OmniSciDB  c1a53651b2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HashJoin.h File Reference
+ Include dependency graph for HashJoin.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  JoinHashTableTooBig
 
class  TooManyHashEntries
 
class  TableMustBeReplicated
 
class  HashJoinFail
 
class  NeedsOneToManyHash
 
class  FailedToFetchColumn
 
class  FailedToJoinOnVirtualColumn
 
class  OverlapsHashTableTooBig
 
struct  ColumnsForDevice
 
struct  HashJoinMatchingSet
 
struct  CompositeKeyInfo
 
class  HashJoin
 

Typedefs

using InnerOuter = std::pair< const Analyzer::ColumnVar *, const Analyzer::Expr * >
 
using InnerOuterStringOpInfos = std::pair< std::vector< StringOps_Namespace::StringOpInfo >, std::vector< StringOps_Namespace::StringOpInfo >>
 

Enumerations

enum  InnerQualDecision { InnerQualDecision::IGNORE = 0, InnerQualDecision::UNKNOWN, InnerQualDecision::LHS, InnerQualDecision::RHS }
 

Functions

std::ostream & operator<< (std::ostream &os, InnerQualDecision const decision)
 
std::ostream & operator<< (std::ostream &os, const DecodedJoinHashBufferEntry &e)
 
std::ostream & operator<< (std::ostream &os, const DecodedJoinHashBufferSet &s)
 
std::ostream & operator<< (std::ostream &os, const InnerOuterStringOpInfos &inner_outer_string_op_infos)
 
std::ostream & operator<< (std::ostream &os, const std::vector< InnerOuterStringOpInfos > &inner_outer_string_op_infos_pairs)
 
std::string toString (const InnerOuterStringOpInfos &inner_outer_string_op_infos)
 
std::string toString (const std::vector< InnerOuterStringOpInfos > &inner_outer_string_op_infos_pairs)
 
std::shared_ptr
< Analyzer::ColumnVar
getSyntheticColumnVar (std::string_view table, std::string_view column, int rte_idx, const Catalog_Namespace::Catalog &catalog)
 
size_t get_shard_count (const Analyzer::BinOper *join_condition, const Executor *executor)
 
size_t get_shard_count (std::pair< const Analyzer::ColumnVar *, const Analyzer::Expr * > equi_pair, const Executor *executor)
 

Typedef Documentation

using InnerOuter = std::pair<const Analyzer::ColumnVar*, const Analyzer::Expr*>

Definition at line 106 of file HashJoin.h.

Definition at line 108 of file HashJoin.h.

Enumeration Type Documentation

enum InnerQualDecision
strong
Enumerator
IGNORE 
UNKNOWN 
LHS 
RHS 

Definition at line 63 of file HashJoin.h.

Function Documentation

size_t get_shard_count ( const Analyzer::BinOper join_condition,
const Executor executor 
)

Definition at line 1048 of file HashJoin.cpp.

References anonymous_namespace{HashJoin.cpp}::get_cols(), and get_shard_count().

Referenced by get_shard_count(), BaselineJoinHashTable::getShardCountForCondition(), PerfectJoinHashTable::reify(), PerfectJoinHashTable::shardCount(), and Executor::skipFragmentPair().

1049  {
1050  const Analyzer::ColumnVar* inner_col{nullptr};
1051  const Analyzer::Expr* outer_col{nullptr};
1052  std::shared_ptr<Analyzer::BinOper> redirected_bin_oper;
1053  try {
1054  std::tie(inner_col, outer_col) =
1055  get_cols(join_condition, executor->getTemporaryTables());
1056  } catch (...) {
1057  return 0;
1058  }
1059  if (!inner_col || !outer_col) {
1060  return 0;
1061  }
1062  return get_shard_count({inner_col, outer_col}, executor);
1063 }
InnerOuter get_cols(const Analyzer::BinOper *qual_bin_oper, const TemporaryTables *temporary_tables)
Definition: HashJoin.cpp:1039
size_t get_shard_count(const Analyzer::BinOper *join_condition, const Executor *executor)
Definition: HashJoin.cpp:1048

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

