Remove redundant parts from MergeTree

This commit is contained in:
alesapin 2020-06-01 15:39:20 +03:00
parent b49be4c7f2
commit e0e77194f4
4 changed files with 35 additions and 27 deletions

View File

@ -422,9 +422,6 @@ void MergeTreeData::setProperties(const StorageInMemoryMetadata & metadata, bool
new_sorting_key_data_types.push_back(new_sorting_key_sample.getByPosition(i).type);
}
ASTPtr skip_indices_with_primary_key_expr_list = new_primary_key_expr_list->clone();
ASTPtr skip_indices_with_sorting_key_expr_list = new_sorting_key_expr_list->clone();
if (!metadata.secondary_indices.empty())
{
std::set<String> indices_names;
@ -439,24 +436,9 @@ void MergeTreeData::setProperties(const StorageInMemoryMetadata & metadata, bool
"Index with name " + backQuote(index.name) + " already exsists",
ErrorCodes::LOGICAL_ERROR);
for (const auto & expr : index.expression_list_ast->children)
{
skip_indices_with_primary_key_expr_list->children.push_back(expr->clone());
skip_indices_with_sorting_key_expr_list->children.push_back(expr->clone());
}
indices_names.insert(index.name);
}
}
auto syntax_primary = SyntaxAnalyzer(global_context).analyze(
skip_indices_with_primary_key_expr_list, all_columns);
auto new_indices_with_primary_key_expr = ExpressionAnalyzer(
skip_indices_with_primary_key_expr_list, syntax_primary, global_context).getActions(false);
auto syntax_sorting = SyntaxAnalyzer(global_context).analyze(
skip_indices_with_sorting_key_expr_list, all_columns);
auto new_indices_with_sorting_key_expr = ExpressionAnalyzer(
skip_indices_with_sorting_key_expr_list, syntax_sorting, global_context).getActions(false);
if (!only_check)
{
@ -483,12 +465,39 @@ void MergeTreeData::setProperties(const StorageInMemoryMetadata & metadata, bool
setSecondaryIndices(metadata.secondary_indices);
setConstraints(metadata.constraints);
primary_key_and_skip_indices_expr = new_indices_with_primary_key_expr;
sorting_key_and_skip_indices_expr = new_indices_with_sorting_key_expr;
}
}
namespace
{
ExpressionActionsPtr getCombinedIndicesExpression(
const StorageMetadataKeyField & key,
const IndicesDescription & indices,
const ColumnsDescription & columns,
const Context & context)
{
ASTPtr combined_expr_list = key.expression_list_ast->clone();
for (const auto & index : indices)
for (const auto & index_expr : index.expression_list_ast->children)
combined_expr_list->children.push_back(index_expr->clone());
auto syntax_result = SyntaxAnalyzer(context).analyze(combined_expr_list, columns.getAllPhysical());
return ExpressionAnalyzer(combined_expr_list, syntax_result, context).getActions(false);
}
}
ExpressionActionsPtr MergeTreeData::getPrimaryKeyAndSkipIndicesExpression() const
{
return getCombinedIndicesExpression(getPrimaryKey(), getSecondaryIndices(), getColumns(), global_context);
}
ExpressionActionsPtr MergeTreeData::getSortingKeyAndSkipIndicesExpression() const
{
return getCombinedIndicesExpression(getSortingKey(), getSecondaryIndices(), getColumns(), global_context);
}
ASTPtr MergeTreeData::extractKeyExpressionList(const ASTPtr & node)
{

View File

@ -641,9 +641,8 @@ public:
Int64 minmax_idx_date_column_pos = -1; /// In a common case minmax index includes a date column.
Int64 minmax_idx_time_column_pos = -1; /// In other cases, minmax index often includes a dateTime column.
/// TODO (alesap) generate this expressions on fly
ExpressionActionsPtr primary_key_and_skip_indices_expr;
ExpressionActionsPtr sorting_key_and_skip_indices_expr;
ExpressionActionsPtr getPrimaryKeyAndSkipIndicesExpression() const;
ExpressionActionsPtr getSortingKeyAndSkipIndicesExpression() const;
std::optional<TTLDescription> selectTTLEntryForTTLInfos(const IMergeTreeDataPart::TTLInfos & ttl_infos, time_t time_of_move) const;

View File

@ -795,7 +795,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor
const auto & index_factory = MergeTreeIndexFactory::instance();
if (data.hasSecondaryIndices())
{
merged_stream = std::make_shared<ExpressionBlockInputStream>(merged_stream, data.primary_key_and_skip_indices_expr);
merged_stream = std::make_shared<ExpressionBlockInputStream>(merged_stream, data.getPrimaryKeyAndSkipIndicesExpression());
merged_stream = std::make_shared<MaterializingBlockInputStream>(merged_stream);
}
@ -1586,7 +1586,7 @@ void MergeTreeDataMergerMutator::mutateAllPartColumns(
if (data.hasPrimaryKey() || data.hasSecondaryIndices())
mutating_stream = std::make_shared<MaterializingBlockInputStream>(
std::make_shared<ExpressionBlockInputStream>(mutating_stream, data.primary_key_and_skip_indices_expr));
std::make_shared<ExpressionBlockInputStream>(mutating_stream, data.getPrimaryKeyAndSkipIndicesExpression()));
if (need_remove_expired_values)
mutating_stream = std::make_shared<TTLBlockInputStream>(mutating_stream, data, new_data_part, time_of_mutation, true);

View File

@ -264,7 +264,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataWriter::writeTempPart(BlockWithPa
/// If we need to calculate some columns to sort.
if (data.hasSortingKey() || data.hasSecondaryIndices())
data.sorting_key_and_skip_indices_expr->execute(block);
data.getSortingKeyAndSkipIndicesExpression()->execute(block);
Names sort_columns = data.getSortingKeyColumns();
SortDescription sort_description;