@@ -327,7 +327,7 @@ class TTableDescription::TImpl {
327327 }
328328
329329 // ttl settings
330- if (auto ttlSettings = TTtlSettings::DeserializeFromProto (proto.ttl_settings ())) {
330+ if (auto ttlSettings = TTtlSettings::FromProto (proto.ttl_settings ())) {
331331 TtlSettings_ = std::move (*ttlSettings);
332332 }
333333
@@ -2913,8 +2913,8 @@ bool operator!=(const TChangefeedDescription& lhs, const TChangefeedDescription&
29132913
29142914TTtlTierSettings::TTtlTierSettings (TDuration evictionDelay, const TAction& action)
29152915 : ApplyAfter_(evictionDelay)
2916- , Action_(action) {
2917- }
2916+ , Action_(action)
2917+ { }
29182918
29192919TTtlTierSettings::TTtlTierSettings (const Ydb::Table::TtlTier& tier)
29202920 : ApplyAfter_(TDuration::Seconds(tier.apply_after_seconds())) {
@@ -3078,42 +3078,55 @@ const TValueSinceUnixEpochModeSettings& TTtlSettings::GetValueSinceUnixEpoch() c
30783078 return std::get<TValueSinceUnixEpochModeSettings>(Mode_);
30793079}
30803080
3081- std::optional<TTtlSettings> TTtlSettings::DeserializeFromProto (const Ydb::Table::TtlSettings& proto) {
3082- TDuration legacyExpireAfter = TDuration::Max () ;
3081+ std::optional<TTtlSettings> TTtlSettings::FromProto (const Ydb::Table::TtlSettings& proto) {
3082+ TVector<TTtlTierSettings> tiers ;
30833083 for (const auto & tier : proto.tiers ()) {
3084- if (tier.has_delete_ ()) {
3085- legacyExpireAfter = TDuration::Seconds (tier.apply_after_seconds ());
3086- break ;
3087- }
3084+ tiers.emplace_back (tier);
30883085 }
3086+ TDuration legacyExpireAfter = GetExpireAfterFrom (tiers).value_or (TDuration::Max ());
30893087
30903088 switch (proto.mode_case ()) {
30913089 case Ydb::Table::TtlSettings::kDateTypeColumn :
30923090 return TTtlSettings (proto.date_type_column (), proto.run_interval_seconds ());
30933091 case Ydb::Table::TtlSettings::kValueSinceUnixEpoch :
30943092 return TTtlSettings (proto.value_since_unix_epoch (), proto.run_interval_seconds ());
30953093 case Ydb::Table::TtlSettings::kDateTypeColumnV1 :
3096- return TTtlSettings (TDateTypeColumnModeSettings (proto.date_type_column_v1 ().column_name (), legacyExpireAfter), proto.run_interval_seconds ());
3094+ return TTtlSettings (
3095+ TDateTypeColumnModeSettings (proto.date_type_column_v1 ().column_name (), legacyExpireAfter), tiers, proto.run_interval_seconds ());
30973096 case Ydb::Table::TtlSettings::kValueSinceUnixEpochV1 :
3098- return TTtlSettings (TValueSinceUnixEpochModeSettings (proto.value_since_unix_epoch_v1 ().column_name (), TProtoAccessor::FromProto (proto.value_since_unix_epoch_v1 ().column_unit ()), legacyExpireAfter), proto.run_interval_seconds ());
3097+ return TTtlSettings (TValueSinceUnixEpochModeSettings (proto.value_since_unix_epoch_v1 ().column_name (),
3098+ TProtoAccessor::FromProto (proto.value_since_unix_epoch_v1 ().column_unit ()), legacyExpireAfter),
3099+ tiers, proto.run_interval_seconds ());
30993100 case Ydb::Table::TtlSettings::MODE_NOT_SET:
31003101 return std::nullopt ;
31013102 break ;
31023103 }
31033104}
31043105
31053106void TTtlSettings::SerializeTo (Ydb::Table::TtlSettings& proto) const {
3106- switch (GetMode ()) {
3107- case EMode::DateTypeColumn:
3108- GetDateTypeColumn ().SerializeTo (*proto.mutable_date_type_column_v1 ());
3109- break ;
3110- case EMode::ValueSinceUnixEpoch:
3111- GetValueSinceUnixEpoch ().SerializeTo (*proto.mutable_value_since_unix_epoch_v1 ());
3112- break ;
3113- }
3107+ if (Tiers_.size () == 1 && std::holds_alternative<TTtlDeleteAction>(Tiers_.back ().GetAction ())) {
3108+ // serialize DELETE-only TTL to legacy format for backwards-compatibility
3109+ switch (GetMode ()) {
3110+ case EMode::DateTypeColumn:
3111+ GetDateTypeColumn ().SerializeTo (*proto.mutable_date_type_column ());
3112+ break ;
3113+ case EMode::ValueSinceUnixEpoch:
3114+ GetValueSinceUnixEpoch ().SerializeTo (*proto.mutable_value_since_unix_epoch ());
3115+ break ;
3116+ }
3117+ } else {
3118+ switch (GetMode ()) {
3119+ case EMode::DateTypeColumn:
3120+ GetDateTypeColumn ().SerializeTo (*proto.mutable_date_type_column_v1 ());
3121+ break ;
3122+ case EMode::ValueSinceUnixEpoch:
3123+ GetValueSinceUnixEpoch ().SerializeTo (*proto.mutable_value_since_unix_epoch_v1 ());
3124+ break ;
3125+ }
31143126
3115- for (const auto & tier : Tiers_) {
3116- tier.SerializeTo (*proto.add_tiers ());
3127+ for (const auto & tier : Tiers_) {
3128+ tier.SerializeTo (*proto.add_tiers ());
3129+ }
31173130 }
31183131
31193132 if (RunInterval_) {
@@ -3151,7 +3164,11 @@ std::optional<TDuration> TTtlSettings::GetExpireAfterFrom(const TVector<TTtlTier
31513164 return std::nullopt ;
31523165}
31533166
3154- TTtlSettings::TTtlSettings (TMode mode, ui32 runIntervalSeconds) : Mode_(std::move(mode)), RunInterval_(TDuration::Seconds(runIntervalSeconds)) {}
3167+ TTtlSettings::TTtlSettings (TMode mode, const TVector<TTtlTierSettings>& tiers, ui32 runIntervalSeconds)
3168+ : Mode_(std::move(mode))
3169+ , Tiers_(tiers)
3170+ , RunInterval_(TDuration::Seconds(runIntervalSeconds))
3171+ {}
31553172
31563173TAlterTtlSettings::EAction TAlterTtlSettings::GetAction () const {
31573174 return static_cast <EAction>(Action_.index ());
0 commit comments