OmniSciDB  72c90bc290
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TextEncodingCastCountVisitor Class Reference
+ Inheritance diagram for TextEncodingCastCountVisitor:
+ Collaboration diagram for TextEncodingCastCountVisitor:

Public Member Functions

 TextEncodingCastCountVisitor (const bool default_disregard_casts_to_none_encoding)
 
- Public Member Functions inherited from ScalarExprVisitor< TextEncodingCastCounts >
TextEncodingCastCounts visit (const Analyzer::Expr *expr) const
 

Protected Member Functions

TextEncodingCastCounts visitUOper (const Analyzer::UOper *u_oper) const override
 
TextEncodingCastCounts visitStringOper (const Analyzer::StringOper *string_oper) const override
 
TextEncodingCastCounts visitBinOper (const Analyzer::BinOper *bin_oper) const override
 
TextEncodingCastCounts visitLikeExpr (const Analyzer::LikeExpr *like) const override
 
TextEncodingCastCounts aggregateResult (const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
 
void visitBegin () const override
 
TextEncodingCastCounts defaultResult () const override
 
- Protected Member Functions inherited from ScalarExprVisitor< TextEncodingCastCounts >
virtual TextEncodingCastCounts visitVar (const Analyzer::Var *) const
 
virtual TextEncodingCastCounts visitColumnVar (const Analyzer::ColumnVar *) const
 
virtual TextEncodingCastCounts visitColumnVarTuple (const Analyzer::ExpressionTuple *) const
 
virtual TextEncodingCastCounts visitConstant (const Analyzer::Constant *) const
 
virtual TextEncodingCastCounts visitGeoExpr (const Analyzer::GeoExpr *geo_expr) const
 
virtual TextEncodingCastCounts visitInValues (const Analyzer::InValues *in_values) const
 
virtual TextEncodingCastCounts visitInIntegerSet (const Analyzer::InIntegerSet *in_integer_set) const
 
virtual TextEncodingCastCounts visitCharLength (const Analyzer::CharLengthExpr *char_length) const
 
virtual TextEncodingCastCounts visitKeyForString (const Analyzer::KeyForStringExpr *key_for_string) const
 
virtual TextEncodingCastCounts visitSampleRatio (const Analyzer::SampleRatioExpr *sample_ratio) const
 
virtual TextEncodingCastCounts visitCardinality (const Analyzer::CardinalityExpr *cardinality) const
 
virtual TextEncodingCastCounts visitRegexpExpr (const Analyzer::RegexpExpr *regexp) const
 
virtual TextEncodingCastCounts visitWidthBucket (const Analyzer::WidthBucketExpr *width_bucket_expr) const
 
virtual TextEncodingCastCounts visitMLPredict (const Analyzer::MLPredictExpr *ml_predict_expr) const
 
virtual TextEncodingCastCounts visitPCAProject (const Analyzer::PCAProjectExpr *pca_project_expr) const
 
virtual TextEncodingCastCounts visitCaseExpr (const Analyzer::CaseExpr *case_) const
 
virtual TextEncodingCastCounts visitDatetruncExpr (const Analyzer::DatetruncExpr *datetrunc) const
 
virtual TextEncodingCastCounts visitExtractExpr (const Analyzer::ExtractExpr *extract) const
 
virtual TextEncodingCastCounts visitFunctionOperWithCustomTypeHandling (const Analyzer::FunctionOperWithCustomTypeHandling *func_oper) const
 
virtual TextEncodingCastCounts visitArrayOper (Analyzer::ArrayExpr const *array_expr) const
 
virtual TextEncodingCastCounts visitGeoUOper (const Analyzer::GeoUOper *geo_expr) const
 
virtual TextEncodingCastCounts visitGeoBinOper (const Analyzer::GeoBinOper *geo_expr) const
 
virtual TextEncodingCastCounts visitFunctionOper (const Analyzer::FunctionOper *func_oper) const
 
virtual TextEncodingCastCounts visitWindowFunction (const Analyzer::WindowFunction *window_func) const
 
virtual TextEncodingCastCounts visitDatediffExpr (const Analyzer::DatediffExpr *datediff) const
 
virtual TextEncodingCastCounts visitDateaddExpr (const Analyzer::DateaddExpr *dateadd) const
 
virtual TextEncodingCastCounts visitLikelihood (const Analyzer::LikelihoodExpr *likelihood) const
 
virtual TextEncodingCastCounts visitOffsetInFragment (const Analyzer::OffsetInFragment *) const
 
virtual TextEncodingCastCounts visitAggExpr (const Analyzer::AggExpr *agg) const
 
virtual TextEncodingCastCounts visitRangeJoinOper (const Analyzer::RangeOper *range_oper) const
 

Private Attributes

bool disregard_casts_to_none_encoding_ = false
 
const bool default_disregard_casts_to_none_encoding_
 

Detailed Description

Definition at line 269 of file RelAlgExecutor.cpp.

Constructor & Destructor Documentation

TextEncodingCastCountVisitor::TextEncodingCastCountVisitor ( const bool  default_disregard_casts_to_none_encoding)
inline

Definition at line 271 of file RelAlgExecutor.cpp.

273  default_disregard_casts_to_none_encoding) {}
const bool default_disregard_casts_to_none_encoding_