size_t get_shard_count ( std::pair< const Analyzer::ColumnVar *, const Analyzer::Expr * >  equi_pair,
const Executor executor 
)

Definition at line 112 of file PerfectJoinHashTable.cpp.

References CHECK, Catalog_Namespace::get_metadata_for_table(), and anonymous_namespace{PerfectJoinHashTable.cpp}::shard_count_less_or_equal_device_count().

114  {
115  const auto inner_col = equi_pair.first;
116  const auto outer_col = dynamic_cast<const Analyzer::ColumnVar*>(equi_pair.second);
117  if (!outer_col || inner_col->getColumnKey().table_id < 0 ||
118  outer_col->getColumnKey().table_id < 0) {
119  return 0;
120  }
121  if (outer_col->get_rte_idx()) {
122  return 0;
123  }
124  if (inner_col->get_type_info() != outer_col->get_type_info()) {
125  return 0;
126  }
127 
128  const auto inner_td =
129  Catalog_Namespace::get_metadata_for_table(inner_col->getTableKey());
130  CHECK(inner_td);
131  const auto outer_td =
132  Catalog_Namespace::get_metadata_for_table(outer_col->getTableKey());
133  CHECK(outer_td);
134  if (inner_td->shardedColumnId == 0 || outer_td->shardedColumnId == 0 ||
135  inner_td->nShards != outer_td->nShards) {
136  return 0;
137  }
138  if (!shard_count_less_or_equal_device_count(inner_col->getTableKey(), executor)) {
139  return 0;
140  }
141  // The two columns involved must be the ones on which the tables have been sharded on.
142  return (inner_td->shardedColumnId == inner_col->getColumnKey().column_id &&
143  outer_td->shardedColumnId == outer_col->getColumnKey().column_id) ||
144  (outer_td->shardedColumnId == inner_col->getColumnKey().column_id &&
145  inner_td->shardedColumnId == inner_col->getColumnKey().column_id)
146  ? inner_td->nShards
147  : 0;
148 }
const TableDescriptor * get_metadata_for_table(const ::shared::TableKey &table_key, bool populate_fragmenter)
bool shard_count_less_or_equal_device_count(const shared::TableKey &inner_table_key, const Executor *executor)
#define CHECK(condition)
Definition: Logger.h:291

+ Here is the call graph for this function:

std::shared_ptr<Analyzer::ColumnVar> getSyntheticColumnVar ( std::string_view  table,
std::string_view  column,
int  rte_idx,
const Catalog_Namespace::Catalog catalog 
)

Definition at line 561 of file HashJoin.cpp.

References CHECK, Catalog_Namespace::Catalog::getDatabaseId(), Catalog_Namespace::Catalog::getMetadataForColumn(), Catalog_Namespace::Catalog::getMetadataForTable(), kLINESTRING, kMULTIPOLYGON, kPOINT, and kPOLYGON.

Referenced by HashJoin::getSyntheticInstance().

565  {
566  auto tmeta = catalog.getMetadataForTable(std::string(table));
567  CHECK(tmeta);
568 
569  auto cmeta = catalog.getMetadataForColumn(tmeta->tableId, std::string(column));
570  CHECK(cmeta);
571 
572  auto ti = cmeta->columnType;
573 
574  if (ti.is_geometry() && ti.get_type() != kPOINT) {
575  int geoColumnId{0};
576  switch (ti.get_type()) {
577  case kLINESTRING: {
578  geoColumnId = cmeta->columnId + 2;
579  break;
580  }
581  case kPOLYGON: {
582  geoColumnId = cmeta->columnId + 3;
583  break;
584  }
585  case kMULTIPOLYGON: {
586  geoColumnId = cmeta->columnId + 4;
587  break;
588  }
589  default:
590  CHECK(false);
591  }
592  cmeta = catalog.getMetadataForColumn(tmeta->tableId, geoColumnId);
593  CHECK(cmeta);
594  ti = cmeta->columnType;
595  }
596 
597  auto cv = std::make_shared<Analyzer::ColumnVar>(
598  ti,
599  shared::ColumnKey{catalog.getDatabaseId(), tmeta->tableId, cmeta->columnId},
600  rte_idx);
601  return cv;
602 }
const ColumnDescriptor * getMetadataForColumn(int tableId, const std::string &colName) const
int getDatabaseId() const
Definition: Catalog.h:304
#define CHECK(condition)
Definition: Logger.h:291
const TableDescriptor * getMetadataForTable(const std::string &tableName, const bool populateFragmenter=true) const
Returns a pointer to a const TableDescriptor struct matching the provided tableName.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

