This commit is contained in:
Liang Ding 2023-02-14 10:49:03 +08:00
parent d4e3c1e660
commit d5e07318ee
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
3 changed files with 57 additions and 29 deletions

View file

@ -93,8 +93,8 @@ func BuildTreeGraph(id, query string) (boxID string, nodes []*GraphNode, links [
var sqlBlocks []*sql.Block var sqlBlocks []*sql.Block
var rootID string var rootID string
if "NodeDocument" == block.Type { if ast.NodeDocument == node.Type {
sqlBlocks = sql.GetAllChildBlocks(block.ID, stmt) sqlBlocks = sql.GetAllChildBlocks([]string{block.ID}, stmt)
rootID = block.ID rootID = block.ID
} else { } else {
sqlBlocks = sql.GetChildBlocks(block.ID, stmt) sqlBlocks = sql.GetChildBlocks(block.ID, stmt)
@ -106,22 +106,30 @@ func BuildTreeGraph(id, query string) (boxID string, nodes []*GraphNode, links [
if nil != rootBlock { if nil != rootBlock {
// 按引用处理 // 按引用处理
sqlRootDefs := sql.QueryDefRootBlocksByRefRootID(rootID) sqlRootDefs := sql.QueryDefRootBlocksByRefRootID(rootID)
for _, sqlRootDef := range sqlRootDefs { rootDefBlocks := fromSQLBlocks(&sqlRootDefs, "", 0)
rootDef := fromSQLBlock(sqlRootDef, "", 0) var rootIDs []string
for _, rootDef := range rootDefBlocks {
blocks = append(blocks, rootDef) blocks = append(blocks, rootDef)
rootIDs = append(rootIDs, rootDef.ID)
}
sqlRootRefs := sql.QueryRefRootBlocksByDefRootID(sqlRootDef.ID) sqlRootRefBlocks := sql.QueryRefRootBlocksByDefRootIDs(rootIDs)
rootRefs := fromSQLBlocks(&sqlRootRefs, "", 0) for defRootID, sqlRefBlocks := range sqlRootRefBlocks {
rootDef.Refs = append(rootDef.Refs, rootRefs...) rootBlock := getBlockIn(rootDefBlocks, defRootID)
if nil == rootBlock {
continue
}
refBlocks := fromSQLBlocks(&sqlRefBlocks, "", 0)
rootBlock.Refs = append(rootBlock.Refs, refBlocks...)
} }
// 按定义处理 // 按定义处理
sqlRootRefs := sql.QueryRefRootBlocksByDefRootID(rootID) sqlRootRefBlocks = sql.QueryRefRootBlocksByDefRootIDs([]string{rootID})
for _, sqlRootRef := range sqlRootRefs { for _, sqlRefBlocks := range sqlRootRefBlocks {
rootRef := fromSQLBlock(sqlRootRef, "", 0) blocks = append(blocks, rootBlock)
blocks = append(blocks, rootRef) refBlocks := fromSQLBlocks(&sqlRefBlocks, "", 0)
rootBlock.Refs = append(rootBlock.Refs, refBlocks...)
rootBlock.Refs = append(rootBlock.Refs, rootRef)
} }
} }
} }
@ -157,22 +165,29 @@ func BuildGraph(query string) (boxID string, nodes []*GraphNode, links []*GraphL
if 0 < len(roots) { if 0 < len(roots) {
boxID = roots[0].Box boxID = roots[0].Box
} }
var rootIDs []string
for _, root := range roots { for _, root := range roots {
sqlBlocks := sql.GetAllChildBlocks(root.ID, stmt) rootIDs = append(rootIDs, root.ID)
}
rootIDs = gulu.Str.RemoveDuplicatedElem(rootIDs)
sqlBlocks := sql.GetAllChildBlocks(rootIDs, stmt)
treeBlocks := fromSQLBlocks(&sqlBlocks, "", 0) treeBlocks := fromSQLBlocks(&sqlBlocks, "", 0)
genTreeNodes(treeBlocks, &nodes, &links, false, style) genTreeNodes(treeBlocks, &nodes, &links, false, style)
blocks = append(blocks, treeBlocks...) blocks = append(blocks, treeBlocks...)
// 文档块关联 // 文档块关联
rootBlock := getBlockIn(treeBlocks, root.ID) sqlRootRefBlocks := sql.QueryRefRootBlocksByDefRootIDs(rootIDs)
for defRootID, sqlRefBlocks := range sqlRootRefBlocks {
rootBlock := getBlockIn(treeBlocks, defRootID)
if nil == rootBlock { if nil == rootBlock {
continue continue
} }
sqlRootRefs := sql.QueryRefRootBlocksByDefRootID(root.ID) refBlocks := fromSQLBlocks(&sqlRefBlocks, "", 0)
rootRefs := fromSQLBlocks(&sqlRootRefs, "", 0) rootBlock.Refs = append(rootBlock.Refs, refBlocks...)
rootBlock.Refs = append(rootBlock.Refs, rootRefs...)
} }
growTreeGraph(&forwardlinks, &backlinks, &nodes) growTreeGraph(&forwardlinks, &backlinks, &nodes)
blocks = append(blocks, forwardlinks...) blocks = append(blocks, forwardlinks...)
blocks = append(blocks, backlinks...) blocks = append(blocks, backlinks...)
@ -651,6 +666,7 @@ func graphDailyNoteFilter(local bool) string {
return "" return ""
} }
dailyNotesPaths = gulu.Str.RemoveDuplicatedElem(dailyNotesPaths)
buf := bytes.Buffer{} buf := bytes.Buffer{}
for _, p := range dailyNotesPaths { for _, p := range dailyNotesPaths {
buf.WriteString(" AND ref.hpath NOT LIKE '" + p + "%'") buf.WriteString(" AND ref.hpath NOT LIKE '" + p + "%'")

View file

@ -535,13 +535,13 @@ func GetChildBlocks(parentID, condition string) (ret []*Block) {
return return
} }
func GetAllChildBlocks(rootID, condition string) (ret []*Block) { func GetAllChildBlocks(rootIDs []string, condition string) (ret []*Block) {
ret = []*Block{} ret = []*Block{}
sqlStmt := "SELECT * FROM blocks AS ref WHERE ref.root_id = ?" sqlStmt := "SELECT * FROM blocks AS ref WHERE ref.root_id IN ('" + strings.Join(rootIDs, "','") + "')"
if "" != condition { if "" != condition {
sqlStmt += " AND " + condition sqlStmt += " AND " + condition
} }
rows, err := query(sqlStmt, rootID) rows, err := query(sqlStmt)
if nil != err { if nil != err {
logging.LogErrorf("sql query [%s] failed: %s", sqlStmt, err) logging.LogErrorf("sql query [%s] failed: %s", sqlStmt, err)
return return

View file

@ -157,16 +157,28 @@ func QueryDefRootBlocksByRefRootID(refRootID string) (ret []*Block) {
return return
} }
func QueryRefRootBlocksByDefRootID(defRootID string) (ret []*Block) { func QueryRefRootBlocksByDefRootIDs(defRootIDs []string) (ret map[string][]*Block) {
rows, err := query("SELECT * FROM blocks WHERE id IN (SELECT DISTINCT root_id FROM refs WHERE def_block_root_id = ?)", defRootID) ret = map[string][]*Block{}
stmt := "SELECT r.def_block_root_id, b.* FROM refs AS r, blocks AS b ON r.def_block_root_id IN ('" + strings.Join(defRootIDs, "','") + "')" + " AND b.id = r.root_id"
rows, err := query(stmt)
if nil != err { if nil != err {
logging.LogErrorf("sql query failed: %s", err) logging.LogErrorf("sql query failed: %s", err)
return return
} }
defer rows.Close() defer rows.Close()
for rows.Next() { for rows.Next() {
if block := scanBlockRows(rows); nil != block { var block Block
ret = append(ret, block) var defRootID string
if err := rows.Scan(&defRootID, &block.ID, &block.ParentID, &block.RootID, &block.Hash, &block.Box, &block.Path, &block.HPath, &block.Name, &block.Alias, &block.Memo, &block.Tag, &block.Content, &block.FContent, &block.Markdown, &block.Length, &block.Type, &block.SubType, &block.IAL, &block.Sort, &block.Created, &block.Updated); nil != err {
logging.LogErrorf("query scan field failed: %s\n%s", err, logging.ShortStack())
return
}
if nil == ret[defRootID] {
ret[defRootID] = []*Block{}
} else {
ret[defRootID] = append(ret[defRootID], &block)
} }
} }
return return