🎨 Improve the database rollup and asset field filtering https://github.com/siyuan-note/siyuan/issues/16126

Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
Daniel 2025-10-27 11:31:11 +08:00
parent d5b78df9a3
commit 1f464ca42b
No known key found for this signature in database
GPG key ID: 86211BA83DF03017

View file

@ -17,6 +17,7 @@
package av package av
import ( import (
"reflect"
"strings" "strings"
"time" "time"
@ -192,40 +193,88 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
switch filter.Qualifier { switch filter.Qualifier {
case FilterQuantifierUndefined, FilterQuantifierAny: 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 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 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) { if 1 > len(filter.Value.Rollup.Contents) {
return true 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 { for _, content := range value.Rollup.Contents {
if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) {
return true return true
} }
} }
case FilterQuantifierAll: case FilterQuantifierAll:
if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { if FilterOperatorIsEmpty == filter.Operator {
if FilterOperatorIsEmpty == filter.Operator { if 1 > len(value.Rollup.Contents) {
if 1 > len(value.Rollup.Contents) { return true
return true }
}
} else if FilterOperatorIsNotEmpty == filter.Operator { if len(value.Rollup.Contents) < len(relVal.Relation.Contents) {
return false 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) { if 1 > len(filter.Value.Rollup.Contents) {
return true 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 { for _, content := range value.Rollup.Contents {
if !content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { if !content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) {
return false return false
@ -234,19 +283,41 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
return true return true
case FilterQuantifierNone: case FilterQuantifierNone:
if FilterOperatorIsEmpty == filter.Operator { 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 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 { } else if FilterOperatorIsNotEmpty == filter.Operator {
if 1 > len(value.Rollup.Contents) { if 1 > len(value.Rollup.Contents) {
return true 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) { if 1 > len(filter.Value.Rollup.Contents) {
return true 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 { for _, content := range value.Rollup.Contents {
if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) {
return false return false
@ -312,7 +383,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
if "" == strings.TrimSpace(asset.Content) { if "" == strings.TrimSpace(asset.Name) && "" == strings.TrimSpace(asset.Content) {
return true return true
} }
} }
@ -323,7 +394,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
if "" != strings.TrimSpace(asset.Content) { if "" != strings.TrimSpace(asset.Name) || "" != strings.TrimSpace(asset.Content) {
return true return true
} }
} }
@ -354,7 +425,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
if "" != strings.TrimSpace(asset.Content) { if "" != strings.TrimSpace(asset.Name) || "" != strings.TrimSpace(asset.Content) {
return false return false
} }
} }
@ -365,7 +436,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
if "" == strings.TrimSpace(asset.Content) { if "" == strings.TrimSpace(asset.Name) && "" == strings.TrimSpace(asset.Content) {
return false return false
} }
} }
@ -397,7 +468,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
if "" == strings.TrimSpace(asset.Content) { if "" == strings.TrimSpace(asset.Name) && "" == strings.TrimSpace(asset.Content) {
return false return false
} }
} }
@ -408,7 +479,7 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
if "" != strings.TrimSpace(asset.Content) { if "" != strings.TrimSpace(asset.Name) || "" != strings.TrimSpace(asset.Content) {
return false return false
} }
} }