From 276ea421881663a0d01cf53fd47e76cafa12d5cb Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 29 Jun 2025 15:53:56 +0800 Subject: [PATCH] :sparkles: Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 --- kernel/av/av.go | 28 ++++++++++++++++------------ kernel/av/layout.go | 3 ++- kernel/model/attribute_view.go | 7 +++++++ kernel/sql/av_gallery.go | 1 + kernel/sql/av_table.go | 1 + 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 63b90c729..ed258d8fe 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -178,18 +178,18 @@ type SelectOption struct { // View 描述了视图的结构。 type View struct { - ID string `json:"id"` // 视图 ID - Icon string `json:"icon"` // 视图图标 - Name string `json:"name"` // 视图名称 - HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称 - Desc string `json:"desc"` // 视图描述 - Filters []*ViewFilter `json:"filters,omitempty"` // 过滤规则 - Sorts []*ViewSort `json:"sorts,omitempty"` // 排序规则 - PageSize int `json:"pageSize"` // 每页条目数 - - LayoutType LayoutType `json:"type"` // 当前布局类型 - Table *LayoutTable `json:"table,omitempty"` // 表格布局 - Gallery *LayoutGallery `json:"gallery,omitempty"` // 画廊布局 + ID string `json:"id"` // 视图 ID + Icon string `json:"icon"` // 视图图标 + Name string `json:"name"` // 视图名称 + HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称 + Desc string `json:"desc"` // 视图描述 + Filters []*ViewFilter `json:"filters,omitempty"` // 过滤规则 + Sorts []*ViewSort `json:"sorts,omitempty"` // 排序规则 + Group *ViewGroup `json:"group,omitempty"` // 分组规则 + PageSize int `json:"pageSize"` // 每页条目数 + LayoutType LayoutType `json:"type"` // 当前布局类型 + Table *LayoutTable `json:"table,omitempty"` // 表格布局 + Gallery *LayoutGallery `json:"gallery,omitempty"` // 画廊布局 } // LayoutType 描述了视图布局类型。 @@ -585,6 +585,10 @@ func (av *AttributeView) Clone() (ret *AttributeView) { s.Column = keyIDMap[s.Column] } + if nil != view.Group { + view.Group.Field = keyIDMap[view.Group.Field] + } + switch view.LayoutType { case LayoutTypeTable: for _, column := range view.Table.Columns { diff --git a/kernel/av/layout.go b/kernel/av/layout.go index 49f89138b..1e1ad606f 100644 --- a/kernel/av/layout.go +++ b/kernel/av/layout.go @@ -49,7 +49,8 @@ type BaseInstance struct { HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称 Filters []*ViewFilter `json:"filters"` // 过滤规则 Sorts []*ViewSort `json:"sorts"` // 排序规则 - PageSize int `json:"pageSize"` // 每页项目 + Group *ViewGroup `json:"group"` // 分组规则 + PageSize int `json:"pageSize"` // 每页项目数 } func (baseInstance *BaseInstance) GetSorts() []*ViewSort { diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 9f10dd206..40daca59f 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1876,6 +1876,13 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr }) } + if nil != masterView.Group { + if copyErr := copier.Copy(view.Group, masterView.Group); nil != copyErr { + logging.LogErrorf("copy group failed: %s", copyErr) + return &TxErr{code: TxErrWriteAttributeView, id: avID, msg: copyErr.Error()} + } + } + view.PageSize = masterView.PageSize switch masterView.LayoutType { diff --git a/kernel/sql/av_gallery.go b/kernel/sql/av_gallery.go index 4e36a9c38..cc9d0ef50 100644 --- a/kernel/sql/av_gallery.go +++ b/kernel/sql/av_gallery.go @@ -25,6 +25,7 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query HideAttrViewName: view.HideAttrViewName, Filters: view.Filters, Sorts: view.Sorts, + Group: view.Group, }, CoverFrom: view.Gallery.CoverFrom, CoverFromAssetKeyID: view.Gallery.CoverFromAssetKeyID, diff --git a/kernel/sql/av_table.go b/kernel/sql/av_table.go index 41a9e25dc..6a2a72b7e 100644 --- a/kernel/sql/av_table.go +++ b/kernel/sql/av_table.go @@ -32,6 +32,7 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s HideAttrViewName: view.HideAttrViewName, Filters: view.Filters, Sorts: view.Sorts, + Group: view.Group, }, Columns: []*av.TableColumn{}, Rows: []*av.TableRow{},