From fb14f7a46aed7a6cd465f6f7b1fc857743f4c611 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Sat, 26 Nov 2022 18:12:54 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=90=9C=E7=B4=A2=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8C=89=E6=96=87=E6=A1=A3=E5=88=86=E7=BB=84=E5=92=8C=E6=8C=89?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=A0=91=E7=BB=93=E6=9E=84=E5=B1=95=E7=8E=B0?= =?UTF-8?q?=20https://github.com/siyuan-note/siyuan/issues/4772?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/search.go | 7 ++++++- kernel/model/search.go | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/kernel/api/search.go b/kernel/api/search.go index cba275d0e..5211bcd8a 100644 --- a/kernel/api/search.go +++ b/kernel/api/search.go @@ -212,7 +212,12 @@ func fullTextSearchBlock(c *gin.Context) { if nil != querySyntaxArg { querySyntax = querySyntaxArg.(bool) } - blocks, matchedBlockCount, matchedRootCount := model.FullTextSearchBlock(query, box, path, types, querySyntax) + groupByArg := arg["groupBy"] + var groupBy int // 0:不分组,1:按文档分组,2:按文档树结构分组 + if nil != groupByArg { + groupBy = int(groupByArg.(float64)) + } + blocks, matchedBlockCount, matchedRootCount := model.FullTextSearchBlock(query, box, path, types, querySyntax, groupBy) ret.Data = map[string]interface{}{ "blocks": blocks, "matchedBlockCount": matchedBlockCount, diff --git a/kernel/model/search.go b/kernel/model/search.go index 070ba0eac..ddd7347da 100644 --- a/kernel/model/search.go +++ b/kernel/model/search.go @@ -253,13 +253,44 @@ func FindReplace(keyword, replacement string, ids []string) (err error) { return } -func FullTextSearchBlock(query, box, path string, types map[string]bool, querySyntax bool) (ret []*Block, matchedBlockCount, matchedRootCount int) { +func FullTextSearchBlock(query, box, path string, types map[string]bool, querySyntax bool, groupBy int) (ret []*Block, matchedBlockCount, matchedRootCount int) { query = strings.TrimSpace(query) + beforeLen := 36 + var blocks []*Block if queryStrLower := strings.ToLower(query); strings.Contains(queryStrLower, "select ") && strings.Contains(queryStrLower, " * ") && strings.Contains(queryStrLower, " from ") { - ret, matchedBlockCount, matchedRootCount = searchBySQL(query, 36) + blocks, matchedBlockCount, matchedRootCount = searchBySQL(query, beforeLen) } else { filter := searchFilter(types) - ret, matchedBlockCount, matchedRootCount = fullTextSearch(query, box, path, filter, 36, querySyntax) + blocks, matchedBlockCount, matchedRootCount = fullTextSearch(query, box, path, filter, beforeLen, querySyntax) + } + + switch groupBy { + case 0: // 不分组 + ret = blocks + case 1: // 按文档分组 + rootMap := map[string]bool{} + var rootIDs []string + for _, b := range blocks { + if _, ok := rootMap[b.RootID]; !ok { + rootMap[b.RootID] = true + rootIDs = append(rootIDs, b.RootID) + } + } + sqlRoots := sql.GetBlocks(rootIDs) + roots := fromSQLBlocks(&sqlRoots, "", beforeLen) + for _, root := range roots { + for _, b := range blocks { + if b.RootID == root.ID { + root.Children = append(root.Children, b) + } + } + } + ret = roots + case 2: // 按文档树结构分组 + // TODO + ret = blocks + default: + ret = blocks } return }