Add some comments in OptimizeShardingKeyRewriteInVisitor

This commit is contained in:
Azat Khuzhin 2021-04-18 09:07:09 +03:00
parent 8b3c37e648
commit 3f156b83c9

View File

@ -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);
}); });
} }
} }