You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by ji...@apache.org on 2016/08/21 17:29:53 UTC
[2/2] incubator-quickstep git commit: Initial commit.
Initial commit.
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/b163289c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/b163289c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/b163289c
Branch: refs/heads/LIP-for-tpch-merged
Commit: b163289c3bfb437a9fc9b62e85b07094c0357304
Parents: 1111ec5
Author: Hakan Memisoglu <ha...@gmail.com>
Authored: Tue Aug 16 16:40:27 2016 -0500
Committer: Jianqiao Zhu <ji...@cs.wisc.edu>
Committed: Sun Aug 21 12:03:30 2016 -0500
----------------------------------------------------------------------
query_optimizer/CMakeLists.txt | 1 +
query_optimizer/ExecutionGenerator.cpp | 9 +++++
query_optimizer/PhysicalGenerator.cpp | 3 ++
query_optimizer/physical/HashJoin.cpp | 5 +++
query_optimizer/physical/HashJoin.hpp | 13 ++++++-
query_optimizer/rules/AttachBloomFilters.cpp | 1 +
query_optimizer/rules/CMakeLists.txt | 11 ++++++
query_optimizer/rules/FuseJoinSelect.cpp | 43 +++++++++++++++++++++++
query_optimizer/rules/FuseJoinSelect.hpp | 33 +++++++++++++++++
relational_operators/HashJoinOperator.cpp | 13 ++++++-
relational_operators/HashJoinOperator.hpp | 12 +++++++
relational_operators/WorkOrder.proto | 1 +
12 files changed, 143 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt
index 7440151..849caaa 100644
--- a/query_optimizer/CMakeLists.txt
+++ b/query_optimizer/CMakeLists.txt
@@ -201,6 +201,7 @@ target_link_libraries(quickstep_queryoptimizer_PhysicalGenerator
quickstep_queryoptimizer_logical_Logical
quickstep_queryoptimizer_physical_Physical
quickstep_queryoptimizer_rules_AttachBloomFilters
+ quickstep_queryoptimizer_rules_FuseJoinSelect
quickstep_queryoptimizer_rules_PruneColumns
quickstep_queryoptimizer_rules_StarSchemaHashJoinOrderOptimization
quickstep_queryoptimizer_rules_SwapProbeBuild
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/ExecutionGenerator.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp
index f8559ec..457366e 100644
--- a/query_optimizer/ExecutionGenerator.cpp
+++ b/query_optimizer/ExecutionGenerator.cpp
@@ -692,6 +692,14 @@ void ExecutionGenerator::convertHashJoin(const P::HashJoinPtr &physical_plan) {
query_context_proto_->add_predicates()->CopyFrom(residual_predicate->getProto());
}
+ // Convert the left filter predicate proto.
+ QueryContext::predicate_id left_filter_predicate_index = QueryContext::kInvalidPredicateId;
+ if (physical_plan->residual_predicate()) {
+ left_filter_predicate_index = query_context_proto_->predicates_size();
+ unique_ptr<const Predicate> left_filter_predicate(convertPredicate(physical_plan->left_filter_predicate()));
+ query_context_proto_->add_predicates()->CopyFrom(left_filter_predicate->getProto());
+ }
+
// Convert the project expressions proto.
const QueryContext::scalar_group_id project_expressions_group_index =
query_context_proto_->scalar_groups_size();
@@ -796,6 +804,7 @@ void ExecutionGenerator::convertHashJoin(const P::HashJoinPtr &physical_plan) {
insert_destination_index,
join_hash_table_index,
residual_predicate_index,
+ left_filter_predicate_index,
project_expressions_group_index,
is_selection_on_build.get(),
join_type));
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/PhysicalGenerator.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/PhysicalGenerator.cpp b/query_optimizer/PhysicalGenerator.cpp
index 9ee685d..e093272 100644
--- a/query_optimizer/PhysicalGenerator.cpp
+++ b/query_optimizer/PhysicalGenerator.cpp
@@ -27,6 +27,7 @@
#include "query_optimizer/logical/Logical.hpp"
#include "query_optimizer/physical/Physical.hpp"
#include "query_optimizer/rules/AttachBloomFilters.hpp"
+#include "query_optimizer/rules/FuseJoinSelect.hpp"
#include "query_optimizer/rules/PruneColumns.hpp"
#include "query_optimizer/rules/StarSchemaHashJoinOrderOptimization.hpp"
#include "query_optimizer/rules/SwapProbeBuild.hpp"
@@ -102,6 +103,8 @@ P::PhysicalPtr PhysicalGenerator::optimizePlan() {
}
rules.emplace_back(new PruneColumns());
// rules.emplace_back(new SwapProbeBuild());
+ rules.emplace_back(new FuseJoinSelect());
+ rules.emplace_back(new PruneColumns());
rules.emplace_back(new AttachBloomFilters());
for (std::unique_ptr<Rule<P::Physical>> &rule : rules) {
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/physical/HashJoin.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/HashJoin.cpp b/query_optimizer/physical/HashJoin.cpp
index 883c87a..dc564a7 100644
--- a/query_optimizer/physical/HashJoin.cpp
+++ b/query_optimizer/physical/HashJoin.cpp
@@ -111,6 +111,11 @@ void HashJoin::getFieldStringItems(
non_container_child_field_names->push_back("residual_predicate");
non_container_child_fields->push_back(residual_predicate_);
}
+ if (left_filter_predicate_ != nullptr) {
+ non_container_child_field_names->push_back("left_filter_predicate");
+ non_container_child_fields->push_back(left_filter_predicate_);
+ }
+
container_child_field_names->push_back("left_join_attributes");
container_child_fields->push_back(CastSharedPtrVector<OptimizerTreeBase>(left_join_attributes_));
container_child_field_names->push_back("right_join_attributes");
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/physical/HashJoin.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/HashJoin.hpp b/query_optimizer/physical/HashJoin.hpp
index a830d0b..e24dbeb 100644
--- a/query_optimizer/physical/HashJoin.hpp
+++ b/query_optimizer/physical/HashJoin.hpp
@@ -107,6 +107,10 @@ class HashJoin : public BinaryJoin {
return join_type_;
}
+ const expressions::PredicatePtr& left_filter_predicate() const {
+ return left_filter_predicate_;
+ }
+
PhysicalPtr copyWithNewChildren(
const std::vector<PhysicalPtr> &new_children) const override {
DCHECK_EQ(children().size(), new_children.size());
@@ -117,7 +121,8 @@ class HashJoin : public BinaryJoin {
residual_predicate_,
project_expressions(),
join_type_,
- bloom_filter_config_);
+ bloom_filter_config_,
+ left_filter_predicate_);
}
std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override;
@@ -144,6 +149,7 @@ class HashJoin : public BinaryJoin {
* @param residual_predicate Optional filtering predicate evaluated after join.
* @param project_expressions The project expressions.
* @param Join type of this hash join.
+ * @param left_filter_predicate Optional filtering predicate for probe side before join.
* @return An immutable physical HashJoin.
*/
static HashJoinPtr Create(
@@ -154,6 +160,7 @@ class HashJoin : public BinaryJoin {
const expressions::PredicatePtr &residual_predicate,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
const JoinType join_type,
+ const expressions::PredicatePtr &left_filter_predicate = nullptr,
const BloomFilterConfig bloom_filter_config = BloomFilterConfig()) {
return HashJoinPtr(
new HashJoin(left,
@@ -163,6 +170,7 @@ class HashJoin : public BinaryJoin {
residual_predicate,
project_expressions,
join_type,
+ left_filter_predicate,
bloom_filter_config));
}
@@ -184,12 +192,14 @@ class HashJoin : public BinaryJoin {
const expressions::PredicatePtr &residual_predicate,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
const JoinType join_type,
+ const expressions::PredicatePtr &left_filter_predicate,
const BloomFilterConfig &bloom_filter_config)
: BinaryJoin(left, right, project_expressions),
left_join_attributes_(left_join_attributes),
right_join_attributes_(right_join_attributes),
residual_predicate_(residual_predicate),
join_type_(join_type),
+ left_filter_predicate_(left_filter_predicate),
bloom_filter_config_(bloom_filter_config) {
}
@@ -197,6 +207,7 @@ class HashJoin : public BinaryJoin {
std::vector<expressions::AttributeReferencePtr> right_join_attributes_;
expressions::PredicatePtr residual_predicate_;
JoinType join_type_;
+ expressions::PredicatePtr left_filter_predicate_;
BloomFilterConfig bloom_filter_config_;
DISALLOW_COPY_AND_ASSIGN(HashJoin);
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/rules/AttachBloomFilters.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/rules/AttachBloomFilters.cpp b/query_optimizer/rules/AttachBloomFilters.cpp
index 898d831..f86ba60 100644
--- a/query_optimizer/rules/AttachBloomFilters.cpp
+++ b/query_optimizer/rules/AttachBloomFilters.cpp
@@ -338,6 +338,7 @@ P::PhysicalPtr AttachBloomFilters::performAttach(const physical::PhysicalPtr &no
hash_join->residual_predicate(),
hash_join->project_expressions(),
hash_join->join_type(),
+ hash_join->left_filter_predicate(),
attach_it->second);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/rules/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/query_optimizer/rules/CMakeLists.txt b/query_optimizer/rules/CMakeLists.txt
index 54b1e59..9990a4d 100644
--- a/query_optimizer/rules/CMakeLists.txt
+++ b/query_optimizer/rules/CMakeLists.txt
@@ -21,6 +21,7 @@ add_subdirectory(tests)
add_library(quickstep_queryoptimizer_rules_AttachBloomFilters AttachBloomFilters.cpp AttachBloomFilters.hpp)
add_library(quickstep_queryoptimizer_rules_BottomUpRule ../../empty_src.cpp BottomUpRule.hpp)
add_library(quickstep_queryoptimizer_rules_CollapseProject CollapseProject.cpp CollapseProject.hpp)
+add_library(quickstep_queryoptimizer_rules_FuseJoinSelect FuseJoinSelect.cpp FuseJoinSelect.hpp)
add_library(quickstep_queryoptimizer_rules_GenerateJoins GenerateJoins.cpp GenerateJoins.hpp)
add_library(quickstep_queryoptimizer_rules_PruneColumns PruneColumns.cpp PruneColumns.hpp)
add_library(quickstep_queryoptimizer_rules_PushDownFilter PushDownFilter.cpp PushDownFilter.hpp)
@@ -65,6 +66,15 @@ target_link_libraries(quickstep_queryoptimizer_rules_CollapseProject
quickstep_queryoptimizer_rules_Rule
quickstep_queryoptimizer_rules_RuleHelper
quickstep_utility_Macros)
+target_link_libraries(quickstep_queryoptimizer_rules_FuseJoinSelect
+ quickstep_queryoptimizer_expressions_Predicate
+ quickstep_queryoptimizer_physical_HashJoin
+ quickstep_queryoptimizer_physical_PatternMatcher
+ quickstep_queryoptimizer_physical_Physical
+ quickstep_queryoptimizer_physical_Selection
+ quickstep_queryoptimizer_physical_TableReference
+ quickstep_queryoptimizer_rules_BottomUpRule
+ quickstep_queryoptimizer_rules_Rule)
target_link_libraries(quickstep_queryoptimizer_rules_GenerateJoins
glog
quickstep_queryoptimizer_expressions_AttributeReference
@@ -206,6 +216,7 @@ target_link_libraries(quickstep_queryoptimizer_rules
quickstep_queryoptimizer_rules_AttachBloomFilters
quickstep_queryoptimizer_rules_BottomUpRule
quickstep_queryoptimizer_rules_CollapseProject
+ quickstep_queryoptimizer_rules_FuseJoinSelect
quickstep_queryoptimizer_rules_GenerateJoins
quickstep_queryoptimizer_rules_PruneColumns
quickstep_queryoptimizer_rules_PushDownFilter
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/rules/FuseJoinSelect.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/rules/FuseJoinSelect.cpp b/query_optimizer/rules/FuseJoinSelect.cpp
new file mode 100644
index 0000000..e40acfc
--- /dev/null
+++ b/query_optimizer/rules/FuseJoinSelect.cpp
@@ -0,0 +1,43 @@
+#include "query_optimizer/rules/FuseJoinSelect.hpp"
+
+#include "query_optimizer/expressions/Predicate.hpp"
+#include "query_optimizer/physical/HashJoin.hpp"
+#include "query_optimizer/physical/PatternMatcher.hpp"
+#include "query_optimizer/physical/Selection.hpp"
+#include "query_optimizer/physical/TableReference.hpp"
+#include "query_optimizer/rules/Rule.hpp"
+
+namespace quickstep {
+namespace optimizer {
+
+namespace P = ::quickstep::optimizer::physical;
+namespace E = ::quickstep::optimizer::expressions;
+
+P::PhysicalPtr FuseJoinSelect::applyToNode(const P::PhysicalPtr &input) {
+ P::HashJoinPtr hash_join;
+ P::SelectionPtr selection;
+ P::TableReferencePtr table_reference;
+
+ if (P::SomeHashJoin::MatchesWithConditionalCast(input, &hash_join)
+ && hash_join->join_type() == P::HashJoin::JoinType::kInnerJoin
+ && P::SomeSelection::MatchesWithConditionalCast(hash_join->left(), &selection)
+ && P::SomeTableReference::MatchesWithConditionalCast(selection->input(), &table_reference)) {
+ const E::PredicatePtr filter_predicate = selection->filter_predicate();
+ P::PhysicalPtr output = P::HashJoin::Create(table_reference,
+ hash_join->right(),
+ hash_join->left_join_attributes(),
+ hash_join->right_join_attributes(),
+ hash_join->residual_predicate(),
+ hash_join->project_expressions(),
+ hash_join->join_type(),
+ filter_predicate);
+ LOG_APPLYING_RULE(input, output);
+ return output;
+ }
+
+ LOG_IGNORING_RULE(input);
+ return input;
+}
+
+}
+}
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/query_optimizer/rules/FuseJoinSelect.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/rules/FuseJoinSelect.hpp b/query_optimizer/rules/FuseJoinSelect.hpp
new file mode 100644
index 0000000..24ac08b
--- /dev/null
+++ b/query_optimizer/rules/FuseJoinSelect.hpp
@@ -0,0 +1,33 @@
+#ifndef QUICKSTEP_QUERY_OPTIMIZER_RULES_FUSE_JOIN_SELECT_HPP_
+#define QUICKSTEP_QUERY_OPTIMIZER_RULES_FUSE_JOIN_SELECT_HPP_
+
+#include <string>
+
+#include "query_optimizer/physical/Physical.hpp"
+#include "query_optimizer/rules/Rule.hpp"
+#include "query_optimizer/rules/BottomUpRule.hpp"
+#include "utility/Macros.hpp"
+
+namespace quickstep {
+namespace optimizer {
+
+namespace P = ::quickstep::optimizer::physical;
+
+class FuseJoinSelect : public BottomUpRule<P::Physical> {
+ public:
+ FuseJoinSelect() {
+ }
+
+ std::string getName() const override { return "FuseJoinSelect"; }
+
+ protected:
+ P::PhysicalPtr applyToNode(const P::PhysicalPtr &input) override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FuseJoinSelect);
+};
+
+} // namespace optimizer
+} // namespace quickstep
+
+#endif
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/relational_operators/HashJoinOperator.cpp
----------------------------------------------------------------------
diff --git a/relational_operators/HashJoinOperator.cpp b/relational_operators/HashJoinOperator.cpp
index 9b573ac..7357acd 100644
--- a/relational_operators/HashJoinOperator.cpp
+++ b/relational_operators/HashJoinOperator.cpp
@@ -192,6 +192,8 @@ bool HashJoinOperator::getAllNonOuterJoinWorkOrders(
const Predicate *residual_predicate =
query_context->getPredicate(residual_predicate_index_);
+ const Predicate *left_filter_predicate =
+ query_context->getPredicate(left_filter_predicate_index_);
const vector<unique_ptr<const Scalar>> &selection =
query_context->getScalarGroup(selection_index_);
InsertDestination *output_destination =
@@ -210,6 +212,7 @@ bool HashJoinOperator::getAllNonOuterJoinWorkOrders(
any_join_key_attributes_nullable_,
probe_block_id,
residual_predicate,
+ left_filter_predicate,
selection,
hash_table,
output_destination,
@@ -230,6 +233,7 @@ bool HashJoinOperator::getAllNonOuterJoinWorkOrders(
any_join_key_attributes_nullable_,
probe_relation_block_ids_[num_workorders_generated_],
residual_predicate,
+ left_filter_predicate,
selection,
hash_table,
output_destination,
@@ -370,6 +374,7 @@ serialization::WorkOrder* HashJoinOperator::createNonOuterJoinWorkOrderProto(
proto->SetExtension(serialization::HashJoinWorkOrder::selection_index, selection_index_);
proto->SetExtension(serialization::HashJoinWorkOrder::block_id, block);
proto->SetExtension(serialization::HashJoinWorkOrder::residual_predicate_index, residual_predicate_index_);
+ proto->SetExtension(serialization::HashJoinWorkOrder::left_filter_predicate_index, left_filter_predicate_index_);
return proto;
}
@@ -432,7 +437,13 @@ void HashInnerJoinWorkOrder::execute() {
storage_manager_->getBlock(block_id_, probe_relation_));
const TupleStorageSubBlock &probe_store = probe_block->getTupleStorageSubBlock();
- std::unique_ptr<ValueAccessor> probe_accessor(probe_store.createValueAccessor());
+ std::unique_ptr<ValueAccessor> probe_accessor(
+ probe_store.createValueAccessor(
+ left_filter_predicate_ == nullptr
+ ? nullptr
+ : probe_block->getMatchesForPredicate(left_filter_predicate_)));
+
+
MapBasedJoinedTupleCollector collector;
if (join_key_attributes_.size() == 1) {
hash_table_.getAllFromValueAccessor(
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/relational_operators/HashJoinOperator.hpp
----------------------------------------------------------------------
diff --git a/relational_operators/HashJoinOperator.hpp b/relational_operators/HashJoinOperator.hpp
index 30571a1..05e16a4 100644
--- a/relational_operators/HashJoinOperator.hpp
+++ b/relational_operators/HashJoinOperator.hpp
@@ -128,6 +128,7 @@ class HashJoinOperator : public RelationalOperator {
const QueryContext::insert_destination_id output_destination_index,
const QueryContext::join_hash_table_id hash_table_index,
const QueryContext::predicate_id residual_predicate_index,
+ const QueryContext::predicate_id left_filter_predicate_index,
const QueryContext::scalar_group_id selection_index,
const std::vector<bool> *is_selection_on_build = nullptr,
const JoinType join_type = JoinType::kInnerJoin)
@@ -141,6 +142,7 @@ class HashJoinOperator : public RelationalOperator {
output_destination_index_(output_destination_index),
hash_table_index_(hash_table_index),
residual_predicate_index_(residual_predicate_index),
+ left_filter_predicate_index_(left_filter_predicate_index),
selection_index_(selection_index),
is_selection_on_build_(is_selection_on_build == nullptr
? std::vector<bool>()
@@ -256,6 +258,7 @@ class HashJoinOperator : public RelationalOperator {
const QueryContext::insert_destination_id output_destination_index_;
const QueryContext::join_hash_table_id hash_table_index_;
const QueryContext::predicate_id residual_predicate_index_;
+ const QueryContext::predicate_id left_filter_predicate_index_;
const QueryContext::scalar_group_id selection_index_;
const std::vector<bool> is_selection_on_build_;
const JoinType join_type_;
@@ -304,6 +307,7 @@ class HashInnerJoinWorkOrder : public WorkOrder {
const bool any_join_key_attributes_nullable,
const block_id lookup_block_id,
const Predicate *residual_predicate,
+ const Predicate *left_filter_predicate,
const std::vector<std::unique_ptr<const Scalar>> &selection,
const JoinHashTable &hash_table,
InsertDestination *output_destination,
@@ -316,6 +320,7 @@ class HashInnerJoinWorkOrder : public WorkOrder {
any_join_key_attributes_nullable_(any_join_key_attributes_nullable),
block_id_(lookup_block_id),
residual_predicate_(residual_predicate),
+ left_filter_predicate_(left_filter_predicate),
selection_(selection),
hash_table_(hash_table),
output_destination_(DCHECK_NOTNULL(output_destination)),
@@ -388,6 +393,7 @@ class HashInnerJoinWorkOrder : public WorkOrder {
const bool any_join_key_attributes_nullable_;
const block_id block_id_;
const Predicate *residual_predicate_;
+ const Predicate *left_filter_predicate_;
const std::vector<std::unique_ptr<const Scalar>> &selection_;
const JoinHashTable &hash_table_;
@@ -434,6 +440,7 @@ class HashSemiJoinWorkOrder : public WorkOrder {
const bool any_join_key_attributes_nullable,
const block_id lookup_block_id,
const Predicate *residual_predicate,
+ const Predicate *left_filter_predicate,
const std::vector<std::unique_ptr<const Scalar>> &selection,
const JoinHashTable &hash_table,
InsertDestination *output_destination,
@@ -446,6 +453,7 @@ class HashSemiJoinWorkOrder : public WorkOrder {
any_join_key_attributes_nullable_(any_join_key_attributes_nullable),
block_id_(lookup_block_id),
residual_predicate_(residual_predicate),
+ left_filter_predicate_(left_filter_predicate),
selection_(selection),
hash_table_(hash_table),
output_destination_(DCHECK_NOTNULL(output_destination)),
@@ -514,6 +522,7 @@ class HashSemiJoinWorkOrder : public WorkOrder {
const bool any_join_key_attributes_nullable_;
const block_id block_id_;
const Predicate *residual_predicate_;
+ const Predicate *left_filter_predicate_;
const std::vector<std::unique_ptr<const Scalar>> &selection_;
const JoinHashTable &hash_table_;
@@ -560,6 +569,7 @@ class HashAntiJoinWorkOrder : public WorkOrder {
const bool any_join_key_attributes_nullable,
const block_id lookup_block_id,
const Predicate *residual_predicate,
+ const Predicate *left_filter_predicate,
const std::vector<std::unique_ptr<const Scalar>> &selection,
const JoinHashTable &hash_table,
InsertDestination *output_destination,
@@ -572,6 +582,7 @@ class HashAntiJoinWorkOrder : public WorkOrder {
any_join_key_attributes_nullable_(any_join_key_attributes_nullable),
block_id_(lookup_block_id),
residual_predicate_(residual_predicate),
+ left_filter_predicate_(left_filter_predicate),
selection_(selection),
hash_table_(hash_table),
output_destination_(DCHECK_NOTNULL(output_destination)),
@@ -645,6 +656,7 @@ class HashAntiJoinWorkOrder : public WorkOrder {
const bool any_join_key_attributes_nullable_;
const block_id block_id_;
const Predicate *residual_predicate_;
+ const Predicate *left_filter_predicate_;
const std::vector<std::unique_ptr<const Scalar>> &selection_;
const JoinHashTable &hash_table_;
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b163289c/relational_operators/WorkOrder.proto
----------------------------------------------------------------------
diff --git a/relational_operators/WorkOrder.proto b/relational_operators/WorkOrder.proto
index 02aa50e..4874450 100644
--- a/relational_operators/WorkOrder.proto
+++ b/relational_operators/WorkOrder.proto
@@ -128,6 +128,7 @@ message HashJoinWorkOrder {
// Used by all but HashOuterJoinWorkOrder.
optional int32 residual_predicate_index = 169;
+ optional int32 left_filter_predicate_index = 400;
// Used by HashOuterJoinWorkOrder only.
repeated bool is_selection_on_build = 170;
}