From 1864d0e4a68ab9dbe82e5dc1c21e32f8754ef483 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 3 Jan 2024 10:18:53 +0800 Subject: [PATCH 1/3] :bug: The parent block field of the blocks under the heading block is calculated incorrectly https://github.com/siyuan-note/siyuan/issues/9869 --- kernel/model/transaction.go | 19 +++++++++++++++++++ kernel/sql/database.go | 8 +++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index fcc71c583..e149f3345 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1048,6 +1048,15 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { treenode.MoveFoldHeading(updatedNode, oldNode) } + if ast.NodeHeading == oldNode.Type && ast.NodeHeading != updatedNode.Type { + // 将标题块更新为非标题块时需要更新下方块的 parent id + children := treenode.HeadingChildren(oldNode) + updated := time.Now().Format("20060102150405") + for _, child := range children { + child.SetIALAttr("updated", updated) + } + } + cache.PutBlockIAL(updatedNode.ID, parse.IAL2Map(updatedNode.KramdownIAL)) // 替换为新节点 @@ -1055,6 +1064,16 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { oldNode.Unlink() createdUpdated(updatedNode) + if ast.NodeHeading != oldNode.Type && ast.NodeHeading == updatedNode.Type { + // 将非标题块更新为标题块时需要更新下方块的 parent id + // The parent block field of the blocks under the heading block is calculated incorrectly https://github.com/siyuan-note/siyuan/issues/9869 + children := treenode.HeadingChildren(updatedNode) + updated := updatedNode.IALAttr("updated") + for _, child := range children { + child.SetIALAttr("updated", updated) + } + } + tx.nodes[updatedNode.ID] = updatedNode if err = tx.writeTree(tree); nil != err { return &TxErr{code: TxErrCodeWriteTree, msg: err.Error(), id: id} diff --git a/kernel/sql/database.go b/kernel/sql/database.go index 34ce78f07..196f7563d 100644 --- a/kernel/sql/database.go +++ b/kernel/sql/database.go @@ -810,8 +810,7 @@ func buildBlockFromNode(n *ast.Node, tree *parse.Tree) (block *Block, attributes fcontent = treenode.NodeStaticContent(fc, nil, true, false, true) parentID = n.Parent.ID - // 将标题块作为父节点 - if h := heading(n); nil != h { + if h := heading(n); nil != h { // 如果在标题块下方,则将标题块作为父节点 parentID = h.ID } length = utf8.RuneCountInString(fcontent) @@ -823,7 +822,6 @@ func buildBlockFromNode(n *ast.Node, tree *parse.Tree) (block *Block, attributes content = treenode.NodeStaticContent(n, nil, true, indexAssetPath, true) parentID = n.Parent.ID - // 将标题块作为父节点 if h := heading(n); nil != h { parentID = h.ID } @@ -909,6 +907,10 @@ func tagFromNode(node *ast.Node) (ret string) { } func heading(node *ast.Node) *ast.Node { + if nil == node { + return nil + } + currentLevel := 16 if ast.NodeHeading == node.Type { currentLevel = node.HeadingLevel From a785cd15c0708ac1617879bddd7211fe22371043 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 3 Jan 2024 17:38:17 +0800 Subject: [PATCH 2/3] :bug: The parent block field of the blocks under the heading block is calculated incorrectly https://github.com/siyuan-note/siyuan/issues/9869 --- kernel/model/transaction.go | 43 ++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index e149f3345..96560f969 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -314,6 +314,8 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) { headingChildren = treenode.GetHeadingFold(headingChildren) } + refreshHeadingChildrenUpdated(srcNode, time.Now().Format("20060102150405")) + var srcEmptyList *ast.Node if ast.NodeListItem == srcNode.Type && srcNode.Parent.FirstChild == srcNode && srcNode.Parent.LastChild == srcNode { // 列表中唯一的列表项被移除后,该列表就为空了 @@ -366,6 +368,8 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) { srcEmptyList.Unlink() } + refreshHeadingChildrenUpdated(srcNode, time.Now().Format("20060102150405")) + refreshUpdated(srcNode) refreshUpdated(srcTree.Root) if err = tx.writeTree(srcTree); nil != err { @@ -444,6 +448,8 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) { } } + refreshHeadingChildrenUpdated(srcNode, time.Now().Format("20060102150405")) + refreshUpdated(srcNode) refreshUpdated(srcTree.Root) if err = tx.writeTree(srcTree); nil != err { @@ -752,6 +758,9 @@ func (tx *Transaction) doDelete(operation *Operation) (ret *TxErr) { // 列表块撤销状态异常 https://github.com/siyuan-note/siyuan/issues/3985 node.Next.Unlink() } + + refreshHeadingChildrenUpdated(node, time.Now().Format("20060102150405")) + node.Unlink() if nil != parent && ast.NodeListItem == parent.Type && nil == parent.FirstChild { // 保持空列表项 @@ -961,6 +970,8 @@ func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) { } } + refreshHeadingChildrenUpdated(insertedNode, time.Now().Format("20060102150405")) + createdUpdated(insertedNode) tx.nodes[insertedNode.ID] = insertedNode if err = tx.writeTree(tree); nil != err { @@ -1048,14 +1059,7 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { treenode.MoveFoldHeading(updatedNode, oldNode) } - if ast.NodeHeading == oldNode.Type && ast.NodeHeading != updatedNode.Type { - // 将标题块更新为非标题块时需要更新下方块的 parent id - children := treenode.HeadingChildren(oldNode) - updated := time.Now().Format("20060102150405") - for _, child := range children { - child.SetIALAttr("updated", updated) - } - } + refreshHeadingChildrenUpdated(oldNode, time.Now().Format("20060102150405")) cache.PutBlockIAL(updatedNode.ID, parse.IAL2Map(updatedNode.KramdownIAL)) @@ -1064,15 +1068,7 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { oldNode.Unlink() createdUpdated(updatedNode) - if ast.NodeHeading != oldNode.Type && ast.NodeHeading == updatedNode.Type { - // 将非标题块更新为标题块时需要更新下方块的 parent id - // The parent block field of the blocks under the heading block is calculated incorrectly https://github.com/siyuan-note/siyuan/issues/9869 - children := treenode.HeadingChildren(updatedNode) - updated := updatedNode.IALAttr("updated") - for _, child := range children { - child.SetIALAttr("updated", updated) - } - } + refreshHeadingChildrenUpdated(updatedNode, updatedNode.IALAttr("updated")) tx.nodes[updatedNode.ID] = updatedNode if err = tx.writeTree(tree); nil != err { @@ -1085,6 +1081,19 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { return } +func refreshHeadingChildrenUpdated(heading *ast.Node, updated string) { + if nil == heading || ast.NodeHeading != heading.Type { + return + } + + // 将非标题块更新为标题块时需要更新下方块的 parent id + // The parent block field of the blocks under the heading block is calculated incorrectly https://github.com/siyuan-note/siyuan/issues/9869 + children := treenode.HeadingChildren(heading) + for _, child := range children { + child.SetIALAttr("updated", updated) + } +} + func upsertAvBlockRel(node *ast.Node) { ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering { From f9c54420fbae19649919c0e4377c9285af2565a0 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 3 Jan 2024 22:31:25 +0800 Subject: [PATCH 3/3] :art: https://github.com/siyuan-note/siyuan/issues/10068 --- kernel/av/value.go | 61 ++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/kernel/av/value.go b/kernel/av/value.go index 0e70548cc..ebf1317aa 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -216,15 +216,6 @@ const ( NumberFormatFranc NumberFormat = "franc" ) -func NewValueNumber(content float64) *ValueNumber { - return &ValueNumber{ - Content: content, - IsNotEmpty: true, - Format: NumberFormatNone, - FormattedContent: fmt.Sprintf("%f", content), - } -} - func NewFormattedValueNumber(content float64, format NumberFormat) (ret *ValueNumber) { ret = &ValueNumber{ Content: content, @@ -483,9 +474,9 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { switch calc.Operator { case CalcOperatorNone: case CalcOperatorCountAll: - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(len(r.Contents)))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} case CalcOperatorCountValues: - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(len(r.Contents)))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} case CalcOperatorCountUniqueValues: countUniqueValues := 0 uniqueValues := map[string]bool{} @@ -495,7 +486,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { countUniqueValues++ } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countUniqueValues))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} case CalcOperatorCountEmpty: countEmpty := 0 for _, v := range r.Contents { @@ -503,7 +494,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { countEmpty++ } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countEmpty))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} case CalcOperatorCountNotEmpty: countNonEmpty := 0 for _, v := range r.Contents { @@ -511,7 +502,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { countNonEmpty++ } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countNonEmpty))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} case CalcOperatorPercentEmpty: countEmpty := 0 for _, v := range r.Contents { @@ -519,7 +510,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { countEmpty++ } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countEmpty * 100 / len(r.Contents)))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(countEmpty*100/len(r.Contents)), NumberFormatNone)}} case CalcOperatorPercentNotEmpty: countNonEmpty := 0 for _, v := range r.Contents { @@ -527,7 +518,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { countNonEmpty++ } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countNonEmpty * 100 / len(r.Contents)))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(countNonEmpty*100/len(r.Contents)), NumberFormatNone)}} case CalcOperatorSum: sum := 0.0 for _, v := range r.Contents { @@ -560,39 +551,39 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(numbers[len(numbers)/2], destKey.NumberFormat)}} } case CalcOperatorMin: - min := math.MaxFloat64 + minVal := math.MaxFloat64 for _, v := range r.Contents { if nil != v.Number { - if v.Number.Content < min { - min = v.Number.Content + if v.Number.Content < minVal { + minVal = v.Number.Content } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(min, destKey.NumberFormat)}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(minVal, destKey.NumberFormat)}} case CalcOperatorMax: - max := -math.MaxFloat64 + maxVal := -math.MaxFloat64 for _, v := range r.Contents { if nil != v.Number { - if v.Number.Content > max { - max = v.Number.Content + if v.Number.Content > maxVal { + maxVal = v.Number.Content } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(max, destKey.NumberFormat)}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal, destKey.NumberFormat)}} case CalcOperatorRange: - min := math.MaxFloat64 - max := -math.MaxFloat64 + minVal := math.MaxFloat64 + maxVal := -math.MaxFloat64 for _, v := range r.Contents { if nil != v.Number { - if v.Number.Content < min { - min = v.Number.Content + if v.Number.Content < minVal { + minVal = v.Number.Content } - if v.Number.Content > max { - max = v.Number.Content + if v.Number.Content > maxVal { + maxVal = v.Number.Content } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(max-min, destKey.NumberFormat)}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal-minVal, destKey.NumberFormat)}} case CalcOperatorChecked: countChecked := 0 for _, v := range r.Contents { @@ -602,7 +593,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countChecked))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(countChecked), NumberFormatNone)}} case CalcOperatorUnchecked: countUnchecked := 0 for _, v := range r.Contents { @@ -612,7 +603,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countUnchecked))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(countUnchecked), NumberFormatNone)}} case CalcOperatorPercentChecked: countChecked := 0 for _, v := range r.Contents { @@ -622,7 +613,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countChecked * 100 / len(r.Contents)))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(countChecked*100/len(r.Contents)), NumberFormatNone)}} case CalcOperatorPercentUnchecked: countUnchecked := 0 for _, v := range r.Contents { @@ -632,6 +623,6 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(float64(countUnchecked * 100 / len(r.Contents)))}} + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(countUnchecked*100/len(r.Contents)), NumberFormatNone)}} } }