Packages

An Elixir DuckDB library

Current section

Files

Jump to
exduckdb c_src duckdb src optimizer pushdown pushdown_single_join.cpp
Raw

c_src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp

#include "duckdb/optimizer/filter_pushdown.hpp"
#include "duckdb/planner/operator/logical_comparison_join.hpp"
namespace duckdb {
using Filter = FilterPushdown::Filter;
unique_ptr<LogicalOperator> FilterPushdown::PushdownSingleJoin(unique_ptr<LogicalOperator> op,
unordered_set<idx_t> &left_bindings,
unordered_set<idx_t> &right_bindings) {
D_ASSERT(((LogicalJoin &)*op).join_type == JoinType::SINGLE);
FilterPushdown left_pushdown(optimizer), right_pushdown(optimizer);
// now check the set of filters
for (idx_t i = 0; i < filters.size(); i++) {
auto side = JoinSide::GetJoinSide(filters[i]->bindings, left_bindings, right_bindings);
if (side == JoinSide::LEFT) {
// bindings match left side: push into left
left_pushdown.filters.push_back(move(filters[i]));
// erase the filter from the list of filters
filters.erase(filters.begin() + i);
i--;
}
}
op->children[0] = left_pushdown.Rewrite(move(op->children[0]));
op->children[1] = right_pushdown.Rewrite(move(op->children[1]));
return FinishPushdown(move(op));
}
} // namespace duckdb