From 0f48f947042ab1276a1807667fac2893d943e235 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 13 Aug 2025 00:11:38 +0800 Subject: [PATCH 1/5] :art: Improve av http://github.com/siyuan-note/siyuan/issues/15544 --- kernel/av/av.go | 14 +++++++ kernel/model/attribute_view.go | 75 ++++++++++++++++++++++++++-------- 2 files changed, 73 insertions(+), 16 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 76e1b5f00..9e2b0ac0e 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -726,6 +726,20 @@ func (av *AttributeView) Clone() (ret *AttributeView) { return } +func (av *AttributeView) GetTemplateKeyRelevantKeys(templateKey *Key) (ret []*Key) { + ret = []*Key{} + if nil == templateKey || "" == templateKey.Template { + return + } + + for _, kValues := range av.KeyValues { + if strings.Contains(templateKey.Template, "."+kValues.Key.Name) { + ret = append(ret, kValues.Key) + } + } + return +} + func GetAttributeViewDataPath(avID string) (ret string) { av := filepath.Join(util.DataDir, "storage", "av") ret = filepath.Join(av, avID+".json") diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 979ae4ca6..b2d2e3e48 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -87,23 +87,26 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group nearItem := getNearItem(attrView, view, groupView, previousItemID) - // 对库中存在模板字段和汇总字段的情况进行处理(尽量从临近项获取新值,获取不到的话直接返回) - existSpecialField := false + // 使用模板或汇总进行过滤或分组时,需要解析涉及到的其他字段 + templateRelevantKeys, rollupRelevantKeys := map[string][]*av.Key{}, map[string]*av.Key{} for _, keyValues := range attrView.KeyValues { - if av.KeyTypeTemplate == keyValues.Key.Type || av.KeyTypeRollup == keyValues.Key.Type { - existSpecialField = true - break - } - } - if existSpecialField { - if nil != nearItem { - // 存在临近项时从临近项获取新值 - for _, keyValues := range attrView.KeyValues { - newValue := getNewValueByNearItem(nearItem, keyValues.Key, addingItemID) - ret[keyValues.Key.ID] = newValue + if av.KeyTypeTemplate == keyValues.Key.Type { + if tplRelevantKeys := attrView.GetTemplateKeyRelevantKeys(keyValues.Key); 0 < len(tplRelevantKeys) { + for _, k := range tplRelevantKeys { + templateRelevantKeys[keyValues.Key.ID] = append(templateRelevantKeys[keyValues.Key.ID], k) + } + } + } else if av.KeyTypeRollup == keyValues.Key.Type { + if nil != keyValues.Key.Rollup { + relKey, _ := attrView.GetKey(keyValues.Key.Rollup.RelationKeyID) + if nil != relKey && nil != relKey.Relation { + if attrView.ID == relKey.Relation.AvID { + if k, _ := attrView.GetKey(keyValues.Key.Rollup.KeyID); nil != k { + rollupRelevantKeys[k.ID] = k + } + } + } } - } else { // 不存在临近项时不生成任何新值 - return } } @@ -115,6 +118,26 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group continue } + if av.KeyTypeTemplate == keyValues.Key.Type && nil != nearItem { + if keys := templateRelevantKeys[keyValues.Key.ID]; 0 < len(keys) { + for _, k := range keys { + if nil == ret[k.ID] { + ret[k.ID] = getNewValueByNearItem(nearItem, k, addingItemID) + } + } + } + continue + } + + if av.KeyTypeRollup == keyValues.Key.Type && nil != nearItem { + if relKey, ok := rollupRelevantKeys[keyValues.Key.ID]; ok { + if nil == ret[relKey.ID] { + ret[relKey.ID] = getNewValueByNearItem(nearItem, relKey, addingItemID) + } + } + continue + } + newValue := filter.GetAffectValue(keyValues.Key, addingItemID) if nil == newValue { newValue = getNewValueByNearItem(nearItem, keyValues.Key, addingItemID) @@ -135,7 +158,7 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group } newValue := getNewValueByNearItem(nearItem, groupKey, addingItemID) - if av.KeyTypeSelect == groupKey.Type || av.KeyTypeMSelect == groupKey.Type { // 单独处理单选或多选 + if av.KeyTypeSelect == groupKey.Type || av.KeyTypeMSelect == groupKey.Type { // 因为单选或多选只能按选项分组,并且可能存在空白分组(找不到临近项),所以单选或多选类型的分组字段使用分组值内容对应的选项 if opt := groupKey.GetOption(groupView.GetGroupValue()); nil != opt && groupValueDefault != groupView.GetGroupValue() { if nil == newValue { @@ -159,6 +182,26 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group return } + if av.KeyTypeTemplate == keyValues.Key.Type && nil != nearItem { + if keys := templateRelevantKeys[keyValues.Key.ID]; 0 < len(keys) { + for _, k := range keys { + if nil == ret[k.ID] { + ret[k.ID] = getNewValueByNearItem(nearItem, k, addingItemID) + } + } + } + return + } + + if av.KeyTypeRollup == keyValues.Key.Type && nil != nearItem { + if relKey, ok := rollupRelevantKeys[keyValues.Key.ID]; ok { + if nil == ret[relKey.ID] { + ret[relKey.ID] = getNewValueByNearItem(nearItem, relKey, addingItemID) + } + } + return + } + if nil != newValue && !filterKeyIDs[groupKey.ID] /* 命中了过滤条件的话就不重复处理了 */ { ret[groupKey.ID] = newValue } From be05b324d17d663325e5e11c68cfab508e248698 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 13 Aug 2025 00:33:14 +0800 Subject: [PATCH 2/5] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15553 --- kernel/model/attribute_view.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index b2d2e3e48..6f1a14319 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -3523,6 +3523,13 @@ func sortAttributeViewRow(operation *Operation) (err error) { if nil != view.Group && "" != operation.GroupID { if groupView := view.GetGroupByID(operation.GroupID); nil != groupView { + groupKey := view.GetGroupKey(attrView) + isAcrossGroup := operation.GroupID != operation.TargetGroupID + if isAcrossGroup && (av.KeyTypeTemplate == groupKey.Type || av.KeyTypeRollup == groupKey.Type || av.KeyTypeCreated == groupKey.Type || av.KeyTypeUpdated == groupKey.Type) { + // 这些字段类型不支持跨分组移动,因为它们的值是自动计算生成的 + return + } + for i, id := range groupView.GroupItemIDs { if id == operation.ID { itemID = id @@ -3537,10 +3544,16 @@ func sortAttributeViewRow(operation *Operation) (err error) { } groupView.GroupItemIDs = append(groupView.GroupItemIDs[:idx], groupView.GroupItemIDs[idx+1:]...) - if operation.GroupID != operation.TargetGroupID { // 跨分组排序 + if isAcrossGroup { if targetGroupView := view.GetGroupByID(operation.TargetGroupID); nil != targetGroupView && !gulu.Str.Contains(itemID, targetGroupView.GroupItemIDs) { fillDefaultValue(attrView, view, targetGroupView, operation.PreviousID, itemID) + if av.KeyTypeMSelect == groupKey.Type { + // 跨多选分组时一个项目可能会同时存在于多个分组中,需要重新生成分组 + regenAttrViewGroups(attrView, "force") + return + } + for i, r := range targetGroupView.GroupItemIDs { if r == operation.PreviousID { previousIndex = i + 1 @@ -3548,11 +3561,6 @@ func sortAttributeViewRow(operation *Operation) (err error) { } } targetGroupView.GroupItemIDs = util.InsertElem(targetGroupView.GroupItemIDs, previousIndex, itemID) - - if groupKey := view.GetGroupKey(attrView); av.KeyTypeMSelect == groupKey.Type { - // 跨多选分组时一个项目可能会同时存在于多个分组中,需要重新生成分组 - regenAttrViewGroups(attrView, "force") - } } } else { // 同分组内排序 for i, r := range groupView.GroupItemIDs { From 1b9013ed0e5173350ca6ea5dcb7fe80db4fe0988 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 13 Aug 2025 00:38:00 +0800 Subject: [PATCH 3/5] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15553 --- kernel/model/attribute_view.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 6f1a14319..1236c8277 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -3548,12 +3548,6 @@ func sortAttributeViewRow(operation *Operation) (err error) { if targetGroupView := view.GetGroupByID(operation.TargetGroupID); nil != targetGroupView && !gulu.Str.Contains(itemID, targetGroupView.GroupItemIDs) { fillDefaultValue(attrView, view, targetGroupView, operation.PreviousID, itemID) - if av.KeyTypeMSelect == groupKey.Type { - // 跨多选分组时一个项目可能会同时存在于多个分组中,需要重新生成分组 - regenAttrViewGroups(attrView, "force") - return - } - for i, r := range targetGroupView.GroupItemIDs { if r == operation.PreviousID { previousIndex = i + 1 @@ -3561,6 +3555,13 @@ func sortAttributeViewRow(operation *Operation) (err error) { } } targetGroupView.GroupItemIDs = util.InsertElem(targetGroupView.GroupItemIDs, previousIndex, itemID) + + if av.KeyTypeMSelect == groupKey.Type { + // 跨多选分组时一个项目可能会同时存在于多个分组中,需要重新生成分组 + regenAttrViewGroups(attrView, "force") + return + } + } } else { // 同分组内排序 for i, r := range groupView.GroupItemIDs { From 94d37ae47eeee7a4e200a933eda859ad04eadcce Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 13 Aug 2025 00:55:48 +0800 Subject: [PATCH 4/5] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15553 --- kernel/model/attribute_view.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 1236c8277..538660d1c 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -4499,7 +4499,7 @@ func regenAttrViewGroups(attrView *av.AttributeView, keyID string) { } if "force" != keyID { - if av.KeyTypeTemplate != groupKey.Type && av.KeyTypeCreated != groupKey.Type && av.KeyTypeUpdated != groupKey.Type && + if av.KeyTypeTemplate != groupKey.Type && av.KeyTypeRollup != groupKey.Type && av.KeyTypeCreated != groupKey.Type && av.KeyTypeUpdated != groupKey.Type && view.Group.Field != keyID { continue } From 52cd7d0bfa6aed1148abd4932814af47a0bcdefb Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 13 Aug 2025 01:02:38 +0800 Subject: [PATCH 5/5] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15553 --- kernel/model/attribute_view.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 538660d1c..162c93224 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -3559,9 +3559,7 @@ func sortAttributeViewRow(operation *Operation) (err error) { if av.KeyTypeMSelect == groupKey.Type { // 跨多选分组时一个项目可能会同时存在于多个分组中,需要重新生成分组 regenAttrViewGroups(attrView, "force") - return } - } } else { // 同分组内排序 for i, r := range groupView.GroupItemIDs {