@@ -105,42 +105,36 @@ bool TTtlSettings::TryParse(const NNodes::TCoNameValueTupleList& node, TTtlSetti
105105 if (name == " columnName" ) {
106106 YQL_ENSURE (field.Value ().Maybe <TCoAtom>());
107107 settings.ColumnName = field.Value ().Cast <TCoAtom>().StringValue ();
108- } else if (name == " expireAfter" ) {
109- // TODO (yentsovsemyon): remove this clause after extending TTL syntax in YQL
110- YQL_ENSURE (field.Value ().Maybe <TCoInterval>());
111- auto value = FromString<i64 >(field.Value ().Cast <TCoInterval>().Literal ().Value ());
112- if (value < 0 ) {
113- error = " Interval value cannot be negative" ;
114- return false ;
115- }
116-
117- settings.ExpireAfter = TDuration::FromValue (value);
118108 } else if (name == " tiers" ) {
119109 YQL_ENSURE (field.Value ().Maybe <TExprList>());
120110 auto listNode = field.Value ().Cast <TExprList>();
121111
122112 for (size_t i = 0 ; i < listNode.Size (); ++i) {
123113 auto tierNode = listNode.Item (i);
124114
115+ std::optional<TString> storageName;
116+ TDuration evictionDelay;
125117 YQL_ENSURE (tierNode.Maybe <TCoNameValueTupleList>());
126118 for (const auto & tierField : tierNode.Cast <TCoNameValueTupleList>()) {
127119 auto tierFieldName = tierField.Name ().Value ();
128120 if (tierFieldName == " storageName" ) {
129- error = " TTL cannot contain tiered storage: tiering in TTL syntax is not supported " ;
130- return false ;
121+ YQL_ENSURE (tierField. Value (). Maybe <TCoAtom>()) ;
122+ storageName = tierField. Value (). Cast <TCoAtom>(). StringValue () ;
131123 } else if (tierFieldName == " evictionDelay" ) {
132124 YQL_ENSURE (tierField.Value ().Maybe <TCoInterval>());
133125 auto value = FromString<i64 >(tierField.Value ().Cast <TCoInterval>().Literal ().Value ());
134126 if (value < 0 ) {
135127 error = " Interval value cannot be negative" ;
136128 return false ;
137129 }
138- settings. ExpireAfter = TDuration::FromValue (value);
130+ evictionDelay = TDuration::FromValue (value);
139131 } else {
140132 error = TStringBuilder () << " Unknown field: " << tierFieldName;
141133 return false ;
142134 }
143135 }
136+
137+ settings.Tiers .emplace_back (evictionDelay, storageName);
144138 }
145139 } else if (name == " columnUnit" ) {
146140 YQL_ENSURE (field.Value ().Maybe <TCoAtom>());
@@ -322,9 +316,15 @@ void ConvertTtlSettingsToProto(const NYql::TTtlSettings& settings, Ydb::Table::T
322316 opts.set_column_name (settings.ColumnName );
323317 opts.set_column_unit (static_cast <Ydb::Table::ValueSinceUnixEpochModeSettings::Unit>(*settings.ColumnUnit ));
324318 }
325- auto * deleteTier = proto.add_tiers ();
326- deleteTier->set_apply_after_seconds (settings.ExpireAfter .Seconds ());
327- deleteTier->mutable_delete_ ();
319+ for (const auto & tier : settings.Tiers ) {
320+ auto * tierProto = proto.add_tiers ();
321+ tierProto->set_apply_after_seconds (tier.ApplyAfter .Seconds ());
322+ if (tier.StorageName ) {
323+ tierProto->mutable_evict_to_external_storage ()->set_storage_name (*tier.StorageName );
324+ } else {
325+ tierProto->mutable_delete_ ();
326+ }
327+ }
328328}
329329
330330Ydb::FeatureFlag::Status GetFlagValue (const TMaybe<bool >& value) {
0 commit comments