17 #ifndef QUERYENGINE_REXVISITOR_H
18 #define QUERYENGINE_REXVISITOR_H
29 const auto rex_input =
dynamic_cast<const RexInput*
>(rex_scalar);
33 const auto rex_literal =
dynamic_cast<const RexLiteral*
>(rex_scalar);
37 const auto rex_subquery =
dynamic_cast<const RexSubQuery*
>(rex_scalar);
41 const auto rex_operator =
dynamic_cast<const RexOperator*
>(rex_scalar);
45 const auto rex_case =
dynamic_cast<const RexCase*
>(rex_scalar);
49 const auto rex_ref =
dynamic_cast<const RexRef*
>(rex_scalar);
85 const size_t operand_count = rex_operator->
size();
87 for (
size_t i = 0; i < operand_count; ++i) {
88 const auto operand = rex_operator->
getOperand(i);
92 const auto rex_window_func_operator =
94 if (rex_window_func_operator) {
102 for (
size_t i = 0; i < rex_case->
branchCount(); ++i) {
103 const auto when = rex_case->
getWhen(i);
105 const auto then = rex_case->
getThen(i);
123 const T operands_visit_result)
const {
124 T result = operands_visit_result;
129 for (
const auto& key : rex_window_func_operator->
getOrderKeys()) {
139 using RetType = std::unique_ptr<const RexScalar>;
144 return literal->deepCopy();
148 return subquery->deepCopy();
154 const auto rex_window_function_operator =
156 if (rex_window_function_operator) {
160 const size_t operand_count = rex_operator->
size();
161 std::vector<RetType> new_opnds;
162 for (
size_t i = 0; i < operand_count; ++i) {
170 const size_t operand_count = rex_window_function_operator->
size();
171 std::vector<RetType> new_opnds;
172 for (
size_t i = 0; i < operand_count; ++i) {
173 new_opnds.push_back(
visit(rex_window_function_operator->
getOperand(i)));
176 const auto& partition_keys = rex_window_function_operator->
getPartitionKeys();
177 std::vector<std::unique_ptr<const RexScalar>> disambiguated_partition_keys;
178 for (
const auto& partition_key : partition_keys) {
179 disambiguated_partition_keys.emplace_back(
visit(partition_key.get()));
181 std::vector<std::unique_ptr<const RexScalar>> disambiguated_order_keys;
182 const auto& order_keys = rex_window_function_operator->
getOrderKeys();
183 for (
const auto& order_key : order_keys) {
184 disambiguated_order_keys.emplace_back(
visit(order_key.get()));
188 disambiguated_partition_keys,
189 disambiguated_order_keys,
194 std::vector<std::pair<RetType, RetType>> new_pair_list;
195 for (
size_t i = 0; i < rex_case->
branchCount(); ++i) {
200 return std::make_unique<RexCase>(new_pair_list, new_else);
207 using RowValues = std::vector<std::unique_ptr<const RexScalar>>;
209 static std::vector<RowValues>
copy(std::vector<RowValues>
const& rhs) {
211 std::vector<RowValues> retval;
212 retval.reserve(rhs.size());
213 for (
auto const& row : rhs) {
214 retval.push_back({});
215 retval.back().reserve(row.size());
216 for (
auto const& value : row) {
217 retval.back().push_back(copier.
visit(value.get()));
224 template <
bool bAllowMissing>
233 return std::make_unique<RexInput>(input->
getSourceNode(), renum_it->second);
239 return std::make_unique<RexInput>(input->
getSourceNode(), renum_it->second);
247 #endif // QUERYENGINE_REXVISITOR_H
const RexScalar * getThen(const size_t idx) const
T defaultResult() const override
std::vector< std::unique_ptr< const RexScalar >> RowValues
T visitCase(const RexCase *rex_case) const override
const RexScalar * getElse() const
std::unique_ptr< RexRef > deepCopy() const
const RexScalar * getOperand(const size_t idx) const
const std::vector< SortField > & getCollation() const
virtual T visitRef(const RexRef *) const =0
RetType visitOperator(const RexOperator *rex_operator) const override
virtual T visitLiteral(const RexLiteral *) const =0
T visitOperator(const RexOperator *rex_operator) const override
const RexScalar * getWhen(const size_t idx) const
virtual T visitCase(const RexCase *rex_case) const =0
RetType visitWindowFunctionOperator(const RexWindowFunctionOperator *rex_window_function_operator) const
RetType visitLiteral(const RexLiteral *literal) const override
virtual std::unique_ptr< const RexOperator > getDisambiguated(std::vector< std::unique_ptr< const RexScalar >> &operands) const
virtual T aggregateResult(const T &aggregate, const T &next_result) const
virtual T visit(const RexScalar *rex_scalar) const
T visitRef(const RexRef *) const override
virtual T defaultResult() const =0
RetType visitSubQuery(const RexSubQuery *subquery) const override
std::unique_ptr< const RexOperator > disambiguatedOperands(ConstRexScalarPtrVector &operands, ConstRexScalarPtrVector &partition_keys, ConstRexScalarPtrVector &order_keys, const std::vector< SortField > &collation) const
virtual T visitOperator(const RexOperator *rex_operator) const =0
virtual T visitInput(const RexInput *) const =0
virtual T visitSubQuery(const RexSubQuery *) const =0
size_t branchCount() const
RetType visitInput(const RexInput *input) const override
T visitWindowFunctionOperator(const RexWindowFunctionOperator *rex_window_func_operator, const T operands_visit_result) const
const ConstRexScalarPtrVector & getPartitionKeys() const
T visitInput(const RexInput *) const override
T visitSubQuery(const RexSubQuery *) const override
RetType visitRef(const RexRef *ref) const override
virtual std::string toString() const =0
const ConstRexScalarPtrVector & getOrderKeys() const
static std::vector< RowValues > copy(std::vector< RowValues > const &rhs)
RetType visitCase(const RexCase *rex_case) const override
RetType defaultResult() const override
std::unique_ptr< const RexScalar > RetType
T visitLiteral(const RexLiteral *) const override