@@ -101,42 +101,36 @@ bool TTtlSettings::TryParse(const NNodes::TCoNameValueTupleList& node, TTtlSetti
101101 if (name == " columnName" ) {
102102 YQL_ENSURE (field.Value ().Maybe <TCoAtom>());
103103 settings.ColumnName = field.Value ().Cast <TCoAtom>().StringValue ();
104- } else if (name == " expireAfter" ) {
105- // TODO (yentsovsemyon): remove this clause after extending TTL syntax in YQL
106- YQL_ENSURE (field.Value ().Maybe <TCoInterval>());
107- auto value = FromString<i64 >(field.Value ().Cast <TCoInterval>().Literal ().Value ());
108- if (value < 0 ) {
109- error = " Interval value cannot be negative" ;
110- return false ;
111- }
112-
113- settings.ExpireAfter = TDuration::FromValue (value);
114104 } else if (name == " tiers" ) {
115105 YQL_ENSURE (field.Value ().Maybe <TExprList>());
116106 auto listNode = field.Value ().Cast <TExprList>();
117107
118108 for (size_t i = 0 ; i < listNode.Size (); ++i) {
119109 auto tierNode = listNode.Item (i);
120110
111+ std::optional<TString> storageName;
112+ TDuration evictionDelay;
121113 YQL_ENSURE (tierNode.Maybe <TCoNameValueTupleList>());
122114 for (const auto & tierField : tierNode.Cast <TCoNameValueTupleList>()) {
123115 auto tierFieldName = tierField.Name ().Value ();
124116 if (tierFieldName == " storageName" ) {
125- error = " TTL cannot contain tiered storage: tiering in TTL syntax is not supported " ;
126- return false ;
117+ YQL_ENSURE (tierField. Value (). Maybe <TCoAtom>()) ;
118+ storageName = tierField. Value (). Cast <TCoAtom>(). StringValue () ;
127119 } else if (tierFieldName == " evictionDelay" ) {
128120 YQL_ENSURE (tierField.Value ().Maybe <TCoInterval>());
129121 auto value = FromString<i64 >(tierField.Value ().Cast <TCoInterval>().Literal ().Value ());
130122 if (value < 0 ) {
131123 error = " Interval value cannot be negative" ;
132124 return false ;
133125 }
134- settings. ExpireAfter = TDuration::FromValue (value);
126+ evictionDelay = TDuration::FromValue (value);
135127 } else {
136128 error = TStringBuilder () << " Unknown field: " << tierFieldName;
137129 return false ;
138130 }
139131 }
132+
133+ settings.Tiers .emplace_back (evictionDelay, storageName);
140134 }
141135 } else if (name == " columnUnit" ) {
142136 YQL_ENSURE (field.Value ().Maybe <TCoAtom>());
@@ -318,9 +312,15 @@ void ConvertTtlSettingsToProto(const NYql::TTtlSettings& settings, Ydb::Table::T
318312 opts.set_column_name (settings.ColumnName );
319313 opts.set_column_unit (static_cast <Ydb::Table::ValueSinceUnixEpochModeSettings::Unit>(*settings.ColumnUnit ));
320314 }
321- auto * deleteTier = proto.add_tiers ();
322- deleteTier->set_apply_after_seconds (settings.ExpireAfter .Seconds ());
323- deleteTier->mutable_delete_ ();
315+ for (const auto & tier : settings.Tiers ) {
316+ auto * tierProto = proto.add_tiers ();
317+ tierProto->set_apply_after_seconds (tier.ApplyAfter .Seconds ());
318+ if (tier.StorageName ) {
319+ tierProto->mutable_evict_to_external_storage ()->set_storage_name (*tier.StorageName );
320+ } else {
321+ tierProto->mutable_delete_ ();
322+ }
323+ }
324324}
325325
326326Ydb::FeatureFlag::Status GetFlagValue (const TMaybe<bool >& value) {
0 commit comments