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 2017/08/27 08:03:30 UTC
[05/12] incubator-quickstep git commit: Added has_repartition in
RelationalOperators.
Added has_repartition in RelationalOperators.
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/5f066fa4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/5f066fa4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/5f066fa4
Branch: refs/heads/copy-to
Commit: 5f066fa4bd53ec11d82c4a68bd3a120c65c873e8
Parents: 942a15b
Author: Zuyu Zhang <zu...@cs.wisc.edu>
Authored: Wed Aug 9 14:24:03 2017 -0500
Committer: Zuyu Zhang <zu...@cs.wisc.edu>
Committed: Sun Aug 27 00:59:20 2017 -0500
----------------------------------------------------------------------
query_optimizer/ExecutionGenerator.cpp | 18 ++
query_optimizer/physical/Aggregate.cpp | 3 +
query_optimizer/physical/Aggregate.hpp | 14 +-
query_optimizer/physical/BinaryJoin.cpp | 3 +
query_optimizer/physical/BinaryJoin.hpp | 4 +-
query_optimizer/physical/HashJoin.cpp | 1 +
query_optimizer/physical/HashJoin.hpp | 13 +-
query_optimizer/physical/Join.hpp | 4 +-
query_optimizer/physical/NestedLoopsJoin.hpp | 14 +-
query_optimizer/physical/Physical.hpp | 21 ++-
query_optimizer/physical/Selection.cpp | 9 +-
query_optimizer/physical/Selection.hpp | 13 +-
query_optimizer/physical/TableGenerator.hpp | 9 +-
query_optimizer/physical/TableReference.hpp | 2 +-
query_optimizer/rules/Partition.cpp | 30 +++-
.../physical_generator/CommonSubexpression.test | 23 ++-
.../tests/physical_generator/Join.test | 44 ++---
.../tests/physical_generator/Select.test | 164 +++++++++----------
.../FinalizeAggregationOperator.hpp | 4 +-
relational_operators/HashJoinOperator.hpp | 4 +-
.../NestedLoopsJoinOperator.hpp | 4 +-
relational_operators/RelationalOperator.hpp | 15 +-
relational_operators/SelectOperator.hpp | 8 +-
.../tests/AggregationOperator_unittest.cpp | 3 +
.../tests/HashJoinOperator_unittest.cpp | 12 ++
25 files changed, 281 insertions(+), 158 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/ExecutionGenerator.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp
index d43432c..d82a0c7 100644
--- a/query_optimizer/ExecutionGenerator.cpp
+++ b/query_optimizer/ExecutionGenerator.cpp
@@ -747,6 +747,8 @@ void ExecutionGenerator::convertSelection(
insert_destination_proto);
// Create and add a Select operator.
+ const bool has_repartition = physical_selection->hasRepartition();
+
// Use the "simple" form of the selection operator (a pure projection that
// doesn't require any expression evaluation or intermediate copies) if
// possible.
@@ -755,6 +757,7 @@ void ExecutionGenerator::convertSelection(
convertSimpleProjection(project_expressions_group_index, &attributes)
? new SelectOperator(query_handle_->query_id(),
input_relation,
+ has_repartition,
*output_relation,
insert_destination_index,
execution_predicate_index,
@@ -762,6 +765,7 @@ void ExecutionGenerator::convertSelection(
input_relation_info->isStoredRelation())
: new SelectOperator(query_handle_->query_id(),
input_relation,
+ has_repartition,
*output_relation,
insert_destination_index,
execution_predicate_index,
@@ -1040,6 +1044,7 @@ void ExecutionGenerator::convertHashJoin(const P::HashJoinPtr &physical_plan) {
probe_attribute_ids,
any_probe_attributes_nullable,
probe_num_partitions,
+ physical_plan->hasRepartition(),
*output_relation,
insert_destination_index,
join_hash_table_index,
@@ -1152,6 +1157,7 @@ void ExecutionGenerator::convertNestedLoopsJoin(
left_relation,
right_relation,
num_partitions,
+ physical_plan->hasRepartition(),
*output_relation,
insert_destination_index,
execution_join_predicate_index,
@@ -1539,6 +1545,15 @@ void ExecutionGenerator::convertInsertSelection(
static_cast<const ScalarAttribute*>(attribute.get())->getAttribute().getID());
}
+ const P::PartitionSchemeHeader *input_physical_partition_scheme_header =
+ physical_plan->selection()->getOutputPartitionSchemeHeader();
+ const P::PartitionSchemeHeader *output_physical_partition_scheme_header =
+ physical_plan->destination()->getOutputPartitionSchemeHeader();
+ const bool has_repartition =
+ (input_physical_partition_scheme_header && output_physical_partition_scheme_header)
+ ? input_physical_partition_scheme_header->equal(*output_physical_partition_scheme_header)
+ : (input_physical_partition_scheme_header || output_physical_partition_scheme_header);
+
// Create the select operator.
// TODO(jianqiao): This select operator is actually redundant. That is,
// we may directly set physical_plan_->selection()'s output relation to be
@@ -1549,6 +1564,7 @@ void ExecutionGenerator::convertInsertSelection(
SelectOperator *insert_selection_op =
new SelectOperator(query_handle_->query_id(),
selection_relation,
+ has_repartition,
destination_relation,
insert_destination_index,
QueryContext::kInvalidPredicateId,
@@ -1901,6 +1917,7 @@ void ExecutionGenerator::convertAggregate(
new FinalizeAggregationOperator(query_handle_->query_id(),
aggr_state_index,
num_partitions,
+ physical_plan->hasRepartition(),
aggr_state_num_partitions,
*output_relation,
insert_destination_index));
@@ -2078,6 +2095,7 @@ void ExecutionGenerator::convertCrossReferenceCoalesceAggregate(
new FinalizeAggregationOperator(query_handle_->query_id(),
aggr_state_index,
num_partitions,
+ physical_plan->hasRepartition(),
aggr_state_num_partitions,
*output_relation,
insert_destination_index));
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/Aggregate.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/Aggregate.cpp b/query_optimizer/physical/Aggregate.cpp
index f249e95..94be616 100644
--- a/query_optimizer/physical/Aggregate.cpp
+++ b/query_optimizer/physical/Aggregate.cpp
@@ -96,6 +96,9 @@ void Aggregate::getFieldStringItems(
std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
std::vector<std::string> *container_child_field_names,
std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const {
+ inline_field_names->push_back("has_repartition");
+ inline_field_values->push_back(has_repartition_ ? "true" : "false");
+
if (partition_scheme_header_) {
inline_field_names->push_back("output_partition_scheme_header");
inline_field_values->push_back(partition_scheme_header_->toString());
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/Aggregate.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/Aggregate.hpp b/query_optimizer/physical/Aggregate.hpp
index c19a951..68f8811 100644
--- a/query_optimizer/physical/Aggregate.hpp
+++ b/query_optimizer/physical/Aggregate.hpp
@@ -89,7 +89,7 @@ class Aggregate : public Physical {
const std::vector<PhysicalPtr> &new_children) const override {
DCHECK_EQ(getNumChildren(), new_children.size());
return Create(new_children[0], grouping_expressions_, aggregate_expressions_, filter_predicate_,
- cloneOutputPartitionSchemeHeader());
+ has_repartition_, cloneOutputPartitionSchemeHeader());
}
std::vector<expressions::AttributeReferencePtr> getOutputAttributes() const override;
@@ -97,9 +97,10 @@ class Aggregate : public Physical {
std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override;
PhysicalPtr copyWithNewOutputPartitionSchemeHeader(
- PartitionSchemeHeader *partition_scheme_header) const override {
+ PartitionSchemeHeader *partition_scheme_header,
+ const bool has_repartition = true) const override {
return Create(input_, grouping_expressions_, aggregate_expressions_, filter_predicate_,
- partition_scheme_header);
+ has_repartition, partition_scheme_header);
}
bool maybeCopyWithPrunedExpressions(
@@ -125,9 +126,11 @@ class Aggregate : public Physical {
const std::vector<expressions::NamedExpressionPtr> &grouping_expressions,
const std::vector<expressions::AliasPtr> &aggregate_expressions,
const expressions::PredicatePtr &filter_predicate,
+ const bool has_repartition = false,
PartitionSchemeHeader *partition_scheme_header = nullptr) {
return AggregatePtr(
- new Aggregate(input, grouping_expressions, aggregate_expressions, filter_predicate, partition_scheme_header));
+ new Aggregate(input, grouping_expressions, aggregate_expressions, filter_predicate, has_repartition,
+ partition_scheme_header));
}
protected:
@@ -145,8 +148,9 @@ class Aggregate : public Physical {
const std::vector<expressions::NamedExpressionPtr> &grouping_expressions,
const std::vector<expressions::AliasPtr> &aggregate_expressions,
const expressions::PredicatePtr &filter_predicate,
+ const bool has_repartition,
PartitionSchemeHeader *partition_scheme_header)
- : Physical(partition_scheme_header),
+ : Physical(has_repartition, partition_scheme_header),
input_(input),
grouping_expressions_(grouping_expressions),
aggregate_expressions_(aggregate_expressions),
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/BinaryJoin.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/BinaryJoin.cpp b/query_optimizer/physical/BinaryJoin.cpp
index 1928198..b8e8609 100644
--- a/query_optimizer/physical/BinaryJoin.cpp
+++ b/query_optimizer/physical/BinaryJoin.cpp
@@ -40,6 +40,9 @@ void BinaryJoin::getFieldStringItems(
std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
std::vector<std::string> *container_child_field_names,
std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const {
+ inline_field_names->push_back("has_repartition");
+ inline_field_values->push_back(has_repartition_ ? "true" : "false");
+
if (partition_scheme_header_) {
inline_field_names->push_back("output_partition_scheme_header");
inline_field_values->push_back(partition_scheme_header_->toString());
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/BinaryJoin.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/BinaryJoin.hpp b/query_optimizer/physical/BinaryJoin.hpp
index d1f652f..39d5e31 100644
--- a/query_optimizer/physical/BinaryJoin.hpp
+++ b/query_optimizer/physical/BinaryJoin.hpp
@@ -70,13 +70,15 @@ class BinaryJoin : public Join {
* @param left The left operand.
* @param right The right operand.
* @param project_expressions The project expressions.
+ * @param has_repartition Whether this node has repartition.
* @param partition_scheme_header The optional output partition scheme header.
*/
BinaryJoin(const PhysicalPtr &left,
const PhysicalPtr &right,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
+ const bool has_repartition = false,
PartitionSchemeHeader *partition_scheme_header = nullptr)
- : Join(project_expressions, partition_scheme_header),
+ : Join(project_expressions, has_repartition, partition_scheme_header),
left_(left),
right_(right) {
addChild(left_);
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/HashJoin.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/HashJoin.cpp b/query_optimizer/physical/HashJoin.cpp
index b0ee913..a49bc8e 100644
--- a/query_optimizer/physical/HashJoin.cpp
+++ b/query_optimizer/physical/HashJoin.cpp
@@ -81,6 +81,7 @@ bool HashJoin::maybeCopyWithPrunedExpressions(
residual_predicate_,
new_project_expressions,
join_type_,
+ has_repartition_,
cloneOutputPartitionSchemeHeader());
return true;
}
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/HashJoin.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/HashJoin.hpp b/query_optimizer/physical/HashJoin.hpp
index 1804d4b..2ed83af 100644
--- a/query_optimizer/physical/HashJoin.hpp
+++ b/query_optimizer/physical/HashJoin.hpp
@@ -119,15 +119,18 @@ class HashJoin : public BinaryJoin {
residual_predicate_,
project_expressions(),
join_type_,
+ has_repartition_,
cloneOutputPartitionSchemeHeader());
}
std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override;
PhysicalPtr copyWithNewOutputPartitionSchemeHeader(
- PartitionSchemeHeader *partition_scheme_header) const override {
+ PartitionSchemeHeader *partition_scheme_header,
+ const bool has_repartition = true) const override {
return Create(left(), right(), left_join_attributes_, right_join_attributes_,
- residual_predicate_, project_expressions(), join_type_, partition_scheme_header);
+ residual_predicate_, project_expressions(), join_type_,
+ has_repartition, partition_scheme_header);
}
bool maybeCopyWithPrunedExpressions(
@@ -145,6 +148,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 has_repartition Whether this node has repartition.
* @param partition_scheme_header The optional output partition scheme header.
*
* @return An immutable physical HashJoin.
@@ -157,6 +161,7 @@ class HashJoin : public BinaryJoin {
const expressions::PredicatePtr &residual_predicate,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
const JoinType join_type,
+ const bool has_repartition = false,
PartitionSchemeHeader *partition_scheme_header = nullptr) {
return HashJoinPtr(
new HashJoin(left,
@@ -166,6 +171,7 @@ class HashJoin : public BinaryJoin {
residual_predicate,
project_expressions,
join_type,
+ has_repartition,
partition_scheme_header));
}
@@ -187,8 +193,9 @@ class HashJoin : public BinaryJoin {
const expressions::PredicatePtr &residual_predicate,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
const JoinType join_type,
+ const bool has_repartition,
PartitionSchemeHeader *partition_scheme_header)
- : BinaryJoin(left, right, project_expressions, partition_scheme_header),
+ : BinaryJoin(left, right, project_expressions, has_repartition, partition_scheme_header),
left_join_attributes_(left_join_attributes),
right_join_attributes_(right_join_attributes),
residual_predicate_(residual_predicate),
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/Join.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/Join.hpp b/query_optimizer/physical/Join.hpp
index d72d072..63f67c8 100644
--- a/query_optimizer/physical/Join.hpp
+++ b/query_optimizer/physical/Join.hpp
@@ -70,12 +70,14 @@ class Join : public Physical {
* @brief Constructor.
*
* @param project_expressions The project expressions.
+ * @param has_repartition Whether this node has repartition.
* @param partition_scheme_header The optional output partition scheme header.
*/
explicit Join(
const std::vector<expressions::NamedExpressionPtr>& project_expressions,
+ const bool has_repartition = false,
PartitionSchemeHeader *partition_scheme_header = nullptr)
- : Physical(partition_scheme_header),
+ : Physical(has_repartition, partition_scheme_header),
project_expressions_(project_expressions) {}
private:
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/NestedLoopsJoin.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/NestedLoopsJoin.hpp b/query_optimizer/physical/NestedLoopsJoin.hpp
index f4c3a42..0e0260c 100644
--- a/query_optimizer/physical/NestedLoopsJoin.hpp
+++ b/query_optimizer/physical/NestedLoopsJoin.hpp
@@ -75,6 +75,7 @@ class NestedLoopsJoin : public BinaryJoin {
new_children[1],
join_predicate_,
project_expressions(),
+ has_repartition_,
cloneOutputPartitionSchemeHeader());
}
@@ -85,8 +86,10 @@ class NestedLoopsJoin : public BinaryJoin {
PhysicalPtr *output) const override;
PhysicalPtr copyWithNewOutputPartitionSchemeHeader(
- PartitionSchemeHeader *partition_scheme_header) const override {
- return Create(left(), right(), join_predicate_, project_expressions(), partition_scheme_header);
+ PartitionSchemeHeader *partition_scheme_header,
+ const bool has_repartition = true) const override {
+ return Create(left(), right(), join_predicate_, project_expressions(),
+ has_repartition, partition_scheme_header);
}
/**
@@ -105,9 +108,11 @@ class NestedLoopsJoin : public BinaryJoin {
const PhysicalPtr &right,
const expressions::PredicatePtr &join_predicate,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
+ const bool has_repartition = false,
PartitionSchemeHeader *partition_scheme_header = nullptr) {
return NestedLoopsJoinPtr(
- new NestedLoopsJoin(left, right, join_predicate, project_expressions, partition_scheme_header));
+ new NestedLoopsJoin(left, right, join_predicate, project_expressions,
+ has_repartition, partition_scheme_header));
}
protected:
@@ -125,8 +130,9 @@ class NestedLoopsJoin : public BinaryJoin {
const PhysicalPtr &right,
const expressions::PredicatePtr &join_predicate,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
+ const bool has_repartition,
PartitionSchemeHeader *partition_scheme_header)
- : BinaryJoin(left, right, project_expressions, partition_scheme_header),
+ : BinaryJoin(left, right, project_expressions, has_repartition, partition_scheme_header),
join_predicate_(join_predicate) {
DCHECK(join_predicate_ != nullptr);
}
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/Physical.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/Physical.hpp b/query_optimizer/physical/Physical.hpp
index a3a56d0..4491520 100644
--- a/query_optimizer/physical/Physical.hpp
+++ b/query_optimizer/physical/Physical.hpp
@@ -95,12 +95,14 @@ class Physical : public OptimizerTree<Physical> {
* @param partition_scheme_header The partition scheme header to be
* substituted for the existing one, if any. It takes ownership of
* 'partition_scheme_header'.
+ * @param has_repartition Whether the new node does repartition.
*
* @return A copy with \p partition_scheme_header as the partition scheme
* header.
*/
virtual PhysicalPtr copyWithNewOutputPartitionSchemeHeader(
- PartitionSchemeHeader *partition_scheme_header) const {
+ PartitionSchemeHeader *partition_scheme_header,
+ const bool has_repartition = true) const {
std::unique_ptr<PartitionSchemeHeader> new_partition_scheme_header(partition_scheme_header);
LOG(FATAL) << "copyWithNewOutputPartitionSchemeHeader is not implemented for " << getName();
}
@@ -128,16 +130,29 @@ class Physical : public OptimizerTree<Physical> {
return nullptr;
}
+ /**
+ * @brief Whether the physical plan node does repartition.
+ *
+ * @return True if this node does repartition. Otherwise, false.
+ **/
+ bool hasRepartition() const {
+ return has_repartition_;
+ }
+
protected:
/**
* @brief Constructor.
*
+ * @param has_repartition Whether this node does repartition.
* @param partition_scheme_header The partition scheme header of the relation.
* The constructor takes ownership of 'partition_scheme_header'.
*/
- explicit Physical(PartitionSchemeHeader *partition_scheme_header = nullptr)
- : partition_scheme_header_(partition_scheme_header) {}
+ explicit Physical(const bool has_repartition = false,
+ PartitionSchemeHeader *partition_scheme_header = nullptr)
+ : has_repartition_(has_repartition),
+ partition_scheme_header_(partition_scheme_header) {}
+ const bool has_repartition_;
std::unique_ptr<PartitionSchemeHeader> partition_scheme_header_;
private:
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/Selection.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/Selection.cpp b/query_optimizer/physical/Selection.cpp
index 3307e9e..b2b3f7e 100644
--- a/query_optimizer/physical/Selection.cpp
+++ b/query_optimizer/physical/Selection.cpp
@@ -45,7 +45,8 @@ namespace E = ::quickstep::optimizer::expressions;
PhysicalPtr Selection::copyWithNewChildren(
const std::vector<PhysicalPtr> &new_children) const {
DCHECK_EQ(children().size(), new_children.size());
- return Create(new_children[0], project_expressions_, filter_predicate_, cloneOutputPartitionSchemeHeader());
+ return Create(new_children[0], project_expressions_, filter_predicate_,
+ has_repartition_, cloneOutputPartitionSchemeHeader());
}
std::vector<E::AttributeReferencePtr> Selection::getOutputAttributes() const {
@@ -82,7 +83,8 @@ bool Selection::maybeCopyWithPrunedExpressions(
}
}
if (new_project_expressions.size() != project_expressions_.size()) {
- *output = Create(input(), new_project_expressions, filter_predicate_, cloneOutputPartitionSchemeHeader());
+ *output = Create(input(), new_project_expressions, filter_predicate_,
+ has_repartition_, cloneOutputPartitionSchemeHeader());
return true;
}
return false;
@@ -95,6 +97,9 @@ void Selection::getFieldStringItems(
std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
std::vector<std::string> *container_child_field_names,
std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const {
+ inline_field_names->push_back("has_repartition");
+ inline_field_values->push_back(has_repartition_ ? "true" : "false");
+
if (partition_scheme_header_) {
inline_field_names->push_back("output_partition_scheme_header");
inline_field_values->push_back(partition_scheme_header_->toString());
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/Selection.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/Selection.hpp b/query_optimizer/physical/Selection.hpp
index 4cbc856..2b50061 100644
--- a/query_optimizer/physical/Selection.hpp
+++ b/query_optimizer/physical/Selection.hpp
@@ -85,8 +85,10 @@ class Selection : public Physical {
std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override;
PhysicalPtr copyWithNewOutputPartitionSchemeHeader(
- PartitionSchemeHeader *partition_scheme_header) const override {
- return Create(input(), project_expressions_, filter_predicate_, partition_scheme_header);
+ PartitionSchemeHeader *partition_scheme_header,
+ const bool has_repartition = true) const override {
+ return Create(input(), project_expressions_, filter_predicate_,
+ has_repartition, partition_scheme_header);
}
bool maybeCopyWithPrunedExpressions(
@@ -109,9 +111,11 @@ class Selection : public Physical {
const PhysicalPtr &input,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
const expressions::PredicatePtr &filter_predicate,
+ const bool has_repartition = false,
PartitionSchemeHeader *output_partition_scheme_header = nullptr) {
return SelectionPtr(
- new Selection(input, project_expressions, filter_predicate, output_partition_scheme_header));
+ new Selection(input, project_expressions, filter_predicate,
+ has_repartition, output_partition_scheme_header));
}
/**
@@ -153,8 +157,9 @@ class Selection : public Physical {
const PhysicalPtr &input,
const std::vector<expressions::NamedExpressionPtr> &project_expressions,
const expressions::PredicatePtr &filter_predicate,
+ const bool has_repartition,
PartitionSchemeHeader *partition_scheme_header)
- : Physical(partition_scheme_header),
+ : Physical(has_repartition, partition_scheme_header),
project_expressions_(project_expressions),
filter_predicate_(filter_predicate) {
addChild(input);
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/TableGenerator.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/TableGenerator.hpp b/query_optimizer/physical/TableGenerator.hpp
index 4d6419f..0798165 100644
--- a/query_optimizer/physical/TableGenerator.hpp
+++ b/query_optimizer/physical/TableGenerator.hpp
@@ -102,9 +102,11 @@ class TableGenerator : public Physical {
}
PhysicalPtr copyWithNewOutputPartitionSchemeHeader(
- PartitionSchemeHeader *partition_scheme_header) const override {
+ PartitionSchemeHeader *partition_scheme_header,
+ const bool has_repartition = true) const override {
return TableGeneratorPtr(
- new TableGenerator(generator_function_handle_, table_alias_, attribute_list_, partition_scheme_header));
+ new TableGenerator(generator_function_handle_, table_alias_, attribute_list_,
+ partition_scheme_header != nullptr, partition_scheme_header));
}
void getFieldStringItems(
@@ -152,8 +154,9 @@ class TableGenerator : public Physical {
TableGenerator(const GeneratorFunctionHandlePtr &generator_function_handle,
const std::string &table_alias,
const std::vector<E::AttributeReferencePtr> &attribute_list,
+ const bool has_repartition = false,
PartitionSchemeHeader *partition_scheme_header = nullptr)
- : Physical(partition_scheme_header),
+ : Physical(has_repartition, partition_scheme_header),
generator_function_handle_(generator_function_handle),
table_alias_(table_alias),
attribute_list_(attribute_list) {
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/physical/TableReference.hpp
----------------------------------------------------------------------
diff --git a/query_optimizer/physical/TableReference.hpp b/query_optimizer/physical/TableReference.hpp
index bdc0578..85cb76b 100644
--- a/query_optimizer/physical/TableReference.hpp
+++ b/query_optimizer/physical/TableReference.hpp
@@ -114,7 +114,7 @@ class TableReference : public Physical {
const CatalogRelation *relation, const std::string &alias,
const std::vector<expressions::AttributeReferencePtr> &attribute_list,
PartitionSchemeHeader *partition_scheme_header)
- : Physical(partition_scheme_header),
+ : Physical(false /* has_repartition */, partition_scheme_header),
relation_(relation),
alias_(alias),
attribute_list_(attribute_list) {}
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/rules/Partition.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/rules/Partition.cpp b/query_optimizer/rules/Partition.cpp
index fd4deb3..5f8b2c6 100644
--- a/query_optimizer/rules/Partition.cpp
+++ b/query_optimizer/rules/Partition.cpp
@@ -100,7 +100,8 @@ P::PhysicalPtr Repartition(const P::PhysicalPtr &node, P::PartitionSchemeHeader
// Add a Selection node.
return P::Selection::Create(node,
CastSharedPtrVector<E::NamedExpression>(node->getOutputAttributes()),
- nullptr /* filter_predicate */, repartition_scheme_header);
+ nullptr /* filter_predicate */,
+ true /* has_repartition */, repartition_scheme_header);
} else {
// Overwrite the output partition scheme header of the node.
return node->copyWithNewOutputPartitionSchemeHeader(repartition_scheme_header);
@@ -180,7 +181,8 @@ P::PhysicalPtr applyToNestedLoopsJoin(const P::NestedLoopsJoinPtr &nested_loops_
// Add a Selection node.
left = P::Selection::Create(left,
CastSharedPtrVector<E::NamedExpression>(left->getOutputAttributes()),
- nullptr /* filter_predicate */, left_repartition_scheme_header.release());
+ nullptr /* filter_predicate */,
+ true /* has_repartition */, left_repartition_scheme_header.release());
break;
default: {
if (!left_partition_scheme_header) {
@@ -199,7 +201,8 @@ P::PhysicalPtr applyToNestedLoopsJoin(const P::NestedLoopsJoinPtr &nested_loops_
// Add a Selection node.
right = P::Selection::Create(right,
CastSharedPtrVector<E::NamedExpression>(right->getOutputAttributes()),
- nullptr /* filter_predicate */, right_repartition_scheme_header.release());
+ nullptr /* filter_predicate */,
+ true /* has_repartition */, right_repartition_scheme_header.release());
} else {
right = right->copyWithNewOutputPartitionSchemeHeader(right_repartition_scheme_header.release());
}
@@ -227,9 +230,11 @@ P::PhysicalPtr applyToNestedLoopsJoin(const P::NestedLoopsJoinPtr &nested_loops_
}
std::unique_ptr<P::PartitionSchemeHeader> output_partition_scheme_header;
+ bool has_repartition = false;
if (left_partition_expr_ids != output_partition_expr_ids) {
output_partition_scheme_header = make_unique<P::PartitionSchemeHeader>(
left_partition_scheme_header->partition_type, num_partitions, move(output_partition_expr_ids));
+ has_repartition = true;
} else {
output_partition_scheme_header = make_unique<P::PartitionSchemeHeader>(*left_partition_scheme_header);
}
@@ -237,6 +242,7 @@ P::PhysicalPtr applyToNestedLoopsJoin(const P::NestedLoopsJoinPtr &nested_loops_
return P::NestedLoopsJoin::Create(left, right,
nested_loops_join->join_predicate(),
nested_loops_join->project_expressions(),
+ has_repartition,
output_partition_scheme_header.release());
}
@@ -277,7 +283,8 @@ P::PhysicalPtr Partition::applyToNode(const P::PhysicalPtr &node) {
input_partition_scheme_header->num_partitions,
move(output_partition_expr_ids));
- return aggregate->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release());
+ return aggregate->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release(),
+ false /* has_repartition */);
}
}
@@ -364,7 +371,8 @@ P::PhysicalPtr Partition::applyToNode(const P::PhysicalPtr &node) {
avg_recompute_expressions.empty()
? aggregate->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release())
: P::Aggregate::Create(input, grouping_expressions, partial_aggregate_expressions,
- filter_predicate, output_partition_scheme_header.release());
+ filter_predicate, true /* has_repartition */,
+ output_partition_scheme_header.release());
vector<E::AliasPtr> reaggregate_expressions;
for (const auto &aggregate_expr : partial_aggregate_expressions) {
@@ -383,7 +391,8 @@ P::PhysicalPtr Partition::applyToNode(const P::PhysicalPtr &node) {
}
const P::AggregatePtr reaggregate =
P::Aggregate::Create(partial_aggregate, grouping_expressions, reaggregate_expressions,
- nullptr /* filter_predicate */, output_partition_scheme_header.release());
+ nullptr /* filter_predicate */, false /* has_repartition */,
+ output_partition_scheme_header.release());
if (avg_recompute_expressions.empty()) {
return reaggregate;
@@ -419,7 +428,7 @@ P::PhysicalPtr Partition::applyToNode(const P::PhysicalPtr &node) {
make_unique<P::PartitionSchemeHeader>(*reaggregate->getOutputPartitionSchemeHeader());
}
return P::Selection::Create(reaggregate, project_expressions, nullptr /* filter_predicate */,
- output_partition_scheme_header.release());
+ false /* has_repartition */, output_partition_scheme_header.release());
}
case P::PhysicalType::kHashJoin: {
const P::HashJoinPtr hash_join = static_pointer_cast<const P::HashJoin>(node);
@@ -489,10 +498,12 @@ P::PhysicalPtr Partition::applyToNode(const P::PhysicalPtr &node) {
hash_join->residual_predicate(),
hash_join->project_expressions(),
hash_join->join_type(),
+ false /* has_repartition */,
output_partition_scheme_header.release());
}
- return hash_join->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release());
+ return hash_join->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release(),
+ false /* has_repartition */);
}
case P::PhysicalType::kNestedLoopsJoin: {
const P::NestedLoopsJoinPtr nested_loops_join = static_pointer_cast<const P::NestedLoopsJoin>(node);
@@ -552,7 +563,8 @@ P::PhysicalPtr Partition::applyToNode(const P::PhysicalPtr &node) {
// TODO(quickstep-team): Check RangePartitionSchemeHeader against the project expressions.
DCHECK(input_partition_scheme_header->partition_type != P::PartitionSchemeHeader::PartitionType::kRange);
auto output_partition_scheme_header = make_unique<P::PartitionSchemeHeader>(*input_partition_scheme_header);
- return selection->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release());
+ return selection->copyWithNewOutputPartitionSchemeHeader(output_partition_scheme_header.release(),
+ false /* has_repartition */);
}
default:
break;
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/tests/physical_generator/CommonSubexpression.test
----------------------------------------------------------------------
diff --git a/query_optimizer/tests/physical_generator/CommonSubexpression.test b/query_optimizer/tests/physical_generator/CommonSubexpression.test
index b23a97d..147cfeb 100644
--- a/query_optimizer/tests/physical_generator/CommonSubexpression.test
+++ b/query_optimizer/tests/physical_generator/CommonSubexpression.test
@@ -44,7 +44,7 @@ TopLevelPlan
+-AttributeReference[id=7,name=,alias=(1+int_col),relation=,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -114,8 +114,8 @@ TopLevelPlan
type=Float NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -216,7 +216,7 @@ TopLevelPlan
type=Float NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
++-plan=HashJoin[has_repartition=false]
| +-left=TableGenerator[function_name=generate_series,table_alias=g]
| | +-AttributeReference[id=6,name=generate_series,alias=g,
| | relation=generate_series,type=Int]
@@ -318,7 +318,7 @@ TopLevelPlan
type=Float NULL]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -416,7 +416,7 @@ TopLevelPlan
+-AttributeReference[id=7,name=result,relation=,type=Long]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -512,7 +512,7 @@ TopLevelPlan
+-AttributeReference[id=8,name=,alias=(int_col+1),relation=,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -627,8 +627,8 @@ TopLevelPlan
+-AttributeReference[id=11,name=,alias=COUNT(*),relation=,type=Long]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -731,8 +731,8 @@ TopLevelPlan
type=Long NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -769,4 +769,3 @@ TopLevelPlan
| type=Long NULL]
+-AttributeReference[id=9,name=,alias=((SUM((long_col+1))+2)*3),relation=,
type=Long NULL]
-==
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/tests/physical_generator/Join.test
----------------------------------------------------------------------
diff --git a/query_optimizer/tests/physical_generator/Join.test b/query_optimizer/tests/physical_generator/Join.test
index 4ebbac7..45ea0ed 100644
--- a/query_optimizer/tests/physical_generator/Join.test
+++ b/query_optimizer/tests/physical_generator/Join.test
@@ -23,9 +23,9 @@ FROM a JOIN b ON a.w = b.w
JOIN d ON a.y = d.y;
--
TopLevelPlan
-+-plan=HashJoin
-| +-left=HashJoin
-| | +-left=HashJoin
++-plan=HashJoin[has_repartition=false]
+| +-left=HashJoin[has_repartition=false]
+| | +-left=HashJoin[has_repartition=false]
| | | +-left=TableReference[relation=a]
| | | | +-AttributeReference[id=0,name=w,relation=a,type=Int]
| | | | +-AttributeReference[id=1,name=x,relation=a,type=Int]
@@ -71,9 +71,9 @@ FROM a JOIN b ON (a.w = b.w OR a.x > b.x)
JOIN d ON (a.y = d.y OR a.z > d.z);
--
TopLevelPlan
-+-plan=NestedLoopsJoin
-| +-left=HashJoin
-| | +-left=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
+| +-left=HashJoin[has_repartition=false]
+| | +-left=NestedLoopsJoin[has_repartition=false]
| | | +-left=TableReference[relation=a]
| | | | +-AttributeReference[id=0,name=w,relation=a,type=Int]
| | | | +-AttributeReference[id=1,name=x,relation=a,type=Int]
@@ -131,9 +131,9 @@ WHERE a1.x = b1.x
AND a1.z = d1.z;
--
TopLevelPlan
-+-plan=HashJoin
-| +-left=HashJoin
-| | +-left=HashJoin
++-plan=HashJoin[has_repartition=false]
+| +-left=HashJoin[has_repartition=false]
+| | +-left=HashJoin[has_repartition=false]
| | | +-left=TableReference[relation=a,alias=a1]
| | | | +-AttributeReference[id=0,name=w,relation=a1,type=Int]
| | | | +-AttributeReference[id=1,name=x,relation=a1,type=Int]
@@ -188,9 +188,9 @@ WHERE a1.x = b1.x
AND a1.z = d1.z;
--
TopLevelPlan
-+-plan=HashJoin
-| +-left=HashJoin
-| | +-left=HashJoin
++-plan=HashJoin[has_repartition=false]
+| +-left=HashJoin[has_repartition=false]
+| | +-left=HashJoin[has_repartition=false]
| | | +-left=TableReference[relation=a,alias=a1]
| | | | +-AttributeReference[id=0,name=w,relation=a1,type=Int]
| | | | +-AttributeReference[id=1,name=x,relation=a1,type=Int]
@@ -245,9 +245,9 @@ FROM a LEFT JOIN b ON a.w = b.w
LEFT JOIN d ON a.y = d.y;
--
TopLevelPlan
-+-plan=HashLeftOuterJoin
-| +-left=HashLeftOuterJoin
-| | +-left=HashLeftOuterJoin
++-plan=HashLeftOuterJoin[has_repartition=false]
+| +-left=HashLeftOuterJoin[has_repartition=false]
+| | +-left=HashLeftOuterJoin[has_repartition=false]
| | | +-left=TableReference[relation=a]
| | | | +-AttributeReference[id=0,name=w,relation=a,type=Int]
| | | | +-AttributeReference[id=1,name=x,relation=a,type=Int]
@@ -304,10 +304,10 @@ WHERE b.x > 10
AND c.y > 20;
--
TopLevelPlan
-+-plan=HashLeftOuterJoin
-| +-left=HashJoin
-| | +-left=HashLeftOuterJoin
-| | | +-left=Selection
++-plan=HashLeftOuterJoin[has_repartition=false]
+| +-left=HashJoin[has_repartition=false]
+| | +-left=HashLeftOuterJoin[has_repartition=false]
+| | | +-left=Selection[has_repartition=false]
| | | | +-input=TableReference[relation=b]
| | | | | +-AttributeReference[id=4,name=w,relation=b,type=Int]
| | | | | +-AttributeReference[id=5,name=x,relation=b,type=Int]
@@ -331,7 +331,7 @@ TopLevelPlan
| | | | +-AttributeReference[id=4,name=w,relation=b,type=Int]
| | | +-right_join_attributes=
| | | +-AttributeReference[id=0,name=w,relation=a,type=Int]
-| | +-right=Selection
+| | +-right=Selection[has_repartition=false]
| | | +-input=TableReference[relation=c]
| | | | +-AttributeReference[id=6,name=x,relation=c,type=Int]
| | | | +-AttributeReference[id=7,name=y,relation=c,type=Int]
@@ -373,11 +373,11 @@ SELECT *
FROM b LEFT JOIN c ON (b.x = c.x AND c.x > 10);
--
TopLevelPlan
-+-plan=HashLeftOuterJoin
++-plan=HashLeftOuterJoin[has_repartition=false]
| +-left=TableReference[relation=b]
| | +-AttributeReference[id=0,name=w,relation=b,type=Int]
| | +-AttributeReference[id=1,name=x,relation=b,type=Int]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=c]
| | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/query_optimizer/tests/physical_generator/Select.test
----------------------------------------------------------------------
diff --git a/query_optimizer/tests/physical_generator/Select.test b/query_optimizer/tests/physical_generator/Select.test
index dc923ae..8bb6599 100644
--- a/query_optimizer/tests/physical_generator/Select.test
+++ b/query_optimizer/tests/physical_generator/Select.test
@@ -44,7 +44,7 @@ TopLevelPlan
+-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -90,7 +90,7 @@ TopLevelPlan
+-AttributeReference[id=7,name=,alias=2,relation=,type=Int]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -148,7 +148,7 @@ TopLevelPlan
type=Float NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
++-plan=HashJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -233,7 +233,7 @@ TopLevelPlan
+-AttributeReference[id=9,name=int_col,relation=,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -325,7 +325,7 @@ TopLevelPlan
+-AttributeReference[id=12,name=float_col,relation=b,type=Float]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -421,7 +421,7 @@ TopLevelPlan
+-AttributeReference[id=8,name=float_col,relation=b,type=Float]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -429,7 +429,7 @@ TopLevelPlan
| | +-AttributeReference[id=3,name=double_col,relation=a,type=Double NULL]
| | +-AttributeReference[id=4,name=char_col,relation=a,type=Char(20)]
| | +-AttributeReference[id=5,name=vchar_col,relation=a,type=VarChar(20) NULL]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -518,7 +518,7 @@ TopLevelPlan
+-AttributeReference[id=12,name=float_col,relation=b,type=Float]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
++-plan=HashJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -526,7 +526,7 @@ TopLevelPlan
| | +-AttributeReference[id=3,name=double_col,relation=a,type=Double NULL]
| | +-AttributeReference[id=4,name=char_col,relation=a,type=Char(20)]
| | +-AttributeReference[id=5,name=vchar_col,relation=a,type=VarChar(20) NULL]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -604,7 +604,7 @@ TopLevelPlan
+-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
++-plan=HashJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -675,7 +675,7 @@ TopLevelPlan
+-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
++-plan=HashJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -683,7 +683,7 @@ TopLevelPlan
| | +-AttributeReference[id=3,name=double_col,relation=a,type=Double NULL]
| | +-AttributeReference[id=4,name=char_col,relation=a,type=Char(20)]
| | +-AttributeReference[id=5,name=vchar_col,relation=a,type=VarChar(20) NULL]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -755,7 +755,7 @@ TopLevelPlan
+-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
++-plan=HashJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -835,8 +835,8 @@ TopLevelPlan
+-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
-| +-left=HashJoin
++-plan=NestedLoopsJoin[has_repartition=false]
+| +-left=HashJoin[has_repartition=false]
| | +-left=TableReference[relation=Test,alias=a]
| | | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -857,7 +857,7 @@ TopLevelPlan
| | | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-right_join_attributes=
| | +-AttributeReference[id=7,name=long_col,relation=b,type=Long]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=c]
| | | +-AttributeReference[id=12,name=int_col,relation=c,type=Int NULL]
| | | +-AttributeReference[id=13,name=long_col,relation=c,type=Long]
@@ -916,7 +916,7 @@ TopLevelPlan
+-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=a]
| | +-AttributeReference[id=0,name=int_col,relation=a,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=a,type=Long]
@@ -924,7 +924,7 @@ TopLevelPlan
| | +-AttributeReference[id=3,name=double_col,relation=a,type=Double NULL]
| | +-AttributeReference[id=4,name=char_col,relation=a,type=Char(20)]
| | +-AttributeReference[id=5,name=vchar_col,relation=a,type=VarChar(20) NULL]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -1021,8 +1021,8 @@ TopLevelPlan
+-AttributeReference[id=10,name=col,relation=,type=Double NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1157,8 +1157,8 @@ TopLevelPlan
+-AttributeReference[id=6,name=col2,relation=,type=Long]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1296,8 +1296,8 @@ TopLevelPlan
+-AttributeReference[id=4,name=subquery_col3,relation=subquery,type=Char(20)]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1407,8 +1407,8 @@ TopLevelPlan
+-AttributeReference[id=6,name=,alias=count(*),relation=,type=Long]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1465,8 +1465,8 @@ TopLevelPlan
+-AttributeReference[id=6,name=,alias=count(*),relation=,type=Long]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1522,8 +1522,8 @@ TopLevelPlan
+-AttributeReference[id=7,name=,alias=count(*),relation=,type=Long]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1585,7 +1585,7 @@ TopLevelPlan
+-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=SharedSubplanReference[subplan_id=0]
| | +-referenced_attributes=
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
@@ -1598,7 +1598,7 @@ TopLevelPlan
| +-project_expressions=
| +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
+-shared_subplans=
-| +-Selection
+| +-Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1673,8 +1673,8 @@ TopLevelPlan
type=Double NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1786,9 +1786,9 @@ TopLevelPlan
+-AttributeReference[id=1,name=i,relation=,type=Int]
[Physical Plan]
TopLevelPlan
-+-plan=HashLeftSemiJoin
-| +-left=HashLeftAntiJoin
-| | +-left=Selection
++-plan=HashLeftSemiJoin[has_repartition=false]
+| +-left=HashLeftAntiJoin[has_repartition=false]
+| | +-left=Selection[has_repartition=false]
| | | +-input=TableGenerator[function_name=generate_series,table_alias=gs1]
| | | | +-AttributeReference[id=0,name=generate_series,alias=gs1,
| | | | relation=generate_series,type=Int]
@@ -1859,7 +1859,7 @@ TopLevelPlan
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -1925,7 +1925,7 @@ TopLevelPlan
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -2014,7 +2014,7 @@ TopLevelPlan
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
[Physical Plan]
TopLevelPlan
-+-plan=HashLeftSemiJoin
++-plan=HashLeftSemiJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -2022,8 +2022,8 @@ TopLevelPlan
| | +-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
| | +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
| | +-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
-| +-right=Selection
-| | +-input=Aggregate
+| +-right=Selection[has_repartition=false]
+| | +-input=Aggregate[has_repartition=false]
| | | +-input=TableReference[relation=Test,alias=test]
| | | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -2105,7 +2105,7 @@ TopLevelPlan
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
[Physical Plan]
TopLevelPlan
-+-plan=HashLeftAntiJoin
++-plan=HashLeftAntiJoin[has_repartition=false]
| +-left=TableReference[relation=Test,alias=test]
| | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -2113,7 +2113,7 @@ TopLevelPlan
| | +-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
| | +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
| | +-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
-| +-right=Selection
+| +-right=Selection[has_repartition=false]
| | +-input=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -2179,11 +2179,11 @@ TopLevelPlan
type=Long NULL]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=b]
| | +-AttributeReference[id=0,name=w,relation=b,type=Int]
| | +-AttributeReference[id=1,name=x,relation=b,type=Int]
-| +-right=Aggregate
+| +-right=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=c]
| | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
@@ -2246,8 +2246,8 @@ TopLevelPlan
type=Long NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
-| +-left=Aggregate
++-plan=HashJoin[has_repartition=false]
+| +-left=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=c]
| | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
@@ -2313,11 +2313,11 @@ TopLevelPlan
+-AttributeReference[id=1,name=x,relation=b,type=Int]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=b]
| | +-AttributeReference[id=0,name=w,relation=b,type=Int]
| | +-AttributeReference[id=1,name=x,relation=b,type=Int]
-| +-right=Aggregate
+| +-right=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=c]
| | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
@@ -2383,8 +2383,8 @@ TopLevelPlan
+-AttributeReference[id=1,name=x,relation=b,type=Int]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
-| +-left=Aggregate
++-plan=HashJoin[has_repartition=false]
+| +-left=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=c]
| | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
@@ -2490,9 +2490,9 @@ TopLevelPlan
type=Long NULL]
[Physical Plan]
TopLevelPlan
-+-plan=HashJoin
-| +-left=NestedLoopsJoin
-| | +-left=Aggregate
++-plan=HashJoin[has_repartition=false]
+| +-left=NestedLoopsJoin[has_repartition=false]
+| | +-left=Aggregate[has_repartition=false]
| | | +-input=TableReference[relation=c]
| | | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
@@ -2505,7 +2505,7 @@ TopLevelPlan
| | | +-Alias[id=4,name=,alias=$aggregate0,relation=$aggregate,type=Long NULL]
| | | +-AggregateFunction[function=SUM]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
-| | +-right=Aggregate
+| | +-right=Aggregate[has_repartition=false]
| | | +-input=TableReference[relation=a]
| | | | +-AttributeReference[id=5,name=w,relation=a,type=Int]
| | | | +-AttributeReference[id=6,name=x,relation=a,type=Int]
@@ -2606,12 +2606,12 @@ TopLevelPlan
alias=((x*SubqueryExpression)+SubqueryExpression),relation=,type=Double NULL]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
| +-left=TableReference[relation=b]
| | +-AttributeReference[id=0,name=w,relation=b,type=Int]
| | +-AttributeReference[id=1,name=x,relation=b,type=Int]
-| +-right=NestedLoopsJoin
-| | +-left=Aggregate
+| +-right=NestedLoopsJoin[has_repartition=false]
+| | +-left=Aggregate[has_repartition=false]
| | | +-input=TableReference[relation=c]
| | | | +-AttributeReference[id=2,name=x,relation=c,type=Int]
| | | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
@@ -2621,7 +2621,7 @@ TopLevelPlan
| | | +-Alias[id=4,name=,alias=$aggregate0,relation=$aggregate,type=Long NULL]
| | | +-AggregateFunction[function=SUM]
| | | +-AttributeReference[id=3,name=y,relation=c,type=Int]
-| | +-right=Aggregate
+| | +-right=Aggregate[has_repartition=false]
| | | +-input=TableReference[relation=d]
| | | | +-AttributeReference[id=5,name=y,relation=d,type=Int]
| | | | +-AttributeReference[id=6,name=z,relation=d,type=Int]
@@ -2712,12 +2712,12 @@ TopLevelPlan
type=Long NULL]
[Physical Plan]
TopLevelPlan
-+-plan=NestedLoopsJoin
-| +-left=NestedLoopsJoin
++-plan=NestedLoopsJoin[has_repartition=false]
+| +-left=NestedLoopsJoin[has_repartition=false]
| | +-left=TableReference[relation=b]
| | | +-AttributeReference[id=0,name=w,relation=b,type=Int]
| | | +-AttributeReference[id=1,name=x,relation=b,type=Int]
-| | +-right=Aggregate
+| | +-right=Aggregate[has_repartition=false]
| | | +-input=TableReference[relation=d]
| | | | +-AttributeReference[id=2,name=y,relation=d,type=Int]
| | | | +-AttributeReference[id=3,name=z,relation=d,type=Int]
@@ -2734,7 +2734,7 @@ TopLevelPlan
| | | type=Double NULL]
| | +-project_expressions=
| | +-AttributeReference[id=1,name=x,relation=b,type=Int]
-| +-right=Aggregate
+| +-right=Aggregate[has_repartition=false]
| | +-input=TableReference[relation=c]
| | | +-AttributeReference[id=5,name=x,relation=c,type=Int]
| | | +-AttributeReference[id=6,name=y,relation=c,type=Int]
@@ -2835,9 +2835,9 @@ TopLevelPlan
+-AttributeReference[id=6,name=y,relation=,type=Int]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=Sort[is_ascending=[true],nulls_first=[false]]
-| | +-input=HashJoin
+| | +-input=HashJoin[has_repartition=false]
| | | +-left=SharedSubplanReference[subplan_id=0]
| | | | +-referenced_attributes=
| | | | | +-AttributeReference[id=3,name=x,relation=,type=Int]
@@ -2845,7 +2845,7 @@ TopLevelPlan
| | | | +-output_attributes=
| | | | +-AttributeReference[id=5,name=x,relation=,type=Int]
| | | | +-AttributeReference[id=6,name=y,relation=,type=Int]
-| | | +-right=Aggregate
+| | | +-right=Aggregate[has_repartition=false]
| | | | +-input=SharedSubplanReference[subplan_id=0]
| | | | | +-referenced_attributes=
| | | | | | +-AttributeReference[id=3,name=x,relation=,type=Int]
@@ -2875,7 +2875,7 @@ TopLevelPlan
| +-AttributeReference[id=5,name=x,relation=,type=Int]
| +-AttributeReference[id=6,name=y,relation=,type=Int]
+-shared_subplans=
-| +-Selection
+| +-Selection[has_repartition=false]
| +-input=TableGenerator[function_name=generate_series,table_alias=g]
| | +-AttributeReference[id=0,name=generate_series,alias=g,
| | relation=generate_series,type=Int]
@@ -2934,7 +2934,7 @@ TopLevelPlan
+-AttributeReference[id=6,name=,alias=avg(int_col),relation=,type=Double NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=WindowAggregate
| | +-input=Sort[is_ascending=[true,false],nulls_first=[false,false]]
| | | +-input=TableReference[relation=Test,alias=test]
@@ -3018,7 +3018,7 @@ TopLevelPlan
type=Double NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=WindowAggregate
| | +-input=Sort[is_ascending=[true,true,false,true],
| | | nulls_first=[false,false,false,true]]
@@ -3113,8 +3113,8 @@ TopLevelPlan
type=Double NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
-| +-input=Aggregate
++-plan=Selection[has_repartition=false]
+| +-input=Aggregate[has_repartition=false]
| | +-input=WindowAggregate
| | | +-input=Sort[is_ascending=[true,true],nulls_first=[false,false]]
| | | | +-input=TableReference[relation=Test,alias=test]
@@ -3192,10 +3192,10 @@ TopLevelPlan
+-AttributeReference[id=12,name=int_col,relation=,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Aggregate
++-plan=Aggregate[has_repartition=false]
| +-input=UnionAll
| | +-operands=
-| | | +-Selection
+| | | +-Selection[has_repartition=false]
| | | | +-input=TableReference[relation=Test,alias=test]
| | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -3207,7 +3207,7 @@ TopLevelPlan
| | | | | type=VarChar(20) NULL]
| | | | +-project_expressions=
| | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
-| | | +-Selection
+| | | +-Selection[has_repartition=false]
| | | +-input=TableReference[relation=Test,alias=test]
| | | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -3278,10 +3278,10 @@ TopLevelPlan
+-AttributeReference[id=14,name=intv,relation=,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Selection
++-plan=Selection[has_repartition=false]
| +-input=UnionAll
| | +-operands=
-| | | +-Selection
+| | | +-Selection[has_repartition=false]
| | | | +-input=TableReference[relation=Test,alias=test]
| | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -3293,7 +3293,7 @@ TopLevelPlan
| | | | | type=VarChar(20) NULL]
| | | | +-project_expressions=
| | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
-| | | +-Selection
+| | | +-Selection[has_repartition=false]
| | | +-input=TableReference[relation=Test,alias=test]
| | | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -3384,8 +3384,8 @@ TopLevelPlan
+-AttributeReference[id=22,name=int_col,relation=,type=Int NULL]
[Physical Plan]
TopLevelPlan
-+-plan=Aggregate
-| +-input=HashLeftSemiJoin
++-plan=Aggregate[has_repartition=false]
+| +-input=HashLeftSemiJoin[has_repartition=false]
| | +-left=TableReference[relation=Test,alias=test]
| | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
| | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
@@ -3396,7 +3396,7 @@ TopLevelPlan
| | | type=VarChar(20) NULL]
| | +-right=UnionAll
| | | +-operands=
-| | | | +-Selection
+| | | | +-Selection[has_repartition=false]
| | | | | +-input=TableReference[relation=Test,alias=test]
| | | | | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
| | | | | | +-AttributeReference[id=7,name=long_col,relation=test,type=Long]
@@ -3408,7 +3408,7 @@ TopLevelPlan
| | | | | | type=VarChar(20) NULL]
| | | | | +-project_expressions=
| | | | | +-AttributeReference[id=6,name=int_col,relation=test,type=Int NULL]
-| | | | +-Selection
+| | | | +-Selection[has_repartition=false]
| | | | +-input=TableReference[relation=Test,alias=test]
| | | | | +-AttributeReference[id=12,name=int_col,relation=test,type=Int NULL]
| | | | | +-AttributeReference[id=13,name=long_col,relation=test,type=Long]
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/FinalizeAggregationOperator.hpp
----------------------------------------------------------------------
diff --git a/relational_operators/FinalizeAggregationOperator.hpp b/relational_operators/FinalizeAggregationOperator.hpp
index 382a7da..b344c13 100644
--- a/relational_operators/FinalizeAggregationOperator.hpp
+++ b/relational_operators/FinalizeAggregationOperator.hpp
@@ -61,6 +61,7 @@ class FinalizeAggregationOperator : public RelationalOperator {
* @param aggr_state_index The index of the AggregationState in QueryContext.
* @param num_partitions The number of partitions of 'input_relation' in a
* partitioned aggregation. If no partitions, it is one.
+ * @param has_repartition Whether this operator does repartition.
* @param output_relation The output relation.
* @param output_destination_index The index of the InsertDestination in the
* QueryContext to insert aggregation results.
@@ -69,10 +70,11 @@ class FinalizeAggregationOperator : public RelationalOperator {
const std::size_t query_id,
const QueryContext::aggregation_state_id aggr_state_index,
const std::size_t num_partitions,
+ const bool has_repartition,
const std::size_t aggr_state_num_partitions,
const CatalogRelation &output_relation,
const QueryContext::insert_destination_id output_destination_index)
- : RelationalOperator(query_id, num_partitions),
+ : RelationalOperator(query_id, num_partitions, has_repartition),
aggr_state_index_(aggr_state_index),
aggr_state_num_partitions_(aggr_state_num_partitions),
output_relation_(output_relation),
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/HashJoinOperator.hpp
----------------------------------------------------------------------
diff --git a/relational_operators/HashJoinOperator.hpp b/relational_operators/HashJoinOperator.hpp
index 519718c..a5e6eb4 100644
--- a/relational_operators/HashJoinOperator.hpp
+++ b/relational_operators/HashJoinOperator.hpp
@@ -104,6 +104,7 @@ class HashJoinOperator : public RelationalOperator {
* @param any_join_key_attributes_nullable If any attribute is nullable.
* @param num_partitions The number of partitions in 'probe_relation'.
* If no partitions, it is one.
+ * @param has_repartition Whether this operator does repartition.
* @param output_relation The output relation.
* @param output_destination_index The index of the InsertDestination in the
* QueryContext to insert the join results.
@@ -130,6 +131,7 @@ class HashJoinOperator : public RelationalOperator {
const std::vector<attribute_id> &join_key_attributes,
const bool any_join_key_attributes_nullable,
const std::size_t num_partitions,
+ const bool has_repartition,
const CatalogRelation &output_relation,
const QueryContext::insert_destination_id output_destination_index,
const QueryContext::join_hash_table_id hash_table_index,
@@ -137,7 +139,7 @@ class HashJoinOperator : public RelationalOperator {
const QueryContext::scalar_group_id selection_index,
const std::vector<bool> *is_selection_on_build = nullptr,
const JoinType join_type = JoinType::kInnerJoin)
- : RelationalOperator(query_id, num_partitions),
+ : RelationalOperator(query_id, num_partitions, has_repartition),
build_relation_(build_relation),
probe_relation_(probe_relation),
probe_relation_is_stored_(probe_relation_is_stored),
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/NestedLoopsJoinOperator.hpp
----------------------------------------------------------------------
diff --git a/relational_operators/NestedLoopsJoinOperator.hpp b/relational_operators/NestedLoopsJoinOperator.hpp
index 1b14638..777a737 100644
--- a/relational_operators/NestedLoopsJoinOperator.hpp
+++ b/relational_operators/NestedLoopsJoinOperator.hpp
@@ -74,6 +74,7 @@ class NestedLoopsJoinOperator : public RelationalOperator {
* @param right_input_relation The second relation in the join (order is not
* actually important).
* @param num_partitions The number of partitions.
+ * @param has_repartition Whether this operator does repartition.
* @param output_relation The output relation.
* @param output_destination_index The index of the InsertDestination in the
* QueryContext to insert the join results.
@@ -94,13 +95,14 @@ class NestedLoopsJoinOperator : public RelationalOperator {
const CatalogRelation &left_input_relation,
const CatalogRelation &right_input_relation,
const std::size_t num_partitions,
+ const bool has_repartition,
const CatalogRelation &output_relation,
const QueryContext::insert_destination_id output_destination_index,
const QueryContext::predicate_id join_predicate_index,
const QueryContext::scalar_group_id selection_index,
const bool left_relation_is_stored,
const bool right_relation_is_stored)
- : RelationalOperator(query_id, num_partitions),
+ : RelationalOperator(query_id, num_partitions, has_repartition),
nested_loops_join_index_(nested_loops_join_index),
left_input_relation_(left_input_relation),
right_input_relation_(right_input_relation),
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/RelationalOperator.hpp
----------------------------------------------------------------------
diff --git a/relational_operators/RelationalOperator.hpp b/relational_operators/RelationalOperator.hpp
index 29ae194..0541bbd 100644
--- a/relational_operators/RelationalOperator.hpp
+++ b/relational_operators/RelationalOperator.hpp
@@ -269,6 +269,15 @@ class RelationalOperator {
}
/**
+ * @brief Whether this operator does repartition.
+ *
+ * @return True if this node does repartition. Otherwise, false.
+ */
+ bool hasRepartition() const {
+ return has_repartition_;
+ }
+
+ /**
* @brief Deploy a group of LIPFilters to this operator.
*/
void deployLIPFilters(const QueryContext::lip_deployment_id lip_deployment_index,
@@ -284,16 +293,20 @@ class RelationalOperator {
* @param query_id The ID of the query to which this operator belongs.
* @param num_partitions The number of partitions of the input relation.
* If create table / index, return zero. If no partitions, return one.
+ * @param has_repartition Whether this operator does repartition.
**/
explicit RelationalOperator(const std::size_t query_id,
- const std::size_t num_partitions = 1u)
+ const std::size_t num_partitions = 1u,
+ const bool has_repartition = false)
: query_id_(query_id),
num_partitions_(num_partitions),
+ has_repartition_(has_repartition),
done_feeding_input_relation_(false),
lip_deployment_index_(QueryContext::kInvalidLIPDeploymentId) {}
const std::size_t query_id_;
const std::size_t num_partitions_;
+ const bool has_repartition_;
bool done_feeding_input_relation_;
std::size_t op_index_;
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/SelectOperator.hpp
----------------------------------------------------------------------
diff --git a/relational_operators/SelectOperator.hpp b/relational_operators/SelectOperator.hpp
index a71f4c1..71dcfca 100644
--- a/relational_operators/SelectOperator.hpp
+++ b/relational_operators/SelectOperator.hpp
@@ -74,6 +74,7 @@ class SelectOperator : public RelationalOperator {
*
* @param query_id The ID of the query to which this operator belongs.
* @param input_relation The relation to perform selection over.
+ * @param has_repartition Whether this operator does repartition.
* @param output_relation The output relation.
* @param output_destination_index The index of the InsertDestination in the
* QueryContext to insert the selection results.
@@ -89,12 +90,13 @@ class SelectOperator : public RelationalOperator {
SelectOperator(
const std::size_t query_id,
const CatalogRelation &input_relation,
+ const bool has_repartition,
const CatalogRelation &output_relation,
const QueryContext::insert_destination_id output_destination_index,
const QueryContext::predicate_id predicate_index,
const QueryContext::scalar_group_id selection_index,
const bool input_relation_is_stored)
- : RelationalOperator(query_id, input_relation.getNumPartitions()),
+ : RelationalOperator(query_id, input_relation.getNumPartitions(), has_repartition),
input_relation_(input_relation),
output_relation_(output_relation),
output_destination_index_(output_destination_index),
@@ -129,6 +131,7 @@ class SelectOperator : public RelationalOperator {
*
* @param query_id The ID of the query to which this operator belongs.
* @param input_relation The relation to perform selection over.
+ * @param has_repartition Whether this operator does repartition.
* @param output_relation The output relation.
* @param output_destination_index The index of the InsertDestination in the
* QueryContext to insert the selection results.
@@ -144,12 +147,13 @@ class SelectOperator : public RelationalOperator {
SelectOperator(
const std::size_t query_id,
const CatalogRelation &input_relation,
+ const bool has_repartition,
const CatalogRelation &output_relation,
const QueryContext::insert_destination_id output_destination_index,
const QueryContext::predicate_id predicate_index,
std::vector<attribute_id> &&selection,
const bool input_relation_is_stored)
- : RelationalOperator(query_id, input_relation.getNumPartitions()),
+ : RelationalOperator(query_id, input_relation.getNumPartitions(), has_repartition),
input_relation_(input_relation),
output_relation_(output_relation),
output_destination_index_(output_destination_index),
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/tests/AggregationOperator_unittest.cpp
----------------------------------------------------------------------
diff --git a/relational_operators/tests/AggregationOperator_unittest.cpp b/relational_operators/tests/AggregationOperator_unittest.cpp
index 4cda2d1..5c9cc7a 100644
--- a/relational_operators/tests/AggregationOperator_unittest.cpp
+++ b/relational_operators/tests/AggregationOperator_unittest.cpp
@@ -83,6 +83,7 @@ namespace {
constexpr std::size_t kQueryId = 0;
constexpr int kOpIndex = 0;
constexpr std::size_t kNumPartitions = 1u;
+constexpr bool kNoRepartition = false;
} // namespace
class Type;
@@ -293,6 +294,7 @@ class AggregationOperatorTest : public ::testing::Test {
new FinalizeAggregationOperator(kQueryId,
aggr_state_index,
kNumPartitions,
+ kNoRepartition,
kNumPartitions,
*result_table_,
insert_destination_index));
@@ -388,6 +390,7 @@ class AggregationOperatorTest : public ::testing::Test {
new FinalizeAggregationOperator(kQueryId,
aggr_state_index,
kNumPartitions,
+ kNoRepartition,
kNumPartitions,
*result_table_,
insert_destination_index));
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5f066fa4/relational_operators/tests/HashJoinOperator_unittest.cpp
----------------------------------------------------------------------
diff --git a/relational_operators/tests/HashJoinOperator_unittest.cpp b/relational_operators/tests/HashJoinOperator_unittest.cpp
index 89aafe5..1fc84fc 100644
--- a/relational_operators/tests/HashJoinOperator_unittest.cpp
+++ b/relational_operators/tests/HashJoinOperator_unittest.cpp
@@ -104,6 +104,9 @@ constexpr int kOpIndex = 0;
constexpr std::size_t kSinglePartition = 1;
constexpr std::size_t kMultiplePartitions = 4;
+const bool kHasRepartition = true;
+const bool kNoRepartition = false;
+
} // namespace
class HashJoinOperatorTest : public ::testing::TestWithParam<HashTableImplType> {
@@ -454,6 +457,7 @@ TEST_P(HashJoinOperatorTest, LongKeyHashJoinTest) {
std::vector<attribute_id>(1, fact_col_long.getID()),
fact_col_long.getType().isNullable(),
kSinglePartition,
+ kNoRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -604,6 +608,7 @@ TEST_P(HashJoinOperatorTest, IntDuplicateKeyHashJoinTest) {
std::vector<attribute_id>(1, fact_col_int.getID()),
fact_col_int.getType().isNullable(),
kSinglePartition,
+ kNoRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -763,6 +768,7 @@ TEST_P(HashJoinOperatorTest, CharKeyCartesianProductHashJoinTest) {
std::vector<attribute_id>(1, fact_col_char.getID()),
fact_col_char.getType().isNullable(),
kSinglePartition,
+ kNoRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -906,6 +912,7 @@ TEST_P(HashJoinOperatorTest, VarCharDuplicateKeyHashJoinTest) {
std::vector<attribute_id>(1, fact_col_varchar.getID()),
fact_col_varchar.getType().isNullable(),
kSinglePartition,
+ kNoRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -1085,6 +1092,7 @@ TEST_P(HashJoinOperatorTest, CompositeKeyHashJoinTest) {
fact_col_long.getType().isNullable() ||
fact_col_varchar.getType().isNullable(),
kSinglePartition,
+ kNoRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -1274,6 +1282,7 @@ TEST_P(HashJoinOperatorTest, CompositeKeyHashJoinWithResidualPredicateTest) {
fact_col_long.getType().isNullable() ||
fact_col_varchar.getType().isNullable(),
kSinglePartition,
+ kNoRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -1446,6 +1455,7 @@ TEST_P(HashJoinOperatorTest, SinlgeAttributePartitionedLongKeyHashJoinTest) {
{ fact_col_long.getID() },
fact_col_long.getType().isNullable(),
kMultiplePartitions,
+ kHasRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -1591,6 +1601,7 @@ TEST_P(HashJoinOperatorTest, SinlgeAttributePartitionedCompositeKeyHashJoinTest)
{ fact_col_long.getID(), fact_col_varchar.getID() },
fact_col_long.getType().isNullable() || fact_col_varchar.getType().isNullable(),
kMultiplePartitions,
+ kHasRepartition,
*result_table,
output_destination_index,
join_hash_table_index,
@@ -1771,6 +1782,7 @@ TEST_P(HashJoinOperatorTest, SinlgeAttributePartitionedCompositeKeyHashJoinWithR
{ fact_col_long.getID(), fact_col_varchar.getID() },
fact_col_long.getType().isNullable() || fact_col_varchar.getType().isNullable(),
kMultiplePartitions,
+ kHasRepartition,
*result_table,
output_destination_index,
join_hash_table_index,