You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by zu...@apache.org on 2016/05/05 06:17:00 UTC
[24/30] incubator-quickstep git commit: Refactored HashJoinWorkOrder
protos. (#203)
Refactored HashJoinWorkOrder protos. (#203)
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/6f4dd8f2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/6f4dd8f2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/6f4dd8f2
Branch: refs/heads/master
Commit: 6f4dd8f2a349601e8dd562d31359b1478ddf5c22
Parents: 2abc988
Author: Zuyu ZHANG <zu...@users.noreply.github.com>
Authored: Fri Apr 29 21:11:23 2016 -0700
Committer: Zuyu Zhang <zz...@pivotal.io>
Committed: Wed May 4 23:15:35 2016 -0700
----------------------------------------------------------------------
relational_operators/CMakeLists.txt | 3 +
relational_operators/HashJoinOperator.cpp | 5 +-
relational_operators/WorkOrder.proto | 98 +++----
relational_operators/WorkOrderFactory.cpp | 362 +++++++++----------------
4 files changed, 162 insertions(+), 306 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6f4dd8f2/relational_operators/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/relational_operators/CMakeLists.txt b/relational_operators/CMakeLists.txt
index 759a233..a4600e6 100644
--- a/relational_operators/CMakeLists.txt
+++ b/relational_operators/CMakeLists.txt
@@ -181,6 +181,9 @@ target_link_libraries(quickstep_relationaloperators_HashJoinOperator
quickstep_storage_TupleReference
quickstep_storage_TupleStorageSubBlock
quickstep_storage_ValueAccessor
+ quickstep_types_Type
+ quickstep_types_TypedValue
+ quickstep_types_containers_ColumnVector
quickstep_types_containers_ColumnVectorsValueAccessor
quickstep_utility_Macros
tmb)
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6f4dd8f2/relational_operators/HashJoinOperator.cpp
----------------------------------------------------------------------
diff --git a/relational_operators/HashJoinOperator.cpp b/relational_operators/HashJoinOperator.cpp
index 82f6b2a..104a02d 100644
--- a/relational_operators/HashJoinOperator.cpp
+++ b/relational_operators/HashJoinOperator.cpp
@@ -42,6 +42,9 @@
#include "storage/TupleReference.hpp"
#include "storage/TupleStorageSubBlock.hpp"
#include "storage/ValueAccessor.hpp"
+#include "types/Type.hpp"
+#include "types/TypedValue.hpp"
+#include "types/containers/ColumnVector.hpp"
#include "types/containers/ColumnVectorsValueAccessor.hpp"
#include "gflags/gflags.h"
@@ -820,7 +823,7 @@ void HashOuterJoinWorkOrder::execute() {
// where x is an attribute of the build relation.
// In that case, this HashOuterJoinWorkOrder needs to be updated to
// correctly handle the selections.
- const Type& column_type = selection_[i]->getType().getNullableVersion();
+ const Type &column_type = selection_[i]->getType().getNullableVersion();
if (NativeColumnVector::UsableForType(column_type)) {
NativeColumnVector *result = new NativeColumnVector(
column_type, num_tuples_without_matches);
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6f4dd8f2/relational_operators/WorkOrder.proto
----------------------------------------------------------------------
diff --git a/relational_operators/WorkOrder.proto b/relational_operators/WorkOrder.proto
index 8ed2080..5d0619a 100644
--- a/relational_operators/WorkOrder.proto
+++ b/relational_operators/WorkOrder.proto
@@ -29,21 +29,18 @@ enum WorkOrderType {
DESTROY_HASH = 6;
DROP_TABLE = 7;
FINALIZE_AGGREGATION = 8;
- HASH_ANTI_JOIN = 9;
- HASH_INNER_JOIN = 10;
- HASH_OUTER_JOIN = 11;
- HASH_SEMI_JOIN = 12;
- INSERT = 13;
- NESTED_LOOP_JOIN = 14;
- SAMPLE = 15;
- SAVE_BLOCKS = 16;
- SELECT = 17;
- SORT_MERGE_RUN = 18;
- SORT_RUN_GENERATION = 19;
- TABLE_GENERATOR = 20;
- TEXT_SCAN = 21;
- TEXT_SPLIT = 22;
- UPDATE = 23;
+ HASH_JOIN = 9;
+ INSERT = 10;
+ NESTED_LOOP_JOIN = 11;
+ SAMPLE = 12;
+ SAVE_BLOCKS = 13;
+ SELECT = 14;
+ SORT_MERGE_RUN = 15;
+ SORT_RUN_GENERATION = 16;
+ TABLE_GENERATOR = 17;
+ TEXT_SCAN = 18;
+ TEXT_SPLIT = 19;
+ UPDATE = 20;
}
message WorkOrder {
@@ -107,63 +104,30 @@ message FinalizeAggregationWorkOrder {
}
}
-message HashInnerJoinWorkOrder {
- extend WorkOrder {
- // All required.
- optional int32 build_relation_id = 160;
- optional int32 probe_relation_id = 161;
- repeated int32 join_key_attributes = 162;
- optional bool any_join_key_attributes_nullable = 163;
- optional int32 insert_destination_index = 164;
- optional uint32 join_hash_table_index = 165;
- optional int32 residual_predicate_index = 166;
- optional int32 selection_index = 167;
- optional fixed64 block_id = 168;
- }
-}
-
-message HashAntiJoinWorkOrder {
- extend WorkOrder {
- // All required.
- optional int32 build_relation_id = 350;
- optional int32 probe_relation_id = 351;
- repeated int32 join_key_attributes = 352;
- optional bool any_join_key_attributes_nullable = 353;
- optional int32 insert_destination_index = 354;
- optional uint32 join_hash_table_index = 355;
- optional int32 residual_predicate_index = 356;
- optional int32 selection_index = 357;
- optional fixed64 block_id = 358;
+message HashJoinWorkOrder {
+ enum HashJoinWorkOrderType {
+ HASH_ANTI_JOIN = 0;
+ HASH_INNER_JOIN = 1;
+ HASH_OUTER_JOIN = 2;
+ HASH_SEMI_JOIN = 3;
}
-}
-message HashSemiJoinWorkOrder {
extend WorkOrder {
// All required.
- optional int32 build_relation_id = 360;
- optional int32 probe_relation_id = 361;
- repeated int32 join_key_attributes = 362;
- optional bool any_join_key_attributes_nullable = 363;
- optional int32 insert_destination_index = 364;
- optional uint32 join_hash_table_index = 365;
- optional int32 residual_predicate_index = 366;
- optional int32 selection_index = 367;
- optional fixed64 block_id = 368;
- }
-}
+ optional HashJoinWorkOrderType hash_join_work_order_type = 160;
+ optional int32 build_relation_id = 161;
+ optional int32 probe_relation_id = 162;
+ repeated int32 join_key_attributes = 163;
+ optional bool any_join_key_attributes_nullable = 164;
+ optional int32 insert_destination_index = 165;
+ optional uint32 join_hash_table_index = 166;
+ optional int32 selection_index = 167;
+ optional fixed64 block_id = 168;
-message HashOuterJoinWorkOrder {
- extend WorkOrder {
- // All required.
- optional int32 build_relation_id = 370;
- optional int32 probe_relation_id = 371;
- repeated int32 join_key_attributes = 372;
- optional bool any_join_key_attributes_nullable = 373;
- optional int32 insert_destination_index = 374;
- optional uint32 join_hash_table_index = 375;
- optional int32 selection_index = 376;
- repeated bool is_selection_on_build = 377;
- optional fixed64 block_id = 378;
+ // Used by all but HashOuterJoinWorkOrder.
+ optional int32 residual_predicate_index = 169;
+ // Used by HashOuterJoinWorkOrder only.
+ repeated bool is_selection_on_build = 170;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6f4dd8f2/relational_operators/WorkOrderFactory.cpp
----------------------------------------------------------------------
diff --git a/relational_operators/WorkOrderFactory.cpp b/relational_operators/WorkOrderFactory.cpp
index 964c11c..4157d0f 100644
--- a/relational_operators/WorkOrderFactory.cpp
+++ b/relational_operators/WorkOrderFactory.cpp
@@ -16,6 +16,7 @@
#include "relational_operators/WorkOrderFactory.hpp"
+#include <memory>
#include <utility>
#include <vector>
@@ -55,6 +56,10 @@ using std::vector;
namespace quickstep {
+class InsertDestination;
+class Predicate;
+class Scalar;
+
WorkOrder* WorkOrderFactory::ReconstructFromProto(const serialization::WorkOrder &proto,
CatalogDatabaseLite *catalog_database,
QueryContext *query_context,
@@ -135,123 +140,115 @@ WorkOrder* WorkOrderFactory::ReconstructFromProto(const serialization::WorkOrder
query_context->getInsertDestination(
proto.GetExtension(serialization::FinalizeAggregationWorkOrder::insert_destination_index)));
}
- case serialization::HASH_ANTI_JOIN: {
- LOG(INFO) << "Creating HashAntiJoinWorkOrder";
- vector<attribute_id> join_key_attributes;
- const int join_key_attributes_size =
- proto.ExtensionSize(serialization::HashAntiJoinWorkOrder::join_key_attributes);
- for (int i = 0; i < join_key_attributes_size; ++i) {
- join_key_attributes.push_back(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::join_key_attributes, i));
- }
+ case serialization::HASH_JOIN: {
+ const auto hash_join_work_order_type =
+ proto.GetExtension(serialization::HashJoinWorkOrder::hash_join_work_order_type);
- return new HashAntiJoinWorkOrder(
+ const CatalogRelationSchema &build_relation =
catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::build_relation_id)),
+ proto.GetExtension(serialization::HashJoinWorkOrder::build_relation_id));
+ const CatalogRelationSchema &probe_relation =
catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::probe_relation_id)),
- move(join_key_attributes),
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::any_join_key_attributes_nullable),
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::block_id),
- query_context->getPredicate(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::residual_predicate_index)),
- query_context->getScalarGroup(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::selection_index)),
- *query_context->getJoinHashTable(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::join_hash_table_index)),
- query_context->getInsertDestination(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::insert_destination_index)),
- storage_manager);
- }
- case serialization::HASH_INNER_JOIN: {
- LOG(INFO) << "Creating HashInnerJoinWorkOrder";
- vector<attribute_id> join_key_attributes;
- const int join_key_attributes_size =
- proto.ExtensionSize(serialization::HashInnerJoinWorkOrder::join_key_attributes);
- for (int i = 0; i < join_key_attributes_size; ++i) {
- join_key_attributes.push_back(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::join_key_attributes, i));
- }
+ proto.GetExtension(serialization::HashJoinWorkOrder::probe_relation_id));
- return new HashInnerJoinWorkOrder(
- catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::build_relation_id)),
- catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::probe_relation_id)),
- move(join_key_attributes),
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::any_join_key_attributes_nullable),
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::block_id),
- query_context->getPredicate(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::residual_predicate_index)),
- query_context->getScalarGroup(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::selection_index)),
- *query_context->getJoinHashTable(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::join_hash_table_index)),
- query_context->getInsertDestination(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::insert_destination_index)),
- storage_manager);
- }
- case serialization::HASH_OUTER_JOIN: {
- LOG(INFO) << "Creating HashOuterJoinWorkOrder";
vector<attribute_id> join_key_attributes;
const int join_key_attributes_size =
- proto.ExtensionSize(serialization::HashOuterJoinWorkOrder::join_key_attributes);
+ proto.ExtensionSize(serialization::HashJoinWorkOrder::join_key_attributes);
for (int i = 0; i < join_key_attributes_size; ++i) {
join_key_attributes.push_back(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::join_key_attributes, i));
- }
- vector<bool> is_selection_on_build;
- const int is_selection_on_build_size =
- proto.ExtensionSize(serialization::HashOuterJoinWorkOrder::is_selection_on_build);
- for (int i = 0; i < is_selection_on_build_size; ++i) {
- is_selection_on_build.push_back(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::is_selection_on_build, i));
+ proto.GetExtension(serialization::HashJoinWorkOrder::join_key_attributes, i));
}
- return new HashOuterJoinWorkOrder(
- catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::build_relation_id)),
- catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::probe_relation_id)),
- move(join_key_attributes),
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::any_join_key_attributes_nullable),
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::block_id),
- query_context->getScalarGroup(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::selection_index)),
- move(is_selection_on_build),
- *query_context->getJoinHashTable(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::join_hash_table_index)),
- query_context->getInsertDestination(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::insert_destination_index)),
- storage_manager);
- }
- case serialization::HASH_SEMI_JOIN: {
- LOG(INFO) << "Creating HashSemiJoinWorkOrder";
- vector<attribute_id> join_key_attributes;
- const int join_key_attributes_size =
- proto.ExtensionSize(serialization::HashSemiJoinWorkOrder::join_key_attributes);
- for (int i = 0; i < join_key_attributes_size; ++i) {
- join_key_attributes.push_back(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::join_key_attributes, i));
+ const bool any_join_key_attributes_nullable =
+ proto.GetExtension(serialization::HashJoinWorkOrder::any_join_key_attributes_nullable);
+ const block_id lookup_block_id =
+ proto.GetExtension(serialization::HashJoinWorkOrder::block_id);
+
+ const Predicate *residual_predicate = nullptr;
+ if (hash_join_work_order_type != serialization::HashJoinWorkOrder::HASH_OUTER_JOIN) {
+ residual_predicate =
+ query_context->getPredicate(
+ proto.GetExtension(serialization::HashJoinWorkOrder::residual_predicate_index));
}
- return new HashSemiJoinWorkOrder(
- catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::build_relation_id)),
- catalog_database->getRelationSchemaById(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::probe_relation_id)),
- move(join_key_attributes),
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::any_join_key_attributes_nullable),
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::block_id),
- query_context->getPredicate(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::residual_predicate_index)),
+ const std::vector<std::unique_ptr<const Scalar>> &selection =
query_context->getScalarGroup(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::selection_index)),
+ proto.GetExtension(serialization::HashJoinWorkOrder::selection_index));
+ const JoinHashTable &hash_table =
*query_context->getJoinHashTable(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::join_hash_table_index)),
+ proto.GetExtension(serialization::HashJoinWorkOrder::join_hash_table_index));
+ InsertDestination *output_destination =
query_context->getInsertDestination(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::insert_destination_index)),
- storage_manager);
+ proto.GetExtension(serialization::HashJoinWorkOrder::insert_destination_index));
+
+ switch (hash_join_work_order_type) {
+ case serialization::HashJoinWorkOrder::HASH_ANTI_JOIN: {
+ LOG(INFO) << "Creating HashAntiJoinWorkOrder";
+ return new HashAntiJoinWorkOrder(
+ build_relation,
+ probe_relation,
+ move(join_key_attributes),
+ any_join_key_attributes_nullable,
+ lookup_block_id,
+ residual_predicate,
+ selection,
+ hash_table,
+ output_destination,
+ storage_manager);
+ }
+ case serialization::HashJoinWorkOrder::HASH_INNER_JOIN: {
+ LOG(INFO) << "Creating HashInnerJoinWorkOrder";
+ return new HashInnerJoinWorkOrder(
+ build_relation,
+ probe_relation,
+ move(join_key_attributes),
+ any_join_key_attributes_nullable,
+ lookup_block_id,
+ residual_predicate,
+ selection,
+ hash_table,
+ output_destination,
+ storage_manager);
+ }
+ case serialization::HashJoinWorkOrder::HASH_OUTER_JOIN: {
+ vector<bool> is_selection_on_build;
+ const int is_selection_on_build_size =
+ proto.ExtensionSize(serialization::HashJoinWorkOrder::is_selection_on_build);
+ for (int i = 0; i < is_selection_on_build_size; ++i) {
+ is_selection_on_build.push_back(
+ proto.GetExtension(serialization::HashJoinWorkOrder::is_selection_on_build, i));
+ }
+
+ LOG(INFO) << "Creating HashOuterJoinWorkOrder";
+ return new HashOuterJoinWorkOrder(
+ build_relation,
+ probe_relation,
+ move(join_key_attributes),
+ any_join_key_attributes_nullable,
+ lookup_block_id,
+ selection,
+ move(is_selection_on_build),
+ hash_table,
+ output_destination,
+ storage_manager);
+ }
+ case serialization::HashJoinWorkOrder::HASH_SEMI_JOIN: {
+ LOG(INFO) << "Creating HashSemiJoinWorkOrder";
+ return new HashSemiJoinWorkOrder(
+ build_relation,
+ probe_relation,
+ move(join_key_attributes),
+ any_join_key_attributes_nullable,
+ lookup_block_id,
+ residual_predicate,
+ selection,
+ hash_table,
+ output_destination,
+ storage_manager);
+ }
+ default:
+ LOG(FATAL) << "Unknown HashJoinWorkOrder Type in WorkOrderFactory::ReconstructFromProto";
+ }
}
case serialization::INSERT: {
LOG(INFO) << "Creating InsertWorkOrder";
@@ -486,179 +483,68 @@ bool WorkOrderFactory::ProtoIsValid(const serialization::WorkOrder &proto,
query_context.isValidInsertDestinationId(
proto.GetExtension(serialization::FinalizeAggregationWorkOrder::insert_destination_index));
}
- case serialization::HASH_ANTI_JOIN: {
- if (!proto.HasExtension(serialization::HashAntiJoinWorkOrder::build_relation_id) ||
- !proto.HasExtension(serialization::HashAntiJoinWorkOrder::probe_relation_id)) {
+ case serialization::HASH_JOIN: {
+ if (!proto.HasExtension(serialization::HashJoinWorkOrder::hash_join_work_order_type)) {
return false;
}
- const relation_id build_relation_id =
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::build_relation_id);
- if (!catalog_database.hasRelationWithId(build_relation_id)) {
+ const auto hash_join_work_order_type =
+ proto.GetExtension(serialization::HashJoinWorkOrder::hash_join_work_order_type);
+ if (!serialization::HashJoinWorkOrder_HashJoinWorkOrderType_IsValid(hash_join_work_order_type)) {
return false;
}
- const relation_id probe_relation_id =
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::probe_relation_id);
- if (!catalog_database.hasRelationWithId(probe_relation_id)) {
- return false;
- }
-
- const CatalogRelationSchema &build_relation = catalog_database.getRelationSchemaById(build_relation_id);
- const CatalogRelationSchema &probe_relation = catalog_database.getRelationSchemaById(probe_relation_id);
- for (int i = 0; i < proto.ExtensionSize(serialization::HashAntiJoinWorkOrder::join_key_attributes); ++i) {
- const attribute_id attr_id =
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::join_key_attributes, i);
- if (!build_relation.hasAttributeWithId(attr_id) ||
- !probe_relation.hasAttributeWithId(attr_id)) {
- return false;
- }
- }
-
- return proto.HasExtension(serialization::HashAntiJoinWorkOrder::any_join_key_attributes_nullable) &&
- proto.HasExtension(serialization::HashAntiJoinWorkOrder::insert_destination_index) &&
- query_context.isValidInsertDestinationId(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::insert_destination_index)) &&
- proto.HasExtension(serialization::HashAntiJoinWorkOrder::join_hash_table_index) &&
- query_context.isValidJoinHashTableId(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::join_hash_table_index)) &&
- proto.HasExtension(serialization::HashAntiJoinWorkOrder::residual_predicate_index) &&
- query_context.isValidPredicate(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::residual_predicate_index)) &&
- proto.HasExtension(serialization::HashAntiJoinWorkOrder::selection_index) &&
- query_context.isValidScalarGroupId(
- proto.GetExtension(serialization::HashAntiJoinWorkOrder::selection_index)) &&
- proto.HasExtension(serialization::HashAntiJoinWorkOrder::block_id);
- }
- case serialization::HASH_INNER_JOIN: {
- if (!proto.HasExtension(serialization::HashInnerJoinWorkOrder::build_relation_id) ||
- !proto.HasExtension(serialization::HashInnerJoinWorkOrder::probe_relation_id)) {
+ if (!proto.HasExtension(serialization::HashJoinWorkOrder::build_relation_id) ||
+ !proto.HasExtension(serialization::HashJoinWorkOrder::probe_relation_id)) {
return false;
}
const relation_id build_relation_id =
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::build_relation_id);
+ proto.GetExtension(serialization::HashJoinWorkOrder::build_relation_id);
if (!catalog_database.hasRelationWithId(build_relation_id)) {
return false;
}
const relation_id probe_relation_id =
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::probe_relation_id);
+ proto.GetExtension(serialization::HashJoinWorkOrder::probe_relation_id);
if (!catalog_database.hasRelationWithId(probe_relation_id)) {
return false;
}
const CatalogRelationSchema &build_relation = catalog_database.getRelationSchemaById(build_relation_id);
const CatalogRelationSchema &probe_relation = catalog_database.getRelationSchemaById(probe_relation_id);
- for (int i = 0; i < proto.ExtensionSize(serialization::HashInnerJoinWorkOrder::join_key_attributes); ++i) {
+ for (int i = 0; i < proto.ExtensionSize(serialization::HashJoinWorkOrder::join_key_attributes); ++i) {
const attribute_id attr_id =
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::join_key_attributes, i);
+ proto.GetExtension(serialization::HashJoinWorkOrder::join_key_attributes, i);
if (!build_relation.hasAttributeWithId(attr_id) ||
!probe_relation.hasAttributeWithId(attr_id)) {
return false;
}
}
- return proto.HasExtension(serialization::HashInnerJoinWorkOrder::any_join_key_attributes_nullable) &&
- proto.HasExtension(serialization::HashInnerJoinWorkOrder::insert_destination_index) &&
- query_context.isValidInsertDestinationId(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::insert_destination_index)) &&
- proto.HasExtension(serialization::HashInnerJoinWorkOrder::join_hash_table_index) &&
- query_context.isValidJoinHashTableId(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::join_hash_table_index)) &&
- proto.HasExtension(serialization::HashInnerJoinWorkOrder::residual_predicate_index) &&
- query_context.isValidPredicate(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::residual_predicate_index)) &&
- proto.HasExtension(serialization::HashInnerJoinWorkOrder::selection_index) &&
- query_context.isValidScalarGroupId(
- proto.GetExtension(serialization::HashInnerJoinWorkOrder::selection_index)) &&
- proto.HasExtension(serialization::HashInnerJoinWorkOrder::block_id);
- }
- case serialization::HASH_OUTER_JOIN: {
- if (!proto.HasExtension(serialization::HashOuterJoinWorkOrder::build_relation_id) ||
- !proto.HasExtension(serialization::HashOuterJoinWorkOrder::probe_relation_id)) {
- return false;
- }
-
- const relation_id build_relation_id =
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::build_relation_id);
- if (!catalog_database.hasRelationWithId(build_relation_id)) {
- return false;
- }
-
- const relation_id probe_relation_id =
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::probe_relation_id);
- if (!catalog_database.hasRelationWithId(probe_relation_id)) {
- return false;
- }
-
- const CatalogRelationSchema &build_relation = catalog_database.getRelationSchemaById(build_relation_id);
- const CatalogRelationSchema &probe_relation = catalog_database.getRelationSchemaById(probe_relation_id);
- for (int i = 0; i < proto.ExtensionSize(serialization::HashOuterJoinWorkOrder::join_key_attributes); ++i) {
- const attribute_id attr_id =
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::join_key_attributes, i);
- if (!build_relation.hasAttributeWithId(attr_id) ||
- !probe_relation.hasAttributeWithId(attr_id)) {
+ if (hash_join_work_order_type == serialization::HashJoinWorkOrder::HASH_OUTER_JOIN) {
+ if (!proto.HasExtension(serialization::HashJoinWorkOrder::is_selection_on_build)) {
return false;
}
- }
-
- return proto.HasExtension(serialization::HashOuterJoinWorkOrder::any_join_key_attributes_nullable) &&
- proto.HasExtension(serialization::HashOuterJoinWorkOrder::insert_destination_index) &&
- query_context.isValidInsertDestinationId(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::insert_destination_index)) &&
- proto.HasExtension(serialization::HashOuterJoinWorkOrder::join_hash_table_index) &&
- query_context.isValidJoinHashTableId(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::join_hash_table_index)) &&
- proto.HasExtension(serialization::HashOuterJoinWorkOrder::selection_index) &&
- query_context.isValidScalarGroupId(
- proto.GetExtension(serialization::HashOuterJoinWorkOrder::selection_index)) &&
- proto.HasExtension(serialization::HashOuterJoinWorkOrder::is_selection_on_build) &&
- proto.HasExtension(serialization::HashOuterJoinWorkOrder::block_id);
- }
- case serialization::HASH_SEMI_JOIN: {
- if (!proto.HasExtension(serialization::HashSemiJoinWorkOrder::build_relation_id) ||
- !proto.HasExtension(serialization::HashSemiJoinWorkOrder::probe_relation_id)) {
- return false;
- }
-
- const relation_id build_relation_id =
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::build_relation_id);
- if (!catalog_database.hasRelationWithId(build_relation_id)) {
- return false;
- }
-
- const relation_id probe_relation_id =
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::probe_relation_id);
- if (!catalog_database.hasRelationWithId(probe_relation_id)) {
- return false;
- }
-
- const CatalogRelationSchema &build_relation = catalog_database.getRelationSchemaById(build_relation_id);
- const CatalogRelationSchema &probe_relation = catalog_database.getRelationSchemaById(probe_relation_id);
- for (int i = 0; i < proto.ExtensionSize(serialization::HashSemiJoinWorkOrder::join_key_attributes); ++i) {
- const attribute_id attr_id =
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::join_key_attributes, i);
- if (!build_relation.hasAttributeWithId(attr_id) ||
- !probe_relation.hasAttributeWithId(attr_id)) {
+ } else {
+ if (!proto.HasExtension(serialization::HashJoinWorkOrder::residual_predicate_index) ||
+ !query_context.isValidPredicate(
+ proto.GetExtension(serialization::HashJoinWorkOrder::residual_predicate_index))) {
return false;
}
}
- return proto.HasExtension(serialization::HashSemiJoinWorkOrder::any_join_key_attributes_nullable) &&
- proto.HasExtension(serialization::HashSemiJoinWorkOrder::insert_destination_index) &&
+ return proto.HasExtension(serialization::HashJoinWorkOrder::any_join_key_attributes_nullable) &&
+ proto.HasExtension(serialization::HashJoinWorkOrder::insert_destination_index) &&
query_context.isValidInsertDestinationId(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::insert_destination_index)) &&
- proto.HasExtension(serialization::HashSemiJoinWorkOrder::join_hash_table_index) &&
+ proto.GetExtension(serialization::HashJoinWorkOrder::insert_destination_index)) &&
+ proto.HasExtension(serialization::HashJoinWorkOrder::join_hash_table_index) &&
query_context.isValidJoinHashTableId(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::join_hash_table_index)) &&
- proto.HasExtension(serialization::HashSemiJoinWorkOrder::residual_predicate_index) &&
- query_context.isValidPredicate(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::residual_predicate_index)) &&
- proto.HasExtension(serialization::HashSemiJoinWorkOrder::selection_index) &&
+ proto.GetExtension(serialization::HashJoinWorkOrder::join_hash_table_index)) &&
+ proto.HasExtension(serialization::HashJoinWorkOrder::selection_index) &&
query_context.isValidScalarGroupId(
- proto.GetExtension(serialization::HashSemiJoinWorkOrder::selection_index)) &&
- proto.HasExtension(serialization::HashSemiJoinWorkOrder::block_id);
+ proto.GetExtension(serialization::HashJoinWorkOrder::selection_index)) &&
+ proto.HasExtension(serialization::HashJoinWorkOrder::block_id);
}
case serialization::INSERT: {
return proto.HasExtension(serialization::InsertWorkOrder::insert_destination_index) &&