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;