2020-05-21 19:07:18 +00:00
|
|
|
#include <Storages/StorageInMemoryMetadata.h>
|
|
|
|
|
2020-02-14 13:17:50 +00:00
|
|
|
namespace DB
|
|
|
|
{
|
2020-05-21 19:07:18 +00:00
|
|
|
|
2020-02-14 13:17:50 +00:00
|
|
|
StorageInMemoryMetadata::StorageInMemoryMetadata(
|
|
|
|
const ColumnsDescription & columns_,
|
2020-06-01 12:11:23 +00:00
|
|
|
const IndicesDescription & secondary_indices_,
|
2020-02-14 13:17:50 +00:00
|
|
|
const ConstraintsDescription & constraints_)
|
|
|
|
: columns(columns_)
|
2020-06-01 12:11:23 +00:00
|
|
|
, secondary_indices(secondary_indices_)
|
2020-02-14 13:17:50 +00:00
|
|
|
, constraints(constraints_)
|
|
|
|
{
|
|
|
|
}
|
2020-06-08 14:18:38 +00:00
|
|
|
|
|
|
|
StorageInMemoryMetadata::StorageInMemoryMetadata(const StorageInMemoryMetadata & other)
|
|
|
|
: columns(other.columns)
|
|
|
|
, secondary_indices(other.secondary_indices)
|
|
|
|
, constraints(other.constraints)
|
|
|
|
, partition_key(other.partition_key)
|
|
|
|
, primary_key(other.primary_key)
|
|
|
|
, sorting_key(other.sorting_key)
|
|
|
|
, sampling_key(other.sampling_key)
|
|
|
|
, column_ttls_by_name(other.column_ttls_by_name)
|
|
|
|
, table_ttl(other.table_ttl)
|
|
|
|
, settings_changes(other.settings_changes ? other.settings_changes->clone() : nullptr)
|
|
|
|
, select(other.select)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
StorageInMemoryMetadata & StorageInMemoryMetadata::operator=(const StorageInMemoryMetadata & other)
|
|
|
|
{
|
2020-06-09 17:42:04 +00:00
|
|
|
if (&other == this)
|
|
|
|
return *this;
|
|
|
|
|
2020-06-08 14:18:38 +00:00
|
|
|
columns = other.columns;
|
|
|
|
secondary_indices = other.secondary_indices;
|
|
|
|
constraints = other.constraints;
|
|
|
|
partition_key = other.partition_key;
|
|
|
|
primary_key = other.primary_key;
|
|
|
|
sorting_key = other.sorting_key;
|
|
|
|
sampling_key = other.sampling_key;
|
|
|
|
column_ttls_by_name = other.column_ttls_by_name;
|
|
|
|
table_ttl = other.table_ttl;
|
|
|
|
if (other.settings_changes)
|
|
|
|
settings_changes = other.settings_changes->clone();
|
|
|
|
else
|
|
|
|
settings_changes.reset();
|
|
|
|
select = other.select;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2020-06-12 09:37:52 +00:00
|
|
|
|
2020-06-15 16:55:33 +00:00
|
|
|
void StorageInMemoryMetadata::setColumns(ColumnsDescription columns_)
|
|
|
|
{
|
|
|
|
columns = std::move(columns_);
|
|
|
|
}
|
|
|
|
|
|
|
|
void StorageInMemoryMetadata::setSecondaryIndices(IndicesDescription secondary_indices_)
|
|
|
|
{
|
|
|
|
secondary_indices = std::move(secondary_indices_);
|
|
|
|
}
|
|
|
|
|
|
|
|
void StorageInMemoryMetadata::setConstraints(ConstraintsDescription constraints_)
|
|
|
|
{
|
|
|
|
constraints = std::move(constraints_);
|
|
|
|
}
|
|
|
|
|
2020-06-15 17:50:53 +00:00
|
|
|
void StorageInMemoryMetadata::setTableTTLs(const TTLTableDescription & table_ttl_)
|
|
|
|
{
|
|
|
|
table_ttl = table_ttl_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void StorageInMemoryMetadata::setColumnTTLs(const TTLColumnsDescription & column_ttls_by_name_)
|
|
|
|
{
|
|
|
|
column_ttls_by_name = column_ttls_by_name_;
|
|
|
|
}
|
|
|
|
|
2020-06-15 18:08:05 +00:00
|
|
|
void StorageInMemoryMetadata::setSettingsChanges(const ASTPtr & settings_changes_)
|
|
|
|
{
|
|
|
|
if (settings_changes_)
|
|
|
|
settings_changes = settings_changes_;
|
|
|
|
else
|
|
|
|
settings_changes = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void StorageInMemoryMetadata::setSelectQuery(const SelectQueryDescription & select_)
|
|
|
|
{
|
|
|
|
select = select_;
|
|
|
|
}
|
|
|
|
|
2020-06-16 12:03:27 +00:00
|
|
|
const ColumnsDescription & StorageInMemoryMetadata::getColumns() const
|
|
|
|
{
|
|
|
|
return columns;
|
|
|
|
}
|
|
|
|
|
|
|
|
const IndicesDescription & StorageInMemoryMetadata::getSecondaryIndices() const
|
|
|
|
{
|
|
|
|
return secondary_indices;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool StorageInMemoryMetadata::hasSecondaryIndices() const
|
|
|
|
{
|
|
|
|
return !secondary_indices.empty();
|
|
|
|
}
|
|
|
|
|
|
|
|
const ConstraintsDescription & StorageInMemoryMetadata::getConstraints() const
|
|
|
|
{
|
|
|
|
return constraints;
|
|
|
|
}
|
|
|
|
|
|
|
|
TTLTableDescription StorageInMemoryMetadata::getTableTTLs() const
|
|
|
|
{
|
|
|
|
return table_ttl;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool StorageInMemoryMetadata::hasAnyTableTTL() const
|
|
|
|
{
|
|
|
|
return hasAnyMoveTTL() || hasRowsTTL();
|
|
|
|
}
|
|
|
|
|
|
|
|
TTLColumnsDescription StorageInMemoryMetadata::getColumnTTLs() const
|
|
|
|
{
|
|
|
|
return column_ttls_by_name;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool StorageInMemoryMetadata::hasAnyColumnTTL() const
|
|
|
|
{
|
|
|
|
return !column_ttls_by_name.empty();
|
|
|
|
}
|
|
|
|
|
|
|
|
TTLDescription StorageInMemoryMetadata::getRowsTTL() const
|
|
|
|
{
|
|
|
|
return table_ttl.rows_ttl;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool StorageInMemoryMetadata::hasRowsTTL() const
|
|
|
|
{
|
|
|
|
return table_ttl.rows_ttl.expression != nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
TTLDescriptions StorageInMemoryMetadata::getMoveTTLs() const
|
|
|
|
{
|
|
|
|
return table_ttl.move_ttl;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool StorageInMemoryMetadata::hasAnyMoveTTL() const
|
|
|
|
{
|
|
|
|
return !table_ttl.move_ttl.empty();
|
|
|
|
}
|
|
|
|
|
|
|
|
ColumnDependencies StorageInMemoryMetadata::getColumnDependencies(const NameSet & updated_columns) const
|
|
|
|
{
|
|
|
|
if (updated_columns.empty())
|
|
|
|
return {};
|
|
|
|
|
|
|
|
ColumnDependencies res;
|
|
|
|
|
|
|
|
NameSet indices_columns;
|
|
|
|
NameSet required_ttl_columns;
|
|
|
|
NameSet updated_ttl_columns;
|
|
|
|
|
|
|
|
auto add_dependent_columns = [&updated_columns](const auto & expression, auto & to_set)
|
|
|
|
{
|
|
|
|
auto requiered_columns = expression->getRequiredColumns();
|
|
|
|
for (const auto & dependency : requiered_columns)
|
|
|
|
{
|
|
|
|
if (updated_columns.count(dependency))
|
|
|
|
{
|
|
|
|
to_set.insert(requiered_columns.begin(), requiered_columns.end());
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
for (const auto & index : getSecondaryIndices())
|
|
|
|
add_dependent_columns(index.expression, indices_columns);
|
|
|
|
|
|
|
|
if (hasRowsTTL())
|
|
|
|
{
|
|
|
|
auto rows_expression = getRowsTTL().expression;
|
|
|
|
if (add_dependent_columns(rows_expression, required_ttl_columns))
|
|
|
|
{
|
|
|
|
/// Filter all columns, if rows TTL expression have to be recalculated.
|
|
|
|
for (const auto & column : getColumns().getAllPhysical())
|
|
|
|
updated_ttl_columns.insert(column.name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const auto & [name, entry] : getColumnTTLs())
|
|
|
|
{
|
|
|
|
if (add_dependent_columns(entry.expression, required_ttl_columns))
|
|
|
|
updated_ttl_columns.insert(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const auto & entry : getMoveTTLs())
|
|
|
|
add_dependent_columns(entry.expression, required_ttl_columns);
|
|
|
|
|
|
|
|
for (const auto & column : indices_columns)
|
|
|
|
res.emplace(column, ColumnDependency::SKIP_INDEX);
|
|
|
|
for (const auto & column : required_ttl_columns)
|
|
|
|
res.emplace(column, ColumnDependency::TTL_EXPRESSION);
|
|
|
|
for (const auto & column : updated_ttl_columns)
|
|
|
|
res.emplace(column, ColumnDependency::TTL_TARGET);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-06-16 12:48:10 +00:00
|
|
|
Block StorageInMemoryMetadata::getSampleBlockNonMaterialized() const
|
|
|
|
{
|
|
|
|
Block res;
|
|
|
|
|
|
|
|
for (const auto & column : getColumns().getOrdinary())
|
|
|
|
res.insert({column.type->createColumn(), column.type, column.name});
|
2020-06-16 12:03:27 +00:00
|
|
|
|
2020-06-16 12:48:10 +00:00
|
|
|
return res;
|
|
|
|
}
|
2020-02-14 13:17:50 +00:00
|
|
|
}
|