From 5f04af1afe6976240ac696c7b536dd73cabcaa94 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 1 Dec 2023 09:17:44 +0800 Subject: [PATCH] :art: Supports multiple views for the database https://github.com/siyuan-note/siyuan/issues/9751 --- kernel/av/av.go | 21 ++++++++++++++++++--- kernel/model/attribute_view.go | 15 ++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 74dc595ac..2e34ddff0 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -64,7 +64,7 @@ func ShallowCloneAttributeView(av *AttributeView) (ret *AttributeView) { view.ID = ast.NewNodeID() ret.ViewID = view.ID } else { - view, _ = NewView(ast.NewNodeID()) + view, _ = NewTableViewWithBlockKey(ast.NewNodeID()) ret.ViewID = view.ID ret.Views = append(ret.Views, view) } @@ -559,7 +559,22 @@ const ( LayoutTypeTable LayoutType = "table" // 属性视图类型 - 表格 ) -func NewView(blockKeyID string) (view *View, blockKey *Key) { +func NewTableView() (ret *View) { + ret = &View{ + ID: ast.NewNodeID(), + Name: "Table", + LayoutType: LayoutTypeTable, + Table: &LayoutTable{ + Spec: 0, + ID: ast.NewNodeID(), + Filters: []*ViewFilter{}, + Sorts: []*ViewSort{}, + }, + } + return +} + +func NewTableViewWithBlockKey(blockKeyID string) (view *View, blockKey *Key) { name := "Table" view = &View{ ID: ast.NewNodeID(), @@ -588,7 +603,7 @@ type Viewable interface { } func NewAttributeView(id string) (ret *AttributeView) { - view, blockKey := NewView(ast.NewNodeID()) + view, blockKey := NewTableViewWithBlockKey(ast.NewNodeID()) ret = &AttributeView{ Spec: 0, ID: id, diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 91a1d40a3..b397e0615 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -294,7 +294,7 @@ func RenderAttributeView(avID, viewID string) (viewable av.Viewable, attrView *a func renderAttributeView(attrView *av.AttributeView, viewID string) (viewable av.Viewable, err error) { if 1 > len(attrView.Views) { - view, _ := av.NewView(ast.NewNodeID()) + view, _ := av.NewTableViewWithBlockKey(ast.NewNodeID()) attrView.Views = append(attrView.Views, view) attrView.ViewID = view.ID if err = av.SaveAttributeView(attrView); nil != err { @@ -666,16 +666,21 @@ func (tx *Transaction) doAddAttrViewView(operation *Operation) (ret *TxErr) { return &TxErr{code: TxErrWriteAttributeView, id: avID} } - bKey := attrView.GetBlockKey() - if nil == bKey { - logging.LogErrorf("get block key failed: %s", avID) + firstView := attrView.Views[0] + if nil == firstView { + logging.LogErrorf("get first view failed: %s", avID) return &TxErr{code: TxErrWriteAttributeView, id: avID} } - view, _ := av.NewView(bKey.ID) + view := av.NewTableView() view.ID = operation.ID attrView.Views = append(attrView.Views, view) attrView.ViewID = view.ID + + for _, col := range firstView.Table.Columns { + view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{ID: col.ID}) + } + if err = av.SaveAttributeView(attrView); nil != err { logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) return &TxErr{code: TxErrWriteAttributeView, msg: err.Error(), id: avID}