1
0
Fork 0
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:
kirillston 2024-11-07 16:18:08 +01:00
parent 31e066d088
commit 7ba3eb2422
No known key found for this signature in database
GPG key ID: 88218A7F1109754B
3 changed files with 93 additions and 6 deletions

View file

@ -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)
}
}

View file

@ -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 {

View 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)
})
}