Skip to content

Commit 82ee751

Browse files
authored
Merge pull request #467 from ydb-platform/ttl-settings-fluent
* Added fluent modifiers for `options.TimeToLiveSettings`
2 parents 8367a51 + dd73600 commit 82ee751

File tree

6 files changed

+178
-47
lines changed

6 files changed

+178
-47
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Added constructor of `options.TimeToLiveSettings` and fluent modifiers
2+
13
## v3.40.0
24
* Added `options.WithAddAttribute` and `options.WithDropAttribute` options for `session.AlterTable` request
35
* Added `options.WithAddIndex` and `options.WithDropIndex` options for `session.AlterTable` request

internal/table/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ func (s *session) DescribeTable(
426426
KeyBloomFilter: feature.FromYDB(result.GetKeyBloomFilter()),
427427
PartitioningSettings: options.NewPartitioningSettings(result.GetPartitioningSettings()),
428428
Indexes: indexes,
429-
TimeToLiveSettings: options.NewTimeToLiveSettings(result.GetTtlSettings()),
429+
TimeToLiveSettings: NewTimeToLiveSettings(result.GetTtlSettings()),
430430
Changefeeds: changeFeeds,
431431
}, nil
432432
}

internal/table/ttl.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package table
2+
3+
import (
4+
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Table"
5+
6+
"github.com/ydb-platform/ydb-go-sdk/v3/table/options"
7+
)
8+
9+
func NewTimeToLiveSettings(settings *Ydb_Table.TtlSettings) *options.TimeToLiveSettings {
10+
if settings == nil {
11+
return nil
12+
}
13+
switch mode := settings.Mode.(type) {
14+
case *Ydb_Table.TtlSettings_DateTypeColumn:
15+
return &options.TimeToLiveSettings{
16+
ColumnName: mode.DateTypeColumn.ColumnName,
17+
ExpireAfterSeconds: mode.DateTypeColumn.ExpireAfterSeconds,
18+
Mode: options.TimeToLiveModeDateType,
19+
}
20+
21+
case *Ydb_Table.TtlSettings_ValueSinceUnixEpoch:
22+
return &options.TimeToLiveSettings{
23+
ColumnName: mode.ValueSinceUnixEpoch.ColumnName,
24+
ColumnUnit: timeToLiveUnit(mode.ValueSinceUnixEpoch.ColumnUnit),
25+
ExpireAfterSeconds: mode.ValueSinceUnixEpoch.ExpireAfterSeconds,
26+
Mode: options.TimeToLiveModeValueSinceUnixEpoch,
27+
}
28+
}
29+
return nil
30+
}
31+
32+
func timeToLiveUnit(unit Ydb_Table.ValueSinceUnixEpochModeSettings_Unit) *options.TimeToLiveUnit {
33+
var res options.TimeToLiveUnit
34+
switch unit {
35+
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_SECONDS:
36+
res = options.TimeToLiveUnitSeconds
37+
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_MILLISECONDS:
38+
res = options.TimeToLiveUnitMilliseconds
39+
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_MICROSECONDS:
40+
res = options.TimeToLiveUnitMicroseconds
41+
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_NANOSECONDS:
42+
res = options.TimeToLiveUnitNanoseconds
43+
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_UNSPECIFIED:
44+
res = options.TimeToLiveUnitUnspecified
45+
default:
46+
panic("ydb: unknown Ydb unit for value since epoch")
47+
}
48+
return &res
49+
}

