OmniSciDB  c1a53651b2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor Class Reference
+ Inheritance diagram for anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor:
+ Collaboration diagram for anonymous_namespace{RelAlgExecutor.cpp}::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 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
 
virtual TextEncodingCastCounts aggregateResult (const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const
 

Private Attributes

bool disregard_casts_to_none_encoding_ = false
 
const bool default_disregard_casts_to_none_encoding_
 

Detailed Description

Definition at line 279 of file RelAlgExecutor.cpp.

Constructor & Destructor Documentation

anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::TextEncodingCastCountVisitor ( const bool  default_disregard_casts_to_none_encoding)
inline

Definition at line 281 of file RelAlgExecutor.cpp.

283  default_disregard_casts_to_none_encoding) {}

Member Function Documentation

TextEncodingCastCounts anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::aggregateResult ( const TextEncodingCastCounts aggregate,
const TextEncodingCastCounts next_result 
) const
inlineoverrideprotected

Definition at line 393 of file RelAlgExecutor.cpp.

References run_benchmark_import::result, anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCounts::text_decoding_casts, and anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCounts::text_encoding_casts.

395  {
396  auto result = aggregate;
397  result.text_decoding_casts += next_result.text_decoding_casts;
398  result.text_encoding_casts += next_result.text_encoding_casts;
399  return result;
400  }
TextEncodingCastCounts anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::defaultResult ( ) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 406 of file RelAlgExecutor.cpp.

406  {
407  return TextEncodingCastCounts();
408  }
void anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::visitBegin ( ) const
inlineoverrideprotectedvirtual
TextEncodingCastCounts anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::visitBinOper ( const Analyzer::BinOper bin_oper) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 333 of file RelAlgExecutor.cpp.

References Analyzer::BinOper::get_left_operand(), Analyzer::BinOper::get_optype(), Analyzer::BinOper::get_right_operand(), kCAST, kEQ, kNE, and run_benchmark_import::result.

333  {
334  TextEncodingCastCounts result = defaultResult();
335  // Currently the join framework handles casts between string types, and
336  // casts to none-encoded strings should be considered spurious, except
337  // when the join predicate is not a =/<> operator, in which case
338  // for both join predicates and all other instances we have to decode
339  // to a none-encoded string to do the comparison. The logic below essentially
340  // overrides the logic such as to always count none-encoded casts on strings
341  // that are children of binary operators other than =/<>
342  if (bin_oper->get_optype() != kEQ && bin_oper->get_optype() != kNE) {
343  // Override the global override so that join opers don't skip
344  // the check when there is an actual cast to none-encoded string
345  const auto prev_disregard_casts_to_none_encoding_state =
347  const auto left_u_oper =
348  dynamic_cast<const Analyzer::UOper*>(bin_oper->get_left_operand());
349  if (left_u_oper && left_u_oper->get_optype() == kCAST) {
351  result = aggregateResult(result, visitUOper(left_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_left_operand()));
355  }
356 
357  const auto right_u_oper =
358  dynamic_cast<const Analyzer::UOper*>(bin_oper->get_left_operand());
359  if (right_u_oper && right_u_oper->get_optype() == kCAST) {
361  result = aggregateResult(result, visitUOper(right_u_oper));
362  } else {
363  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
364  result = aggregateResult(result, visit(bin_oper->get_right_operand()));
365  }
366  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
367  } else {
368  result = aggregateResult(result, visit(bin_oper->get_left_operand()));
369  result = aggregateResult(result, visit(bin_oper->get_right_operand()));
370  }
371  return result;
372  }
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

+ Here is the call graph for this function:

TextEncodingCastCounts anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::visitLikeExpr ( const Analyzer::LikeExpr like) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 374 of file RelAlgExecutor.cpp.

References Analyzer::LikeExpr::get_arg(), Analyzer::LikeExpr::get_escape_expr(), Analyzer::LikeExpr::get_like_expr(), kCAST, and run_benchmark_import::result.