std::ostream& operator<< ( std::ostream &  os,
InnerQualDecision const  decision 
)
inline

Definition at line 66 of file HashJoin.h.

66  {
67  constexpr char const* strings[]{"IGNORE", "UNKNOWN", "LHS", "RHS"};
68  return os << strings[static_cast<int>(decision)];
69 }
std::ostream& operator<< ( std::ostream &  os,
const DecodedJoinHashBufferEntry e 
)

Definition at line 126 of file HashJoin.cpp.

References DecodedJoinHashBufferEntry::key, and DecodedJoinHashBufferEntry::payload.

126  {
127  os << " {{";
128  bool first = true;
129  for (auto k : e.key) {
130  if (!first) {
131  os << ",";
132  } else {
133  first = false;
134  }
135  os << k;
136  }
137  os << "}, ";
138  os << "{";
139  first = true;
140  for (auto p : e.payload) {
141  if (!first) {
142  os << ", ";
143  } else {
144  first = false;
145  }
146  os << p;
147  }
148  os << "}}";
149  return os;
150 }
std::set< int32_t > payload
Definition: HashTable.h:23
std::vector< int64_t > key
Definition: HashTable.h:22
std::ostream& operator<< ( std::ostream &  os,
const DecodedJoinHashBufferSet s 
)

Definition at line 152 of file HashJoin.cpp.

152  {
153  os << "{\n";
154  bool first = true;
155  for (auto e : s) {
156  if (!first) {
157  os << ",\n";
158  } else {
159  first = false;
160  }
161  os << e;
162  }
163  if (!s.empty()) {
164  os << "\n";
165  }
166  os << "}\n";
167  return os;
168 }
std::ostream& operator<< ( std::ostream &  os,
const InnerOuterStringOpInfos inner_outer_string_op_infos 
)

Definition at line 170 of file HashJoin.cpp.

171  {
172  os << "(" << inner_outer_string_op_infos.first << ", "
173  << inner_outer_string_op_infos.second << ")";
174  return os;
175 }
std::ostream& operator<< ( std::ostream &  os,
const std::vector< InnerOuterStringOpInfos > &  inner_outer_string_op_infos_pairs 
)

Definition at line 183 of file HashJoin.cpp.

185  {
186  os << "[";
187  bool first_elem = true;
188  for (const auto& inner_outer_string_op_infos : inner_outer_string_op_infos_pairs) {
189  if (!first_elem) {
190  os << ", ";
191  }
192  first_elem = false;
193  os << inner_outer_string_op_infos;
194  }
195  os << "]";
196  return os;
197 }
std::string toString ( const InnerOuterStringOpInfos inner_outer_string_op_infos)

Definition at line 177 of file HashJoin.cpp.

177  {
178  std::ostringstream os;
179  os << inner_outer_string_op_infos;
180  return os.str();
181 }
std::string toString ( const std::vector< InnerOuterStringOpInfos > &  inner_outer_string_op_infos_pairs)

Definition at line 199 of file HashJoin.cpp.

200  {
201  std::ostringstream os;
202  os << inner_outer_string_op_infos_pairs;
203  return os.str();
204 }