Member Function Documentation

TextEncodingCastCounts TextEncodingCastCountVisitor::aggregateResult ( const TextEncodingCastCounts aggregate,
const TextEncodingCastCounts next_result 
) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 383 of file RelAlgExecutor.cpp.

References run_benchmark_import::result, TextEncodingCastCounts::text_decoding_casts, and TextEncodingCastCounts::text_encoding_casts.

Referenced by visitBinOper(), visitLikeExpr(), visitStringOper(), and visitUOper().

385  {
386  auto result = aggregate;
387  result.text_decoding_casts += next_result.text_decoding_casts;
388  result.text_encoding_casts += next_result.text_encoding_casts;
389  return result;
390  }

+ Here is the caller graph for this function:

TextEncodingCastCounts TextEncodingCastCountVisitor::defaultResult ( ) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 396 of file RelAlgExecutor.cpp.

Referenced by visitBinOper(), visitLikeExpr(), visitStringOper(), and visitUOper().

396  {
397  return TextEncodingCastCounts();
398  }

+ Here is the caller graph for this function:

void TextEncodingCastCountVisitor::visitBegin ( ) const
inlineoverrideprotectedvirtual
TextEncodingCastCounts TextEncodingCastCountVisitor::visitBinOper ( const Analyzer::BinOper bin_oper) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 323 of file RelAlgExecutor.cpp.

References aggregateResult(), defaultResult(), disregard_casts_to_none_encoding_, Analyzer::BinOper::get_left_operand(), Analyzer::BinOper::get_optype(), Analyzer::BinOper::get_right_operand(), kCAST, kEQ, kNE, run_benchmark_import::result, ScalarExprVisitor< TextEncodingCastCounts >::visit(), and visitUOper().

