diff --git a/kernel/api/notebook.go b/kernel/api/notebook.go index 39ee83a57..839f74adf 100644 --- a/kernel/api/notebook.go +++ b/kernel/api/notebook.go @@ -244,7 +244,7 @@ func openNotebook(c *gin.Context) { "20240530133126-axarxgx": "20240530101000-4qitucx", } startID = guideStartID[notebook] - if nil != treenode.GetBlockTree(startID) { + if treenode.ExistBlockTree(startID) { util.BroadcastByTypeAndApp("main", app, "openFileById", 0, "", map[string]interface{}{ "id": startID, }) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 1b1736f5a..f080dec3c 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -199,7 +199,7 @@ func GetAttributeViewPrimaryKeyValues(avID, keyword string, page, pageSize int) switch view.LayoutType { case av.LayoutTypeTable: if !kv.IsDetached { - if nil == treenode.GetBlockTree(kv.BlockID) { + if !treenode.ExistBlockTree(kv.BlockID) { break } } diff --git a/kernel/model/blockinfo.go b/kernel/model/blockinfo.go index 44fba8752..6ee03a32d 100644 --- a/kernel/model/blockinfo.go +++ b/kernel/model/blockinfo.go @@ -71,17 +71,17 @@ func GetDocInfo(blockID string) (ret *BlockInfo) { delete(ret.IAL, "scroll") } else { if zoomInId := scroll["zoomInId"]; nil != zoomInId { - if nil == treenode.GetBlockTree(zoomInId.(string)) { + if !treenode.ExistBlockTree(zoomInId.(string)) { delete(ret.IAL, "scroll") } } else { if startId := scroll["startId"]; nil != startId { - if nil == treenode.GetBlockTree(startId.(string)) { + if !treenode.ExistBlockTree(startId.(string)) { delete(ret.IAL, "scroll") } } if endId := scroll["endId"]; nil != endId { - if nil == treenode.GetBlockTree(endId.(string)) { + if !treenode.ExistBlockTree(endId.(string)) { delete(ret.IAL, "scroll") } } diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index 829ef654a..9cb7d3cbb 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -1085,7 +1085,7 @@ func getDeckDueCards(deck *riff.Deck, reviewedCardIDs, blockIDs []string, newCar continue } - if nil == treenode.GetBlockTree(c.BlockID()) { + if !treenode.ExistBlockTree(c.BlockID()) { continue } diff --git a/kernel/sql/av.go b/kernel/sql/av.go index fd6d84b3c..13e4dba25 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -111,6 +111,7 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s // 过滤掉不存在的行 var notFound []string + var toCheckBlockIDs []string for blockID, keyValues := range rows { blockValue := getRowBlockValue(keyValues) if nil == blockValue { @@ -127,7 +128,11 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s continue } - if nil == treenode.GetBlockTree(blockID) { + toCheckBlockIDs = append(toCheckBlockIDs, blockID) + } + checkRet := treenode.ExistBlockTrees(toCheckBlockIDs) + for blockID, exist := range checkRet { + if !exist { notFound = append(notFound, blockID) } } diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index 15755a34d..10cf2bb3f 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -304,6 +304,30 @@ func ExistBlockTree(id string) bool { return 0 < count } +func ExistBlockTrees(ids []string) (ret map[string]bool) { + ret = map[string]bool{} + for _, id := range ids { + ret[id] = false + } + + sqlStmt := "SELECT id FROM blocktrees WHERE id IN ('" + strings.Join(ids, "','") + "')" + rows, err := db.Query(sqlStmt) + if nil != err { + logging.LogErrorf("sql query [%s] failed: %s", sqlStmt, err) + return + } + defer rows.Close() + for rows.Next() { + var id string + if err = rows.Scan(&id); nil != err { + logging.LogErrorf("query scan field failed: %s", err) + return + } + ret[id] = true + } + return +} + func GetBlockTrees(ids []string) (ret map[string]*BlockTree) { ret = map[string]*BlockTree{} sqlStmt := "SELECT * FROM blocktrees WHERE id IN ('" + strings.Join(ids, "','") + "')"