374  {
375  TextEncodingCastCounts result = defaultResult();
376  const auto u_oper = dynamic_cast<const Analyzer::UOper*>(like->get_arg());
377  const auto prev_disregard_casts_to_none_encoding_state =
379  if (u_oper && u_oper->get_optype() == kCAST) {
381  result = aggregateResult(result, visitUOper(u_oper));
382  disregard_casts_to_none_encoding_ = prev_disregard_casts_to_none_encoding_state;
383  } else {
384  result = aggregateResult(result, visit(like->get_arg()));
385  }
386  result = aggregateResult(result, visit(like->get_like_expr()));
387  if (like->get_escape_expr()) {
388  result = aggregateResult(result, visit(like->get_escape_expr()));
389  }
390  return result;
391  }
TextEncodingCastCounts visitUOper(const Analyzer::UOper *u_oper) const override
const Expr * get_escape_expr() const
Definition: Analyzer.h:912
Definition: sqldefs.h:48
TextEncodingCastCounts visit(const Analyzer::Expr *expr) const
const Expr * get_arg() const
Definition: Analyzer.h:909
TextEncodingCastCounts aggregateResult(const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
const Expr * get_like_expr() const
Definition: Analyzer.h:911

+ Here is the call graph for this function:

TextEncodingCastCounts anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::visitStringOper ( const Analyzer::StringOper string_oper) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 320 of file RelAlgExecutor.cpp.

References Analyzer::StringOper::get_kind(), Analyzer::StringOper::getArg(), Analyzer::StringOper::getArity(), Analyzer::StringOper::hasNoneEncodedTextArg(), run_benchmark_import::result, and string_op_returns_string().

321  {
322  TextEncodingCastCounts result = defaultResult();
323  if (string_oper->getArity() > 0) {
324  result = aggregateResult(result, visit(string_oper->getArg(0)));
325  }
326  if (string_op_returns_string(string_oper->get_kind()) &&
327  string_oper->hasNoneEncodedTextArg()) {
328  result = aggregateResult(result, TextEncodingCastCounts(0UL, 1UL));
329  }
330  return result;
331  }
bool hasNoneEncodedTextArg() const
Definition: Analyzer.h:1617
size_t getArity() const
Definition: Analyzer.h:1548
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:449
SqlStringOpKind get_kind() const
Definition: Analyzer.h:1546
const Expr * getArg(const size_t i) const
Definition: Analyzer.h:1562

+ Here is the call graph for this function:

TextEncodingCastCounts anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::visitUOper ( const Analyzer::UOper u_oper) const
inlineoverrideprotectedvirtual

Reimplemented from ScalarExprVisitor< TextEncodingCastCounts >.

Definition at line 286 of file RelAlgExecutor.cpp.

References Analyzer::Expr::get_num_column_vars(), Analyzer::UOper::get_operand(), Analyzer::UOper::get_optype(), Analyzer::Expr::get_type_info(), kCAST, and run_benchmark_import::result.

286  {
287  TextEncodingCastCounts result = defaultResult();
288  // Save state of input disregard_casts_to_none_encoding_ as child node traversal
289  // will reset it
290  const bool disregard_casts_to_none_encoding = disregard_casts_to_none_encoding_;
291  result = aggregateResult(result, visit(u_oper->get_operand()));
292  if (u_oper->get_optype() != kCAST) {
293  return result;
294  }
295  const auto& operand_ti = u_oper->get_operand()->get_type_info();
296  const auto& casted_ti = u_oper->get_type_info();
297  if (!operand_ti.is_string() && casted_ti.is_dict_encoded_string()) {
298  return aggregateResult(result, TextEncodingCastCounts(0UL, 1UL));
299  }
300  if (!casted_ti.is_string()) {
301  return result;
302  }
303  const bool literals_only = u_oper->get_operand()->get_num_column_vars(true) == 0UL;
304  if (literals_only) {
305  return result;
306  }
307  if (operand_ti.is_none_encoded_string() && casted_ti.is_dict_encoded_string()) {
308  return aggregateResult(result, TextEncodingCastCounts(0UL, 1UL));
309  }
310  if (operand_ti.is_dict_encoded_string() && casted_ti.is_none_encoded_string()) {
311  if (!disregard_casts_to_none_encoding) {
312  return aggregateResult(result, TextEncodingCastCounts(1UL, 0UL));
313  } else {
314  return result;
315  }
316  }
317  return result;
318  }
Definition: sqldefs.h:48
TextEncodingCastCounts visit(const Analyzer::Expr *expr) const
TextEncodingCastCounts aggregateResult(const TextEncodingCastCounts &aggregate, const TextEncodingCastCounts &next_result) const override
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:79
const Expr * get_operand() const
Definition: Analyzer.h:384
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:

Member Data Documentation

const bool anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::default_disregard_casts_to_none_encoding_
private

Definition at line 412 of file RelAlgExecutor.cpp.

bool anonymous_namespace{RelAlgExecutor.cpp}::TextEncodingCastCountVisitor::disregard_casts_to_none_encoding_ = false
mutableprivate

Definition at line 411 of file RelAlgExecutor.cpp.


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