Repository: incubator-quickstep Updated Branches: refs/heads/tpch-all-in-one 49ef7284a -> 27d43d54e
Updates Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/27d43d54 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/27d43d54 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/27d43d54 Branch: refs/heads/tpch-all-in-one Commit: 27d43d54ed0d4799b13d6513bc2cae97f7a558eb Parents: 49ef728 Author: Jianqiao Zhu <jianq...@cs.wisc.edu> Authored: Sun Jan 29 16:28:13 2017 -0600 Committer: Jianqiao Zhu <jianq...@cs.wisc.edu> Committed: Sun Jan 29 16:28:13 2017 -0600 ---------------------------------------------------------------------- query_optimizer/CMakeLists.txt | 1 + query_optimizer/ExecutionGenerator.cpp | 1 + query_optimizer/ExecutionGenerator.hpp | 2 + query_optimizer/PhysicalGenerator.cpp | 2 + query_optimizer/physical/HashJoin.hpp | 5 +- query_optimizer/rules/CMakeLists.txt | 15 ++ query_optimizer/rules/CoalesceLeftOuterJoin.cpp | 67 +++++++++ query_optimizer/rules/CoalesceLeftOuterJoin.hpp | 60 ++++++++ query_optimizer/rules/SwapProbeBuild.cpp | 5 +- query_optimizer/rules/SwapProbeBuild.hpp | 20 ++- relational_operators/CMakeLists.txt | 21 +++ .../CoalesceAggregationStateOperator.cpp | 69 +++++++++ .../CoalesceAggregationStateOperator.hpp | 146 +++++++++++++++++++ storage/AggregationOperationState.hpp | 1 + 14 files changed, 402 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt index 6091d2d..3b9f0c7 100644 --- a/query_optimizer/CMakeLists.txt +++ b/query_optimizer/CMakeLists.txt @@ -214,6 +214,7 @@ target_link_libraries(quickstep_queryoptimizer_PhysicalGenerator quickstep_queryoptimizer_logical_Logical quickstep_queryoptimizer_physical_Physical quickstep_queryoptimizer_rules_AttachLIPFilters + quickstep_queryoptimizer_rules_CoalesceLeftOuterJoin quickstep_queryoptimizer_rules_InjectJoinFilters quickstep_queryoptimizer_rules_PruneColumns quickstep_queryoptimizer_rules_PushDownLowCostDisjunctivePredicate http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/ExecutionGenerator.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp index a86b1f3..ce40141 100644 --- a/query_optimizer/ExecutionGenerator.cpp +++ b/query_optimizer/ExecutionGenerator.cpp @@ -96,6 +96,7 @@ #include "relational_operators/AggregationOperator.hpp" #include "relational_operators/BuildHashOperator.hpp" #include "relational_operators/BuildLIPFilterOperator.hpp" +#include "relational_operators/CoalesceAggregationStateOperator.hpp" #include "relational_operators/CreateIndexOperator.hpp" #include "relational_operators/CreateTableOperator.hpp" #include "relational_operators/DeleteOperator.hpp" http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/ExecutionGenerator.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/ExecutionGenerator.hpp b/query_optimizer/ExecutionGenerator.hpp index 36f3bd7..b940550 100644 --- a/query_optimizer/ExecutionGenerator.hpp +++ b/query_optimizer/ExecutionGenerator.hpp @@ -264,6 +264,8 @@ class ExecutionGenerator { */ void convertHashJoin(const physical::HashJoinPtr &physical_plan); +// void convertHashLeftOuterJoinCoalesceZero(const physical::HashJoinPtr &physical_plan); + /** * @brief Converts a NestedLoopsJoin to a NestedLoopsJoin operator. * http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/PhysicalGenerator.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/PhysicalGenerator.cpp b/query_optimizer/PhysicalGenerator.cpp index 3828be6..9517ed6 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/AttachLIPFilters.hpp" +#include "query_optimizer/rules/CoalesceLeftOuterJoin.hpp" #include "query_optimizer/rules/InjectJoinFilters.hpp" #include "query_optimizer/rules/PruneColumns.hpp" #include "query_optimizer/rules/PushDownLowCostDisjunctivePredicate.hpp" @@ -110,6 +111,7 @@ P::PhysicalPtr PhysicalGenerator::optimizePlan() { rules.emplace_back(new PruneColumns()); rules.emplace_back(new PushDownLowCostDisjunctivePredicate()); rules.emplace_back(new ReduceGroupByAttributes(optimizer_context_)); + rules.emplace_back(new CoalesceLeftOuterJoin()); if (FLAGS_reorder_hash_joins) { rules.emplace_back(new StarSchemaHashJoinOrderOptimization()); rules.emplace_back(new PruneColumns()); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/physical/HashJoin.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/HashJoin.hpp b/query_optimizer/physical/HashJoin.hpp index c513f77..5180d35 100644 --- a/query_optimizer/physical/HashJoin.hpp +++ b/query_optimizer/physical/HashJoin.hpp @@ -58,7 +58,8 @@ class HashJoin : public BinaryJoin { kInnerJoin = 0, kLeftSemiJoin, kLeftAntiJoin, - kLeftOuterJoin + kLeftOuterJoin, + kLeftOuterJoinCoalesceZero }; PhysicalType getPhysicalType() const override { return PhysicalType::kHashJoin; } @@ -73,6 +74,8 @@ class HashJoin : public BinaryJoin { return "HashLeftAntiJoin"; case JoinType::kLeftOuterJoin: return "HashLeftOuterJoin"; + case JoinType::kLeftOuterJoinCoalesceZero: + return "HashLeftOuterJoinCoalesceZero"; default: LOG(FATAL) << "Invalid JoinType: " << static_cast<typename std::underlying_type<JoinType>::type>(join_type_); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/rules/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/CMakeLists.txt b/query_optimizer/rules/CMakeLists.txt index 0994b68..2e64c7a 100644 --- a/query_optimizer/rules/CMakeLists.txt +++ b/query_optimizer/rules/CMakeLists.txt @@ -20,6 +20,9 @@ add_subdirectory(tests) # Declare micro-libs: add_library(quickstep_queryoptimizer_rules_AttachLIPFilters AttachLIPFilters.cpp AttachLIPFilters.hpp) add_library(quickstep_queryoptimizer_rules_BottomUpRule ../../empty_src.cpp BottomUpRule.hpp) +add_library(quickstep_queryoptimizer_rules_CoalesceLeftOuterJoin + CoalesceLeftOuterJoin.cpp + CoalesceLeftOuterJoin.hpp) add_library(quickstep_queryoptimizer_rules_CollapseProject CollapseProject.cpp CollapseProject.hpp) add_library(quickstep_queryoptimizer_rules_EliminateSemiAntiJoinResidualPredicate EliminateSemiAntiJoinResidualPredicate.cpp @@ -67,6 +70,17 @@ target_link_libraries(quickstep_queryoptimizer_rules_BottomUpRule glog quickstep_queryoptimizer_rules_Rule quickstep_utility_Macros) +target_link_libraries(quickstep_queryoptimizer_rules_CoalesceLeftOuterJoin + glog + quickstep_queryoptimizer_costmodel_StarSchemaSimpleCostModel + quickstep_queryoptimizer_expressions_AttributeReference + quickstep_queryoptimizer_physical_Aggregate + quickstep_queryoptimizer_physical_HashJoin + quickstep_queryoptimizer_physical_PatternMatcher + quickstep_queryoptimizer_physical_Physical + quickstep_queryoptimizer_physical_TopLevelPlan + quickstep_queryoptimizer_rules_BottomUpRule + quickstep_utility_Macros) target_link_libraries(quickstep_queryoptimizer_rules_CollapseProject glog quickstep_queryoptimizer_expressions_NamedExpression @@ -300,6 +314,7 @@ add_library(quickstep_queryoptimizer_rules ../../empty_src.cpp OptimizerRulesMod target_link_libraries(quickstep_queryoptimizer_rules quickstep_queryoptimizer_rules_AttachLIPFilters quickstep_queryoptimizer_rules_BottomUpRule + quickstep_queryoptimizer_rules_CoalesceLeftOuterJoin quickstep_queryoptimizer_rules_CollapseProject quickstep_queryoptimizer_rules_EliminateSemiAntiJoinResidualPredicate quickstep_queryoptimizer_rules_GenerateJoins http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/rules/CoalesceLeftOuterJoin.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/CoalesceLeftOuterJoin.cpp b/query_optimizer/rules/CoalesceLeftOuterJoin.cpp new file mode 100644 index 0000000..cbd27a4 --- /dev/null +++ b/query_optimizer/rules/CoalesceLeftOuterJoin.cpp @@ -0,0 +1,67 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + **/ + +#include "query_optimizer/rules/CoalesceLeftOuterJoin.hpp" + +#include <cstddef> +#include <memory> +#include <vector> + +#include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" +#include "query_optimizer/expressions/AttributeReference.hpp" +#include "query_optimizer/physical/Aggregate.hpp" +#include "query_optimizer/physical/HashJoin.hpp" +#include "query_optimizer/physical/PatternMatcher.hpp" +#include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/physical/TopLevelPlan.hpp" + +#include "glog/logging.h" + +namespace quickstep { +namespace optimizer { + +namespace P = ::quickstep::optimizer::physical; +namespace E = ::quickstep::optimizer::expressions; + +P::PhysicalPtr CoalesceLeftOuterJoin::applyToNode(const P::PhysicalPtr &input) { + P::AggregatePtr aggregate; + if (!P::SomeAggregate::MatchesWithConditionalCast(input, &aggregate)) { + return input; + } + + P::HashJoinPtr hash_join; + if (!P::SomeHashJoin::MatchesWithConditionalCast(aggregate->input(), &hash_join) || + hash_join->join_type() != P::HashJoin::JoinType::kLeftOuterJoin) { + return input; + } + + std::cout << "HERE!\n"; + std::cout << aggregate->toString() << "\n"; + + return input; +} + +void CoalesceLeftOuterJoin::init(const P::PhysicalPtr &input) { + DCHECK(input->getPhysicalType() == P::PhysicalType::kTopLevelPlan); + cost_model_.reset(new cost::StarSchemaSimpleCostModel( + std::static_pointer_cast<const P::TopLevelPlan>(input)->shared_subplans())); +} + +} // namespace optimizer +} // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/rules/CoalesceLeftOuterJoin.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/CoalesceLeftOuterJoin.hpp b/query_optimizer/rules/CoalesceLeftOuterJoin.hpp new file mode 100644 index 0000000..b3752b2 --- /dev/null +++ b/query_optimizer/rules/CoalesceLeftOuterJoin.hpp @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + **/ + +#ifndef QUICKSTEP_QUERY_OPTIMIZER_RULES_COALESCE_LEFT_OUTER_JOIN_HPP_ +#define QUICKSTEP_QUERY_OPTIMIZER_RULES_COALESCE_LEFT_OUTER_JOIN_HPP_ + +#include <memory> +#include <string> + +#include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" +#include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/rules/BottomUpRule.hpp" +#include "utility/Macros.hpp" + +namespace quickstep { +namespace optimizer { + +/** \addtogroup OptimizerRules + * @{ + */ + +class CoalesceLeftOuterJoin : public BottomUpRule<physical::Physical> { + public: + CoalesceLeftOuterJoin() { + } + + std::string getName() const override { + return "CoalesceLeftOuterJoin"; + } + + protected: + physical::PhysicalPtr applyToNode(const physical::PhysicalPtr &input) override; + void init(const physical::PhysicalPtr &input) override; + + private: + std::unique_ptr<cost::StarSchemaSimpleCostModel> cost_model_; + + DISALLOW_COPY_AND_ASSIGN(CoalesceLeftOuterJoin); +}; + +} // namespace optimizer +} // namespace quickstep + +#endif // QUICKSTEP_QUERY_OPTIMIZER_RULES_COALESCE_LEFT_OUTER_JOIN_HPP_ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/rules/SwapProbeBuild.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/SwapProbeBuild.cpp b/query_optimizer/rules/SwapProbeBuild.cpp index c51776b..501f740 100644 --- a/query_optimizer/rules/SwapProbeBuild.cpp +++ b/query_optimizer/rules/SwapProbeBuild.cpp @@ -35,6 +35,9 @@ namespace quickstep { namespace optimizer { +namespace P = ::quickstep::optimizer::physical; +namespace E = ::quickstep::optimizer::expressions; + P::PhysicalPtr SwapProbeBuild::applyToNode(const P::PhysicalPtr &input) { P::HashJoinPtr hash_join; @@ -65,7 +68,7 @@ P::PhysicalPtr SwapProbeBuild::applyToNode(const P::PhysicalPtr &input) { void SwapProbeBuild::init(const P::PhysicalPtr &input) { DCHECK(input->getPhysicalType() == P::PhysicalType::kTopLevelPlan); - cost_model_.reset(new C::SimpleCostModel( + cost_model_.reset(new cost::SimpleCostModel( std::static_pointer_cast<const P::TopLevelPlan>(input)->shared_subplans())); } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/query_optimizer/rules/SwapProbeBuild.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/SwapProbeBuild.hpp b/query_optimizer/rules/SwapProbeBuild.hpp index ad756fb..f50f6ec 100644 --- a/query_optimizer/rules/SwapProbeBuild.hpp +++ b/query_optimizer/rules/SwapProbeBuild.hpp @@ -36,27 +36,25 @@ namespace optimizer { * @{ */ -namespace P = ::quickstep::optimizer::physical; -namespace E = ::quickstep::optimizer::expressions; -namespace C = ::quickstep::optimizer::cost; - /** * @brief Rule that applies to a physical plan to arrange probe and * build side based on the cardinalities. */ -class SwapProbeBuild : public BottomUpRule<P::Physical> { +class SwapProbeBuild : public BottomUpRule<physical::Physical> { public: - SwapProbeBuild() { - } + /** + * @brief Constructor. + */ + SwapProbeBuild() {} std::string getName() const override { return "SwapProbeBuild"; } protected: - P::PhysicalPtr applyToNode(const P::PhysicalPtr &input) override; - void init(const P::PhysicalPtr &input) override; + physical::PhysicalPtr applyToNode(const physical::PhysicalPtr &input) override; + void init(const physical::PhysicalPtr &input) override; private: - std::unique_ptr<C::SimpleCostModel> cost_model_; + std::unique_ptr<cost::SimpleCostModel> cost_model_; DISALLOW_COPY_AND_ASSIGN(SwapProbeBuild); }; @@ -64,4 +62,4 @@ class SwapProbeBuild : public BottomUpRule<P::Physical> { } // namespace optimizer } // namespace quickstep -#endif +#endif // QUICKSTEP_QUERY_OPTIMIZER_RULES_SWAP_PROBE_BUILD_HPP_ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/relational_operators/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/relational_operators/CMakeLists.txt b/relational_operators/CMakeLists.txt index 82460dc..b68831f 100644 --- a/relational_operators/CMakeLists.txt +++ b/relational_operators/CMakeLists.txt @@ -39,6 +39,9 @@ endif() add_library(quickstep_relationaloperators_AggregationOperator AggregationOperator.cpp AggregationOperator.hpp) add_library(quickstep_relationaloperators_BuildHashOperator BuildHashOperator.cpp BuildHashOperator.hpp) add_library(quickstep_relationaloperators_BuildLIPFilterOperator BuildLIPFilterOperator.cpp BuildLIPFilterOperator.hpp) +add_library(quickstep_relationaloperators_CoalesceAggregationStateOperator + CoalesceAggregationStateOperator.cpp + CoalesceAggregationStateOperator.hpp) add_library(quickstep_relationaloperators_CreateIndexOperator CreateIndexOperator.cpp CreateIndexOperator.hpp) add_library(quickstep_relationaloperators_CreateTableOperator CreateTableOperator.cpp CreateTableOperator.hpp) add_library(quickstep_relationaloperators_DestroyAggregationStateOperator @@ -141,6 +144,24 @@ target_link_libraries(quickstep_relationaloperators_BuildLIPFilterOperator quickstep_utility_lipfilter_LIPFilterBuilder quickstep_utility_lipfilter_LIPFilterUtil tmb) +target_link_libraries(quickstep_relationaloperators_CoalesceAggregationStateOperator + glog + quickstep_catalog_CatalogRelation + quickstep_catalog_CatalogTypedefs + quickstep_queryexecution_QueryContext + quickstep_queryexecution_WorkOrderProtosContainer + quickstep_queryexecution_WorkOrdersContainer + quickstep_relationaloperators_RelationalOperator + quickstep_relationaloperators_WorkOrder + quickstep_relationaloperators_WorkOrder_proto + quickstep_storage_StorageBlock + quickstep_storage_StorageBlockInfo + quickstep_storage_StorageManager + quickstep_storage_TupleStorageSubBlock + quickstep_storage_ValueAccessor + quickstep_utility_ConcurrentBitVector + quickstep_utility_Macros + tmb) target_link_libraries(quickstep_relationaloperators_CreateIndexOperator glog quickstep_catalog_CatalogRelation http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/relational_operators/CoalesceAggregationStateOperator.cpp ---------------------------------------------------------------------- diff --git a/relational_operators/CoalesceAggregationStateOperator.cpp b/relational_operators/CoalesceAggregationStateOperator.cpp new file mode 100644 index 0000000..83c0755 --- /dev/null +++ b/relational_operators/CoalesceAggregationStateOperator.cpp @@ -0,0 +1,69 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + **/ + +//#include "relational_operators/InitializeAggregationStateOperator.hpp" +// +//#include <vector> +// +//#include "query_execution/QueryContext.hpp" +//#include "query_execution/WorkOrderProtosContainer.hpp" +//#include "query_execution/WorkOrdersContainer.hpp" +//#include "relational_operators/WorkOrder.pb.h" +//#include "storage/AggregationOperationState.hpp" +// +//#include "tmb/id_typedefs.h" +// +//namespace quickstep { +// +//bool InitializeAggregationStateOperator::getAllWorkOrders( +// WorkOrdersContainer *container, +// QueryContext *query_context, +// StorageManager *storage_manager, +// const tmb::client_id scheduler_client_id, +// tmb::MessageBus *bus) { +// if (!started_) { +// AggregationOperationState *agg_state = +// query_context->getAggregationState(aggr_state_index_); +// DCHECK(agg_state != nullptr); +// +// for (std::size_t partition_id = 0; +// partition_id < agg_state->getNumInitializePartitions(); +// ++partition_id) { +// container->addNormalWorkOrder( +// new InitializeAggregationStateWorkOrder( +// query_id_, +// partition_id, +// agg_state), +// op_index_); +// } +// started_ = true; +// } +// return started_; +//} +// +//bool InitializeAggregationStateOperator::getAllWorkOrderProtos(WorkOrderProtosContainer *container) { +// // TODO +// LOG(FATAL) << "Not implemented"; +//} +// +//void InitializeAggregationStateWorkOrder::execute() { +// state_->initializeState(partition_id_); +//} +// +//} // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/relational_operators/CoalesceAggregationStateOperator.hpp ---------------------------------------------------------------------- diff --git a/relational_operators/CoalesceAggregationStateOperator.hpp b/relational_operators/CoalesceAggregationStateOperator.hpp new file mode 100644 index 0000000..d19dab4 --- /dev/null +++ b/relational_operators/CoalesceAggregationStateOperator.hpp @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + **/ + +#ifndef QUICKSTEP_RELATIONAL_OPERATORS_COALESCE_AGGREGATION_STATE_OPERATOR_HPP_ +#define QUICKSTEP_RELATIONAL_OPERATORS_COALESCE_AGGREGATION_STATE_OPERATOR_HPP_ + +#include <string> + +#include "catalog/CatalogRelation.hpp" +#include "catalog/CatalogTypedefs.hpp" +#include "query_execution/QueryContext.hpp" +#include "relational_operators/RelationalOperator.hpp" +#include "relational_operators/WorkOrder.hpp" +#include "utility/Macros.hpp" + +#include "glog/logging.h" + +#include "tmb/id_typedefs.h" + +namespace tmb { class MessageBus; } + +namespace quickstep { + +class AggregationOperationState; +class CatalogRelationSchema; +class StorageManager; +class WorkOrderProtosContainer; +class WorkOrdersContainer; + +namespace serialization { class WorkOrder; } + +/** \addtogroup RelationalOperators + * @{ + */ + +class CoalesceAggregationStateOperator : public RelationalOperator { + public: + CoalesceAggregationStateOperator(const std::size_t query_id, + const CatalogRelation &input_relation, + const bool input_relation_is_stored, + const attribute_id key_attribute_id) + : RelationalOperator(query_id), + input_relation_(input_relation), + input_relation_is_stored_(input_relation_is_stored), + key_attribute_id_(key_attribute_id), + input_relation_block_ids_(input_relation_is_stored ? input_relation.getBlocksSnapshot() + : std::vector<block_id>()), + num_workorders_generated_(0), + started_(false) {} + + ~CoalesceAggregationStateOperator() override {} + + const CatalogRelation& input_relation() const { + return input_relation_; + } + + std::string getName() const override { + return "CoalesceAggregationStateOperator"; + } + + bool getAllWorkOrders(WorkOrdersContainer *container, + QueryContext *query_context, + StorageManager *storage_manager, + const tmb::client_id scheduler_client_id, + tmb::MessageBus *bus) override; + + bool getAllWorkOrderProtos(WorkOrderProtosContainer *container) override; + + void feedInputBlock(const block_id input_block_id, + const relation_id input_relation_id) override { + input_relation_block_ids_.push_back(input_block_id); + } + + void feedInputBlocks(const relation_id rel_id, + std::vector<block_id> *partially_filled_blocks) override { + input_relation_block_ids_.insert(input_relation_block_ids_.end(), + partially_filled_blocks->begin(), + partially_filled_blocks->end()); + } + + private: + const CatalogRelation &input_relation_; + const bool input_relation_is_stored_; + const attribute_id key_attribute_id_; + + std::vector<block_id> input_relation_block_ids_; + std::vector<block_id>::size_type num_workorders_generated_; + + bool started_; + + DISALLOW_COPY_AND_ASSIGN(CoalesceAggregationStateOperator); +}; + +class CoalesceAggregationStateWorkOrder : public WorkOrder { + public: + CoalesceAggregationStateWorkOrder(const std::size_t query_id, + const CatalogRelationSchema &input_relation, + const block_id build_block_id, + AggregationOperationState *state, + StorageManager *storage_manager) + : WorkOrder(query_id), + input_relation_(input_relation), + build_block_id_(build_block_id), + state_(DCHECK_NOTNULL(state)), + storage_manager_(DCHECK_NOTNULL(storage_manager)) {} + + ~CoalesceAggregationStateWorkOrder() override {} + + const CatalogRelationSchema& input_relation() const { + return input_relation_; + } + + void execute() override; + + private: + const CatalogRelationSchema &input_relation_; + const block_id build_block_id_; + + AggregationOperationState *state_; + + StorageManager *storage_manager_; + + DISALLOW_COPY_AND_ASSIGN(CoalesceAggregationStateWorkOrder); +}; + +/** @} */ + +} // namespace quickstep + +#endif // QUICKSTEP_RELATIONAL_OPERATORS_COALESCE_AGGREGATION_STATE_OPERATOR_HPP_ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/27d43d54/storage/AggregationOperationState.hpp ---------------------------------------------------------------------- diff --git a/storage/AggregationOperationState.hpp b/storage/AggregationOperationState.hpp index 233256c..17c5ea4 100644 --- a/storage/AggregationOperationState.hpp +++ b/storage/AggregationOperationState.hpp @@ -35,6 +35,7 @@ #include "storage/PartitionedHashTablePool.hpp" #include "storage/StorageBlock.hpp" #include "storage/StorageBlockInfo.hpp" +#include "utility/ConcurrentBitVector.hpp" #include "utility/Macros.hpp" #include "gflags/gflags.h"