table/example_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,9 @@ func Example_alterTable() {
159159
return s.AlterTable(ctx, path.Join(db.Name(), "series"),
160160
options.WithAddColumn("series_id", types.Optional(types.TypeUint64)),
161161
options.WithAddColumn("title", types.Optional(types.TypeText)),
162-
options.WithSetTimeToLiveSettings(options.TimeToLiveSettings{
163-
ColumnName: "expire_at",
164-
ExpireAfterSeconds: uint32(time.Hour.Seconds()),
165-
}),
162+
options.WithSetTimeToLiveSettings(
163+
options.NewTTLSettings().ColumnDateType("expire_at").ExpireAfter(time.Hour),
164+
),
166165
options.WithAddIndex("idx_series_series_id",
167166
options.WithIndexColumns("series_id"),
168167
options.WithDataColumns("title"),

table/options/models.go

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,55 @@ const (
442442
TimeToLiveModeValueSinceUnixEpoch
443443
)
444444

445+
func NewTTLSettings() TimeToLiveSettings {
446+
return TimeToLiveSettings{
447+
Mode: TimeToLiveModeDateType,
448+
}
449+
}
450+
451+
func (ttl TimeToLiveSettings) ColumnDateType(columnName string) TimeToLiveSettings {
452+
ttl.Mode = TimeToLiveModeDateType
453+
ttl.ColumnName = columnName
454+
return ttl
455+
}
456+
457+
func unitToPointer(unit TimeToLiveUnit) *TimeToLiveUnit {
458+
return &unit
459+
}
460+
461+
func (ttl TimeToLiveSettings) ColumnSeconds(columnName string) TimeToLiveSettings {
462+
ttl.Mode = TimeToLiveModeValueSinceUnixEpoch
463+
ttl.ColumnName = columnName
464+
ttl.ColumnUnit = unitToPointer(TimeToLiveUnitSeconds)
465+
return ttl
466+
}
467+
468+
func (ttl TimeToLiveSettings) ColumnMilliseconds(columnName string) TimeToLiveSettings {
469+
ttl.Mode = TimeToLiveModeValueSinceUnixEpoch
470+
ttl.ColumnName = columnName
471+
ttl.ColumnUnit = unitToPointer(TimeToLiveUnitMilliseconds)
472+
return ttl
473+
}
474+
475+
func (ttl TimeToLiveSettings) ColumnMicroseconds(columnName string) TimeToLiveSettings {
476+
ttl.Mode = TimeToLiveModeValueSinceUnixEpoch
477+
ttl.ColumnName = columnName
478+
ttl.ColumnUnit = unitToPointer(TimeToLiveUnitMicroseconds)
479+
return ttl
480+
}
481+
482+
func (ttl TimeToLiveSettings) ColumnNanoseconds(columnName string) TimeToLiveSettings {
483+
ttl.Mode = TimeToLiveModeValueSinceUnixEpoch
484+
ttl.ColumnName = columnName
485+
ttl.ColumnUnit = unitToPointer(TimeToLiveUnitNanoseconds)
486+
return ttl
487+
}
488+
489+
func (ttl TimeToLiveSettings) ExpireAfter(expireAfter time.Duration) TimeToLiveSettings {
490+
ttl.ExpireAfterSeconds = uint32(expireAfter.Seconds())
491+
return ttl
492+
}
493+
445494
func (ttl *TimeToLiveSettings) ToYDB() *Ydb_Table.TtlSettings {
446495
if ttl == nil {
447496
return nil
@@ -469,29 +518,6 @@ func (ttl *TimeToLiveSettings) ToYDB() *Ydb_Table.TtlSettings {
469518
}
470519
}
471520

472-
func NewTimeToLiveSettings(settings *Ydb_Table.TtlSettings) *TimeToLiveSettings {
473-
if settings == nil {
474-
return nil
475-
}
476-
switch mode := settings.Mode.(type) {
477-
case *Ydb_Table.TtlSettings_DateTypeColumn:
478-
return &TimeToLiveSettings{
479-
ColumnName: mode.DateTypeColumn.ColumnName,
480-
ExpireAfterSeconds: mode.DateTypeColumn.ExpireAfterSeconds,
481-
Mode: TimeToLiveModeDateType,
482-
}
483-
484-
case *Ydb_Table.TtlSettings_ValueSinceUnixEpoch:
485-
return &TimeToLiveSettings{
486-
ColumnName: mode.ValueSinceUnixEpoch.ColumnName,
487-
ColumnUnit: timeToLiveUnit(mode.ValueSinceUnixEpoch.ColumnUnit),
488-
ExpireAfterSeconds: mode.ValueSinceUnixEpoch.ExpireAfterSeconds,
489-
Mode: TimeToLiveModeValueSinceUnixEpoch,
490-
}
491-
}
492-
return nil
493-
}
494-
495521
type TimeToLiveUnit int32
496522

497523
const (
@@ -522,25 +548,6 @@ func (unit *TimeToLiveUnit) ToYDB() Ydb_Table.ValueSinceUnixEpochModeSettings_Un
522548
}
523549
}
524550

525-
func timeToLiveUnit(unit Ydb_Table.ValueSinceUnixEpochModeSettings_Unit) *TimeToLiveUnit {
526-
var res TimeToLiveUnit
527-
switch unit {
528-
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_SECONDS:
529-
res = TimeToLiveUnitSeconds
530-
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_MILLISECONDS:
531-
res = TimeToLiveUnitMilliseconds
532-
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_MICROSECONDS:
533-
res = TimeToLiveUnitMicroseconds
534-
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_NANOSECONDS:
535-
res = TimeToLiveUnitNanoseconds
536-
case Ydb_Table.ValueSinceUnixEpochModeSettings_UNIT_UNSPECIFIED:
537-
res = TimeToLiveUnitUnspecified
538-
default:
539-
panic("ydb: unknown Ydb unit for value since epoch")
540-
}
541-
return &res
542-
}
543-
544551
type ChangefeedDescription struct {
545552
Name string
546553
Mode ChangefeedMode

table/options/models_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package options
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestTimeToLiveSettingsFluentModifiers(t *testing.T) {
11+
for _, tt := range []struct {
12+
fluentSettings TimeToLiveSettings
13+
expectedSettings TimeToLiveSettings
14+
}{
15+
{
16+
fluentSettings: NewTTLSettings().
17+
ColumnDateType("a").
18+
ExpireAfter(time.Hour),
19+
expectedSettings: TimeToLiveSettings{
20+
ColumnName: "a",
21+
Mode: TimeToLiveModeDateType,
22+
ExpireAfterSeconds: uint32(time.Hour.Seconds()),
23+
},
24+
},
25+
{
26+
fluentSettings: NewTTLSettings().
27+
ColumnSeconds("a").
28+
ExpireAfter(time.Hour),
29+
expectedSettings: TimeToLiveSettings{
30+
ColumnName: "a",
31+
Mode: TimeToLiveModeValueSinceUnixEpoch,
32+
ExpireAfterSeconds: uint32(time.Hour.Seconds()),
33+
ColumnUnit: unitToPointer(TimeToLiveUnitSeconds),
34+
},
35+
},
36+
{
37+
fluentSettings: NewTTLSettings().
38+
ColumnMilliseconds("a").
39+
ExpireAfter(time.Hour),
40+
expectedSettings: TimeToLiveSettings{
41+
ColumnName: "a",
42+
Mode: TimeToLiveModeValueSinceUnixEpoch,
43+
ExpireAfterSeconds: uint32(time.Hour.Seconds()),
44+
ColumnUnit: unitToPointer(TimeToLiveUnitMilliseconds),
45+
},
46+
},
47+
{
48+
fluentSettings: NewTTLSettings().
49+
ColumnMicroseconds("a").
50+
ExpireAfter(time.Hour),
51+
expectedSettings: TimeToLiveSettings{
52+
ColumnName: "a",
53+
Mode: TimeToLiveModeValueSinceUnixEpoch,
54+
ExpireAfterSeconds: uint32(time.Hour.Seconds()),
55+
ColumnUnit: unitToPointer(TimeToLiveUnitMicroseconds),
56+
},
57+
},
58+
{
59+
fluentSettings: NewTTLSettings().
60+
ColumnNanoseconds("a").
61+
ExpireAfter(time.Hour),
62+
expectedSettings: TimeToLiveSettings{
63+
ColumnName: "a",
64+
Mode: TimeToLiveModeValueSinceUnixEpoch,
65+
ExpireAfterSeconds: uint32(time.Hour.Seconds()),
66+
ColumnUnit: unitToPointer(TimeToLiveUnitNanoseconds),
67+
},
68+
},
69+
} {
70+
t.Run("", func(t *testing.T) {
71+
require.Equal(t, tt.fluentSettings, tt.expectedSettings)
72+
})
73+
}
74+
}

0 commit comments

Comments
 (0)