OmniSciDB  dfae7c3b14
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

◆ can_combine_with()

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

Definition at line 25 of file EquiJoinCondition.cpp.

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

Referenced by combine_equi_join_conditions().

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

◆ make_composite_equals()

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 102 of file EquiJoinCondition.cpp.

References make_composite_equals_impl().

Referenced by combine_equi_join_conditions().

103  {
104  if (crt_coalesced_quals.size() == 1) {
105  return {crt_coalesced_quals.front()};
106  }
107  return make_composite_equals_impl(crt_coalesced_quals);
108 }
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:

◆ make_composite_equals_impl()

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 57 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().

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