mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-10 18:10:49 +09:00
GO-4451 Add long date object ids
This commit is contained in:
parent
31e066d088
commit
7ba3eb2422
3 changed files with 93 additions and 6 deletions
|
@ -121,21 +121,39 @@ func generateFilter(value *types.Value) func(v *types.Value) bool {
|
|||
return equalOrHasFilter
|
||||
}
|
||||
|
||||
start, err := dateutil.ParseDateId(stringValue)
|
||||
ts, err := dateutil.ParseDateId(stringValue)
|
||||
if err != nil {
|
||||
log.Error("failed to convert date id to day start", zap.Error(err))
|
||||
log.Error("failed to parse Date object id", zap.Error(err))
|
||||
return equalOrHasFilter
|
||||
}
|
||||
|
||||
shortId := dateutil.TimeToShortDateId(ts)
|
||||
|
||||
start := ts.Truncate(24 * time.Hour)
|
||||
end := start.Add(24 * time.Hour)
|
||||
startTimestamp := start.Unix()
|
||||
endTimestamp := end.Unix()
|
||||
|
||||
// filter for date objects is able to find relations with values between the borders of queried day
|
||||
// - for relations with number format it checks timestamp value is between timestamps of this day midnights
|
||||
// - for relations carrying string list it checks if some of the strings has day prefix, e.g.
|
||||
// if _date_2023-12-12-08-30-50 is queried, then all relations with prefix _date_2023-12-12 will be returned
|
||||
return func(v *types.Value) bool {
|
||||
numberValue := int64(v.GetNumberValue())
|
||||
if numberValue >= startTimestamp && numberValue < endTimestamp {
|
||||
return true
|
||||
}
|
||||
return equalOrHasFilter(v)
|
||||
|
||||
if list := v.GetListValue(); list != nil {
|
||||
for _, element := range list.Values {
|
||||
if element.Equal(value) {
|
||||
return true
|
||||
}
|
||||
if strings.HasPrefix(element.GetStringValue(), shortId) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return v.Equal(value)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,16 +8,26 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
dateIdLayout = "2006-01-02"
|
||||
dateNameLayout = "02 Jan 2006"
|
||||
shortDateIdLayout = "2006-01-02"
|
||||
dateIdLayout = "2006-01-02-15-04-05"
|
||||
dateNameLayout = "02 Jan 2006"
|
||||
)
|
||||
|
||||
func TimeToDateId(t time.Time) string {
|
||||
return addr.DatePrefix + t.Format(dateIdLayout)
|
||||
}
|
||||
|
||||
// TimeToShortDateId should not be used to generate Date object id. Use TimeToDateId instead
|
||||
func TimeToShortDateId(t time.Time) string {
|
||||
return addr.DatePrefix + t.Format(shortDateIdLayout)
|
||||
}
|
||||
|
||||
func ParseDateId(id string) (time.Time, error) {
|
||||
return time.Parse(dateIdLayout, strings.TrimPrefix(id, addr.DatePrefix))
|
||||
t, err := time.Parse(dateIdLayout, strings.TrimPrefix(id, addr.DatePrefix))
|
||||
if err == nil {
|
||||
return t, nil
|
||||
}
|
||||
return time.Parse(shortDateIdLayout, strings.TrimPrefix(id, addr.DatePrefix))
|
||||
}
|
||||
|
||||
func TimeToDateName(t time.Time) string {
|
||||
|
|
59
util/dateutil/util_test.go
Normal file
59
util/dateutil/util_test.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package dateutil
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
|
||||
)
|
||||
|
||||
func TestTimeToDateId(t *testing.T) {
|
||||
assert.Equal(t, "_date_2024-11-07-12-25-59", TimeToDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
|
||||
assert.Equal(t, "_date_1998-01-01-00-01-01", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
|
||||
assert.Equal(t, "_date_2124-12-25-23-34-00", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
|
||||
}
|
||||
|
||||
func TestTimeToShortDateId(t *testing.T) {
|
||||
assert.Equal(t, "_date_2024-11-07", TimeToShortDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
|
||||
assert.Equal(t, "_date_1998-01-01", TimeToShortDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
|
||||
assert.Equal(t, "_date_2124-12-25", TimeToShortDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
|
||||
}
|
||||
|
||||
func TestTimeToDateName(t *testing.T) {
|
||||
assert.Equal(t, "07 Nov 2024", TimeToDateName(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
|
||||
assert.Equal(t, "01 Jan 1998", TimeToDateName(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
|
||||
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
|
||||
}
|
||||
|
||||
func TestParseDateId(t *testing.T) {
|
||||
t.Run("current date format", func(t *testing.T) {
|
||||
for _, ts := range []time.Time{
|
||||
time.Date(2024, time.December, 7, 12, 25, 59, 0, time.UTC),
|
||||
time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC),
|
||||
time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC),
|
||||
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC),
|
||||
} {
|
||||
ts2, err := ParseDateId(TimeToDateId(ts))
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, ts, ts2)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("old date format", func(t *testing.T) {
|
||||
ts := time.Date(2025, time.June, 8, 2, 25, 39, 0, time.UTC)
|
||||
ts2, err := ParseDateId(addr.DatePrefix + ts.Format(shortDateIdLayout))
|
||||
ts = ts.Truncate(24 * time.Hour)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, ts, ts2)
|
||||
})
|
||||
|
||||
t.Run("wrong format", func(t *testing.T) {
|
||||
_, err := ParseDateId("_date_2024")
|
||||
assert.Error(t, err)
|
||||
|
||||
_, err = ParseDateId("object1")
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue