diff --git a/kernel/av/table.go b/kernel/av/table.go index a5b9abf5c..910124e25 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -433,61 +433,18 @@ func (value *Value) filter(other *Value, relativeDate, relativeDate2 *RelativeDa count := relativeDate.Count unit := relativeDate.Unit direction := relativeDate.Direction - valueTime := time.UnixMilli(value.Date.Content) relativeTimeStart, relativeTimeEnd := calcRelativeTimeRegion(count, unit, direction) - switch operator { - case FilterOperatorIsEqual: - return (valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) && (valueTime.Before(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd)) - case FilterOperatorIsNotEqual: - return !(valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) || !(valueTime.Before(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd)) - case FilterOperatorIsGreater: - return valueTime.After(relativeTimeEnd) - case FilterOperatorIsGreaterOrEqual: - return valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart) - case FilterOperatorIsLess: - return valueTime.Before(relativeTimeStart) - case FilterOperatorIsLessOrEqual: - return valueTime.Before(relativeTimeStart) || valueTime.Equal(relativeTimeStart) - case FilterOperatorIsBetween: - _, relativeTime2End := calcRelativeTimeRegion(relativeDate2.Count, relativeDate2.Unit, relativeDate2.Direction) - return (valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) && (valueTime.Before(relativeTime2End) || valueTime.Equal(relativeTime2End)) - } + _, relativeTimeEnd2 := calcRelativeTimeRegion(relativeDate2.Count, relativeDate2.Unit, relativeDate2.Direction) + return filterTime(value.Date.Content, true, relativeTimeStart, relativeTimeEnd, relativeTimeEnd2, operator) } else { // 使用具体时间比较 if nil == other.Date { return true } - 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 - case FilterOperatorIsGreaterOrEqual: - return value.Date.Content >= other.Date.Content - case FilterOperatorIsLess: - return value.Date.Content < other.Date.Content - case FilterOperatorIsLessOrEqual: - return value.Date.Content <= other.Date.Content - case FilterOperatorIsBetween: - start := value.Date.Content >= other.Date.Content - end := value.Date.Content <= other.Date.Content2 - if value.Date.HasEndDate { - end = value.Date.Content2 <= other.Date.Content2 - } - return start && end - case FilterOperatorIsEmpty: - return !value.Date.IsNotEmpty - case FilterOperatorIsNotEmpty: - return value.Date.IsNotEmpty - } + otherTime := time.UnixMilli(other.Date.Content) + otherStart := time.Date(otherTime.Year(), otherTime.Month(), otherTime.Day(), 0, 0, 0, 0, otherTime.Location()) + otherEnd := time.Date(otherTime.Year(), otherTime.Month(), otherTime.Day(), 23, 59, 59, 999999999, otherTime.Location()) + return filterTime(value.Date.Content, value.Date.IsNotEmpty, otherStart, otherEnd, time.Now(), operator) } } case KeyTypeCreated: @@ -498,58 +455,17 @@ func (value *Value) filter(other *Value, relativeDate, relativeDate2 *RelativeDa count := relativeDate.Count unit := relativeDate.Unit direction := relativeDate.Direction - valueTime := time.UnixMilli(value.Created.Content) relativeTimeStart, relativeTimeEnd := calcRelativeTimeRegion(count, unit, direction) - switch operator { - case FilterOperatorIsEqual: - return (valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) && (valueTime.Before(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd)) - case FilterOperatorIsNotEqual: - return !(valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) || !(valueTime.Before(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd)) - case FilterOperatorIsGreater: - return valueTime.After(relativeTimeEnd) - case FilterOperatorIsGreaterOrEqual: - return valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart) - case FilterOperatorIsLess: - return valueTime.Before(relativeTimeStart) - case FilterOperatorIsLessOrEqual: - return valueTime.Before(relativeTimeStart) || valueTime.Equal(relativeTimeStart) - case FilterOperatorIsBetween: - _, relativeTime2End := calcRelativeTimeRegion(relativeDate2.Count, relativeDate2.Unit, relativeDate2.Direction) - return (valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) && (valueTime.Before(relativeTime2End) || valueTime.Equal(relativeTime2End)) - } + return filterTime(value.Created.Content, true, relativeTimeStart, relativeTimeEnd, time.Now(), operator) } else { // 使用具体时间比较 if nil == other.Created { return true } - switch operator { - case FilterOperatorIsEqual: - if !other.Created.IsNotEmpty { - return true - } - return value.Created.Content == other.Created.Content - case FilterOperatorIsNotEqual: - if !other.Created.IsNotEmpty { - return true - } - return value.Created.Content != other.Created.Content - case FilterOperatorIsGreater: - return value.Created.Content > other.Created.Content - case FilterOperatorIsGreaterOrEqual: - return value.Created.Content >= other.Created.Content - case FilterOperatorIsLess: - return value.Created.Content < other.Created.Content - case FilterOperatorIsLessOrEqual: - return value.Created.Content <= other.Created.Content - case FilterOperatorIsBetween: - start := value.Created.Content >= other.Created.Content - end := value.Created.Content <= other.Created.Content2 - return start && end - case FilterOperatorIsEmpty: - return !value.Created.IsNotEmpty - case FilterOperatorIsNotEmpty: - return value.Created.IsNotEmpty - } + otherTime := time.UnixMilli(other.Created.Content) + otherStart := time.Date(otherTime.Year(), otherTime.Month(), otherTime.Day(), 0, 0, 0, 0, otherTime.Location()) + otherEnd := time.Date(otherTime.Year(), otherTime.Month(), otherTime.Day(), 23, 59, 59, 999999999, otherTime.Location()) + return filterTime(value.Created.Content, value.Created.IsNotEmpty, otherStart, otherEnd, time.Now(), operator) } } case KeyTypeUpdated: @@ -560,58 +476,17 @@ func (value *Value) filter(other *Value, relativeDate, relativeDate2 *RelativeDa count := relativeDate.Count unit := relativeDate.Unit direction := relativeDate.Direction - valueTime := time.UnixMilli(value.Updated.Content) relativeTimeStart, relativeTimeEnd := calcRelativeTimeRegion(count, unit, direction) - switch operator { - case FilterOperatorIsEqual: - return (valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) && (valueTime.Before(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd)) - case FilterOperatorIsNotEqual: - return !(valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) || !(valueTime.Before(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd)) - case FilterOperatorIsGreater: - return valueTime.After(relativeTimeEnd) - case FilterOperatorIsGreaterOrEqual: - return valueTime.After(relativeTimeEnd) || valueTime.Equal(relativeTimeEnd) - case FilterOperatorIsLess: - return valueTime.Before(relativeTimeStart) - case FilterOperatorIsLessOrEqual: - return valueTime.Before(relativeTimeStart) || valueTime.Equal(relativeTimeStart) - case FilterOperatorIsBetween: - _, relativeTime2End := calcRelativeTimeRegion(relativeDate2.Count, relativeDate2.Unit, relativeDate2.Direction) - return (valueTime.After(relativeTimeStart) || valueTime.Equal(relativeTimeStart)) && (valueTime.Before(relativeTime2End) || valueTime.Equal(relativeTime2End)) - } + return filterTime(value.Updated.Content, true, relativeTimeStart, relativeTimeEnd, time.Now(), operator) } else { // 使用具体时间比较 if nil == other.Updated { return true } - switch operator { - case FilterOperatorIsEqual: - if !other.Updated.IsNotEmpty { - return true - } - return value.Updated.Content == other.Updated.Content - case FilterOperatorIsNotEqual: - if !other.Updated.IsNotEmpty { - return true - } - return value.Updated.Content != other.Updated.Content - case FilterOperatorIsGreater: - return value.Updated.Content > other.Updated.Content - case FilterOperatorIsGreaterOrEqual: - return value.Updated.Content >= other.Updated.Content - case FilterOperatorIsLess: - return value.Updated.Content < other.Updated.Content - case FilterOperatorIsLessOrEqual: - return value.Updated.Content <= other.Updated.Content - case FilterOperatorIsBetween: - start := value.Updated.Content >= other.Updated.Content - end := value.Updated.Content <= other.Updated.Content2 - return start && end - case FilterOperatorIsEmpty: - return !value.Updated.IsNotEmpty - case FilterOperatorIsNotEmpty: - return value.Updated.IsNotEmpty - } + otherTime := time.UnixMilli(other.Updated.Content) + otherStart := time.Date(otherTime.Year(), otherTime.Month(), otherTime.Day(), 0, 0, 0, 0, otherTime.Location()) + otherEnd := time.Date(otherTime.Year(), otherTime.Month(), otherTime.Day(), 23, 59, 59, 999999999, otherTime.Location()) + return filterTime(value.Updated.Content, value.Updated.IsNotEmpty, otherStart, otherEnd, time.Now(), operator) } } case KeyTypeSelect, KeyTypeMSelect: @@ -825,6 +700,31 @@ func (value *Value) filter(other *Value, relativeDate, relativeDate2 *RelativeDa return false } +func filterTime(valueMills int64, valueIsNotEmpty bool, otherValueStart, otherValueEnd, otherValueEnd2 time.Time, operator FilterOperator) bool { + valueTime := time.UnixMilli(valueMills) + switch operator { + case FilterOperatorIsEqual: + return (valueTime.After(otherValueStart) || valueTime.Equal(otherValueStart)) && (valueTime.Before(otherValueEnd) || valueTime.Equal(otherValueEnd)) + case FilterOperatorIsNotEqual: + return !((valueTime.After(otherValueStart) || valueTime.Equal(otherValueStart)) && (valueTime.Before(otherValueEnd) || valueTime.Equal(otherValueEnd))) + case FilterOperatorIsGreater: + return valueTime.After(otherValueEnd) + case FilterOperatorIsGreaterOrEqual: + return valueTime.After(otherValueStart) || valueTime.Equal(otherValueStart) + case FilterOperatorIsLess: + return valueTime.Before(otherValueStart) + case FilterOperatorIsLessOrEqual: + return valueTime.Before(otherValueStart) || valueTime.Equal(otherValueStart) + case FilterOperatorIsBetween: + return (valueTime.After(otherValueStart) || valueTime.Equal(otherValueStart)) && (valueTime.Before(otherValueEnd2) || valueTime.Equal(otherValueEnd2)) + case FilterOperatorIsEmpty: + return !valueIsNotEmpty + case FilterOperatorIsNotEmpty: + return valueIsNotEmpty + } + return false +} + // 根据 Count、Unit 和 Direction 计算相对当前时间的开始时间和结束时间 func calcRelativeTimeRegion(count int, unit RelativeDateUnit, direction RelativeDateDirection) (start, end time.Time) { now := time.Now()