323  {
325  // Currently the join framework handles casts between string types, and
326  // casts to none-encoded strings should be considered spurious, except
327  // when the join predicate is not a =/<> operator, in which case
328  // for both join predicates and all other instances we have to decode
329  // to a none-encoded string to do the comparison. The logic below essentially
330  // overrides the logic such as to always count none-encoded casts on strings
331  // that are children of binary operators other than =/<>
332  if (bin_oper->get_optype() != kEQ && bin_oper->get_optype() != kNE) {
333  // Override the global override so that join opers don't skip
334  // the check when there is an actual cast to none-encoded string
335  const auto prev_disregard_casts_to_none_encoding_state =
337  const auto left_u_oper =
338  dynamic_cast<const Analyzer::UOper*>(bin_oper->get_left_operand());
339  if (left_u_oper && left_u_oper->get_optype() == kCAST) {
341  result = aggregateResult(result, visitUOper(left_u_oper));
342  } else {
343  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
344  result = aggregateResult(result, visit(bin_oper->get_left_operand()));
345  }
346 
347  const auto right_u_oper =
348  dynamic_cast<const Analyzer::UOper*>(bin_oper->get_left_operand());
349  if (right_u_oper && right_u_oper->get_optype() == kCAST) {
351  result = aggregateResult(result, visitUOper(right_u_oper));
352  } else {
353  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
354  result = aggregateResult(result, visit(bin_oper->get_right_operand()));
355  }
356  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
357  } else {
358  result = aggregateResult(result, visit(bin_oper->get_left_operand()));
359  result = aggregateResult(result, visit(bin_oper->get_right_operand()));
360  }
361  return result;
362  }
TextEncodingCastCounts visitUOper(const Analyzer::UOper *u_oper) const override
const Expr * get_right_operand() const
Definition: Analyzer.h:456
Definition: sqldefs.h:48
Definition: sqldefs.h:29
TextEncodingCastCounts visit(const Analyzer::Expr *expr) const
SQLOps get_optype() const
Definition: Analyzer.h:452
TextEncodingCastCounts aggregateResult(const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
Definition: sqldefs.h:31
const Expr * get_left_operand() const
Definition: Analyzer.h:455
TextEncodingCastCounts defaultResult() const override

+ Here is the call graph for this function:

TextEncodingCastCounts TextEncodingCastCountVisitor::visitLikeExpr ( const Analyzer::LikeExpr like) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 364 of file RelAlgExecutor.cpp.

References aggregateResult(), defaultResult(), disregard_casts_to_none_encoding_, Analyzer::LikeExpr::get_arg(), Analyzer::LikeExpr::get_escape_expr(), Analyzer::LikeExpr::get_like_expr(), kCAST, run_benchmark_import::result, ScalarExprVisitor< TextEncodingCastCounts >::visit(), and visitUOper().

364  {
366  const auto u_oper = dynamic_cast<const Analyzer::UOper*>(like->get_arg());
367  const auto prev_disregard_casts_to_none_encoding_state =
369  if (u_oper && u_oper->get_optype() == kCAST) {
371  result = aggregateResult(result, visitUOper(u_oper));
372  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
373  } else {
374  result = aggregateResult(result, visit(like->get_arg()));
375  }
376  result = aggregateResult(result, visit(like->get_like_expr()));
377  if (like->get_escape_expr()) {
378  result = aggregateResult(result, visit(like->get_escape_expr()));
379  }
380  return result;
381  }
TextEncodingCastCounts visitUOper(const Analyzer::UOper *u_oper) const override
const Expr * get_escape_expr() const
Definition: Analyzer.h:1064
Definition: sqldefs.h:48
TextEncodingCastCounts visit(const Analyzer::Expr *expr) const
const Expr * get_arg() const
Definition: Analyzer.h:1061
TextEncodingCastCounts aggregateResult(const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
const Expr * get_like_expr() const
Definition: Analyzer.h:1063
TextEncodingCastCounts defaultResult() const override

+ Here is the call graph for this function:

TextEncodingCastCounts TextEncodingCastCountVisitor::visitStringOper ( const Analyzer::StringOper string_oper) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 310 of file RelAlgExecutor.cpp.

References aggregateResult(), defaultResult(), Analyzer::StringOper::get_kind(), Analyzer::StringOper::getArg(), Analyzer::StringOper::getArity(), Analyzer::StringOper::hasNoneEncodedTextArg(), run_benchmark_import::result, string_op_returns_string(), and ScalarExprVisitor< TextEncodingCastCounts >::visit().

311  {
313  if (string_oper->getArity() > 0) {
314  result = aggregateResult(result, visit(string_oper->getArg(0)));
315  }
316  if (string_op_returns_string(string_oper->get_kind()) &&
317  string_oper->hasNoneEncodedTextArg()) {
318  result = aggregateResult(result, TextEncodingCastCounts(0UL, 1UL));
319  }
320  return result;
321  }
bool hasNoneEncodedTextArg() const
Definition: Analyzer.h:1743
size_t getArity() const
Definition: Analyzer.h:1674
TextEncodingCastCounts visit(const Analyzer::Expr *expr) const
TextEncodingCastCounts aggregateResult(const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
bool string_op_returns_string(const SqlStringOpKind kind)
Definition: sqldefs.h:468
SqlStringOpKind get_kind() const
Definition: Analyzer.h:1672
TextEncodingCastCounts defaultResult() const override
const Expr * getArg(const size_t i) const
Definition: Analyzer.h:1688

+ Here is the call graph for this function:

TextEncodingCastCounts TextEncodingCastCountVisitor::visitUOper ( const Analyzer::UOper u_oper) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 276 of file RelAlgExecutor.cpp.

References aggregateResult(), defaultResult(), disregard_casts_to_none_encoding_, Analyzer::Expr::get_num_column_vars(), Analyzer::UOper::get_operand(), Analyzer::UOper::get_optype(), Analyzer::Expr::get_type_info(), kCAST, run_benchmark_import::result, and ScalarExprVisitor< TextEncodingCastCounts >::visit().

Referenced by visitBinOper(), and visitLikeExpr().

276  {
278  // Save state of input disregard_casts_to_none_encoding_ as child node traversal
279  // will reset it
280  const bool disregard_casts_to_none_encoding = disregard_casts_to_none_encoding_;
281  result = aggregateResult(result, visit(u_oper->get_operand()));
282  if (u_oper->get_optype() != kCAST) {
283  return result;
284  }
285  const auto& operand_ti = u_oper->get_operand()->get_type_info();
286  const auto& casted_ti = u_oper->get_type_info();
287  if (!operand_ti.is_string() && casted_ti.is_dict_encoded_string()) {
288  return aggregateResult(result, TextEncodingCastCounts(0UL, 1UL));
289  }
290  if (!casted_ti.is_string()) {
291  return result;
292  }
293  const bool literals_only = u_oper->get_operand()->get_num_column_vars(true) == 0UL;
294  if (literals_only) {
295  return result;
296  }
297  if (operand_ti.is_none_encoded_string() && casted_ti.is_dict_encoded_string()) {
298  return aggregateResult(result, TextEncodingCastCounts(0UL, 1UL));
299  }
300  if (operand_ti.is_dict_encoded_string() && casted_ti.is_none_encoded_string()) {
301  if (!disregard_casts_to_none_encoding) {
302  return aggregateResult(result, TextEncodingCastCounts(1UL, 0UL));
303  } else {
304  return result;
305  }
306  }
307  return result;
308  }
Definition: sqldefs.h:48
TextEncodingCastCounts visit(const Analyzer::Expr *expr) const
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:79
TextEncodingCastCounts aggregateResult(const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
const Expr * get_operand() const
Definition: Analyzer.h:384
TextEncodingCastCounts defaultResult() const override
virtual size_t get_num_column_vars(const bool include_agg) const
Definition: Analyzer.cpp:58
SQLOps get_optype() const
Definition: Analyzer.h:383

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Member Data Documentation

const bool TextEncodingCastCountVisitor::default_disregard_casts_to_none_encoding_
private

Definition at line 402 of file RelAlgExecutor.cpp.

Referenced by visitBegin().

bool TextEncodingCastCountVisitor::disregard_casts_to_none_encoding_ = false
mutableprivate

Definition at line 401 of file RelAlgExecutor.cpp.

Referenced by visitBegin(), visitBinOper(), visitLikeExpr(), and visitUOper().


The documentation for this class was generated from the following file: