From 23c4f81289470c15b362f06830b49712e8ca04f3 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 6 Mar 2024 09:11:50 +0800 Subject: [PATCH] :art: Improve database filtering for `Created` and `Updated` fields https://github.com/siyuan-note/siyuan/issues/10522 --- kernel/av/table.go | 72 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/kernel/av/table.go b/kernel/av/table.go index 29a54a178..63ede4391 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -456,21 +456,39 @@ func (value *Value) compareOperator(filter *ViewFilter) bool { if nil != value.Created && nil != filter.Value.Created { switch operator { case FilterOperatorIsEqual: - return value.Created.Content == filter.Value.Created.Content + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Created.Content >= start.UnixMilli() && value.Created.Content < end.UnixMilli() case FilterOperatorIsNotEqual: - return value.Created.Content != filter.Value.Created.Content + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Created.Content < start.UnixMilli() || value.Created.Content >= end.UnixMilli() case FilterOperatorIsGreater: - return value.Created.Content > filter.Value.Created.Content + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Created.Content >= end.UnixMilli() case FilterOperatorIsGreaterOrEqual: - return value.Created.Content >= filter.Value.Created.Content + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + return value.Created.Content >= start.UnixMilli() case FilterOperatorIsLess: - return value.Created.Content < filter.Value.Created.Content + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + return value.Created.Content < start.UnixMilli() case FilterOperatorIsLessOrEqual: - return value.Created.Content <= filter.Value.Created.Content + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Created.Content < end.UnixMilli() case FilterOperatorIsBetween: - start := value.Created.Content >= filter.Value.Created.Content - end := value.Created.Content <= filter.Value.Created.Content2 - return start && end + start := time.UnixMilli(filter.Value.Created.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := time.UnixMilli(filter.Value.Created.Content2) + end = time.Date(end.Year(), end.Month(), end.Day(), 0, 0, 0, 0, time.Local) + return value.Created.Content >= start.UnixMilli() && value.Created.Content < end.UnixMilli() case FilterOperatorIsEmpty: return !value.Created.IsNotEmpty case FilterOperatorIsNotEmpty: @@ -481,21 +499,39 @@ func (value *Value) compareOperator(filter *ViewFilter) bool { if nil != value.Updated && nil != filter.Value.Updated { switch operator { case FilterOperatorIsEqual: - return value.Updated.Content == filter.Value.Updated.Content + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Updated.Content >= start.UnixMilli() && value.Updated.Content < end.UnixMilli() case FilterOperatorIsNotEqual: - return value.Updated.Content != filter.Value.Updated.Content + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Updated.Content < start.UnixMilli() || value.Updated.Content >= end.UnixMilli() case FilterOperatorIsGreater: - return value.Updated.Content > filter.Value.Updated.Content + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Updated.Content >= end.UnixMilli() case FilterOperatorIsGreaterOrEqual: - return value.Updated.Content >= filter.Value.Updated.Content + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + return value.Updated.Content >= start.UnixMilli() case FilterOperatorIsLess: - return value.Updated.Content < filter.Value.Updated.Content + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + return value.Updated.Content < start.UnixMilli() case FilterOperatorIsLessOrEqual: - return value.Updated.Content <= filter.Value.Updated.Content + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := start.AddDate(0, 0, 1) + return value.Updated.Content < end.UnixMilli() case FilterOperatorIsBetween: - start := value.Updated.Content >= filter.Value.Updated.Content - end := value.Updated.Content <= filter.Value.Updated.Content2 - return start && end + start := time.UnixMilli(filter.Value.Updated.Content) + start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local) + end := time.UnixMilli(filter.Value.Updated.Content2) + end = time.Date(end.Year(), end.Month(), end.Day(), 0, 0, 0, 0, time.Local) + return value.Updated.Content >= start.UnixMilli() && value.Updated.Content < end.UnixMilli() case FilterOperatorIsEmpty: return !value.Updated.IsNotEmpty case FilterOperatorIsNotEmpty: