From e98dcf65b655b2d29289b2673292eeee5b424694 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Tue, 1 Jul 2025 17:19:54 +0800 Subject: [PATCH] :sparkles: Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 --- kernel/av/av.go | 1 - kernel/av/group.go | 7 ------- kernel/av/layout.go | 4 ---- kernel/av/layout_gallery.go | 4 ---- kernel/av/layout_table.go | 4 ---- kernel/model/attribute_view.go | 30 ++++++++++++++++++++++++++++++ 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 36de95fda..87b13b67e 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -254,7 +254,6 @@ func NewGalleryView() (ret *View) { type Viewable interface { Filterable Sortable - Groupable Calculable GetType() LayoutType diff --git a/kernel/av/group.go b/kernel/av/group.go index 3cd846c13..25ee349d0 100644 --- a/kernel/av/group.go +++ b/kernel/av/group.go @@ -16,13 +16,6 @@ package av -// Groupable 定义了可分组的视图类型。 -type Groupable interface { - - // Group 根据视图中设置的分组规则进行分组。 - Group(attrView *AttributeView) -} - type ViewGroup struct { Field string `json:"field"` // 分组字段 ID Method GroupMethod `json:"method"` // 分组方式 diff --git a/kernel/av/layout.go b/kernel/av/layout.go index 437e50b36..5610af3c5 100644 --- a/kernel/av/layout.go +++ b/kernel/av/layout.go @@ -316,7 +316,3 @@ func filter0(collection Collection, attrView *AttributeView) { } collection.SetItems(items) } - -func group0(collection Collection, attrView *AttributeView) { - // TODO 分组 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 -} diff --git a/kernel/av/layout_gallery.go b/kernel/av/layout_gallery.go index 0c6c01a63..231404597 100644 --- a/kernel/av/layout_gallery.go +++ b/kernel/av/layout_gallery.go @@ -190,7 +190,3 @@ func (gallery *Gallery) Sort(attrView *AttributeView) { func (gallery *Gallery) Filter(attrView *AttributeView) { filter0(gallery, attrView) } - -func (gallery *Gallery) Group(attrView *AttributeView) { - group0(gallery, attrView) -} diff --git a/kernel/av/layout_table.go b/kernel/av/layout_table.go index 6dad96825..e7dcf2105 100644 --- a/kernel/av/layout_table.go +++ b/kernel/av/layout_table.go @@ -168,7 +168,3 @@ func (table *Table) Sort(attrView *AttributeView) { func (table *Table) Filter(attrView *AttributeView) { filter0(table, attrView) } - -func (table *Table) Group(attrView *AttributeView) { - group0(table, attrView) -} diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 220381ed2..339e270f4 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1232,7 +1232,37 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page, checkAttrView(attrView, view) upgradeAttributeViewSpec(attrView) + if nil != view.Group && 0 < len(view.Groups) { + var instances []av.Viewable + for _, groupView := range view.Groups { + groupViewable := sql.RenderView(groupView, attrView, query) + err = renderViewableInstance(groupViewable, view, attrView, page, pageSize) + if nil != err { + return + } + instances = append(instances, groupViewable) + } + + viewable = instances[0] + switch view.LayoutType { + case av.LayoutTypeTable: + for i := 1; i < len(instances); i++ { + viewable.(*av.Table).Groups = append(viewable.(*av.Table).Groups, instances[i].(*av.Table).Groups...) + } + case av.LayoutTypeGallery: + for i := 1; i < len(instances); i++ { + viewable.(*av.Gallery).Groups = append(viewable.(*av.Gallery).Groups, instances[i].(*av.Gallery).Groups...) + } + } + return + } + viewable = sql.RenderView(view, attrView, query) + err = renderViewableInstance(viewable, view, attrView, page, pageSize) + return +} + +func renderViewableInstance(viewable av.Viewable, view *av.View, attrView *av.AttributeView, page, pageSize int) (err error) { if nil == viewable { err = av.ErrViewNotFound logging.LogErrorf("render attribute view [%s] failed", attrView.ID)