mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-15 19:02:04 +00:00
264cff6415
TODO (suggested by Nikolai) 1. Build query plan fro current query (inside storage::read) up to WithMergableState 2. Check, that plan is simple enough: Aggregating - Expression - Filter - ReadFromStorage (or simplier) 3. Check, that filter is the same as filter in projection, and also expression calculates the same aggregation keys as in projection 4. Return WithMergableState if projection applies 3 will be easier to do with ActionsDAG, cause it sees all functions, and dependencies are direct (but it is possible with ExpressionActions also) Also need to figure out how prewhere works for projections, and row_filter_policies. wip
26 lines
790 B
C++
26 lines
790 B
C++
#include <Storages/MergeTree/PartitionPruner.h>
|
|
|
|
namespace DB
|
|
{
|
|
|
|
bool PartitionPruner::canBePruned(const DataPart & part)
|
|
{
|
|
if (part.isEmpty())
|
|
return true;
|
|
const auto & partition_id = part.info.partition_id;
|
|
bool is_valid;
|
|
if (auto it = partition_filter_map.find(partition_id); it != partition_filter_map.end())
|
|
is_valid = it->second;
|
|
else
|
|
{
|
|
const auto & partition_value = part.partition.value;
|
|
std::vector<FieldRef> index_value(partition_value.begin(), partition_value.end());
|
|
is_valid = partition_condition.mayBeTrueInRange(
|
|
partition_value.size(), index_value.data(), index_value.data(), partition_key.data_types);
|
|
partition_filter_map.emplace(partition_id, is_valid);
|
|
}
|
|
return !is_valid;
|
|
}
|
|
|
|
}
|