| 1 | #include "duckdb/planner/logical_operator.hpp" |
|---|---|
| 2 | |
| 3 | #include "duckdb/common/printer.hpp" |
| 4 | #include "duckdb/common/string_util.hpp" |
| 5 | |
| 6 | using namespace duckdb; |
| 7 | using namespace std; |
| 8 | |
| 9 | string LogicalOperator::ParamsToString() const { |
| 10 | string result = ""; |
| 11 | if (expressions.size() > 0) { |
| 12 | result += "["; |
| 13 | result += StringUtil::Join(expressions, expressions.size(), ", ", |
| 14 | [](const unique_ptr<Expression> &expression) { return expression->GetName(); }); |
| 15 | result += "]"; |
| 16 | } |
| 17 | |
| 18 | return result; |
| 19 | } |
| 20 | |
| 21 | void LogicalOperator::ResolveOperatorTypes() { |
| 22 | // if (types.size() > 0) { |
| 23 | // // types already resolved for this node |
| 24 | // return; |
| 25 | // } |
| 26 | types.clear(); |
| 27 | // first resolve child types |
| 28 | for (auto &child : children) { |
| 29 | child->ResolveOperatorTypes(); |
| 30 | } |
| 31 | // now resolve the types for this operator |
| 32 | ResolveTypes(); |
| 33 | } |
| 34 | |
| 35 | vector<ColumnBinding> LogicalOperator::GenerateColumnBindings(idx_t table_idx, idx_t column_count) { |
| 36 | vector<ColumnBinding> result; |
| 37 | for (idx_t i = 0; i < column_count; i++) { |
| 38 | result.push_back(ColumnBinding(table_idx, i)); |
| 39 | } |
| 40 | return result; |
| 41 | } |
| 42 | |
| 43 | vector<TypeId> LogicalOperator::MapTypes(vector<TypeId> types, vector<idx_t> projection_map) { |
| 44 | if (projection_map.size() == 0) { |
| 45 | return types; |
| 46 | } else { |
| 47 | vector<TypeId> result_types; |
| 48 | for (auto index : projection_map) { |
| 49 | result_types.push_back(types[index]); |
| 50 | } |
| 51 | return result_types; |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | vector<ColumnBinding> LogicalOperator::MapBindings(vector<ColumnBinding> bindings, vector<idx_t> projection_map) { |
| 56 | if (projection_map.size() == 0) { |
| 57 | return bindings; |
| 58 | } else { |
| 59 | vector<ColumnBinding> result_bindings; |
| 60 | for (auto index : projection_map) { |
| 61 | result_bindings.push_back(bindings[index]); |
| 62 | } |
| 63 | return result_bindings; |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | string LogicalOperator::ToString(idx_t depth) const { |
| 68 | string result = LogicalOperatorToString(type); |
| 69 | result += ParamsToString(); |
| 70 | if (children.size() > 0) { |
| 71 | for (idx_t i = 0; i < children.size(); i++) { |
| 72 | result += "\n"+ string(depth * 4, ' '); |
| 73 | auto &child = children[i]; |
| 74 | result += child->ToString(depth + 1); |
| 75 | } |
| 76 | result += ""; |
| 77 | } |
| 78 | return result; |
| 79 | } |
| 80 | |
| 81 | void LogicalOperator::Print() { |
| 82 | Printer::Print(ToString()); |
| 83 | } |
| 84 |