🎨 Database asset fields support filtering https://github.com/siyuan-note/siyuan/issues/11967

Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
Daniel 2025-09-21 22:22:45 +08:00
parent 533e11cc1e
commit 0f24054d3d
No known key found for this signature in database
GPG key ID: 86211BA83DF03017

View file

@ -153,10 +153,9 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
return !value.IsEmpty()
}
// 单独处理汇总
if nil != value.Rollup && KeyTypeRollup == value.Type && nil != filter.Value && KeyTypeRollup == filter.Value.Type &&
nil != filter.Value.Rollup && 0 < len(filter.Value.Rollup.Contents) {
// 单独处理汇总类型的比较
key, _ := attrView.GetKey(value.KeyID)
if nil == key {
return false
@ -214,10 +213,9 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
}
}
// 单独处理关联
if nil != value.Relation && KeyTypeRelation == value.Type && nil != filter.Value && KeyTypeRelation == filter.Value.Type &&
nil != filter.Value.Relation && 0 < len(filter.Value.Relation.BlockIDs) {
// 单独处理关联类型的比较
for _, relationValue := range value.Relation.Contents {
filterValue := &Value{Type: KeyTypeBlock, Block: &ValueBlock{Content: filter.Value.Relation.BlockIDs[0]}}
@ -247,6 +245,61 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
return false
}
}
// 单独处理资源
if nil != value.MAsset && KeyTypeMAsset == value.Type && nil != filter.Value && KeyTypeMAsset == filter.Value.Type && 0 < len(filter.Value.MAsset) {
key, _ := attrView.GetKey(value.KeyID)
if nil == key {
return false
}
switch filter.Qualifier {
case FilterQuantifierUndefined, FilterQuantifierAny:
for _, asset := range value.MAsset {
switch asset.Type {
case AssetTypeFile:
if filterTextContent(filter.Operator, asset.Name, filter.Value.MAsset[0].Name) ||
filterTextContent(filter.Operator, asset.Content, filter.Value.MAsset[0].Content) {
return true
}
case AssetTypeImage:
if filterTextContent(filter.Operator, asset.Content, filter.Value.MAsset[0].Content) {
return true
}
}
}
case FilterQuantifierAll:
for _, asset := range value.MAsset {
switch asset.Type {
case AssetTypeFile:
if !filterTextContent(filter.Operator, asset.Name, filter.Value.MAsset[0].Name) &&
!filterTextContent(filter.Operator, asset.Content, filter.Value.MAsset[0].Content) {
return false
}
case AssetTypeImage:
if !filterTextContent(filter.Operator, asset.Content, filter.Value.MAsset[0].Content) {
return false
}
}
}
return true
case FilterQuantifierNone:
for _, asset := range value.MAsset {
switch asset.Type {
case AssetTypeFile:
if filterTextContent(filter.Operator, asset.Name, filter.Value.MAsset[0].Name) ||
filterTextContent(filter.Operator, asset.Content, filter.Value.MAsset[0].Content) {
return false
}
case AssetTypeImage:
if filterTextContent(filter.Operator, asset.Content, filter.Value.MAsset[0].Content) {
return false
}
}
}
return true
}
}
return value.filter(filter.Value, filter.RelativeDate, filter.RelativeDate2, filter.Operator)
}