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 &current_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;

Reply via email to