OmniSciDB  6686921089
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HashJoin.cpp File Reference
+ Include dependency graph for HashJoin.cpp:

Go to the source code of this file.

Classes

class  AllColumnVarsVisitor
 

Namespaces

 anonymous_namespace{HashJoin.cpp}
 

Functions

template<typename T >
std::string anonymous_namespace{HashJoin.cpp}::toStringFlat (const HashJoin *hash_table, const ExecutorDeviceType device_type, const int device_id)
 
std::ostream & operator<< (std::ostream &os, const DecodedJoinHashBufferEntry &e)
 
std::ostream & operator<< (std::ostream &os, const DecodedJoinHashBufferSet &s)
 
std::shared_ptr
< Analyzer::ColumnVar
getSyntheticColumnVar (std::string_view table, std::string_view column, int rte_idx, Executor *executor)
 
void setupSyntheticCaching (std::set< const Analyzer::ColumnVar * > cvs, Executor *executor)
 
std::vector< InputTableInfogetSyntheticInputTableInfo (std::set< const Analyzer::ColumnVar * > cvs, Executor *executor)
 
InnerOuter anonymous_namespace{HashJoin.cpp}::get_cols (const Analyzer::BinOper *qual_bin_oper, const Catalog_Namespace::Catalog &cat, const TemporaryTables *temporary_tables)
 
size_t get_shard_count (const Analyzer::BinOper *join_condition, const Executor *executor)
 

Variables

bool g_enable_overlaps_hashjoin
 

Function Documentation

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

Definition at line 790 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().

791  {
792  const Analyzer::ColumnVar* inner_col{nullptr};
793  const Analyzer::Expr* outer_col{nullptr};
794  std::shared_ptr<Analyzer::BinOper> redirected_bin_oper;
795  try {
796  std::tie(inner_col, outer_col) =
797  get_cols(join_condition, *executor->getCatalog(), executor->getTemporaryTables());
798  } catch (...) {
799  return 0;
800  }
801  if (!inner_col || !outer_col) {
802  return 0;
803  }
804  return get_shard_count({inner_col, outer_col}, executor);
805 }
size_t get_shard_count(const Analyzer::BinOper *join_condition, const Executor *executor)
Definition: HashJoin.cpp:790
InnerOuter get_cols(const Analyzer::BinOper *qual_bin_oper, const Catalog_Namespace::Catalog &cat, const TemporaryTables *temporary_tables)
Definition: HashJoin.cpp:780

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

std::shared_ptr<Analyzer::ColumnVar> getSyntheticColumnVar ( std::string_view  table,
std::string_view  column,
int  rte_idx,
Executor executor 
)

Definition at line 371 of file HashJoin.cpp.

References CHECK, kLINESTRING, kMULTIPOLYGON, kPOINT, and kPOLYGON.

Referenced by HashJoin::getSyntheticInstance().

374  {
375  auto catalog = executor->getCatalog();
376  CHECK(catalog);
377 
378  auto tmeta = catalog->getMetadataForTable(std::string(table));
379  CHECK(tmeta);
380 
381  auto cmeta = catalog->getMetadataForColumn(tmeta->tableId, std::string(column));
382  CHECK(cmeta);
383 
384  auto ti = cmeta->columnType;
385 
386  if (ti.is_geometry() && ti.get_type() != kPOINT) {
387  int geoColumnId{0};
388  switch (ti.get_type()) {
389  case kLINESTRING: {
390  geoColumnId = cmeta->columnId + 2;
391  break;
392  }
393  case kPOLYGON: {
394  geoColumnId = cmeta->columnId + 3;
395  break;
396  }
397  case kMULTIPOLYGON: {
398  geoColumnId = cmeta->columnId + 4;
399  break;
400  }
401  default:
402  CHECK(false);
403  }
404  cmeta = catalog->getMetadataForColumn(tmeta->tableId, geoColumnId);
405  CHECK(cmeta);
406  ti = cmeta->columnType;
407  }
408 
409  auto cv =
410  std::make_shared<Analyzer::ColumnVar>(ti, tmeta->tableId, cmeta->columnId, rte_idx);
411  return cv;
412 }
#define CHECK(condition)
Definition: Logger.h:209

+ Here is the caller graph for this function:

std::vector<InputTableInfo> getSyntheticInputTableInfo ( std::set< const Analyzer::ColumnVar * >  cvs,
Executor executor 
)

Definition at line 456 of file HashJoin.cpp.

References CHECK, and i.

Referenced by HashJoin::getSyntheticInstance().

458  {
459  auto catalog = executor->getCatalog();
460  CHECK(catalog);
461 
462  std::unordered_set<int> phys_table_ids;
463  for (auto cv : cvs) {
464  phys_table_ids.insert(cv->get_table_id());
465  }
466 
467  // NOTE(sy): This vector ordering seems to work for now, but maybe we need to
468  // review how rte_idx is assigned for ColumnVars. See for example Analyzer.h
469  // and RelAlgExecutor.cpp and rte_idx there.
470  std::vector<InputTableInfo> query_infos(phys_table_ids.size());
471  size_t i = 0;
472  for (auto id : phys_table_ids) {
473  auto tmeta = catalog->getMetadataForTable(id);
474  query_infos[i].table_id = id;
475  query_infos[i].info = tmeta->fragmenter->getFragmentsForQuery();
476  ++i;
477  }
478 
479  return query_infos;
480 }
#define CHECK(condition)
Definition: Logger.h:209

+ Here is the caller graph for this function:

std::ostream& operator<< ( std::ostream &  os,
const DecodedJoinHashBufferEntry e 
)

Definition at line 122 of file HashJoin.cpp.

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

122  {
123  os << " {{";
124  bool first = true;
125  for (auto k : e.key) {
126  if (!first) {
127  os << ",";
128  } else {
129  first = false;
130  }
131  os << k;
132  }
133  os << "}, ";
134  os << "{";
135  first = true;
136  for (auto p : e.payload) {
137  if (!first) {
138  os << ", ";
139  } else {
140  first = false;
141  }
142  os << p;
143  }
144  os << "}}";
145  return os;
146 }
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 148 of file HashJoin.cpp.

148  {
149  os << "{\n";
150  bool first = true;
151  for (auto e : s) {
152  if (!first) {
153  os << ",\n";
154  } else {
155  first = false;
156  }
157  os << e;
158  }
159  if (!s.empty()) {
160  os << "\n";
161  }
162  os << "}\n";
163  return os;
164 }
void setupSyntheticCaching ( std::set< const Analyzer::ColumnVar * >  cvs,
Executor executor 
)

Definition at line 442 of file HashJoin.cpp.

Referenced by HashJoin::getSyntheticInstance().

442  {
443  std::unordered_set<int> phys_table_ids;
444  for (auto cv : cvs) {
445  phys_table_ids.insert(cv->get_table_id());
446  }
447 
448  std::unordered_set<PhysicalInput> phys_inputs;
449  for (auto cv : cvs) {
450  phys_inputs.emplace(PhysicalInput{cv->get_column_id(), cv->get_table_id()});
451  }
452 
453  executor->setupCaching(phys_inputs, phys_table_ids);
454 }

+ Here is the caller graph for this function:

Variable Documentation

bool g_enable_overlaps_hashjoin

Definition at line 98 of file Execute.cpp.