From 400153319eef68d90cfa0b51bfad53acc22391e5 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 28 Jul 2025 10:54:51 +0800 Subject: [PATCH] :art: Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 --- kernel/model/attribute_view.go | 20 ++++++++------------ kernel/model/transaction.go | 1 + kernel/sql/av.go | 13 +++++++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 94281e755..24d419aae 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1541,17 +1541,7 @@ func renderAttributeView(attrView *av.AttributeView, blockID, viewID, query stri // 如果存在分组的话渲染分组视图 var groups []av.Viewable for _, groupView := range view.Groups { - switch groupView.LayoutType { - case av.LayoutTypeTable: - groupView.Table.Columns = view.Table.Columns - case av.LayoutTypeGallery: - groupView.Gallery.CardFields = view.Gallery.CardFields - } - - groupView.Filters = view.Filters - groupView.Sorts = view.Sorts - - groupViewable := sql.RenderView(attrView, groupView, query) + groupViewable := sql.RenderGroupView(attrView, view, groupView) err = renderViewableInstance(groupViewable, view, attrView, page, pageSize) if nil != err { return @@ -2940,7 +2930,13 @@ func addAttributeViewBlock(now int64, avID, blockID, groupID, previousBlockID, a var nearItem av.Item // 临近项 if nil != view && ((0 < len(view.Filters) && !ignoreFillFilter) || "" != groupID) { // 存在过滤条件或者指定分组视图时,先获取临近项备用 - viewable := sql.RenderView(attrView, view, "") + targetView := view + if "" != groupID { + if groupView := view.GetGroup(groupID); nil != groupView { + targetView = groupView + } + } + viewable := sql.RenderGroupView(attrView, view, targetView) av.Filter(viewable, attrView) av.Sort(viewable, attrView) items := viewable.(av.Collection).GetItems() diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 07f04d4df..6d53042d3 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1693,6 +1693,7 @@ type Operation struct { RemoveDest bool `json:"removeDest"` // 属性视图删除关联目标 Layout av.LayoutType `json:"layout"` // 属性视图布局类型 GroupID string `json:"groupID"` // 属性视图分组视图 ID + TargetGroupID string `json:"targetGroupID"` // 属性视图目标分组视图 ID } type Transaction struct { diff --git a/kernel/sql/av.go b/kernel/sql/av.go index 53afb0198..747fb5d76 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -32,6 +32,19 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func RenderGroupView(attrView *av.AttributeView, view, groupView *av.View) (ret av.Viewable) { + switch groupView.LayoutType { + case av.LayoutTypeTable: + groupView.Table.Columns = view.Table.Columns + case av.LayoutTypeGallery: + groupView.Gallery.CardFields = view.Gallery.CardFields + } + + groupView.Filters = view.Filters + groupView.Sorts = view.Sorts + return RenderView(attrView, groupView, "") +} + func RenderView(attrView *av.AttributeView, view *av.View, query string) (ret av.Viewable) { switch view.LayoutType { case av.LayoutTypeTable: