Browse Source

:art: 搜索结果按文档分组时按块在文档中的先后排序 Fix https://github.com/siyuan-note/siyuan/issues/6749

Liang Ding 2 years ago
parent
commit
3e2bddf5d8
2 changed files with 22 additions and 0 deletions
  1. 1 0
      kernel/model/block.go
  2. 21 0
      kernel/model/search.go

+ 1 - 0
kernel/model/block.go

@@ -55,6 +55,7 @@ type Block struct {
 	Children []*Block          `json:"children"`
 	Depth    int               `json:"depth"`
 	Count    int               `json:"count"`
+	Sort     int               `json:"sort"`
 }
 
 func (block *Block) IsContainerBlock() bool {

+ 21 - 0
kernel/model/search.go

@@ -22,6 +22,7 @@ import (
 	"fmt"
 	"path"
 	"regexp"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -344,20 +345,39 @@ func FullTextSearchBlock(query string, boxes, paths []string, types map[string]b
 	case 1: // 按文档分组
 		rootMap := map[string]bool{}
 		var rootIDs []string
+		sorts := map[string]int{}
 		for _, b := range blocks {
 			if _, ok := rootMap[b.RootID]; !ok {
 				rootMap[b.RootID] = true
 				rootIDs = append(rootIDs, b.RootID)
+				tree, _ := loadTreeByBlockID(b.RootID)
+				if nil == tree {
+					continue
+				}
+
+				sort := 0
+				ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus {
+					if !entering || !n.IsBlock() {
+						return ast.WalkContinue
+					}
+
+					sorts[n.ID] = sort
+					sort++
+					return ast.WalkContinue
+				})
 			}
 		}
+
 		sqlRoots := sql.GetBlocks(rootIDs)
 		roots := fromSQLBlocks(&sqlRoots, "", beforeLen)
 		for _, root := range roots {
 			for _, b := range blocks {
+				b.Sort = sorts[b.ID]
 				if b.RootID == root.ID {
 					root.Children = append(root.Children, b)
 				}
 			}
+			sort.Slice(root.Children, func(i, j int) bool { return root.Children[i].Sort < root.Children[j].Sort })
 		}
 		ret = roots
 	default:
@@ -729,6 +749,7 @@ func fromSQLBlock(sqlBlock *sql.Block, terms string, beforeLen int) (block *Bloc
 		Markdown: markdown,
 		Type:     treenode.FromAbbrType(sqlBlock.Type),
 		SubType:  sqlBlock.SubType,
+		Sort:     sqlBlock.Sort,
 	}
 	if "" != sqlBlock.IAL {
 		block.IAL = map[string]string{}