From c7d5fddb977108fd3dbc940c57dcb58ec317f0d2 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 7 Jan 2024 17:30:52 +0800 Subject: [PATCH] :art: Improve adding rows of the sorted database table view https://github.com/siyuan-note/siyuan/issues/10099 --- kernel/av/filter.go | 17 +++++++++++++++ kernel/model/attribute_view.go | 38 +++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/kernel/av/filter.go b/kernel/av/filter.go index 8dd8c137e..3399f36e2 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -139,6 +139,23 @@ func (filter *ViewFilter) GetAffectValue(key *Key) (ret *Value) { case FilterOperatorIsNotEmpty: ret.Date = &ValueDate{Content: util.CurrentTimeMillis(), IsNotEmpty: true} } + case KeyTypeSelect: + switch filter.Operator { + case FilterOperatorIsEqual: + if 0 < len(filter.Value.MSelect) { + ret.MSelect = []*ValueSelect{{Content: filter.Value.MSelect[0].Content, Color: filter.Value.MSelect[0].Color}} + } + case FilterOperatorIsNotEqual: + if 0 < len(filter.Value.MSelect) { + ret.MSelect = []*ValueSelect{{Content: filter.Value.MSelect[0].Content + " Untitled", Color: "1"}} + } + case FilterOperatorIsEmpty: + ret.MSelect = []*ValueSelect{} + case FilterOperatorIsNotEmpty: + if 0 < len(key.Options) { + ret.MSelect = []*ValueSelect{{Content: key.Options[0].Name, Color: key.Options[0].Color}} + } + } case KeyTypeMSelect: switch filter.Operator { case FilterOperatorIsEqual, FilterOperatorContains: diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 14be072c3..10b2c20ca 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1553,20 +1553,28 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre blockValue := &av.Value{ID: ast.NewNodeID(), KeyID: blockValues.Key.ID, BlockID: blockID, Type: av.KeyTypeBlock, IsDetached: operation.IsDetached, Block: &av.ValueBlock{ID: blockID, Content: content, Created: now, Updated: now}} blockValues.Values = append(blockValues.Values, blockValue) - // 如果存在过滤条件,则将过滤条件应用到新添加的块上 + // 如果存在排序和过滤条件,则将排序和过滤条件应用到新添加的块上 view, _ := attrView.GetCurrentView() - if nil != view && 0 < len(view.Table.Filters) { + if nil != view && (0 < len(view.Table.Filters) || 0 < len(view.Table.Sorts)) { viewable, _ := renderAttributeViewTable(attrView, view) viewable.FilterRows(attrView) viewable.SortRows() - addedVal := false + affectKeyIDs := map[string]bool{} + for _, f := range view.Table.Filters { + affectKeyIDs[f.Column] = true + } + for _, s := range view.Table.Sorts { + affectKeyIDs[s.Column] = true + } + + addedValues := map[string]bool{} if 0 < len(viewable.Rows) { row := GetLastSortRow(viewable.Rows) if nil != row { - for _, filter := range view.Table.Filters { + for affectKeyID, _ := range affectKeyIDs { for _, cell := range row.Cells { - if nil != cell.Value && cell.Value.KeyID == filter.Column { + if nil != cell.Value && cell.Value.KeyID == affectKeyID { if av.KeyTypeBlock == cell.ValueType { blockValue.Block.Content = cell.Value.Block.Content continue @@ -1576,18 +1584,30 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre newValue.ID = ast.NewNodeID() newValue.BlockID = blockID newValue.IsDetached = operation.IsDetached - values, _ := attrView.GetKeyValues(filter.Column) + values, _ := attrView.GetKeyValues(affectKeyID) values.Values = append(values.Values, newValue) + addedValues[affectKeyID] = true break } } } - addedVal = true } } - if !addedVal { + notAddedValues := map[string]bool{} + for affectKeyID, _ := range affectKeyIDs { + if !addedValues[affectKeyID] { + notAddedValues[affectKeyID] = true + break + } + } + + if 0 < len(notAddedValues) { for _, filter := range view.Table.Filters { + if !notAddedValues[filter.Column] { + continue + } + for _, keyValues := range attrView.KeyValues { if keyValues.Key.ID == filter.Column { newValue := filter.GetAffectValue(keyValues.Key) @@ -1600,6 +1620,8 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre } } } + + // 仅使用上面的过滤条件计算受影响的值并插入兜底,受影响的排序条件不进行计算值插入 } }