|
19 | 19 | #include "ExpressionRewrite.h"
|
20 | 20 | #include "RelAlgExecutor.h"
|
21 | 21 |
|
| 22 | +namespace { |
| 23 | + |
| 24 | +class InputColumnsCollector |
| 25 | + : public hdk::ir::ExprCollector<std::unordered_set<InputColDescriptor>, |
| 26 | + InputColumnsCollector> { |
| 27 | + protected: |
| 28 | + void visitColumnVar(const hdk::ir::ColumnVar* col_var) override { |
| 29 | + result_.insert(InputColDescriptor(col_var->columnInfo(), 0)); |
| 30 | + } |
| 31 | +}; |
| 32 | + |
| 33 | +} // namespace |
| 34 | + |
22 | 35 | size_t RelAlgExecutor::getNDVEstimation(const WorkUnit& work_unit,
|
23 | 36 | const int64_t range,
|
24 | 37 | const bool is_agg,
|
@@ -101,8 +114,43 @@ RelAlgExecutionUnit create_ndv_execution_unit(const RelAlgExecutionUnit& ra_exe_
|
101 | 114 | RelAlgExecutionUnit create_count_all_execution_unit(
|
102 | 115 | const RelAlgExecutionUnit& ra_exe_unit,
|
103 | 116 | hdk::ir::ExprPtr replacement_target) {
|
| 117 | + InputColumnsCollector input_columns_collector; |
| 118 | + |
| 119 | + std::list<std::shared_ptr<const InputColDescriptor>> join_input_col_descs; |
| 120 | + std::stringstream os{}; |
| 121 | + if (!ra_exe_unit.join_quals.empty()) { |
| 122 | + os << "\n[Count all] Join Quals: "; |
| 123 | + |
| 124 | + for (size_t i = 0; i < ra_exe_unit.join_quals.size(); i++) { |
| 125 | + const auto& join_condition = ra_exe_unit.join_quals[i]; |
| 126 | + os << "\t" << std::to_string(i) << " " << ::toString(join_condition.type); |
| 127 | + for (const auto& q : join_condition.quals) { |
| 128 | + input_columns_collector.visit(q.get()); |
| 129 | + os << q->toString() << ", "; |
| 130 | + } |
| 131 | + } |
| 132 | + } |
| 133 | + auto& input_column_descriptors = input_columns_collector.result(); |
| 134 | + for (auto& col_var : input_column_descriptors) { |
| 135 | + LOG(INFO) << "col_vars: " << col_var; |
| 136 | + for (auto& icol : ra_exe_unit.input_col_descs) { |
| 137 | + if (icol->getColId() == col_var.getColId() && |
| 138 | + icol->getTableId() == col_var.getTableId()) { |
| 139 | + join_input_col_descs.emplace_back(icol); |
| 140 | + } |
| 141 | + } |
| 142 | + } |
| 143 | + |
| 144 | + LOG(INFO) << "join quals: " << os.str(); |
| 145 | + std::stringstream js{}; |
| 146 | + js << "\n\t[Only Join] Table/Col/Levels: "; |
| 147 | + for (const auto& input_col_desc : join_input_col_descs) { |
| 148 | + js << "(" << input_col_desc->getTableId() << ", " << input_col_desc->getColId() |
| 149 | + << ", " << input_col_desc->getNestLevel() << ") "; |
| 150 | + } |
| 151 | + LOG(INFO) << "join in cols: " << js.str(); |
104 | 152 | return {ra_exe_unit.input_descs,
|
105 |
| - ra_exe_unit.input_col_descs, |
| 153 | + join_input_col_descs, |
106 | 154 | ra_exe_unit.simple_quals,
|
107 | 155 | ra_exe_unit.quals,
|
108 | 156 | ra_exe_unit.join_quals,
|
|
0 commit comments