OmniSciDB  a47db9e897
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
anonymous_namespace{EquiJoinCondition.cpp} Namespace Reference

Functions

bool can_combine_with (const Analyzer::Expr *crt, const Analyzer::Expr *prev)
 
std::list< std::shared_ptr
< Analyzer::Expr > > 
make_composite_equals_impl (const std::vector< std::shared_ptr< Analyzer::Expr >> &crt_coalesced_quals)
 
std::list< std::shared_ptr
< Analyzer::Expr > > 
make_composite_equals (const std::vector< std::shared_ptr< Analyzer::Expr >> &crt_coalesced_quals)
 

Function Documentation

bool anonymous_namespace{EquiJoinCondition.cpp}::can_combine_with ( const Analyzer::Expr crt,
const Analyzer::Expr prev 
)

Definition at line 24 of file EquiJoinCondition.cpp.

References IS_EQUIVALENCE, kONE, remove_cast(), and ScalarExprVisitor< T >::visit().

Referenced by combine_equi_join_conditions().

24  {
25  const auto crt_bin = dynamic_cast<const Analyzer::BinOper*>(crt);
26  const auto prev_bin = dynamic_cast<const Analyzer::BinOper*>(prev);
27  if (!crt_bin || !prev_bin) {
28  return false;
29  }
30  if (!IS_EQUIVALENCE(crt_bin->get_optype()) || crt_bin->get_qualifier() != kONE ||
31  !IS_EQUIVALENCE(prev_bin->get_optype()) || prev_bin->get_qualifier() != kONE ||
32  // We could accept a mix of kEQ and kBW_EQ, but don't bother for now.
33  crt_bin->get_optype() != prev_bin->get_optype()) {
34  return false;
35  }
36  const auto crt_inner = std::dynamic_pointer_cast<Analyzer::ColumnVar>(
37  remove_cast(crt_bin->get_own_right_operand()));
38  const auto prev_inner = std::dynamic_pointer_cast<Analyzer::ColumnVar>(
39  remove_cast(prev_bin->get_own_right_operand()));
41  const auto crt_outer_rte_set = visitor.visit(crt_bin->get_left_operand());
42  const auto prev_outer_rte_set = visitor.visit(prev_bin->get_left_operand());
43  // We shouldn't treat mixed nesting levels columns as a composite key tuple.
44  if (crt_outer_rte_set.size() != 1 || prev_outer_rte_set.size() != 1 ||
45  crt_outer_rte_set != prev_outer_rte_set) {
46  return false;
47  }
48  if (!crt_inner || !prev_inner ||
49  crt_inner->get_table_id() != prev_inner->get_table_id() ||
50  crt_inner->get_rte_idx() != prev_inner->get_rte_idx()) {
51  return false;
52  }
53  return true;
54 }
std::shared_ptr< Analyzer::Expr > remove_cast(const std::shared_ptr< Analyzer::Expr > &expr)
Definition: Analyzer.cpp:3056
#define IS_EQUIVALENCE(X)
Definition: sqldefs.h:67
T visit(const Analyzer::Expr *expr) const
Definition: sqldefs.h:69

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

std::list<std::shared_ptr<Analyzer::Expr> > anonymous_namespace{EquiJoinCondition.cpp}::make_composite_equals ( const std::vector< std::shared_ptr< Analyzer::Expr >> &  crt_coalesced_quals)

Definition at line 101 of file EquiJoinCondition.cpp.

References make_composite_equals_impl().

Referenced by combine_equi_join_conditions().

102  {
103  if (crt_coalesced_quals.size() == 1) {
104  return {crt_coalesced_quals.front()};
105  }
106  return make_composite_equals_impl(crt_coalesced_quals);
107 }
std::list< std::shared_ptr< Analyzer::Expr > > make_composite_equals_impl(const std::vector< std::shared_ptr< Analyzer::Expr >> &crt_coalesced_quals)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

std::list<std::shared_ptr<Analyzer::Expr> > anonymous_namespace{EquiJoinCondition.cpp}::make_composite_equals_impl ( const std::vector< std::shared_ptr< Analyzer::Expr >> &  crt_coalesced_quals)

Definition at line 56 of file EquiJoinCondition.cpp.

References CHECK(), CHECK_EQ, IS_NUMBER, IS_STRING, kBOOLEAN, kENCODING_DICT, kONE, and remove_cast().

Referenced by coalesce_singleton_equi_join(), and make_composite_equals().

57  {
58  std::list<std::shared_ptr<Analyzer::Expr>> join_quals;
59  std::vector<std::shared_ptr<Analyzer::Expr>> lhs_tuple;
60  std::vector<std::shared_ptr<Analyzer::Expr>> rhs_tuple;
61  bool not_null{true};
62  for (const auto& qual : crt_coalesced_quals) {
63  const auto qual_binary = std::dynamic_pointer_cast<Analyzer::BinOper>(qual);
64  CHECK(qual_binary);
65  not_null = not_null && qual_binary->get_type_info().get_notnull();
66  const auto lhs_col = remove_cast(qual_binary->get_own_left_operand());
67  const auto rhs_col = remove_cast(qual_binary->get_own_right_operand());
68  const auto lhs_ti = lhs_col->get_type_info();
69  // Coalesce cols for integers, bool, and dict encoded strings. Forces baseline hash
70  // join.
71  if (IS_NUMBER(lhs_ti.get_type()) ||
72  (IS_STRING(lhs_ti.get_type()) && lhs_ti.get_compression() == kENCODING_DICT) ||
73  (lhs_ti.get_type() == kBOOLEAN)) {
74  lhs_tuple.push_back(lhs_col);
75  rhs_tuple.push_back(rhs_col);
76  } else {
77  join_quals.push_back(qual);
78  }
79  }
80  CHECK(!crt_coalesced_quals.empty());
81  const auto first_qual =
82  std::dynamic_pointer_cast<Analyzer::BinOper>(crt_coalesced_quals.front());
83  CHECK(first_qual);
84  CHECK_EQ(lhs_tuple.size(), rhs_tuple.size());
85  if (lhs_tuple.size() > 0) {
86  join_quals.push_front(std::make_shared<Analyzer::BinOper>(
87  SQLTypeInfo(kBOOLEAN, not_null),
88  false,
89  first_qual->get_optype(),
90  kONE,
91  lhs_tuple.size() > 1 ? std::make_shared<Analyzer::ExpressionTuple>(lhs_tuple)
92  : lhs_tuple.front(),
93  rhs_tuple.size() > 1 ? std::make_shared<Analyzer::ExpressionTuple>(rhs_tuple)
94  : rhs_tuple.front()));
95  }
96  return join_quals;
97 }
#define CHECK_EQ(x, y)
Definition: Logger.h:198
std::shared_ptr< Analyzer::Expr > remove_cast(const std::shared_ptr< Analyzer::Expr > &expr)
Definition: Analyzer.cpp:3056
CHECK(cgen_state)
SQLTypeInfoCore< ArrayContextTypeSizer, ExecutorTypePackaging, DateTimeFacilities > SQLTypeInfo
Definition: sqltypes.h:852
Definition: sqldefs.h:69
#define IS_STRING(T)
Definition: sqltypes.h:166
#define IS_NUMBER(T)
Definition: sqltypes.h:163

+ Here is the call graph for this function:

+ Here is the caller graph for this function: