♻️ Improve database loading performance https://github.com/siyuan-note/siyuan/issues/12818

This commit is contained in:
Daniel 2024-10-17 23:31:54 +08:00
parent da64370496
commit c42064ec0b
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
9 changed files with 77 additions and 79 deletions

View file

@ -27,23 +27,11 @@ import (
"github.com/88250/lute/ast"
"github.com/siyuan-note/logging"
"github.com/siyuan-note/siyuan/kernel/av"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
)
func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string,
GetBlockAttrsWithoutWaitWriting func(id string) (ret map[string]string)) (ret *av.Table) {
if nil == GetBlockAttrsWithoutWaitWriting {
GetBlockAttrsWithoutWaitWriting = func(id string) (ret map[string]string) {
ret = cache.GetBlockIAL(id)
if nil == ret {
ret = map[string]string{}
}
return
}
}
func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string) (ret *av.Table) {
ret = &av.Table{
ID: view.ID,
Icon: view.Icon,
@ -568,8 +556,7 @@ func FillAttributeViewTableCellNilValue(tableCell *av.TableCell, rowID, colID st
}
}
func getAttributeViewContent(avID string,
GetBlockAttrsWithoutWaitWriting func(id string) (ret map[string]string)) (content string) {
func getAttributeViewContent(avID string) (content string) {
if "" == avID {
return
}
@ -605,7 +592,7 @@ func getAttributeViewContent(avID string,
return
}
table := RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
table := RenderAttributeViewTable(attrView, view, "")
for _, col := range table.Columns {
buf.WriteString(col.Name)
buf.WriteByte(' ')

View file

@ -19,6 +19,8 @@ package sql
import (
"bytes"
"database/sql"
"github.com/88250/lute/parse"
"github.com/siyuan-note/logging"
"strings"
"github.com/88250/gulu"
@ -104,7 +106,6 @@ func indexNode(tx *sql.Tx, id string) (err error) {
return
}
luteEngine := util.NewLute()
tree, _ := filesys.LoadTree(bt.BoxID, bt.Path, luteEngine)
if nil == tree {
return
@ -115,7 +116,7 @@ func indexNode(tx *sql.Tx, id string) (err error) {
return
}
content := NodeStaticContent(node, nil, true, indexAssetPath, true, nil)
content := NodeStaticContent(node, nil, true, indexAssetPath, true)
stmt := "UPDATE blocks SET content = ? WHERE id = ?"
if err = execStmtTx(tx, stmt, content, id); err != nil {
tx.Rollback()
@ -136,15 +137,14 @@ func indexNode(tx *sql.Tx, id string) (err error) {
return
}
func NodeStaticContent(node *ast.Node, excludeTypes []string, includeTextMarkATitleURL, includeAssetPath, fullAttrView bool,
GetBlockAttrsWithoutWaitWriting func(id string) (ret map[string]string)) string {
func NodeStaticContent(node *ast.Node, excludeTypes []string, includeTextMarkATitleURL, includeAssetPath, fullAttrView bool) string {
if nil == node {
return ""
}
if ast.NodeAttributeView == node.Type {
if fullAttrView {
return getAttributeViewContent(node.AttributeViewID, GetBlockAttrsWithoutWaitWriting)
return getAttributeViewContent(node.AttributeViewID)
}
ret, _ := av.GetAttributeViewName(node.AttributeViewID)
@ -274,3 +274,54 @@ func nodeStaticContent(node *ast.Node, excludeTypes []string, includeTextMarkATi
// Improve search and replace for spaces https://github.com/siyuan-note/siyuan/issues/10231
return buf.String()
}
func GetBlockAttrsWithoutWaitWriting(id string) (ret map[string]string) {
ret = map[string]string{}
if cached := cache.GetBlockIAL(id); nil != cached {
ret = cached
return
}
ret = GetBlockAttrs(id)
cache.PutBlockIAL(id, ret)
return
}
func GetBlockAttrs(id string) (ret map[string]string) {
ret = map[string]string{}
tree := loadTreeByBlockID(id)
if nil == tree {
return
}
ret = GetBlockAttrs0(id, tree)
return
}
func GetBlockAttrs0(id string, tree *parse.Tree) (ret map[string]string) {
ret = map[string]string{}
node := treenode.GetNodeInTree(tree, id)
if nil == node {
logging.LogWarnf("block [%s] not found", id)
return
}
for _, kv := range node.KramdownIAL {
ret[kv[0]] = html.UnescapeAttrVal(kv[1])
}
return
}
func loadTreeByBlockID(id string) (ret *parse.Tree) {
bt := treenode.GetBlockTree(id)
if nil == bt {
return
}
ret, err := filesys.LoadTree(bt.BoxID, bt.Path, luteEngine)
if nil != err {
return
}
return
}

View file

@ -828,13 +828,13 @@ func buildBlockFromNode(n *ast.Node, tree *parse.Tree) (block *Block, attributes
if !treenode.IsNodeOCRed(n) {
util.PushNodeOCRQueue(n)
}
content = NodeStaticContent(n, nil, true, indexAssetPath, true, nil)
content = NodeStaticContent(n, nil, true, indexAssetPath, true)
fc := treenode.FirstLeafBlock(n)
if !treenode.IsNodeOCRed(fc) {
util.PushNodeOCRQueue(fc)
}
fcontent = NodeStaticContent(fc, nil, true, false, true, nil)
fcontent = NodeStaticContent(fc, nil, true, false, true)
parentID = n.Parent.ID
if h := heading(n); nil != h { // 如果在标题块下方,则将标题块作为父节点
@ -846,7 +846,7 @@ func buildBlockFromNode(n *ast.Node, tree *parse.Tree) (block *Block, attributes
if !treenode.IsNodeOCRed(n) {
util.PushNodeOCRQueue(n)
}
content = NodeStaticContent(n, nil, true, indexAssetPath, true, nil)
content = NodeStaticContent(n, nil, true, indexAssetPath, true)
parentID = n.Parent.ID
if h := heading(n); nil != h {