mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
Add some comments in OptimizeShardingKeyRewriteInVisitor
This commit is contained in:
parent
8b3c37e648
commit
3f156b83c9
@ -13,7 +13,7 @@ using namespace DB;
|
|||||||
|
|
||||||
Field executeFunctionOnField(
|
Field executeFunctionOnField(
|
||||||
const Field & field, const std::string & name,
|
const Field & field, const std::string & name,
|
||||||
const ExpressionActionsPtr & expr,
|
const ExpressionActionsPtr & sharding_expr,
|
||||||
const std::string & sharding_key_column_name)
|
const std::string & sharding_key_column_name)
|
||||||
{
|
{
|
||||||
DataTypePtr type = applyVisitor(FieldToDataType{}, field);
|
DataTypePtr type = applyVisitor(FieldToDataType{}, field);
|
||||||
@ -25,17 +25,23 @@ Field executeFunctionOnField(
|
|||||||
|
|
||||||
Block block{column};
|
Block block{column};
|
||||||
size_t num_rows = 1;
|
size_t num_rows = 1;
|
||||||
expr->execute(block, num_rows);
|
sharding_expr->execute(block, num_rows);
|
||||||
|
|
||||||
ColumnWithTypeAndName & ret = block.getByName(sharding_key_column_name);
|
ColumnWithTypeAndName & ret = block.getByName(sharding_key_column_name);
|
||||||
return (*ret.column)[0];
|
return (*ret.column)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if shard may contain such value (or it is unknown), otherwise false.
|
/// @param sharding_column_value - one of values from IN
|
||||||
|
/// @param sharding_column_name - name of that column
|
||||||
|
/// @param sharding_expr - expression of sharding_key for the Distributed() table
|
||||||
|
/// @param sharding_key_column_name - name of the column for sharding_expr
|
||||||
|
/// @param shard_info - info for the current shard (to compare shard_num with calculated)
|
||||||
|
/// @param slots - weight -> shard mapping
|
||||||
|
/// @return true if shard may contain such value (or it is unknown), otherwise false.
|
||||||
bool shardContains(
|
bool shardContains(
|
||||||
const Field & sharding_column_value,
|
const Field & sharding_column_value,
|
||||||
const std::string & sharding_column_name,
|
const std::string & sharding_column_name,
|
||||||
const ExpressionActionsPtr & expr,
|
const ExpressionActionsPtr & sharding_expr,
|
||||||
const std::string & sharding_key_column_name,
|
const std::string & sharding_key_column_name,
|
||||||
const Cluster::ShardInfo & shard_info,
|
const Cluster::ShardInfo & shard_info,
|
||||||
const Cluster::SlotToShard & slots)
|
const Cluster::SlotToShard & slots)
|
||||||
@ -45,7 +51,7 @@ bool shardContains(
|
|||||||
if (sharding_column_value.isNull())
|
if (sharding_column_value.isNull())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Field sharding_value = executeFunctionOnField(sharding_column_value, sharding_column_name, expr, sharding_key_column_name);
|
Field sharding_value = executeFunctionOnField(sharding_column_value, sharding_column_name, sharding_expr, sharding_key_column_name);
|
||||||
UInt64 value = sharding_value.get<UInt64>();
|
UInt64 value = sharding_value.get<UInt64>();
|
||||||
const auto shard_num = slots[value % slots.size()] + 1;
|
const auto shard_num = slots[value % slots.size()] + 1;
|
||||||
return shard_info.shard_num == shard_num;
|
return shard_info.shard_num == shard_num;
|
||||||
@ -78,10 +84,10 @@ void OptimizeShardingKeyRewriteInMatcher::visit(ASTFunction & function, Data & d
|
|||||||
if (!identifier)
|
if (!identifier)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const auto & expr = data.sharding_key_expr;
|
const auto & sharding_expr = data.sharding_key_expr;
|
||||||
const auto & sharding_key_column_name = data.sharding_key_column_name;
|
const auto & sharding_key_column_name = data.sharding_key_column_name;
|
||||||
|
|
||||||
if (!expr->getRequiredColumnsWithTypes().contains(identifier->name()))
|
if (!sharding_expr->getRequiredColumnsWithTypes().contains(identifier->name()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/// NOTE: that we should not take care about empty tuple,
|
/// NOTE: that we should not take care about empty tuple,
|
||||||
@ -93,7 +99,7 @@ void OptimizeShardingKeyRewriteInMatcher::visit(ASTFunction & function, Data & d
|
|||||||
std::erase_if(tuple_elements->children, [&](auto & child)
|
std::erase_if(tuple_elements->children, [&](auto & child)
|
||||||
{
|
{
|
||||||
auto * literal = child->template as<ASTLiteral>();
|
auto * literal = child->template as<ASTLiteral>();
|
||||||
return literal && !shardContains(literal->value, identifier->name(), expr, sharding_key_column_name, data.shard_info, data.slots);
|
return literal && !shardContains(literal->value, identifier->name(), sharding_expr, sharding_key_column_name, data.shard_info, data.slots);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (auto * tuple_literal = right->as<ASTLiteral>();
|
else if (auto * tuple_literal = right->as<ASTLiteral>();
|
||||||
@ -102,7 +108,7 @@ void OptimizeShardingKeyRewriteInMatcher::visit(ASTFunction & function, Data & d
|
|||||||
auto & tuple = tuple_literal->value.get<Tuple &>();
|
auto & tuple = tuple_literal->value.get<Tuple &>();
|
||||||
std::erase_if(tuple, [&](auto & child)
|
std::erase_if(tuple, [&](auto & child)
|
||||||
{
|
{
|
||||||
return !shardContains(child, identifier->name(), expr, sharding_key_column_name, data.shard_info, data.slots);
|
return !shardContains(child, identifier->name(), sharding_expr, sharding_key_column_name, data.shard_info, data.slots);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user