From 49cc87381cbb162561c0a502e7fd0d5a237a694a Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 25 Jul 2025 15:20:56 +0800 Subject: [PATCH] :art: Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 --- kernel/av/av.go | 35 +++++++++++++++++----------------- kernel/av/sort.go | 2 +- kernel/av/value.go | 4 ++-- kernel/model/attribute_view.go | 8 ++++++++ 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index d084675a5..ef3b46720 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -79,26 +79,27 @@ func GetKeyBlockValue(blockKeyValues []*KeyValues) (ret *Value) { return } +// KeyType 描述了属性视图属性字段的类型。 type KeyType string const ( - KeyTypeBlock KeyType = "block" - KeyTypeText KeyType = "text" - KeyTypeNumber KeyType = "number" - KeyTypeDate KeyType = "date" - KeyTypeSelect KeyType = "select" - KeyTypeMSelect KeyType = "mSelect" - KeyTypeURL KeyType = "url" - KeyTypeEmail KeyType = "email" - KeyTypePhone KeyType = "phone" - KeyTypeMAsset KeyType = "mAsset" - KeyTypeTemplate KeyType = "template" - KeyTypeCreated KeyType = "created" - KeyTypeUpdated KeyType = "updated" - KeyTypeCheckbox KeyType = "checkbox" - KeyTypeRelation KeyType = "relation" - KeyTypeRollup KeyType = "rollup" - KeyTypeLineNumber KeyType = "lineNumber" + KeyTypeBlock KeyType = "block" // 主键 + KeyTypeText KeyType = "text" // 文本 + KeyTypeNumber KeyType = "number" // 数字 + KeyTypeDate KeyType = "date" // 日期 + KeyTypeSelect KeyType = "select" // 单选 + KeyTypeMSelect KeyType = "mSelect" // 多选 + KeyTypeURL KeyType = "url" // URL + KeyTypeEmail KeyType = "email" // Email + KeyTypePhone KeyType = "phone" // 电话 + KeyTypeMAsset KeyType = "mAsset" // 资源 + KeyTypeTemplate KeyType = "template" // 模板 + KeyTypeCreated KeyType = "created" // 创建时间 + KeyTypeUpdated KeyType = "updated" // 更新时间 + KeyTypeCheckbox KeyType = "checkbox" // 复选框 + KeyTypeRelation KeyType = "relation" // 关联 + KeyTypeRollup KeyType = "rollup" // 汇总 + KeyTypeLineNumber KeyType = "lineNumber" // 行号 ) // Key 描述了属性视图属性字段的基础结构。 diff --git a/kernel/av/sort.go b/kernel/av/sort.go index 1dac261fc..28af345f0 100644 --- a/kernel/av/sort.go +++ b/kernel/av/sort.go @@ -67,7 +67,7 @@ func Sort(viewable Viewable, attrView *AttributeView) { val := items[i].GetValues()[fieldIndexSort.Index] if KeyTypeCheckbox == val.Type { if block := item.GetBlockValue(); nil != block && block.IsEdited() { - // 如果主键编辑过,则勾选框也算作编辑过,参与排序 https://github.com/siyuan-note/siyuan/issues/11016 + // 如果主键编辑过,则复选框也算作编辑过,参与排序 https://github.com/siyuan-note/siyuan/issues/11016 editedValItems[item.GetID()] = true break } diff --git a/kernel/av/value.go b/kernel/av/value.go index 082ea97e4..a86354695 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -210,7 +210,7 @@ func (value *Value) IsEdited() bool { } if KeyTypeCheckbox == value.Type { - // 勾选框不会为空,即使勾选框未勾选,也不算是空,所以不能用下面的 IsEmpty 判断,这里使用更新时间判断是否编辑过 https://github.com/siyuan-note/siyuan/issues/11016 + // 复选框不会为空,即使复选框未勾选,也不算是空,所以不能用下面的 IsEmpty 判断,这里使用更新时间判断是否编辑过 https://github.com/siyuan-note/siyuan/issues/11016 return value.CreatedAt != value.UpdatedAt } @@ -289,7 +289,7 @@ func (value *Value) IsEmpty() bool { if nil == value.Checkbox { return true } - return false // 勾选框不会为空 + return false // 复选框不会为空 case KeyTypeRelation: return 1 > len(value.Relation.Contents) case KeyTypeRollup: diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index fb61cd577..b46e8bfbd 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1598,6 +1598,14 @@ func genAttrViewViewGroups(view *av.View, attrView *av.AttributeView) { groupItemsMap[groupName] = append(groupItemsMap[groupName], item) } + if av.KeyTypeSelect == groupKey.Type || av.KeyTypeMSelect == groupKey.Type { + for _, o := range groupKey.Options { + if _, ok := groupItemsMap[o.Name]; !ok { + groupItemsMap[o.Name] = []av.Item{} + } + } + } + for name, groupItems := range groupItemsMap { var v *av.View switch view.LayoutType {