From e66676598f0ca62bcd43f055abea655e5c68010d Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Sat, 12 Aug 2023 22:48:46 +0800
Subject: [PATCH 1/2] :sparkles: Support for searching asset content
https://github.com/siyuan-note/siyuan/issues/8874
---
kernel/api/router.go | 1 +
kernel/api/search.go | 19 +++++++++++++++++++
kernel/model/asset_content.go | 25 +++++++++++++++++++++++++
3 files changed, 45 insertions(+)
diff --git a/kernel/api/router.go b/kernel/api/router.go
index 2641e2bce..8f0c3e786 100644
--- a/kernel/api/router.go
+++ b/kernel/api/router.go
@@ -145,6 +145,7 @@ func ServeAPI(ginServer *gin.Engine) {
ginServer.Handle("POST", "/api/search/searchAsset", model.CheckAuth, searchAsset)
ginServer.Handle("POST", "/api/search/findReplace", model.CheckAuth, model.CheckReadonly, findReplace)
ginServer.Handle("POST", "/api/search/fullTextSearchAssetContent", model.CheckAuth, fullTextSearchAssetContent)
+ ginServer.Handle("POST", "/api/search/getAssetContent", model.CheckAuth, getAssetContent)
ginServer.Handle("POST", "/api/block/getBlockInfo", model.CheckAuth, getBlockInfo)
ginServer.Handle("POST", "/api/block/getBlockDOM", model.CheckAuth, getBlockDOM)
diff --git a/kernel/api/search.go b/kernel/api/search.go
index 65f080c41..cebb1016d 100644
--- a/kernel/api/search.go
+++ b/kernel/api/search.go
@@ -26,6 +26,25 @@ import (
"github.com/siyuan-note/siyuan/kernel/util"
)
+func getAssetContent(c *gin.Context) {
+ ret := gulu.Ret.NewResult()
+ defer c.JSON(http.StatusOK, ret)
+
+ arg, ok := util.JsonArg(c, ret)
+ if !ok {
+ return
+ }
+
+ id := arg["id"].(string)
+ query := arg["query"].(string)
+ queryMethod := int(arg["queryMethod"].(float64))
+
+ ret.Data = map[string]interface{}{
+ "assetContent": model.GetAssetContent(id, query, queryMethod),
+ }
+ return
+}
+
func fullTextSearchAssetContent(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
diff --git a/kernel/model/asset_content.go b/kernel/model/asset_content.go
index 61c28f980..047110f10 100644
--- a/kernel/model/asset_content.go
+++ b/kernel/model/asset_content.go
@@ -47,6 +47,31 @@ type AssetContent struct {
Content string `json:"content"`
}
+func GetAssetContent(id, query string, queryMethod int) (ret *AssetContent) {
+ if "" != query && (0 == queryMethod || 1 == queryMethod) {
+ if 0 == queryMethod {
+ query = stringQuery(query)
+ }
+ }
+
+ table := "asset_contents_fts_case_insensitive"
+ filter := " id = '" + id + "'"
+ if "" != query {
+ filter += " AND `" + table + "` MATCH '" + buildAssetContentColumnFilter() + ":(" + query + ")'"
+ }
+
+ projections := "id, name, ext, path, size, updated, " +
+ "highlight(" + table + ", 6, '', '') AS content"
+ stmt := "SELECT " + projections + " FROM " + table + " WHERE " + filter
+ assetContents := sql.SelectAssetContentsRawStmt(stmt, 1, 1)
+ results := fromSQLAssetContents(&assetContents, 36)
+ if 1 > len(results) {
+ return
+ }
+ ret = results[0]
+ return
+}
+
// FullTextSearchAssetContent 搜索资源文件内容。
//
// method:0:关键字,1:查询语法,2:SQL,3:正则表达式
From 253b228bb09244c36a6cccc6dfe5827df502cec7 Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Sat, 12 Aug 2023 23:12:34 +0800
Subject: [PATCH 2/2] :sparkles: Support for searching asset content
https://github.com/siyuan-note/siyuan/issues/8874
---
kernel/model/asset_content.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/model/asset_content.go b/kernel/model/asset_content.go
index 047110f10..1863962e2 100644
--- a/kernel/model/asset_content.go
+++ b/kernel/model/asset_content.go
@@ -153,7 +153,7 @@ func fullTextSearchAssetContentCountByRegexp(exp, typeFilter string) (matchedAss
func fullTextSearchAssetContentByFTS(query, typeFilter, orderBy string, beforeLen, page, pageSize int) (ret []*AssetContent, matchedAssetCount int) {
table := "asset_contents_fts_case_insensitive"
projections := "id, name, ext, path, size, updated, " +
- "highlight(" + table + ", 6, '', '') AS content"
+ "snippet(" + table + ", 6, '', '', '...', 64) AS content"
stmt := "SELECT " + projections + " FROM " + table + " WHERE (`" + table + "` MATCH '" + buildAssetContentColumnFilter() + ":(" + query + ")'"
stmt += ") AND ext IN " + typeFilter
stmt += " " + orderBy