You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by ji...@apache.org on 2017/04/20 04:58:18 UTC

incubator-quickstep git commit: Handle commutative operations

Repository: incubator-quickstep
Updated Branches:
  refs/heads/improve-tpch-q01 0ca486424 -> 289e15bdf


Handle commutative operations


Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/289e15bd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/289e15bd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/289e15bd

Branch: refs/heads/improve-tpch-q01
Commit: 289e15bdf68bdc36f7c433922ae34ceb30877257
Parents: 0ca4864
Author: Jianqiao Zhu <ji...@cs.wisc.edu>
Authored: Wed Apr 19 23:57:43 2017 -0500
Committer: Jianqiao Zhu <ji...@cs.wisc.edu>
Committed: Wed Apr 19 23:57:43 2017 -0500

----------------------------------------------------------------------
 .../expressions/BinaryExpression.cpp            | 23 ++++++++++++++++++--
 .../binary_operations/AddBinaryOperation.hpp    |  4 ++++
 .../binary_operations/BinaryOperation.hpp       |  4 ++++
 .../MultiplyBinaryOperation.hpp                 |  4 ++++
 4 files changed, 33 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/289e15bd/query_optimizer/expressions/BinaryExpression.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/expressions/BinaryExpression.cpp b/query_optimizer/expressions/BinaryExpression.cpp
index aac675b..a9ecfb1 100644
--- a/query_optimizer/expressions/BinaryExpression.cpp
+++ b/query_optimizer/expressions/BinaryExpression.cpp
@@ -19,6 +19,7 @@
 
 #include "query_optimizer/expressions/BinaryExpression.hpp"
 
+#include <algorithm>
 #include <string>
 #include <unordered_map>
 #include <vector>
@@ -106,17 +107,35 @@ std::vector<AttributeReferencePtr> BinaryExpression::getReferencedAttributes() c
 }
 
 std::size_t BinaryExpression::computeHash() const {
+  std::size_t left_hash = left_->hash();
+  std::size_t right_hash = right_->hash();
+
+  if (operation_.isCommutative() && left_hash > right_hash) {
+    std::swap(left_hash, right_hash);
+  }
+
   return CombineHashes(
       CombineHashes(static_cast<std::size_t>(ExpressionType::kBinaryExpression),
                     static_cast<std::size_t>(operation_.getBinaryOperationID())),
-      CombineHashes(left_->hash(), right_->hash()));
+      CombineHashes(left_hash, right_hash));
 }
 
 bool BinaryExpression::equals(const ScalarPtr &other) const {
   BinaryExpressionPtr expr;
   if (SomeBinaryExpression::MatchesWithConditionalCast(other, &expr)) {
+    ScalarPtr left = left_;
+    ScalarPtr right = right_;
+
+    if (operation_.isCommutative()) {
+      const bool self_order = (left_->hash() < right_->hash());
+      const bool other_order = (expr->left_->hash() < expr->right_->hash());
+      if (self_order ^ other_order) {
+        std::swap(left, right);
+      }
+    }
+
     return operation_.getBinaryOperationID() == expr->operation_.getBinaryOperationID()
-           && left_->equals(expr->left_) && right_->equals(expr->right_);
+           && left->equals(expr->left_) && right->equals(expr->right_);
   }
   return false;
 }

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/289e15bd/types/operations/binary_operations/AddBinaryOperation.hpp
----------------------------------------------------------------------
diff --git a/types/operations/binary_operations/AddBinaryOperation.hpp b/types/operations/binary_operations/AddBinaryOperation.hpp
index bc862bf..2309563 100644
--- a/types/operations/binary_operations/AddBinaryOperation.hpp
+++ b/types/operations/binary_operations/AddBinaryOperation.hpp
@@ -51,6 +51,10 @@ class AddBinaryOperation : public ArithmeticBinaryOperation {
     return instance;
   }
 
+  bool isCommutative() const override {
+    return true;
+  }
+
   bool canApplyToTypes(const Type &left,
                        const Type &right) const override;
 

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/289e15bd/types/operations/binary_operations/BinaryOperation.hpp
----------------------------------------------------------------------
diff --git a/types/operations/binary_operations/BinaryOperation.hpp b/types/operations/binary_operations/BinaryOperation.hpp
index 585a1c6..c4841e3 100644
--- a/types/operations/binary_operations/BinaryOperation.hpp
+++ b/types/operations/binary_operations/BinaryOperation.hpp
@@ -334,6 +334,10 @@ class BinaryOperation : public Operation {
     return kBinaryOperationShortNames[static_cast<std::size_t>(operation_id_)];
   }
 
+  virtual bool isCommutative() const {
+    return false;
+  }
+
   /**
    * @brief Determine whether this BinaryOperation can apply to the specified
    *        Types.

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/289e15bd/types/operations/binary_operations/MultiplyBinaryOperation.hpp
----------------------------------------------------------------------
diff --git a/types/operations/binary_operations/MultiplyBinaryOperation.hpp b/types/operations/binary_operations/MultiplyBinaryOperation.hpp
index 6edc999..cc005e2 100644
--- a/types/operations/binary_operations/MultiplyBinaryOperation.hpp
+++ b/types/operations/binary_operations/MultiplyBinaryOperation.hpp
@@ -51,6 +51,10 @@ class MultiplyBinaryOperation : public ArithmeticBinaryOperation {
     return instance;
   }
 
+  bool isCommutative() const override {
+    return true;
+  }
+
   bool canApplyToTypes(const Type &left,
                        const Type &right) const override;