From 1f464ca42b4e0606aefc7f46b1e67e29602cb25f Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 27 Oct 2025 11:31:11 +0800 Subject: [PATCH] :art: Improve the database rollup and asset field filtering https://github.com/siyuan-note/siyuan/issues/16126 Signed-off-by: Daniel <845765@qq.com> --- kernel/av/filter.go | 105 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/kernel/av/filter.go b/kernel/av/filter.go index 876d03a85..587293c56 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -17,6 +17,7 @@ package av import ( + "reflect" "strings" "time" @@ -192,40 +193,88 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s switch filter.Qualifier { case FilterQuantifierUndefined, FilterQuantifierAny: - if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { // 说明汇总的目标字段存在空值 - if FilterOperatorIsEmpty == filter.Operator { + if FilterOperatorIsEmpty == filter.Operator { + if 1 > len(value.Rollup.Contents) { return true - } else if FilterOperatorIsNotEmpty == filter.Operator { - if 0 < len(value.Rollup.Contents) { + } + + if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { // 说明汇总的目标字段存在空值 + return true + } + + for _, c := range value.Rollup.Contents { + if v := c.GetValByType(c.Type); nil == v || reflect.ValueOf(v).IsNil() { return true } } + return false + } else if FilterOperatorIsNotEmpty == filter.Operator { + if 1 > len(value.Rollup.Contents) { + return false + } + + for _, c := range value.Rollup.Contents { + if v := c.GetValByType(c.Type); nil != v && !reflect.ValueOf(v).IsNil() { + return true + } + } + return false } if 1 > len(filter.Value.Rollup.Contents) { return true } + if v := filter.Value.GetValByType(filter.Value.Rollup.Contents[0].Type); nil == v || reflect.ValueOf(v).IsNil() { + return true + } + for _, content := range value.Rollup.Contents { if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { return true } } case FilterQuantifierAll: - if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { - if FilterOperatorIsEmpty == filter.Operator { - if 1 > len(value.Rollup.Contents) { - return true - } - } else if FilterOperatorIsNotEmpty == filter.Operator { + if FilterOperatorIsEmpty == filter.Operator { + if 1 > len(value.Rollup.Contents) { + return true + } + + if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { return false } + + for _, c := range value.Rollup.Contents { + if v := c.GetValByType(c.Type); nil != v && !reflect.ValueOf(v).IsNil() { + return false + } + } + return true + } else if FilterOperatorIsNotEmpty == filter.Operator { + if 1 > len(value.Rollup.Contents) { + return false + } + + if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { + return false + } + + for _, c := range value.Rollup.Contents { + if v := c.GetValByType(c.Type); nil == v || reflect.ValueOf(v).IsNil() { + return false + } + } + return true } if 1 > len(filter.Value.Rollup.Contents) { return true } + if v := filter.Value.GetValByType(filter.Value.Rollup.Contents[0].Type); nil == v || reflect.ValueOf(v).IsNil() { + return true + } + for _, content := range value.Rollup.Contents { if !content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { return false @@ -234,19 +283,41 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s return true case FilterQuantifierNone: if FilterOperatorIsEmpty == filter.Operator { - if len(value.Rollup.Contents) < len(relVal.Relation.Contents) || 1 > len(value.Rollup.Contents) { + if 1 > len(value.Rollup.Contents) { return false } + + if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { + return true + } + + for _, c := range value.Rollup.Contents { + if v := c.GetValByType(c.Type); nil == v || reflect.ValueOf(v).IsNil() { + return false + } + } + return true } else if FilterOperatorIsNotEmpty == filter.Operator { if 1 > len(value.Rollup.Contents) { return true } + + for _, c := range value.Rollup.Contents { + if v := c.GetValByType(c.Type); nil != v && !reflect.ValueOf(v).IsNil() { + return false + } + } + return true } if 1 > len(filter.Value.Rollup.Contents) { return true } + if v := filter.Value.GetValByType(filter.Value.Rollup.Contents[0].Type); nil == v || reflect.ValueOf(v).IsNil() { + return true + } + for _, content := range value.Rollup.Contents { if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { return false @@ -312,7 +383,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s } for _, asset := range value.MAsset { - if "" == strings.TrimSpace(asset.Content) { + if "" == strings.TrimSpace(asset.Name) && "" == strings.TrimSpace(asset.Content) { return true } } @@ -323,7 +394,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s } for _, asset := range value.MAsset { - if "" != strings.TrimSpace(asset.Content) { + if "" != strings.TrimSpace(asset.Name) || "" != strings.TrimSpace(asset.Content) { return true } } @@ -354,7 +425,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s } for _, asset := range value.MAsset { - if "" != strings.TrimSpace(asset.Content) { + if "" != strings.TrimSpace(asset.Name) || "" != strings.TrimSpace(asset.Content) { return false } } @@ -365,7 +436,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s } for _, asset := range value.MAsset { - if "" == strings.TrimSpace(asset.Content) { + if "" == strings.TrimSpace(asset.Name) && "" == strings.TrimSpace(asset.Content) { return false } } @@ -397,7 +468,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s } for _, asset := range value.MAsset { - if "" == strings.TrimSpace(asset.Content) { + if "" == strings.TrimSpace(asset.Name) && "" == strings.TrimSpace(asset.Content) { return false } } @@ -408,7 +479,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s } for _, asset := range value.MAsset { - if "" != strings.TrimSpace(asset.Content) { + if "" != strings.TrimSpace(asset.Name) || "" != strings.TrimSpace(asset.Content) { return false } }