Repository: incubator-quickstep Updated Branches: refs/heads/exact-filter 8b68fa53c -> b08b0ce4f
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/b08b0ce4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/b08b0ce4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/b08b0ce4 Branch: refs/heads/exact-filter Commit: b08b0ce4fbd4eddf8789ae15af0f85e55452a0d7 Parents: 8b68fa5 Author: Jianqiao Zhu <jianq...@cs.wisc.edu> Authored: Sat Oct 29 16:22:59 2016 -0500 Committer: Jianqiao Zhu <jianq...@cs.wisc.edu> Committed: Sat Oct 29 16:22:59 2016 -0500 ---------------------------------------------------------------------- cli/QuickstepCli.cpp | 6 - query_optimizer/CMakeLists.txt | 4 +- query_optimizer/ExecutionGenerator.cpp | 2 +- query_optimizer/ExecutionGenerator.hpp | 2 +- query_optimizer/PhysicalGenerator.cpp | 6 +- .../cost_model/StarSchemaSimpleCostModel.cpp | 3 +- query_optimizer/physical/CMakeLists.txt | 6 +- query_optimizer/physical/FilterInjection.cpp | 68 +++++++++ query_optimizer/physical/FilterInjection.hpp | 146 +++++++++++++++++++ query_optimizer/physical/FilterJoin.cpp | 98 ------------- query_optimizer/physical/FilterJoin.hpp | 134 ----------------- query_optimizer/physical/PatternMatcher.hpp | 4 +- query_optimizer/physical/PhysicalType.hpp | 2 +- query_optimizer/rules/CMakeLists.txt | 8 +- query_optimizer/rules/InjectJoinFilters.cpp | 122 ++++++++++++++++ query_optimizer/rules/InjectJoinFilters.hpp | 78 ++++++++++ query_optimizer/rules/TransformFilterJoins.cpp | 92 ------------ query_optimizer/rules/TransformFilterJoins.hpp | 73 ---------- utility/CMakeLists.txt | 1 + utility/PlanVisualizer.cpp | 16 ++ 20 files changed, 452 insertions(+), 419 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/cli/QuickstepCli.cpp ---------------------------------------------------------------------- diff --git a/cli/QuickstepCli.cpp b/cli/QuickstepCli.cpp index b89a0f3..8269197 100644 --- a/cli/QuickstepCli.cpp +++ b/cli/QuickstepCli.cpp @@ -84,7 +84,6 @@ typedef quickstep::LineReaderDumb LineReaderImpl; #include "gflags/gflags.h" #include "glog/logging.h" -#include "google/protobuf/text_format.h" #include "tmb/address.h" #include "tmb/id_typedefs.h" @@ -301,11 +300,6 @@ int main(int argc, char* argv[]) { LOG(FATAL) << "NON-STANDARD EXCEPTION DURING STARTUP"; } - std::string str; - google::protobuf::TextFormat::PrintToString( - query_processor->getDefaultDatabase()->getProto(), &str); - std::cerr << str << "\n"; - // Parse the CPU affinities for workers and the preloader thread, if enabled // to warm up the buffer pool. const vector<int> worker_cpu_affinities = http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt index 3211919..7fb4925 100644 --- a/query_optimizer/CMakeLists.txt +++ b/query_optimizer/CMakeLists.txt @@ -98,7 +98,7 @@ target_link_libraries(quickstep_queryoptimizer_ExecutionGenerator quickstep_queryoptimizer_physical_CreateTable quickstep_queryoptimizer_physical_DeleteTuples quickstep_queryoptimizer_physical_DropTable - quickstep_queryoptimizer_physical_FilterJoin + quickstep_queryoptimizer_physical_FilterInjection quickstep_queryoptimizer_physical_HashJoin quickstep_queryoptimizer_physical_InsertSelection quickstep_queryoptimizer_physical_InsertTuple @@ -209,10 +209,10 @@ target_link_libraries(quickstep_queryoptimizer_PhysicalGenerator quickstep_queryoptimizer_logical_Logical quickstep_queryoptimizer_physical_Physical quickstep_queryoptimizer_rules_AttachLIPFilters + quickstep_queryoptimizer_rules_InjectJoinFilters quickstep_queryoptimizer_rules_PruneColumns quickstep_queryoptimizer_rules_StarSchemaHashJoinOrderOptimization quickstep_queryoptimizer_rules_SwapProbeBuild - quickstep_queryoptimizer_rules_TransformFilterJoins quickstep_queryoptimizer_strategy_Aggregate quickstep_queryoptimizer_strategy_Join quickstep_queryoptimizer_strategy_OneToOne http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/ExecutionGenerator.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp index f97e448..a5c9ef3 100644 --- a/query_optimizer/ExecutionGenerator.cpp +++ b/query_optimizer/ExecutionGenerator.cpp @@ -74,7 +74,7 @@ #include "query_optimizer/physical/CreateTable.hpp" #include "query_optimizer/physical/DeleteTuples.hpp" #include "query_optimizer/physical/DropTable.hpp" -#include "query_optimizer/physical/FilterJoin.hpp" +#include "query_optimizer/physical/FilterInjection.hpp" #include "query_optimizer/physical/HashJoin.hpp" #include "query_optimizer/physical/InsertSelection.hpp" #include "query_optimizer/physical/InsertTuple.hpp" http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/ExecutionGenerator.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/ExecutionGenerator.hpp b/query_optimizer/ExecutionGenerator.hpp index 95608e7..9661eee 100644 --- a/query_optimizer/ExecutionGenerator.hpp +++ b/query_optimizer/ExecutionGenerator.hpp @@ -46,7 +46,7 @@ #include "query_optimizer/physical/CreateTable.hpp" #include "query_optimizer/physical/DeleteTuples.hpp" #include "query_optimizer/physical/DropTable.hpp" -#include "query_optimizer/physical/FilterJoin.hpp" +#include "query_optimizer/physical/FilterInjection.hpp" #include "query_optimizer/physical/HashJoin.hpp" #include "query_optimizer/physical/InsertSelection.hpp" #include "query_optimizer/physical/InsertTuple.hpp" http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/PhysicalGenerator.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/PhysicalGenerator.cpp b/query_optimizer/PhysicalGenerator.cpp index 6c792ac..b641bed 100644 --- a/query_optimizer/PhysicalGenerator.cpp +++ b/query_optimizer/PhysicalGenerator.cpp @@ -30,7 +30,7 @@ #include "query_optimizer/rules/PruneColumns.hpp" #include "query_optimizer/rules/StarSchemaHashJoinOrderOptimization.hpp" #include "query_optimizer/rules/SwapProbeBuild.hpp" -#include "query_optimizer/rules/TransformFilterJoins.hpp" +#include "query_optimizer/rules/InjectJoinFilters.hpp" #include "query_optimizer/strategy/Aggregate.hpp" #include "query_optimizer/strategy/Join.hpp" #include "query_optimizer/strategy/OneToOne.hpp" @@ -110,7 +110,8 @@ P::PhysicalPtr PhysicalGenerator::optimizePlan() { } else { rules.emplace_back(new SwapProbeBuild()); } - rules.emplace_back(new TransformFilterJoins()); + rules.emplace_back(new InjectJoinFilters()); + rules.emplace_back(new PruneColumns()); if (FLAGS_use_lip_filters) { rules.emplace_back(new AttachLIPFilters()); } @@ -127,6 +128,7 @@ P::PhysicalPtr PhysicalGenerator::optimizePlan() { quickstep::PlanVisualizer plan_visualizer; std::cerr << "\n" << plan_visualizer.visualize(physical_plan_) << "\n"; } + exit(0); #ifdef QUICKSTEP_DEBUG Validate(physical_plan_); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp b/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp index cba13ff..9231b36 100644 --- a/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp +++ b/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp @@ -97,7 +97,8 @@ std::size_t StarSchemaSimpleCostModel::estimateCardinality( return estimateCardinalityForWindowAggregate( std::static_pointer_cast<const P::WindowAggregate>(physical_plan)); default: - LOG(FATAL) << "Unsupported physical plan:" << physical_plan->toString(); + return 1u; +// LOG(FATAL) << "Unsupported physical plan:" << physical_plan->toString(); } } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/CMakeLists.txt b/query_optimizer/physical/CMakeLists.txt index 853333c..2ef60ce 100644 --- a/query_optimizer/physical/CMakeLists.txt +++ b/query_optimizer/physical/CMakeLists.txt @@ -23,7 +23,7 @@ add_library(quickstep_queryoptimizer_physical_CreateIndex CreateIndex.cpp Create add_library(quickstep_queryoptimizer_physical_CreateTable CreateTable.cpp CreateTable.hpp) add_library(quickstep_queryoptimizer_physical_DeleteTuples DeleteTuples.cpp DeleteTuples.hpp) add_library(quickstep_queryoptimizer_physical_DropTable DropTable.cpp DropTable.hpp) -add_library(quickstep_queryoptimizer_physical_FilterJoin FilterJoin.cpp FilterJoin.hpp) +add_library(quickstep_queryoptimizer_physical_FilterInjection FilterInjection.cpp FilterInjection.hpp) add_library(quickstep_queryoptimizer_physical_HashJoin HashJoin.cpp HashJoin.hpp) add_library(quickstep_queryoptimizer_physical_InsertSelection InsertSelection.cpp InsertSelection.hpp) add_library(quickstep_queryoptimizer_physical_InsertTuple InsertTuple.cpp InsertTuple.hpp) @@ -115,7 +115,7 @@ target_link_libraries(quickstep_queryoptimizer_physical_DropTable quickstep_queryoptimizer_physical_Physical quickstep_queryoptimizer_physical_PhysicalType quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_physical_FilterJoin +target_link_libraries(quickstep_queryoptimizer_physical_FilterInjection glog quickstep_queryoptimizer_OptimizerTree quickstep_queryoptimizer_expressions_AttributeReference @@ -294,7 +294,7 @@ target_link_libraries(quickstep_queryoptimizer_physical quickstep_queryoptimizer_physical_CreateTable quickstep_queryoptimizer_physical_DeleteTuples quickstep_queryoptimizer_physical_DropTable - quickstep_queryoptimizer_physical_FilterJoin + quickstep_queryoptimizer_physical_FilterInjection quickstep_queryoptimizer_physical_HashJoin quickstep_queryoptimizer_physical_InsertSelection quickstep_queryoptimizer_physical_InsertTuple http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/FilterInjection.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/FilterInjection.cpp b/query_optimizer/physical/FilterInjection.cpp new file mode 100644 index 0000000..5a35439 --- /dev/null +++ b/query_optimizer/physical/FilterInjection.cpp @@ -0,0 +1,68 @@ +/** + * 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/physical/FilterInjection.hpp" + +#include <string> +#include <vector> + +#include "query_optimizer/OptimizerTree.hpp" +#include "query_optimizer/expressions/AttributeReference.hpp" +#include "query_optimizer/expressions/ExpressionUtil.hpp" +#include "query_optimizer/expressions/NamedExpression.hpp" +#include "utility/Cast.hpp" + +namespace quickstep { +namespace optimizer { +namespace physical { + +namespace E = ::quickstep::optimizer::expressions; + +std::vector<E::AttributeReferencePtr> FilterInjection::getReferencedAttributes() const { + std::vector<E::AttributeReferencePtr> referenced_attributes; + referenced_attributes.insert(referenced_attributes.end(), + probe_attributes_.begin(), + probe_attributes_.end()); + referenced_attributes.insert(referenced_attributes.end(), + build_attributes_.begin(), + build_attributes_.end()); + return referenced_attributes; +} + +void FilterInjection::getFieldStringItems( + std::vector<std::string> *inline_field_names, + std::vector<std::string> *inline_field_values, + std::vector<std::string> *non_container_child_field_names, + std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields, + std::vector<std::string> *container_child_field_names, + std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const { + non_container_child_field_names->push_back("probe_child"); + non_container_child_fields->push_back(probe_child_); + non_container_child_field_names->push_back("build_child"); + non_container_child_fields->push_back(build_child_); + + container_child_field_names->push_back("probe_attributes"); + container_child_fields->push_back(CastSharedPtrVector<OptimizerTreeBase>(probe_attributes_)); + container_child_field_names->push_back("build_attributes"); + container_child_fields->push_back(CastSharedPtrVector<OptimizerTreeBase>(build_attributes_)); +} + +} // namespace physical +} // namespace optimizer +} // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/FilterInjection.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/FilterInjection.hpp b/query_optimizer/physical/FilterInjection.hpp new file mode 100644 index 0000000..1e3be57 --- /dev/null +++ b/query_optimizer/physical/FilterInjection.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_QUERY_OPTIMIZER_PHYSICAL_FILTER_INJECTION_HPP_ +#define QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_FILTER_INJECTION_HPP_ + +#include <cstddef> +#include <memory> +#include <string> +#include <type_traits> +#include <vector> + +#include "query_optimizer/OptimizerTree.hpp" +#include "query_optimizer/expressions/AttributeReference.hpp" +#include "query_optimizer/expressions/ExpressionUtil.hpp" +#include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/physical/PhysicalType.hpp" +#include "utility/Macros.hpp" + +#include "glog/logging.h" + +namespace quickstep { +namespace optimizer { +namespace physical { + +/** \addtogroup OptimizerPhysical + * @{ + */ + +class FilterInjection; +typedef std::shared_ptr<const FilterInjection> FilterInjectionPtr; + +/** + * @brief Physical filter injection node. + */ +class FilterInjection : public Physical { + public: + PhysicalType getPhysicalType() const override { return PhysicalType::kFilterInjection; } + + std::string getName() const override { + return "FilterInjection"; + } + + const PhysicalPtr& probe_child() const { + return probe_child_; + } + + const PhysicalPtr& build_child() const { + return build_child_; + } + + const std::vector<expressions::AttributeReferencePtr>& probe_attributes() const { + return probe_attributes_; + } + + const std::vector<expressions::AttributeReferencePtr>& build_attributes() const { + return build_attributes_; + } + + std::vector<expressions::AttributeReferencePtr> getOutputAttributes() const override { + return {}; + } + + PhysicalPtr copyWithNewChildren( + const std::vector<PhysicalPtr> &new_children) const override { + DCHECK_EQ(children().size(), new_children.size()); + return Create(new_children[0], + new_children[1], + probe_attributes_, + build_attributes_); + } + + std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override; + + bool maybeCopyWithPrunedExpressions( + const expressions::UnorderedNamedExpressionSet &referenced_expressions, + PhysicalPtr *output) const override { + return false; + } + + static FilterInjectionPtr Create( + const PhysicalPtr &probe_child, + const PhysicalPtr &build_child, + const std::vector<expressions::AttributeReferencePtr> &probe_attributes, + const std::vector<expressions::AttributeReferencePtr> &build_attributes) { + return FilterInjectionPtr( + new FilterInjection(probe_child, + build_child, + probe_attributes, + build_attributes)); + } + + protected: + void getFieldStringItems( + std::vector<std::string> *inline_field_names, + std::vector<std::string> *inline_field_values, + std::vector<std::string> *non_container_child_field_names, + std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields, + std::vector<std::string> *container_child_field_names, + std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const override; + + private: + FilterInjection( + const PhysicalPtr &probe_child, + const PhysicalPtr &build_child, + const std::vector<expressions::AttributeReferencePtr> &probe_attributes, + const std::vector<expressions::AttributeReferencePtr> &build_attributes) + : probe_child_(probe_child), + build_child_(build_child), + probe_attributes_(probe_attributes), + build_attributes_(build_attributes) { + addChild(probe_child_); + addChild(build_child_); + } + + PhysicalPtr probe_child_; + PhysicalPtr build_child_; + std::vector<expressions::AttributeReferencePtr> probe_attributes_; + std::vector<expressions::AttributeReferencePtr> build_attributes_; + + DISALLOW_COPY_AND_ASSIGN(FilterInjection); +}; + +/** @} */ + +} // namespace physical +} // namespace optimizer +} // namespace quickstep + +#endif // QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_FILTER_INJECTION_HPP_ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/FilterJoin.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/FilterJoin.cpp b/query_optimizer/physical/FilterJoin.cpp deleted file mode 100644 index 0ec3968..0000000 --- a/query_optimizer/physical/FilterJoin.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * 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/physical/FilterJoin.hpp" - -#include <string> -#include <vector> - -#include "query_optimizer/OptimizerTree.hpp" -#include "query_optimizer/expressions/AttributeReference.hpp" -#include "query_optimizer/expressions/ExpressionUtil.hpp" -#include "query_optimizer/expressions/NamedExpression.hpp" -#include "query_optimizer/expressions/Predicate.hpp" -#include "utility/Cast.hpp" - -namespace quickstep { -namespace optimizer { -namespace physical { - -namespace E = ::quickstep::optimizer::expressions; - -std::vector<E::AttributeReferencePtr> FilterJoin::getReferencedAttributes() const { - std::vector<E::AttributeReferencePtr> referenced_attributes; - for (const auto &project_expression : project_expressions()) { - const std::vector<E::AttributeReferencePtr> referenced_attributes_in_expression = - project_expression->getReferencedAttributes(); - referenced_attributes.insert(referenced_attributes.end(), - referenced_attributes_in_expression.begin(), - referenced_attributes_in_expression.end()); - } - referenced_attributes.insert(referenced_attributes.end(), - probe_join_attributes_.begin(), - probe_join_attributes_.end()); - referenced_attributes.insert(referenced_attributes.end(), - build_join_attributes_.begin(), - build_join_attributes_.end()); - return referenced_attributes; -} - -bool FilterJoin::maybeCopyWithPrunedExpressions( - const E::UnorderedNamedExpressionSet &referenced_expressions, - PhysicalPtr *output) const { - std::vector<E::NamedExpressionPtr> new_project_expressions; - const auto ¤t_project_expressions = project_expressions(); - for (const auto &project_expression : current_project_expressions) { - if (referenced_expressions.find(project_expression) != referenced_expressions.end()) { - new_project_expressions.emplace_back(project_expression); - } - } - if (new_project_expressions.size() != current_project_expressions.size()) { - *output = Create(left(), - right(), - probe_join_attributes_, - build_join_attributes_, - new_project_expressions); - return true; - } - return false; -} - -void FilterJoin::getFieldStringItems( - std::vector<std::string> *inline_field_names, - std::vector<std::string> *inline_field_values, - std::vector<std::string> *non_container_child_field_names, - std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields, - std::vector<std::string> *container_child_field_names, - std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const { - BinaryJoin::getFieldStringItems(inline_field_names, - inline_field_values, - non_container_child_field_names, - non_container_child_fields, - container_child_field_names, - container_child_fields); - container_child_field_names->push_back("probe_join_attributes"); - container_child_fields->push_back(CastSharedPtrVector<OptimizerTreeBase>(probe_join_attributes_)); - container_child_field_names->push_back("build_join_attributes"); - container_child_fields->push_back(CastSharedPtrVector<OptimizerTreeBase>(build_join_attributes_)); -} - -} // namespace physical -} // namespace optimizer -} // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/FilterJoin.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/FilterJoin.hpp b/query_optimizer/physical/FilterJoin.hpp deleted file mode 100644 index 281b072..0000000 --- a/query_optimizer/physical/FilterJoin.hpp +++ /dev/null @@ -1,134 +0,0 @@ -/** - * 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_PHYSICAL_FILTER_JOIN_HPP_ -#define QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_FILTER_JOIN_HPP_ - -#include <cstddef> -#include <memory> -#include <string> -#include <type_traits> -#include <vector> - -#include "query_optimizer/OptimizerTree.hpp" -#include "query_optimizer/expressions/AttributeReference.hpp" -#include "query_optimizer/expressions/ExpressionUtil.hpp" -#include "query_optimizer/expressions/NamedExpression.hpp" -#include "query_optimizer/expressions/Predicate.hpp" -#include "query_optimizer/physical/BinaryJoin.hpp" -#include "query_optimizer/physical/Physical.hpp" -#include "query_optimizer/physical/PhysicalType.hpp" -#include "utility/Macros.hpp" - -#include "glog/logging.h" - -namespace quickstep { -namespace optimizer { -namespace physical { - -/** \addtogroup OptimizerPhysical - * @{ - */ - -class FilterJoin; -typedef std::shared_ptr<const FilterJoin> FilterJoinPtr; - -/** - * @brief Physical filter join node. - */ -class FilterJoin : public BinaryJoin { - public: - PhysicalType getPhysicalType() const override { return PhysicalType::kFilterJoin; } - - std::string getName() const override { - return "FilterJoin"; - } - - const std::vector<expressions::AttributeReferencePtr>& probe_join_attributes() const { - return probe_join_attributes_; - } - - const std::vector<expressions::AttributeReferencePtr>& build_join_attributes() const { - return build_join_attributes_; - } - - PhysicalPtr copyWithNewChildren( - const std::vector<PhysicalPtr> &new_children) const override { - DCHECK_EQ(children().size(), new_children.size()); - return Create(new_children[0], - new_children[1], - probe_join_attributes_, - build_join_attributes_, - project_expressions()); - } - - std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override; - - bool maybeCopyWithPrunedExpressions( - const expressions::UnorderedNamedExpressionSet &referenced_expressions, - PhysicalPtr *output) const override; - - static FilterJoinPtr Create( - const PhysicalPtr &probe_child, - const PhysicalPtr &build_child, - const std::vector<expressions::AttributeReferencePtr> &probe_join_attributes, - const std::vector<expressions::AttributeReferencePtr> &build_join_attributes, - const std::vector<expressions::NamedExpressionPtr> &project_expressions) { - return FilterJoinPtr( - new FilterJoin(probe_child, - build_child, - probe_join_attributes, - build_join_attributes, - project_expressions)); - } - - protected: - void getFieldStringItems( - std::vector<std::string> *inline_field_names, - std::vector<std::string> *inline_field_values, - std::vector<std::string> *non_container_child_field_names, - std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields, - std::vector<std::string> *container_child_field_names, - std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const override; - - private: - FilterJoin( - const PhysicalPtr &probe_child, - const PhysicalPtr &build_child, - const std::vector<expressions::AttributeReferencePtr> &probe_join_attributes, - const std::vector<expressions::AttributeReferencePtr> &build_join_attributes, - const std::vector<expressions::NamedExpressionPtr> &project_expressions) - : BinaryJoin(probe_child, build_child, project_expressions), - probe_join_attributes_(probe_join_attributes), - build_join_attributes_(build_join_attributes) { - } - - std::vector<expressions::AttributeReferencePtr> probe_join_attributes_; - std::vector<expressions::AttributeReferencePtr> build_join_attributes_; - - DISALLOW_COPY_AND_ASSIGN(FilterJoin); -}; - -/** @} */ - -} // namespace physical -} // namespace optimizer -} // namespace quickstep - -#endif /* QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_FILTER_JOIN_HPP_ */ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/PatternMatcher.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/PatternMatcher.hpp b/query_optimizer/physical/PatternMatcher.hpp index 4336767..c675cdb 100644 --- a/query_optimizer/physical/PatternMatcher.hpp +++ b/query_optimizer/physical/PatternMatcher.hpp @@ -35,7 +35,7 @@ class CopyFrom; class CreateTable; class DeleteTuples; class DropTable; -class FilterJoin; +class FilterInjection; class HashJoin; class InsertTuple; class Join; @@ -114,7 +114,7 @@ using SomeCopyFrom = SomePhysicalNode<CopyFrom, PhysicalType::kCopyFrom>; using SomeCreateTable = SomePhysicalNode<CreateTable, PhysicalType::kCreateTable>; using SomeDeleteTuples = SomePhysicalNode<DeleteTuples, PhysicalType::kDeleteTuples>; using SomeDropTable = SomePhysicalNode<DropTable, PhysicalType::kDropTable>; -using SomeFilterJoin = SomePhysicalNode<FilterJoin, PhysicalType::kFilterJoin>; +using SomeFilterInjection = SomePhysicalNode<FilterInjection, PhysicalType::kFilterInjection>; using SomeHashJoin = SomePhysicalNode<HashJoin, PhysicalType::kHashJoin>; using SomeInsertTuple = SomePhysicalNode<InsertTuple, PhysicalType::kInsertTuple>; using SomeJoin = SomePhysicalNode<Join, PhysicalType::kHashJoin, PhysicalType::kNestedLoopsJoin>; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/physical/PhysicalType.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/PhysicalType.hpp b/query_optimizer/physical/PhysicalType.hpp index 1da5929..bcf7d22 100644 --- a/query_optimizer/physical/PhysicalType.hpp +++ b/query_optimizer/physical/PhysicalType.hpp @@ -38,7 +38,7 @@ enum class PhysicalType { kCreateTable, kDeleteTuples, kDropTable, - kFilterJoin, + kFilterInjection, kHashJoin, kInsertSelection, kInsertTuple, http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/rules/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/CMakeLists.txt b/query_optimizer/rules/CMakeLists.txt index 1d5b103..316e257 100644 --- a/query_optimizer/rules/CMakeLists.txt +++ b/query_optimizer/rules/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(quickstep_queryoptimizer_rules_AttachLIPFilters AttachLIPFilters.cpp add_library(quickstep_queryoptimizer_rules_BottomUpRule ../../empty_src.cpp BottomUpRule.hpp) add_library(quickstep_queryoptimizer_rules_CollapseProject CollapseProject.cpp CollapseProject.hpp) add_library(quickstep_queryoptimizer_rules_GenerateJoins GenerateJoins.cpp GenerateJoins.hpp) +add_library(quickstep_queryoptimizer_rules_InjectJoinFilters InjectJoinFilters.cpp InjectJoinFilters.hpp) add_library(quickstep_queryoptimizer_rules_PruneColumns PruneColumns.cpp PruneColumns.hpp) add_library(quickstep_queryoptimizer_rules_PushDownFilter PushDownFilter.cpp PushDownFilter.hpp) add_library(quickstep_queryoptimizer_rules_PushDownSemiAntiJoin PushDownSemiAntiJoin.cpp PushDownSemiAntiJoin.hpp) @@ -32,7 +33,6 @@ add_library(quickstep_queryoptimizer_rules_StarSchemaHashJoinOrderOptimization StarSchemaHashJoinOrderOptimization.hpp) add_library(quickstep_queryoptimizer_rules_SwapProbeBuild SwapProbeBuild.cpp SwapProbeBuild.hpp) add_library(quickstep_queryoptimizer_rules_TopDownRule ../../empty_src.cpp TopDownRule.hpp) -add_library(quickstep_queryoptimizer_rules_TransformFilterJoins TransformFilterJoins.cpp TransformFilterJoins.hpp) add_library(quickstep_queryoptimizer_rules_UpdateExpression UpdateExpression.cpp UpdateExpression.hpp) add_library(quickstep_queryoptimizer_rules_UnnestSubqueries UnnestSubqueries.cpp UnnestSubqueries.hpp) @@ -161,11 +161,13 @@ target_link_libraries(quickstep_queryoptimizer_rules_SwapProbeBuild target_link_libraries(quickstep_queryoptimizer_rules_TopDownRule quickstep_queryoptimizer_rules_Rule quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_rules_TransformFilterJoins +target_link_libraries(quickstep_queryoptimizer_rules_InjectJoinFilters quickstep_queryoptimizer_costmodel_StarSchemaSimpleCostModel quickstep_queryoptimizer_expressions_AttributeReference quickstep_queryoptimizer_expressions_ExprId + quickstep_queryoptimizer_expressions_ExpressionUtil quickstep_queryoptimizer_physical_Aggregate + quickstep_queryoptimizer_physical_FilterInjection quickstep_queryoptimizer_physical_HashJoin quickstep_queryoptimizer_physical_LIPFilterConfiguration quickstep_queryoptimizer_physical_PatternMatcher @@ -227,6 +229,7 @@ target_link_libraries(quickstep_queryoptimizer_rules quickstep_queryoptimizer_rules_BottomUpRule quickstep_queryoptimizer_rules_CollapseProject quickstep_queryoptimizer_rules_GenerateJoins + quickstep_queryoptimizer_rules_InjectJoinFilters quickstep_queryoptimizer_rules_PruneColumns quickstep_queryoptimizer_rules_PushDownFilter quickstep_queryoptimizer_rules_PushDownSemiAntiJoin @@ -235,6 +238,5 @@ target_link_libraries(quickstep_queryoptimizer_rules quickstep_queryoptimizer_rules_StarSchemaHashJoinOrderOptimization quickstep_queryoptimizer_rules_SwapProbeBuild quickstep_queryoptimizer_rules_TopDownRule - quickstep_queryoptimizer_rules_TransformFilterJoins quickstep_queryoptimizer_rules_UpdateExpression quickstep_queryoptimizer_rules_UnnestSubqueries) http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/rules/InjectJoinFilters.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/InjectJoinFilters.cpp b/query_optimizer/rules/InjectJoinFilters.cpp new file mode 100644 index 0000000..0643a87 --- /dev/null +++ b/query_optimizer/rules/InjectJoinFilters.cpp @@ -0,0 +1,122 @@ +/** + * 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/InjectJoinFilters.hpp" + +#include <map> +#include <set> +#include <unordered_set> +#include <unordered_map> +#include <vector> +#include <utility> + +#include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" +#include "query_optimizer/expressions/AttributeReference.hpp" +#include "query_optimizer/expressions/ExpressionUtil.hpp" +#include "query_optimizer/physical/LIPFilterConfiguration.hpp" +#include "query_optimizer/physical/Aggregate.hpp" +#include "query_optimizer/physical/FilterInjection.hpp" +#include "query_optimizer/physical/HashJoin.hpp" +#include "query_optimizer/physical/PatternMatcher.hpp" +#include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/physical/PhysicalType.hpp" +#include "query_optimizer/physical/Selection.hpp" +#include "query_optimizer/physical/TopLevelPlan.hpp" +#include "types/TypedValue.hpp" +#include "utility/lip_filter/LIPFilter.hpp" + +#include "glog/logging.h" + +namespace quickstep { +namespace optimizer { + +namespace E = ::quickstep::optimizer::expressions; +namespace P = ::quickstep::optimizer::physical; + +P::PhysicalPtr InjectJoinFilters::apply(const P::PhysicalPtr &input) { + DCHECK(input->getPhysicalType() == P::PhysicalType::kTopLevelPlan); + + P::TopLevelPlanPtr top_level_plan = + std::static_pointer_cast<const P::TopLevelPlan>(input); + cost_model_.reset( + new cost::StarSchemaSimpleCostModel( + top_level_plan->shared_subplans())); + + P::PhysicalPtr output = extractFilters(input); + DCHECK(output->getPhysicalType() == P::PhysicalType::kTopLevelPlan); + + top_level_plan = std::static_pointer_cast<const P::TopLevelPlan>(output); + std::vector<P::PhysicalPtr> new_shared_subplans( + top_level_plan->shared_subplans()); + new_shared_subplans.insert( + new_shared_subplans.end(), filters_.begin(), filters_.end()); + + return P::TopLevelPlan::Create(top_level_plan->plan(), new_shared_subplans); +} + +bool InjectJoinFilters::isTransformable( + const physical::HashJoinPtr &hash_join) const { + if (hash_join->residual_predicate() != nullptr) { + return false; + } + if (!E::SubsetOfExpressions(hash_join->getOutputAttributes(), + hash_join->left()->getOutputAttributes())) { + return false; + } + if (hash_join->join_type() == P::HashJoin::JoinType::kInnerJoin) { + return cost_model_->impliesUniqueAttributes( + hash_join->right(), hash_join->right_join_attributes()); + } + if (hash_join->join_type() == P::HashJoin::JoinType::kLeftSemiJoin) { + return true; + } + return false; +} + +P::PhysicalPtr InjectJoinFilters::extractFilters(const P::PhysicalPtr &input) { + std::vector<P::PhysicalPtr> new_children; + bool has_changed_children = false; + for (const P::PhysicalPtr &child : input->children()) { + P::PhysicalPtr new_child = extractFilters(child); + if (child != new_child && !has_changed_children) { + has_changed_children = true; + } + new_children.push_back(new_child); + } + + P::HashJoinPtr hash_join; + if (P::SomeHashJoin::MatchesWithConditionalCast(input, &hash_join) && + isTransformable(hash_join)) { + filters_.emplace_back( + P::FilterInjection::Create(new_children[0], + new_children[1], + hash_join->left_join_attributes(), + hash_join->right_join_attributes())); + return new_children[0]; + } + + if (has_changed_children) { + return input->copyWithNewChildren(new_children); + } else { + return input; + } +} + +} // namespace optimizer +} // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/rules/InjectJoinFilters.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/InjectJoinFilters.hpp b/query_optimizer/rules/InjectJoinFilters.hpp new file mode 100644 index 0000000..a08ee13 --- /dev/null +++ b/query_optimizer/rules/InjectJoinFilters.hpp @@ -0,0 +1,78 @@ +/** + * 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_INJECT_JOIN_FILTERS_HPP_ +#define QUICKSTEP_QUERY_OPTIMIZER_RULES_INJECT_JOIN_FILTERS_HPP_ + +#include <cstddef> +#include <map> +#include <memory> +#include <set> +#include <string> +#include <vector> + +#include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" +#include "query_optimizer/expressions/AttributeReference.hpp" +#include "query_optimizer/expressions/ExprId.hpp" +#include "query_optimizer/physical/LIPFilterConfiguration.hpp" +#include "query_optimizer/physical/FilterInjection.hpp" +#include "query_optimizer/physical/HashJoin.hpp" +#include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/rules/Rule.hpp" +#include "utility/Macros.hpp" + +namespace quickstep { +namespace optimizer { + +/** \addtogroup OptimizerRules + * @{ + */ + +class InjectJoinFilters : public Rule<physical::Physical> { + public: + /** + * @brief Constructor. + */ + InjectJoinFilters() {} + + ~InjectJoinFilters() override {} + + std::string getName() const override { + return "TransformFilterJoins"; + } + + physical::PhysicalPtr apply(const physical::PhysicalPtr &input) override; + + private: + bool isTransformable(const physical::HashJoinPtr &hash_join) const; + + physical::PhysicalPtr extractFilters(const physical::PhysicalPtr &input); + + std::unique_ptr<cost::StarSchemaSimpleCostModel> cost_model_; + std::vector<physical::FilterInjectionPtr> filters_; + + DISALLOW_COPY_AND_ASSIGN(InjectJoinFilters); +}; + +/** @} */ + +} // namespace optimizer +} // namespace quickstep + +#endif // QUICKSTEP_QUERY_OPTIMIZER_RULES_INJECT_JOIN_FILTERS_HPP_ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/rules/TransformFilterJoins.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/TransformFilterJoins.cpp b/query_optimizer/rules/TransformFilterJoins.cpp deleted file mode 100644 index 706df69..0000000 --- a/query_optimizer/rules/TransformFilterJoins.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/** - * 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/TransformFilterJoins.hpp" - -#include <map> -#include <set> -#include <unordered_set> -#include <unordered_map> -#include <vector> -#include <utility> - -#include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" -#include "query_optimizer/expressions/AttributeReference.hpp" -#include "query_optimizer/physical/LIPFilterConfiguration.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/PhysicalType.hpp" -#include "query_optimizer/physical/Selection.hpp" -#include "query_optimizer/physical/TopLevelPlan.hpp" -#include "types/TypedValue.hpp" -#include "utility/lip_filter/LIPFilter.hpp" - -#include "glog/logging.h" - -namespace quickstep { -namespace optimizer { - -namespace E = ::quickstep::optimizer::expressions; -namespace P = ::quickstep::optimizer::physical; - -P::PhysicalPtr TransformFilterJoins::apply(const P::PhysicalPtr &input) { - DCHECK(input->getPhysicalType() == P::PhysicalType::kTopLevelPlan); - - const P::TopLevelPlanPtr top_level_plan = - std::static_pointer_cast<const P::TopLevelPlan>(input); - cost_model_.reset( - new cost::StarSchemaSimpleCostModel( - top_level_plan->shared_subplans())); - - P::PhysicalPtr output = applyTransform(input); - return output; -} - -P::PhysicalPtr TransformFilterJoins::applyTransform(const P::PhysicalPtr &input) { -// std::vector<P::PhysicalPtr> new_children; -// bool has_changed_children = false; -// for (const P::PhysicalPtr &child : input->children()) { -// P::PhysicalPtr new_child = applyTransform(child); -// if (child != new_child && !has_changed_children) { -// has_changed_children = true; -// } -// new_children.push_back(new_child); -// } -// -// P::HashJoinPtr hash_join; -// if (P::SomeHashJoin::MatchesWithConditionalCast(input, &hash_join)) { -// // TODO(jianqiao): check for other cases -// if (hash_join->join_type() == P::HashJoin::JoinType::kLeftSemiJoin) { -// -// -// } -// } -// -// if (has_changed_children) { -// return applyToNode(tree->copyWithNewChildren(new_children)); -// } else { -// return applyToNode(tree); -// } - return input; -} - -} // namespace optimizer -} // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/query_optimizer/rules/TransformFilterJoins.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/TransformFilterJoins.hpp b/query_optimizer/rules/TransformFilterJoins.hpp deleted file mode 100644 index 2a19203..0000000 --- a/query_optimizer/rules/TransformFilterJoins.hpp +++ /dev/null @@ -1,73 +0,0 @@ -/** - * 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_TRANSFORM_FILTER_JOINS_HPP_ -#define QUICKSTEP_QUERY_OPTIMIZER_RULES_TRANSFORM_FILTER_JOINS_HPP_ - -#include <cstddef> -#include <map> -#include <memory> -#include <set> -#include <string> -#include <vector> - -#include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" -#include "query_optimizer/expressions/AttributeReference.hpp" -#include "query_optimizer/expressions/ExprId.hpp" -#include "query_optimizer/physical/LIPFilterConfiguration.hpp" -#include "query_optimizer/physical/Physical.hpp" -#include "query_optimizer/rules/Rule.hpp" -#include "utility/Macros.hpp" - -namespace quickstep { -namespace optimizer { - -/** \addtogroup OptimizerRules - * @{ - */ - -class TransformFilterJoins : public Rule<physical::Physical> { - public: - /** - * @brief Constructor. - */ - TransformFilterJoins() {} - - ~TransformFilterJoins() override {} - - std::string getName() const override { - return "TransformFilterJoins"; - } - - physical::PhysicalPtr apply(const physical::PhysicalPtr &input) override; - - private: - physical::PhysicalPtr applyTransform(const physical::PhysicalPtr &input); - - std::unique_ptr<cost::StarSchemaSimpleCostModel> cost_model_; - - DISALLOW_COPY_AND_ASSIGN(TransformFilterJoins); -}; - -/** @} */ - -} // namespace optimizer -} // namespace quickstep - -#endif // QUICKSTEP_QUERY_OPTIMIZER_RULES_TRANSFORM_FILTER_JOINS_HPP_ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/utility/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt index e9be2ec..4394aa1 100644 --- a/utility/CMakeLists.txt +++ b/utility/CMakeLists.txt @@ -264,6 +264,7 @@ target_link_libraries(quickstep_utility_PlanVisualizer quickstep_queryoptimizer_costmodel_StarSchemaSimpleCostModel quickstep_queryoptimizer_expressions_AttributeReference quickstep_queryoptimizer_expressions_ExprId + quickstep_queryoptimizer_physical_FilterJoin quickstep_queryoptimizer_physical_HashJoin quickstep_queryoptimizer_physical_LIPFilterConfiguration quickstep_queryoptimizer_physical_Physical http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/b08b0ce4/utility/PlanVisualizer.cpp ---------------------------------------------------------------------- diff --git a/utility/PlanVisualizer.cpp b/utility/PlanVisualizer.cpp index 5d70c86..9ade057 100644 --- a/utility/PlanVisualizer.cpp +++ b/utility/PlanVisualizer.cpp @@ -31,6 +31,7 @@ #include "query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp" #include "query_optimizer/expressions/AttributeReference.hpp" #include "query_optimizer/expressions/ExprId.hpp" +#include "query_optimizer/physical/FilterJoin.hpp" #include "query_optimizer/physical/HashJoin.hpp" #include "query_optimizer/physical/Physical.hpp" #include "query_optimizer/physical/PhysicalType.hpp" @@ -57,6 +58,7 @@ std::string PlanVisualizer::visualize(const P::PhysicalPtr &input) { color_map_["TableReference"] = "skyblue"; color_map_["Selection"] = "#90EE90"; + color_map_["FilterJoin"] = "pink"; color_map_["HashJoin"] = "red"; color_map_["HashLeftOuterJoin"] = "orange"; color_map_["HashLeftSemiJoin"] = "orange"; @@ -164,6 +166,20 @@ void PlanVisualizer::visit(const P::PhysicalPtr &input) { } break; } + case P::PhysicalType::kFilterJoin: { + const P::FilterJoinPtr filter_join = + std::static_pointer_cast<const P::FilterJoin>(input); + node_info.labels.emplace_back(input->getName()); + + const auto &probe_attributes = filter_join->probe_join_attributes(); + const auto &build_attributes = filter_join->build_join_attributes(); + for (std::size_t i = 0; i < probe_attributes.size(); ++i) { + node_info.labels.emplace_back( + probe_attributes[i]->attribute_alias() + " = " + + build_attributes[i]->attribute_alias()); + } + break; + } default: { node_info.labels.emplace_back(input->getName()); break;