From 964c822c2b7322f956234726f0bbb15106da35e4 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Tue, 10 Oct 2023 22:02:46 +0800 Subject: [PATCH 1/3] :art: Improve database created and updated column values https://github.com/siyuan-note/siyuan/issues/9391 --- kernel/model/attribute_view.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 099c67ba79f..afe6667ced4 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1296,8 +1296,16 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string, bindBlockAv(tx, avID, rowID) } - if nil != val.Block { - val.Block.Updated = time.Now().UnixMilli() + for _, kv := range attrView.KeyValues { + if av.KeyTypeBlock == kv.Key.Type { + for _, v := range kv.Values { + if rowID == v.Block.ID { + v.Block.Updated = time.Now().UnixMilli() + break + } + } + break + } } if err = av.SaveAttributeView(attrView); nil != err { From 28e4e1ef2fe1c373b9524a2c3f1cca85eb5452f4 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Tue, 10 Oct 2023 22:31:46 +0800 Subject: [PATCH 2/3] :art: Rename the .sya annotation file when renaming a PDF asset https://github.com/siyuan-note/siyuan/issues/9390 --- kernel/model/assets.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kernel/model/assets.go b/kernel/model/assets.go index 8f651a6e662..709171a53ec 100644 --- a/kernel/model/assets.go +++ b/kernel/model/assets.go @@ -512,6 +512,15 @@ func RenameAsset(oldPath, newName string) (err error) { logging.LogErrorf("copy asset [%s] failed: %s", oldPath, err) return } + + if gulu.File.IsExist(filepath.Join(util.DataDir, oldPath+".sya")) { + // Rename the .sya annotation file when renaming a PDF asset https://github.com/siyuan-note/siyuan/issues/9390 + if err = filelock.Copy(filepath.Join(util.DataDir, oldPath+".sya"), filepath.Join(util.DataDir, newPath+".sya")); nil != err { + logging.LogErrorf("copy PDF annotation [%s] failed: %s", oldPath+".sya", err) + return + } + } + oldName := path.Base(oldPath) notebooks, err := ListNotebooks() From ccb65454a2bad059a33cf360aef8f0a895030dbf Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 11 Oct 2023 08:50:13 +0800 Subject: [PATCH 3/3] :art: Improve handling of database column filters containing empty values Fix https://github.com/siyuan-note/siyuan/issues/9394 --- kernel/av/table.go | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/kernel/av/table.go b/kernel/av/table.go index e9d69107a65..536de5cd74e 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -165,8 +165,8 @@ func (value *Value) Compare(other *Value) int { } func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool { - if nil == value || nil == other { - return false + if nil == other { + return true } if nil != value.Block && nil != other.Block { @@ -193,16 +193,34 @@ func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool if nil != value.Text && nil != other.Text { switch operator { case FilterOperatorIsEqual: + if "" == strings.TrimSpace(other.Text.Content) { + return true + } return value.Text.Content == other.Text.Content case FilterOperatorIsNotEqual: + if "" == strings.TrimSpace(other.Text.Content) { + return true + } return value.Text.Content != other.Text.Content case FilterOperatorContains: + if "" == strings.TrimSpace(other.Text.Content) { + return true + } return strings.Contains(value.Text.Content, other.Text.Content) case FilterOperatorDoesNotContain: + if "" == strings.TrimSpace(other.Text.Content) { + return true + } return !strings.Contains(value.Text.Content, other.Text.Content) case FilterOperatorStartsWith: + if "" == strings.TrimSpace(other.Text.Content) { + return true + } return strings.HasPrefix(value.Text.Content, other.Text.Content) case FilterOperatorEndsWith: + if "" == strings.TrimSpace(other.Text.Content) { + return true + } return strings.HasSuffix(value.Text.Content, other.Text.Content) case FilterOperatorIsEmpty: return "" == strings.TrimSpace(value.Text.Content) @@ -214,8 +232,14 @@ func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool if nil != value.Number && nil != other.Number { switch operator { case FilterOperatorIsEqual: + if !other.Number.IsNotEmpty { + return true + } return value.Number.Content == other.Number.Content case FilterOperatorIsNotEqual: + if !other.Number.IsNotEmpty { + return true + } return value.Number.Content != other.Number.Content case FilterOperatorIsGreater: return value.Number.Content > other.Number.Content @@ -235,8 +259,14 @@ func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool if nil != value.Date && nil != other.Date { switch operator { case FilterOperatorIsEqual: + if !other.Date.IsNotEmpty { + return true + } return value.Date.Content == other.Date.Content case FilterOperatorIsNotEqual: + if !other.Date.IsNotEmpty { + return true + } return value.Date.Content != other.Date.Content case FilterOperatorIsGreater: return value.Date.Content > other.Date.Content @@ -541,7 +571,17 @@ func (table *Table) FilterRows() { for _, row := range table.Rows { pass := true for j, index := range colIndexes { - if !row.Cells[index].Value.CompareOperator(table.Filters[j].Value, table.Filters[j].Operator) { + operator := table.Filters[j].Operator + + if nil == row.Cells[index].Value { + switch operator { + case FilterOperatorIsNotEmpty: + pass = false + } + break + } + + if !row.Cells[index].Value.CompareOperator(table.Filters[j].Value, operator) { pass = false break }