OmniSciDB  c07336695a
DeepCopyVisitor.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017 MapD Technologies, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "ScalarExprVisitor.h"
18 
19 class DeepCopyVisitor : public ScalarExprVisitor<std::shared_ptr<Analyzer::Expr>> {
20  protected:
21  using RetType = std::shared_ptr<Analyzer::Expr>;
22  RetType visitColumnVar(const Analyzer::ColumnVar* col_var) const override {
23  return col_var->deep_copy();
24  }
25 
27  const Analyzer::ExpressionTuple* col_var_tuple) const override {
28  return col_var_tuple->deep_copy();
29  }
30 
31  RetType visitVar(const Analyzer::Var* var) const override { return var->deep_copy(); }
32 
33  RetType visitConstant(const Analyzer::Constant* constant) const override {
34  return constant->deep_copy();
35  }
36 
37  RetType visitUOper(const Analyzer::UOper* uoper) const override {
38  return makeExpr<Analyzer::UOper>(uoper->get_type_info(),
39  uoper->get_contains_agg(),
40  uoper->get_optype(),
41  visit(uoper->get_operand()));
42  }
43 
44  RetType visitBinOper(const Analyzer::BinOper* bin_oper) const override {
45  return makeExpr<Analyzer::BinOper>(bin_oper->get_type_info(),
46  bin_oper->get_contains_agg(),
47  bin_oper->get_optype(),
48  bin_oper->get_qualifier(),
49  visit(bin_oper->get_left_operand()),
50  visit(bin_oper->get_right_operand()));
51  }
52 
53  RetType visitInValues(const Analyzer::InValues* in_values) const override {
54  const auto& value_list = in_values->get_value_list();
55  std::list<RetType> new_list;
56  for (const auto in_value : value_list) {
57  new_list.push_back(visit(in_value.get()));
58  }
59  return makeExpr<Analyzer::InValues>(visit(in_values->get_arg()), new_list);
60  }
61 
62  RetType visitInIntegerSet(const Analyzer::InIntegerSet* in_integer_set) const override {
63  return makeExpr<Analyzer::InIntegerSet>(
64  visit(in_integer_set->get_arg()),
65  in_integer_set->get_value_list(),
66  in_integer_set->get_type_info().get_notnull());
67  }
68 
70  return makeExpr<Analyzer::CharLengthExpr>(visit(char_length->get_arg()),
71  char_length->get_calc_encoded_length());
72  }
73 
75  return makeExpr<Analyzer::KeyForStringExpr>(visit(expr->get_arg()));
76  }
77 
78  RetType visitCardinality(const Analyzer::CardinalityExpr* cardinality) const override {
79  return makeExpr<Analyzer::CardinalityExpr>(visit(cardinality->get_arg()));
80  }
81 
82  RetType visitLikeExpr(const Analyzer::LikeExpr* like) const override {
83  auto escape_expr = like->get_escape_expr();
84  return makeExpr<Analyzer::LikeExpr>(visit(like->get_arg()),
85  visit(like->get_like_expr()),
86  escape_expr ? visit(escape_expr) : nullptr,
87  like->get_is_ilike(),
88  like->get_is_simple());
89  }
90 
91  RetType visitRegexpExpr(const Analyzer::RegexpExpr* regexp) const override {
92  auto escape_expr = regexp->get_escape_expr();
93  return makeExpr<Analyzer::RegexpExpr>(visit(regexp->get_arg()),
94  visit(regexp->get_pattern_expr()),
95  escape_expr ? visit(escape_expr) : nullptr);
96  }
97 
98  RetType visitCaseExpr(const Analyzer::CaseExpr* case_expr) const override {
99  std::list<std::pair<RetType, RetType>> new_list;
100  for (auto p : case_expr->get_expr_pair_list()) {
101  new_list.emplace_back(visit(p.first.get()), visit(p.second.get()));
102  }
103  auto else_expr = case_expr->get_else_expr();
104  return makeExpr<Analyzer::CaseExpr>(
105  case_expr->get_type_info(),
106  case_expr->get_contains_agg(),
107  new_list,
108  else_expr == nullptr ? nullptr : visit(else_expr));
109  }
110 
111  RetType visitDatetruncExpr(const Analyzer::DatetruncExpr* datetrunc) const override {
112  return makeExpr<Analyzer::DatetruncExpr>(datetrunc->get_type_info(),
113  datetrunc->get_contains_agg(),
114  datetrunc->get_field(),
115  visit(datetrunc->get_from_expr()));
116  }
117 
118  RetType visitExtractExpr(const Analyzer::ExtractExpr* extract) const override {
119  return makeExpr<Analyzer::ExtractExpr>(extract->get_type_info(),
120  extract->get_contains_agg(),
121  extract->get_field(),
122  visit(extract->get_from_expr()));
123  }
124 
125  RetType visitArrayOper(const Analyzer::ArrayExpr* array_expr) const override {
126  std::vector<std::shared_ptr<Analyzer::Expr>> args_copy;
127  for (size_t i = 0; i < array_expr->getElementCount(); ++i) {
128  args_copy.push_back(visit(array_expr->getElement(i)));
129  }
130  const auto& type_info = array_expr->get_type_info();
131  return makeExpr<Analyzer::ArrayExpr>(
132  type_info, args_copy, array_expr->getExprIndex(), array_expr->isLocalAlloc());
133  }
134 
136  const Analyzer::WindowFunction* window_func) const override {
137  std::vector<std::shared_ptr<Analyzer::Expr>> args_copy;
138  for (const auto& arg : window_func->getArgs()) {
139  args_copy.push_back(visit(arg.get()));
140  }
141  std::vector<std::shared_ptr<Analyzer::Expr>> partition_keys_copy;
142  for (const auto& partition_key : window_func->getPartitionKeys()) {
143  partition_keys_copy.push_back(visit(partition_key.get()));
144  }
145  std::vector<std::shared_ptr<Analyzer::Expr>> order_keys_copy;
146  for (const auto& order_key : window_func->getOrderKeys()) {
147  order_keys_copy.push_back(visit(order_key.get()));
148  }
149  const auto& type_info = window_func->get_type_info();
150  return makeExpr<Analyzer::WindowFunction>(type_info,
151  window_func->getKind(),
152  args_copy,
153  partition_keys_copy,
154  order_keys_copy,
155  window_func->getCollation());
156  }
157 
158  RetType visitFunctionOper(const Analyzer::FunctionOper* func_oper) const override {
159  std::vector<std::shared_ptr<Analyzer::Expr>> args_copy;
160  for (size_t i = 0; i < func_oper->getArity(); ++i) {
161  args_copy.push_back(visit(func_oper->getArg(i)));
162  }
163  const auto& type_info = func_oper->get_type_info();
164  return makeExpr<Analyzer::FunctionOper>(type_info, func_oper->getName(), args_copy);
165  }
166 
167  RetType visitDatediffExpr(const Analyzer::DatediffExpr* datediff) const override {
168  return makeExpr<Analyzer::DatediffExpr>(datediff->get_type_info(),
169  datediff->get_field(),
170  visit(datediff->get_start_expr()),
171  visit(datediff->get_end_expr()));
172  }
173 
174  RetType visitDateaddExpr(const Analyzer::DateaddExpr* dateadd) const override {
175  return makeExpr<Analyzer::DateaddExpr>(dateadd->get_type_info(),
176  dateadd->get_field(),
177  visit(dateadd->get_number_expr()),
178  visit(dateadd->get_datetime_expr()));
179  }
180 
182  const Analyzer::FunctionOperWithCustomTypeHandling* func_oper) const override {
183  std::vector<std::shared_ptr<Analyzer::Expr>> args_copy;
184  for (size_t i = 0; i < func_oper->getArity(); ++i) {
185  args_copy.push_back(visit(func_oper->getArg(i)));
186  }
187  const auto& type_info = func_oper->get_type_info();
188  return makeExpr<Analyzer::FunctionOperWithCustomTypeHandling>(
189  type_info, func_oper->getName(), args_copy);
190  }
191 
192  RetType visitLikelihood(const Analyzer::LikelihoodExpr* likelihood) const override {
193  return makeExpr<Analyzer::LikelihoodExpr>(visit(likelihood->get_arg()),
194  likelihood->get_likelihood());
195  }
196 
197  RetType visitAggExpr(const Analyzer::AggExpr* agg) const override {
198  RetType arg = agg->get_arg() ? visit(agg->get_arg()) : nullptr;
199  return makeExpr<Analyzer::AggExpr>(agg->get_type_info(),
200  agg->get_aggtype(),
201  arg,
202  agg->get_is_distinct(),
203  agg->get_error_rate());
204  }
205 
207  return makeExpr<Analyzer::OffsetInFragment>();
208  }
209 };
RetType visitColumnVarTuple(const Analyzer::ExpressionTuple *col_var_tuple) const override
SQLQualifier get_qualifier() const
Definition: Analyzer.h:434
RetType visitInValues(const Analyzer::InValues *in_values) const override
const Expr * get_arg() const
Definition: Analyzer.h:577
bool get_is_simple() const
Definition: Analyzer.h:802
RetType visitVar(const Analyzer::Var *var) const override
bool get_calc_encoded_length() const
Definition: Analyzer.h:651
size_t getElementCount() const
Definition: Analyzer.h:1380
const Expr * get_datetime_expr() const
Definition: Analyzer.h:1131
std::string getName() const
Definition: Analyzer.h:1250
RetType visitFunctionOper(const Analyzer::FunctionOper *func_oper) const override
const Expr * get_arg() const
Definition: Analyzer.h:626
RetType visitConstant(const Analyzer::Constant *constant) const override
const Analyzer::Expr * getArg(const size_t i) const
Definition: Analyzer.h:1254
HOST DEVICE bool get_notnull() const
Definition: sqltypes.h:326
const std::vector< std::shared_ptr< Analyzer::Expr > > & getOrderKeys() const
Definition: Analyzer.h:1347
RetType visitDatetruncExpr(const Analyzer::DatetruncExpr *datetrunc) const override
std::shared_ptr< Analyzer::Expr > deep_copy() const override
Definition: Analyzer.cpp:80
RetType visitArrayOper(const Analyzer::ArrayExpr *array_expr) const override
bool isLocalAlloc() const
Definition: Analyzer.h:1382
const Expr * get_start_expr() const
Definition: Analyzer.h:1172
DateaddField get_field() const
Definition: Analyzer.h:1129
std::shared_ptr< Analyzer::Expr > deep_copy() const override
Definition: Analyzer.cpp:59
int32_t getExprIndex() const
Definition: Analyzer.h:1381
size_t getArity() const
Definition: Analyzer.h:1252
const Expr * get_from_expr() const
Definition: Analyzer.h:1089
std::shared_ptr< Analyzer::Expr > RetType
const Expr * get_arg() const
Definition: Analyzer.h:743
std::shared_ptr< Analyzer::Expr > deep_copy() const override
Definition: Analyzer.cpp:69
SQLOps get_optype() const
Definition: Analyzer.h:432
Expr * get_arg() const
Definition: Analyzer.h:988
DatetruncField get_field() const
Definition: Analyzer.h:1213
const Expr * get_arg() const
Definition: Analyzer.h:698
const Expr * get_arg() const
Definition: Analyzer.h:797
const Expr * get_else_expr() const
Definition: Analyzer.h:1044
RetType visitLikeExpr(const Analyzer::LikeExpr *like) const override
RetType visitOffsetInFragment(const Analyzer::OffsetInFragment *) const override
const Analyzer::Expr * getElement(const size_t i) const
Definition: Analyzer.h:1384
RetType visitExtractExpr(const Analyzer::ExtractExpr *extract) const override
ALWAYS_INLINE DEVICE int32_t char_length(const char *str, const int32_t str_len)
RetType visitCardinality(const Analyzer::CardinalityExpr *cardinality) const override
RetType visitLikelihood(const Analyzer::LikelihoodExpr *likelihood) const override
const Expr * get_from_expr() const
Definition: Analyzer.h:1214
const Expr * get_escape_expr() const
Definition: Analyzer.h:800
RetType visitKeyForString(const Analyzer::KeyForStringExpr *expr) const override
const std::vector< OrderEntry > & getCollation() const
Definition: Analyzer.h:1351
float get_likelihood() const
Definition: Analyzer.h:927
RetType visitAggExpr(const Analyzer::AggExpr *agg) const override
RetType visitFunctionOperWithCustomTypeHandling(const Analyzer::FunctionOperWithCustomTypeHandling *func_oper) const override
const std::list< std::pair< std::shared_ptr< Analyzer::Expr >, std::shared_ptr< Analyzer::Expr > > > & get_expr_pair_list() const
Definition: Analyzer.h:1041
DatetruncField get_field() const
Definition: Analyzer.h:1171
const Expr * get_arg() const
Definition: Analyzer.h:869
const Expr * get_pattern_expr() const
Definition: Analyzer.h:871
const Expr * get_escape_expr() const
Definition: Analyzer.h:872
RetType visitUOper(const Analyzer::UOper *uoper) const override
SQLAgg get_aggtype() const
Definition: Analyzer.h:987
const std::vector< std::shared_ptr< Analyzer::Expr > > & getPartitionKeys() const
Definition: Analyzer.h:1343
const Expr * get_arg() const
Definition: Analyzer.h:925
RetType visitCharLength(const Analyzer::CharLengthExpr *char_length) const override
bool get_is_distinct() const
Definition: Analyzer.h:990
std::shared_ptr< Analyzer::Expr > visit(const Analyzer::Expr *expr) const
const std::vector< std::shared_ptr< Analyzer::Expr > > & getArgs() const
Definition: Analyzer.h:1341
std::shared_ptr< Analyzer::Constant > get_error_rate() const
Definition: Analyzer.h:991
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:77
const Expr * get_arg() const
Definition: Analyzer.h:649
RetType visitCaseExpr(const Analyzer::CaseExpr *case_expr) const override
std::shared_ptr< Analyzer::Expr > deep_copy() const override
Definition: Analyzer.cpp:84
RetType visitInIntegerSet(const Analyzer::InIntegerSet *in_integer_set) const override
const std::vector< int64_t > & get_value_list() const
Definition: Analyzer.h:628
RetType visitBinOper(const Analyzer::BinOper *bin_oper) const override
bool get_contains_agg() const
Definition: Analyzer.h:79
RetType visitRegexpExpr(const Analyzer::RegexpExpr *regexp) const override
const Expr * get_like_expr() const
Definition: Analyzer.h:799
RetType visitDatediffExpr(const Analyzer::DatediffExpr *datediff) const override
ExtractField get_field() const
Definition: Analyzer.h:1088
const std::list< std::shared_ptr< Analyzer::Expr > > & get_value_list() const
Definition: Analyzer.h:579
const Expr * get_end_expr() const
Definition: Analyzer.h:1173
const Expr * get_number_expr() const
Definition: Analyzer.h:1130
SqlWindowFunctionKind getKind() const
Definition: Analyzer.h:1339
RetType visitDateaddExpr(const Analyzer::DateaddExpr *dateadd) const override
bool get_is_ilike() const
Definition: Analyzer.h:801
SQLOps get_optype() const
Definition: Analyzer.h:363
RetType visitWindowFunction(const Analyzer::WindowFunction *window_func) const override
const Expr * get_right_operand() const
Definition: Analyzer.h:436
RetType visitColumnVar(const Analyzer::ColumnVar *col_var) const override
const Expr * get_left_operand() const
Definition: Analyzer.h:435
const Expr * get_operand() const
Definition: Analyzer.h:364