Просмотр исходного кода

Per-row TTL for sorted dynamic tables
6244e15f700772bccc350135ee7cd1cf01c281df

alexelexa 11 месяцев назад
Родитель
Сommit
d2d971701b

+ 1 - 0
yt/yt/client/table_client/public.cpp

@@ -12,6 +12,7 @@ const TString RowIndexColumnName = SystemColumnNamePrefix + "row_index";
 const TString RangeIndexColumnName = SystemColumnNamePrefix + "range_index";
 const TString TabletIndexColumnName = SystemColumnNamePrefix + "tablet_index";
 const TString TimestampColumnName = SystemColumnNamePrefix + "timestamp";
+const TString TtlColumnName = SystemColumnNamePrefix + "ttl";
 const TString CumulativeDataWeightColumnName = SystemColumnNamePrefix + "cumulative_data_weight";
 const TString EmptyValueColumnName = SystemColumnNamePrefix + "empty";
 

+ 1 - 0
yt/yt/client/table_client/public.h

@@ -120,6 +120,7 @@ extern const TString RowIndexColumnName;
 extern const TString RangeIndexColumnName;
 extern const TString TabletIndexColumnName;
 extern const TString TimestampColumnName;
+extern const TString TtlColumnName;
 extern const TString CumulativeDataWeightColumnName;
 extern const TString EmptyValueColumnName;
 extern const TString PrimaryLockName;

+ 47 - 0
yt/yt/client/table_client/schema.cpp

@@ -689,6 +689,11 @@ bool TTableSchema::HasTimestampColumn() const
     return FindColumn(TimestampColumnName);
 }
 
+bool TTableSchema::HasTtlColumn() const
+{
+    return FindColumn(TtlColumnName);
+}
+
 bool TTableSchema::IsSorted() const
 {
     return KeyColumnCount_ > 0;
@@ -711,6 +716,15 @@ bool TTableSchema::IsEmpty() const
     return Columns().empty();
 }
 
+std::optional<int> TTableSchema::GetTtlColumnIndex() const
+{
+    auto* column = FindColumn(TtlColumnName);
+    if (!column) {
+        return std::nullopt;
+    }
+    return GetColumnIndex(*column);
+}
+
 TKeyColumns TTableSchema::GetKeyColumnNames() const
 {
     TKeyColumns keyColumns;
@@ -1498,6 +1512,7 @@ void ValidateSystemColumnSchema(
 {
     static const auto allowedSortedTablesSystemColumns = THashMap<TString, ESimpleLogicalValueType>{
         {EmptyValueColumnName, ESimpleLogicalValueType::Int64},
+        {TtlColumnName, ESimpleLogicalValueType::Uint64},
     };
 
     static const auto allowedOrderedTablesSystemColumns = THashMap<TString, ESimpleLogicalValueType>{
@@ -1833,6 +1848,37 @@ void ValidateTimestampColumn(const TTableSchema& schema)
     }
 }
 
+//! Validates |$ttl| column, if any.
+/*!
+ *  Validate that:
+ *  - |$ttl| column cannot be a part of key.
+ *  - |$ttl| column can only be present in sorted tables.
+ *  - |$ttl| column has type |uint64|.
+ */
+void ValidateTtlColumn(const TTableSchema& schema)
+{
+    auto* column = schema.FindColumn(TtlColumnName);
+    if (!column) {
+        return;
+    }
+
+    if (column->SortOrder()) {
+        THROW_ERROR_EXCEPTION("Column %Qv cannot be a part of key",
+            TtlColumnName);
+    }
+
+    if (!column->IsOfV1Type(ESimpleLogicalValueType::Uint64)) {
+        THROW_ERROR_EXCEPTION("Column %Qv must have %Qlv type",
+            TtlColumnName,
+            EValueType::Uint64);
+    }
+
+    if (!schema.IsSorted()) {
+        THROW_ERROR_EXCEPTION("Column %Qv cannot appear in an ordered table",
+            TtlColumnName);
+    }
+}
+
 //! Validates |$cumulative_data_weight| column, if any.
 /*!
  *  Validate that:
@@ -1897,6 +1943,7 @@ void ValidateTableSchema(const TTableSchema& schema, bool isTableDynamic, bool a
     ValidateLocks(schema);
     ValidateKeyColumnsFormPrefix(schema);
     ValidateTimestampColumn(schema);
+    ValidateTtlColumn(schema);
     ValidateCumulativeDataWeightColumn(schema);
     ValidateSchemaAttributes(schema);
     if (isTableDynamic) {

+ 3 - 0
yt/yt/client/table_client/schema.h

@@ -278,11 +278,14 @@ public:
     bool HasAggregateColumns() const;
     bool HasHunkColumns() const;
     bool HasTimestampColumn() const;
+    bool HasTtlColumn() const;
     bool IsSorted() const;
     bool IsUniqueKeys() const;
     bool HasRenamedColumns() const;
     bool IsEmpty() const;
 
+    std::optional<int> GetTtlColumnIndex() const;
+
     std::vector<TColumnStableName> GetKeyColumnStableNames() const;
     TKeyColumns GetKeyColumnNames() const;
     TKeyColumns GetKeyColumns() const;