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/4005df6e Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/4005df6e Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/4005df6e Branch: refs/heads/new-op Commit: 4005df6e31953458c4cb6e09f6c603cae90ef369 Parents: 6941f90 Author: Jianqiao Zhu <jianq...@cs.wisc.edu> Authored: Tue Mar 14 09:55:05 2017 -0500 Committer: Jianqiao Zhu <jianq...@cs.wisc.edu> Committed: Tue Mar 14 09:55:05 2017 -0500 ---------------------------------------------------------------------- expressions/CMakeLists.txt | 3 +- expressions/ExpressionFactories.cpp | 39 +- expressions/Expressions.proto | 7 +- .../aggregation/AggregateFunctionAvg.cpp | 7 +- .../aggregation/AggregateFunctionSum.cpp | 3 +- .../aggregation/AggregationHandleAvg.cpp | 11 +- .../aggregation/AggregationHandleSum.cpp | 5 +- expressions/aggregation/CMakeLists.txt | 4 - expressions/predicate/CMakeLists.txt | 1 - expressions/scalar/CMakeLists.txt | 9 +- expressions/scalar/ScalarBinaryExpression.cpp | 88 +- expressions/scalar/ScalarBinaryExpression.hpp | 31 +- expressions/scalar/ScalarUnaryExpression.cpp | 26 +- expressions/scalar/ScalarUnaryExpression.hpp | 2 - expressions/window_aggregation/CMakeLists.txt | 4 - .../WindowAggregateFunctionAvg.cpp | 7 +- .../WindowAggregateFunctionSum.cpp | 3 +- .../WindowAggregationHandle.cpp | 3 +- .../WindowAggregationHandle.hpp | 1 - .../WindowAggregationHandleAvg.cpp | 9 +- parser/CMakeLists.txt | 3 - parser/ParseBasicExpressions.cpp | 27 - parser/ParseBasicExpressions.hpp | 86 +- parser/SqlParser.ypp | 40 +- parser/preprocessed/SqlParser_gen.cpp | 2596 +++++++++--------- parser/preprocessed/SqlParser_gen.hpp | 4 +- query_optimizer/LogicalGenerator.cpp | 3 +- .../expressions/BinaryExpression.cpp | 64 +- .../expressions/BinaryExpression.hpp | 56 +- query_optimizer/expressions/CMakeLists.txt | 3 +- query_optimizer/expressions/UnaryExpression.cpp | 5 +- query_optimizer/expressions/UnaryExpression.hpp | 1 - query_optimizer/resolver/CMakeLists.txt | 2 +- query_optimizer/resolver/Resolver.cpp | 263 +- query_optimizer/rules/tests/CMakeLists.txt | 1 - query_optimizer/strategy/tests/CMakeLists.txt | 1 - query_optimizer/tests/CMakeLists.txt | 1 - query_optimizer/tests/OptimizerTest.cpp | 1 - relational_operators/CMakeLists.txt | 1 - storage/CMakeLists.txt | 1 - storage/SMAIndexSubBlock.cpp | 5 +- types/CMakeLists.txt | 6 +- types/NumericSuperType.hpp | 2 +- types/Type.hpp | 2 +- types/TypeUtil.hpp | 2 - types/containers/ColumnVector.cpp | 4 + types/containers/ColumnVector.hpp | 10 +- types/operations/CMakeLists.txt | 31 + types/operations/Operation.hpp | 10 +- types/operations/Operation.proto | 12 - types/operations/OperationFactory.cpp | 358 +++ types/operations/OperationFactory.hpp | 205 ++ types/operations/OperationSignature.hpp | 2 +- types/operations/OperationUtil.hpp | 334 +++ .../binary_operations/AddBinaryOperation.cpp | 418 --- .../binary_operations/AddBinaryOperation.hpp | 90 - .../ArithmeticBinaryFunctorOverloads.hpp | 176 ++ .../ArithmeticBinaryOperation.hpp | 404 --- .../ArithmeticBinaryOperations.hpp | 185 ++ .../ArithmeticBinaryOperators.hpp | 851 ------ .../AsciiStringBinaryOperations.hpp | 131 + .../binary_operations/BinaryOperation.cpp | 29 - .../binary_operations/BinaryOperation.hpp | 286 +- .../BinaryOperationFactory.cpp | 59 +- .../BinaryOperationFactory.hpp | 38 +- .../binary_operations/BinaryOperationID.cpp | 40 - .../binary_operations/BinaryOperationID.hpp | 62 - .../BinaryOperationWrapper.hpp | 627 +++++ .../operations/binary_operations/CMakeLists.txt | 177 +- .../binary_operations/DivideBinaryOperation.cpp | 391 --- .../binary_operations/DivideBinaryOperation.hpp | 93 - .../binary_operations/ModuloBinaryOperation.cpp | 259 -- .../binary_operations/ModuloBinaryOperation.hpp | 93 - .../MultiplyBinaryOperation.cpp | 410 --- .../MultiplyBinaryOperation.hpp | 98 - .../SubtractBinaryOperation.cpp | 459 ---- .../SubtractBinaryOperation.hpp | 93 - .../ArithmeticUnaryOperations.hpp | 27 +- .../AsciiStringUnaryOperations.hpp | 122 + .../operations/unary_operations/CMakeLists.txt | 73 +- .../unary_operations/CMathUnaryOperations.hpp | 5 +- .../unary_operations/CastOperation.cpp | 33 +- .../unary_operations/CastOperation.hpp | 25 +- .../unary_operations/DateExtractOperation.cpp | 9 +- .../unary_operations/DateExtractOperation.hpp | 38 +- .../unary_operations/SubstringOperation.cpp | 33 - .../unary_operations/UnaryOperation.hpp | 7 +- .../unary_operations/UnaryOperationFactory.cpp | 74 - .../unary_operations/UnaryOperationFactory.hpp | 97 - .../unary_operations/UnaryOperationWrapper.hpp | 414 +-- utility/TemplateUtil.hpp | 11 + 91 files changed, 4111 insertions(+), 6731 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/expressions/CMakeLists.txt b/expressions/CMakeLists.txt index 3becc71..eb1afb6 100644 --- a/expressions/CMakeLists.txt +++ b/expressions/CMakeLists.txt @@ -51,10 +51,9 @@ target_link_libraries(quickstep_expressions_ExpressionFactories quickstep_expressions_scalar_ScalarUnaryExpression quickstep_types_TypeFactory quickstep_types_TypedValue + quickstep_types_operations_OperationFactory quickstep_types_operations_OperationSignature - quickstep_types_operations_binaryoperations_BinaryOperationFactory quickstep_types_operations_comparisons_ComparisonFactory - quickstep_types_operations_unaryoperations_UnaryOperationFactory quickstep_utility_Macros) target_link_libraries(quickstep_expressions_Expressions_proto quickstep_types_Type_proto http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/ExpressionFactories.cpp ---------------------------------------------------------------------- diff --git a/expressions/ExpressionFactories.cpp b/expressions/ExpressionFactories.cpp index dd7532e..d145a4d 100644 --- a/expressions/ExpressionFactories.cpp +++ b/expressions/ExpressionFactories.cpp @@ -42,10 +42,9 @@ #include "expressions/scalar/ScalarUnaryExpression.hpp" #include "types/TypeFactory.hpp" #include "types/TypedValue.hpp" +#include "types/operations/OperationFactory.hpp" #include "types/operations/OperationSignature.hpp" -#include "types/operations/binary_operations/BinaryOperationFactory.hpp" #include "types/operations/comparisons/ComparisonFactory.hpp" -#include "types/operations/unary_operations/UnaryOperationFactory.hpp" #include "utility/Macros.hpp" #include "glog/logging.h" @@ -176,23 +175,35 @@ Scalar* ScalarFactory::ReconstructFromProto(const serialization::Scalar &proto, TypedValue::ReconstructFromProto( proto.GetExtension(serialization::ScalarUnaryExpression::static_arguments, i))); } - const OperationSignaturePtr op_signature = OperationSignature::ReconstructFromProto( proto.GetExtension(serialization::ScalarUnaryExpression::op_signature)); - return new ScalarUnaryExpression( op_signature, - UnaryOperationFactory::Instance().getUnaryOperation(op_signature), + OperationFactory::Instance().getUnaryOperation(op_signature), ReconstructFromProto(proto.GetExtension(serialization::ScalarUnaryExpression::operand), database), std::make_shared<std::vector<TypedValue>>(std::move(static_arguments))); } case serialization::Scalar::BINARY_EXPRESSION: { + std::vector<TypedValue> static_arguments; + const int num_static_args = + proto.ExtensionSize(serialization::ScalarBinaryExpression::static_arguments); + for (int i = 0; i < num_static_args; ++i) { + static_arguments.emplace_back( + TypedValue::ReconstructFromProto( + proto.GetExtension(serialization::ScalarBinaryExpression::static_arguments, i))); + } + const OperationSignaturePtr op_signature = + OperationSignature::ReconstructFromProto( + proto.GetExtension(serialization::ScalarBinaryExpression::op_signature)); return new ScalarBinaryExpression( - BinaryOperationFactory::ReconstructFromProto( - proto.GetExtension(serialization::ScalarBinaryExpression::operation)), - ReconstructFromProto(proto.GetExtension(serialization::ScalarBinaryExpression::left_operand), database), - ReconstructFromProto(proto.GetExtension(serialization::ScalarBinaryExpression::right_operand), database)); + op_signature, + OperationFactory::Instance().getBinaryOperation(op_signature), + ReconstructFromProto( + proto.GetExtension(serialization::ScalarBinaryExpression::left_operand), database), + ReconstructFromProto( + proto.GetExtension(serialization::ScalarBinaryExpression::right_operand), database), + std::make_shared<std::vector<TypedValue>>(std::move(static_arguments))); } case serialization::Scalar::CASE_EXPRESSION: { const Type &result_type = TypeFactory::ReconstructFromProto( @@ -262,14 +273,8 @@ bool ScalarFactory::ProtoIsValid(const serialization::Scalar &proto, break; } case serialization::Scalar::BINARY_EXPRESSION: { - if (proto.HasExtension(serialization::ScalarBinaryExpression::operation) - && proto.HasExtension(serialization::ScalarBinaryExpression::left_operand) - && proto.HasExtension(serialization::ScalarBinaryExpression::right_operand)) { - return BinaryOperationFactory::ProtoIsValid( - proto.GetExtension(serialization::ScalarBinaryExpression::operation)) - && ProtoIsValid(proto.GetExtension(serialization::ScalarBinaryExpression::left_operand), database) - && ProtoIsValid(proto.GetExtension(serialization::ScalarBinaryExpression::right_operand), database); - } + // TODO + return true; break; } case serialization::Scalar::CASE_EXPRESSION: { http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/Expressions.proto ---------------------------------------------------------------------- diff --git a/expressions/Expressions.proto b/expressions/Expressions.proto index ea6228a..9f8fb3c 100644 --- a/expressions/Expressions.proto +++ b/expressions/Expressions.proto @@ -110,9 +110,10 @@ message ScalarUnaryExpression { message ScalarBinaryExpression { extend Scalar { - optional BinaryOperation operation = 128; - optional Scalar left_operand = 129; - optional Scalar right_operand = 130; + optional OperationSignature op_signature = 129; + optional Scalar left_operand = 130; + optional Scalar right_operand = 131; + repeated TypedValue static_arguments = 132; } } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/aggregation/AggregateFunctionAvg.cpp ---------------------------------------------------------------------- diff --git a/expressions/aggregation/AggregateFunctionAvg.cpp b/expressions/aggregation/AggregateFunctionAvg.cpp index 040d7d9..b5c18c4 100644 --- a/expressions/aggregation/AggregateFunctionAvg.cpp +++ b/expressions/aggregation/AggregateFunctionAvg.cpp @@ -27,7 +27,6 @@ #include "types/TypeID.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "glog/logging.h" @@ -42,9 +41,9 @@ bool AggregateFunctionAvg::canApplyToTypes( // Argument must be addable and divisible. return BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .canApplyToTypes(*argument_types.front(), *argument_types.front()) + .canApplyTo(*argument_types.front(), *argument_types.front()) && BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .canApplyToTypes(*argument_types.front(), TypeFactory::GetType(kDouble)); + .canApplyTo(*argument_types.front(), TypeFactory::GetType(kDouble)); } const Type* AggregateFunctionAvg::resultTypeForArgumentTypes( @@ -68,7 +67,7 @@ const Type* AggregateFunctionAvg::resultTypeForArgumentTypes( } return BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .resultTypeForArgumentTypes(*sum_type, TypeFactory::GetType(kDouble)); + .getResultType(*sum_type, TypeFactory::GetType(kDouble)); } AggregationHandle* AggregateFunctionAvg::createHandle( http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/aggregation/AggregateFunctionSum.cpp ---------------------------------------------------------------------- diff --git a/expressions/aggregation/AggregateFunctionSum.cpp b/expressions/aggregation/AggregateFunctionSum.cpp index b62660f..b0e3f28 100644 --- a/expressions/aggregation/AggregateFunctionSum.cpp +++ b/expressions/aggregation/AggregateFunctionSum.cpp @@ -27,7 +27,6 @@ #include "types/TypeID.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "glog/logging.h" @@ -42,7 +41,7 @@ bool AggregateFunctionSum::canApplyToTypes( // Argument must be addable. return BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .canApplyToTypes(*argument_types.front(), *argument_types.front()); + .canApplyTo(*argument_types.front(), *argument_types.front()); } const Type* AggregateFunctionSum::resultTypeForArgumentTypes( http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/aggregation/AggregationHandleAvg.cpp ---------------------------------------------------------------------- diff --git a/expressions/aggregation/AggregationHandleAvg.cpp b/expressions/aggregation/AggregationHandleAvg.cpp index 46bec1e..f7f2748 100644 --- a/expressions/aggregation/AggregationHandleAvg.cpp +++ b/expressions/aggregation/AggregationHandleAvg.cpp @@ -34,7 +34,6 @@ #include "types/TypedValue.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "glog/logging.h" @@ -70,22 +69,22 @@ AggregationHandleAvg::AggregationHandleAvg(const Type &type) // Add operator for summing argument values. fast_add_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .makeUncheckedBinaryOperatorForTypes(sum_type, argument_type_)); + .makeUncheckedBinaryOperator(sum_type, argument_type_)); // Add operator for merging states. merge_add_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .makeUncheckedBinaryOperatorForTypes(sum_type, sum_type)); + .makeUncheckedBinaryOperator(sum_type, sum_type)); // Divide operator for dividing sum by count to get final average. divide_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .makeUncheckedBinaryOperatorForTypes(sum_type, - TypeFactory::GetType(kDouble))); + .makeUncheckedBinaryOperator(sum_type, + TypeFactory::GetType(kDouble))); // Result is nullable, because AVG() over 0 values (or all NULL values) is // NULL. result_type_ = &(BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .resultTypeForArgumentTypes(sum_type, TypeFactory::GetType(kDouble)) + .getResultType(sum_type, TypeFactory::GetType(kDouble)) ->getNullableVersion()); } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/aggregation/AggregationHandleSum.cpp ---------------------------------------------------------------------- diff --git a/expressions/aggregation/AggregationHandleSum.cpp b/expressions/aggregation/AggregationHandleSum.cpp index 9f5f220..f37cf2a 100644 --- a/expressions/aggregation/AggregationHandleSum.cpp +++ b/expressions/aggregation/AggregationHandleSum.cpp @@ -34,7 +34,6 @@ #include "types/TypedValue.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "glog/logging.h" @@ -69,11 +68,11 @@ AggregationHandleSum::AggregationHandleSum(const Type &type) // Add operator for summing argument values. fast_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .makeUncheckedBinaryOperatorForTypes(sum_type, argument_type_)); + .makeUncheckedBinaryOperator(sum_type, argument_type_)); // Add operator for merging states. merge_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .makeUncheckedBinaryOperatorForTypes(sum_type, sum_type)); + .makeUncheckedBinaryOperator(sum_type, sum_type)); // Result is nullable, because SUM() over 0 values (or all NULL values) is // NULL. http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/aggregation/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/expressions/aggregation/CMakeLists.txt b/expressions/aggregation/CMakeLists.txt index 4220a8d..84b0653 100644 --- a/expressions/aggregation/CMakeLists.txt +++ b/expressions/aggregation/CMakeLists.txt @@ -86,7 +86,6 @@ target_link_libraries(quickstep_expressions_aggregation_AggregateFunctionAvg quickstep_types_TypeID quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_utility_Macros) target_link_libraries(quickstep_expressions_aggregation_AggregateFunctionCount glog @@ -137,7 +136,6 @@ target_link_libraries(quickstep_expressions_aggregation_AggregateFunctionSum quickstep_types_TypeID quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_utility_Macros) target_link_libraries(quickstep_expressions_aggregation_AggregationConcreteHandle glog @@ -172,7 +170,6 @@ target_link_libraries(quickstep_expressions_aggregation_AggregationHandleAvg quickstep_types_TypedValue quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_utility_Macros) target_link_libraries(quickstep_expressions_aggregation_AggregationHandleCount glog @@ -230,7 +227,6 @@ target_link_libraries(quickstep_expressions_aggregation_AggregationHandleSum quickstep_types_TypedValue quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_utility_Macros) # Submodule all-in-one library: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/predicate/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/expressions/predicate/CMakeLists.txt b/expressions/predicate/CMakeLists.txt index b90562c..71101bd 100644 --- a/expressions/predicate/CMakeLists.txt +++ b/expressions/predicate/CMakeLists.txt @@ -148,7 +148,6 @@ target_link_libraries(Predicate_unittest quickstep_types_TypeID quickstep_types_TypedValue quickstep_types_operations_binaryoperations_BinaryOperation - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_types_operations_comparisons_Comparison quickstep_types_operations_comparisons_ComparisonFactory quickstep_types_operations_comparisons_ComparisonID http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/scalar/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/expressions/scalar/CMakeLists.txt b/expressions/scalar/CMakeLists.txt index 79d1a96..fd412e6 100644 --- a/expressions/scalar/CMakeLists.txt +++ b/expressions/scalar/CMakeLists.txt @@ -63,6 +63,7 @@ target_link_libraries(quickstep_expressions_scalar_ScalarBinaryExpression quickstep_types_TypeErrors quickstep_types_TypedValue quickstep_types_containers_ColumnVector + quickstep_types_operations_OperationSignature quickstep_types_operations_Operation_proto quickstep_types_operations_binaryoperations_BinaryOperation quickstep_utility_Macros) @@ -145,11 +146,8 @@ target_link_libraries(ScalarCaseExpression_unittest quickstep_types_containers_ColumnVector quickstep_types_containers_ColumnVectorsValueAccessor quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_types_operations_comparisons_ComparisonFactory - quickstep_types_operations_comparisons_ComparisonID - quickstep_types_operations_unaryoperations_UnaryOperationFactory - quickstep_types_operations_unaryoperations_UnaryOperationID) + quickstep_types_operations_comparisons_ComparisonID) add_test(ScalarCaseExpression_unittest ScalarCaseExpression_unittest) add_executable(Scalar_unittest "${CMAKE_CURRENT_SOURCE_DIR}/tests/Scalar_unittest.cpp") @@ -173,10 +171,7 @@ target_link_libraries(Scalar_unittest quickstep_types_TypedValue quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_types_operations_unaryoperations_CastOperation quickstep_types_operations_unaryoperations_UnaryOperation - quickstep_types_operations_unaryoperations_UnaryOperationFactory - quickstep_types_operations_unaryoperations_UnaryOperationID quickstep_utility_Macros) add_test(Scalar_unittest Scalar_unittest) http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/scalar/ScalarBinaryExpression.cpp ---------------------------------------------------------------------- diff --git a/expressions/scalar/ScalarBinaryExpression.cpp b/expressions/scalar/ScalarBinaryExpression.cpp index 5fe6cde..51abde5 100644 --- a/expressions/scalar/ScalarBinaryExpression.cpp +++ b/expressions/scalar/ScalarBinaryExpression.cpp @@ -38,37 +38,66 @@ namespace quickstep { -ScalarBinaryExpression::ScalarBinaryExpression(const BinaryOperation &operation, - Scalar *left_operand, - Scalar *right_operand) - : Scalar(*operation.resultTypeForArgumentTypes(left_operand->getType(), - right_operand->getType())), +ScalarBinaryExpression::ScalarBinaryExpression( + const OperationSignaturePtr &op_signature, + const BinaryOperationPtr &operation, + Scalar *left_operand, + Scalar *right_operand, + const std::shared_ptr<const std::vector<TypedValue>> &static_arguments) + : Scalar(*operation->getResultType(left_operand->getType(), + right_operand->getType(), + *static_arguments)), + op_signature_(op_signature), operation_(operation), left_operand_(left_operand), - right_operand_(right_operand) { - initHelper(false); + right_operand_(right_operand), + static_arguments_(static_arguments) { + DCHECK(operation_->canApplyTo(left_operand_->getType(), + right_operand_->getType(), + *static_arguments)); + fast_operator_.reset( + operation_->makeUncheckedBinaryOperator(left_operand_->getType(), + right_operand_->getType(), + *static_arguments)); + if (left_operand_->hasStaticValue() && right_operand_->hasStaticValue()) { + static_value_.reset(new TypedValue( + fast_operator_->applyToTypedValues(left_operand_->getStaticValue(), + right_operand_->getStaticValue()))); + } } serialization::Scalar ScalarBinaryExpression::getProto() const { serialization::Scalar proto; proto.set_data_source(serialization::Scalar::BINARY_EXPRESSION); - proto.MutableExtension(serialization::ScalarBinaryExpression::operation)->CopyFrom(operation_.getProto()); - proto.MutableExtension(serialization::ScalarBinaryExpression::left_operand)->CopyFrom(left_operand_->getProto()); - proto.MutableExtension(serialization::ScalarBinaryExpression::right_operand)->CopyFrom(right_operand_->getProto()); - + proto.MutableExtension( + serialization::ScalarBinaryExpression::op_signature)->CopyFrom( + op_signature_->getProto()); + proto.MutableExtension( + serialization::ScalarBinaryExpression::left_operand)->CopyFrom( + left_operand_->getProto()); + proto.MutableExtension( + serialization::ScalarBinaryExpression::right_operand)->CopyFrom( + right_operand_->getProto()); + for (const TypedValue &value : *static_arguments_) { + proto.AddExtension( + serialization::ScalarUnaryExpression::static_arguments)->CopyFrom( + value.getProto()); + } return proto; } Scalar* ScalarBinaryExpression::clone() const { - return new ScalarBinaryExpression(operation_, + return new ScalarBinaryExpression(op_signature_, + operation_, left_operand_->clone(), - right_operand_->clone()); + right_operand_->clone(), + static_arguments_); } TypedValue ScalarBinaryExpression::getValueForSingleTuple(const ValueAccessor &accessor, const tuple_id tuple) const { if (fast_operator_.get() == nullptr) { - return static_value_.makeReferenceToThis(); + return static_value_->makeReferenceToThis(); } else { return fast_operator_->applyToTypedValues(left_operand_->getValueForSingleTuple(accessor, tuple), right_operand_->getValueForSingleTuple(accessor, tuple)); @@ -83,7 +112,7 @@ TypedValue ScalarBinaryExpression::getValueForJoinedTuples( const relation_id right_relation_id, const tuple_id right_tuple_id) const { if (fast_operator_.get() == nullptr) { - return static_value_.makeReferenceToThis(); + return static_value_->makeReferenceToThis(); } else { return fast_operator_->applyToTypedValues( left_operand_->getValueForJoinedTuples(left_accessor, @@ -106,7 +135,7 @@ ColumnVector* ScalarBinaryExpression::getAllValues( const SubBlocksReference *sub_blocks_ref) const { if (fast_operator_.get() == nullptr) { return ColumnVector::MakeVectorOfValue(getType(), - static_value_, + *static_value_, accessor->getNumTuplesVirtual()); } else { // NOTE(chasseur): We don't check if BOTH operands have a static value, @@ -191,7 +220,7 @@ ColumnVector* ScalarBinaryExpression::getAllValuesForJoin( const std::vector<std::pair<tuple_id, tuple_id>> &joined_tuple_ids) const { if (fast_operator_.get() == nullptr) { return ColumnVector::MakeVectorOfValue(getType(), - static_value_, + *static_value_, joined_tuple_ids.size()); } else { if (left_operand_->hasStaticValue()) { @@ -349,29 +378,4 @@ ColumnVector* ScalarBinaryExpression::getAllValuesForJoin( } } -void ScalarBinaryExpression::initHelper(bool own_children) { - if (operation_.canApplyToTypes(left_operand_->getType(), right_operand_->getType())) { - if (left_operand_->hasStaticValue() && right_operand_->hasStaticValue()) { - static_value_ = operation_.applyToChecked(left_operand_->getStaticValue(), - left_operand_->getType(), - right_operand_->getStaticValue(), - right_operand_->getType()); - } else { - fast_operator_.reset(operation_.makeUncheckedBinaryOperatorForTypes(left_operand_->getType(), - right_operand_->getType())); - } - } else { - const Type &left_operand_type = left_operand_->getType(); - const Type &right_operand_type = right_operand_->getType(); - if (!own_children) { - left_operand_.release(); - right_operand_.release(); - } - throw OperationInapplicableToType(operation_.getName(), - 2, - left_operand_type.getName().c_str(), - right_operand_type.getName().c_str()); - } -} - } // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/scalar/ScalarBinaryExpression.hpp ---------------------------------------------------------------------- diff --git a/expressions/scalar/ScalarBinaryExpression.hpp b/expressions/scalar/ScalarBinaryExpression.hpp index c84792a..0bf6abe 100644 --- a/expressions/scalar/ScalarBinaryExpression.hpp +++ b/expressions/scalar/ScalarBinaryExpression.hpp @@ -29,6 +29,7 @@ #include "expressions/scalar/Scalar.hpp" #include "storage/StorageBlockInfo.hpp" #include "types/TypedValue.hpp" +#include "types/operations/OperationSignature.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "utility/Macros.hpp" @@ -50,18 +51,11 @@ struct SubBlocksReference; **/ class ScalarBinaryExpression : public Scalar { public: - /** - * @brief Constructor. - * - * @param operation The binary operation to be performed. - * @param left_operand The left argument of the operation, which this - * ScalarBinaryExpression takes ownership of. - * @param right_operand The right argument of the operation, which this - * ScalarBinaryExpression takes ownership of. - **/ - ScalarBinaryExpression(const BinaryOperation &operation, + ScalarBinaryExpression(const OperationSignaturePtr &op_signature, + const BinaryOperationPtr &operation, Scalar *left_operand, - Scalar *right_operand); + Scalar *right_operand, + const std::shared_ptr<const std::vector<TypedValue>> &static_arguments); /** * @brief Destructor @@ -89,12 +83,12 @@ class ScalarBinaryExpression : public Scalar { const tuple_id right_tuple_id) const override; bool hasStaticValue() const override { - return fast_operator_.get() == nullptr; + return static_value_ != nullptr; } const TypedValue& getStaticValue() const override { DCHECK(hasStaticValue()); - return static_value_; + return *static_value_; } ColumnVector* getAllValues(ValueAccessor *accessor, @@ -108,13 +102,14 @@ class ScalarBinaryExpression : public Scalar { const std::vector<std::pair<tuple_id, tuple_id>> &joined_tuple_ids) const override; private: - void initHelper(bool own_children); + const OperationSignaturePtr op_signature_; + const BinaryOperationPtr operation_; - const BinaryOperation &operation_; + const std::unique_ptr<Scalar> left_operand_; + const std::unique_ptr<Scalar> right_operand_; + const std::shared_ptr<const std::vector<TypedValue>> static_arguments_; - std::unique_ptr<Scalar> left_operand_; - std::unique_ptr<Scalar> right_operand_; - TypedValue static_value_; + std::unique_ptr<TypedValue> static_value_; std::unique_ptr<UncheckedBinaryOperator> fast_operator_; friend class PredicateTest; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/scalar/ScalarUnaryExpression.cpp ---------------------------------------------------------------------- diff --git a/expressions/scalar/ScalarUnaryExpression.cpp b/expressions/scalar/ScalarUnaryExpression.cpp index 61405af..b3d52b6 100644 --- a/expressions/scalar/ScalarUnaryExpression.cpp +++ b/expressions/scalar/ScalarUnaryExpression.cpp @@ -34,9 +34,7 @@ #include "types/operations/Operation.pb.h" #include "types/operations/unary_operations/UnaryOperation.hpp" -#ifdef QUICKSTEP_ENABLE_VECTOR_COPY_ELISION_JOIN #include "glog/logging.h" -#endif // QUICKSTEP_ENABLE_VECTOR_COPY_ELISION_JOIN namespace quickstep { @@ -52,17 +50,14 @@ ScalarUnaryExpression::ScalarUnaryExpression( operation_(operation), operand_(operand), static_arguments_(static_arguments) { - if (operation_->canApplyTo(operand_->getType(), *static_arguments_)) { - fast_operator_.reset( - operation_->makeUncheckedUnaryOperator(operand_->getType(), - *static_arguments_)); - if (operand_->hasStaticValue()) { - static_value_.reset(new TypedValue( - fast_operator_->applyToTypedValue(operand_->getStaticValue()))); - } - } else { - const Type &operand_type = operand_->getType(); - throw OperationInapplicableToType(operation_->getName(), 1, operand_type.getName().c_str()); + DCHECK(operation_->canApplyTo(operand_->getType(), *static_arguments_)); + + fast_operator_.reset( + operation_->makeUncheckedUnaryOperator(operand_->getType(), + *static_arguments_)); + if (operand_->hasStaticValue()) { + static_value_.reset(new TypedValue( + fast_operator_->applyToTypedValue(operand_->getStaticValue()))); } } @@ -72,13 +67,14 @@ serialization::Scalar ScalarUnaryExpression::getProto() const { proto.MutableExtension( serialization::ScalarUnaryExpression::op_signature)->CopyFrom( op_signature_->getProto()); - proto.MutableExtension(serialization::ScalarUnaryExpression::operand)->CopyFrom(operand_->getProto()); + proto.MutableExtension( + serialization::ScalarUnaryExpression::operand)->CopyFrom( + operand_->getProto()); for (const TypedValue &value : *static_arguments_) { proto.AddExtension( serialization::ScalarUnaryExpression::static_arguments)->CopyFrom( value.getProto()); } - return proto; } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/scalar/ScalarUnaryExpression.hpp ---------------------------------------------------------------------- diff --git a/expressions/scalar/ScalarUnaryExpression.hpp b/expressions/scalar/ScalarUnaryExpression.hpp index c84e2bb..2f3a2ee 100644 --- a/expressions/scalar/ScalarUnaryExpression.hpp +++ b/expressions/scalar/ScalarUnaryExpression.hpp @@ -101,8 +101,6 @@ class ScalarUnaryExpression : public Scalar { const std::vector<std::pair<tuple_id, tuple_id>> &joined_tuple_ids) const override; private: - void initHelper(bool own_children); - const OperationSignaturePtr op_signature_; const UnaryOperationPtr operation_; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/window_aggregation/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/expressions/window_aggregation/CMakeLists.txt b/expressions/window_aggregation/CMakeLists.txt index b33a401..538a7f5 100644 --- a/expressions/window_aggregation/CMakeLists.txt +++ b/expressions/window_aggregation/CMakeLists.txt @@ -73,7 +73,6 @@ target_link_libraries(quickstep_expressions_windowaggregation_WindowAggregateFun quickstep_types_TypeID quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_utility_Macros) target_link_libraries(quickstep_expressions_windowaggregation_WindowAggregateFunctionCount glog @@ -124,7 +123,6 @@ target_link_libraries(quickstep_expressions_windowaggregation_WindowAggregateFun quickstep_types_TypeID quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_utility_Macros) target_link_libraries(quickstep_expressions_windowaggregation_WindowAggregationHandle glog @@ -140,7 +138,6 @@ target_link_libraries(quickstep_expressions_windowaggregation_WindowAggregationH quickstep_types_containers_ColumnVectorsValueAccessor quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_types_operations_comparisons_Comparison quickstep_types_operations_comparisons_ComparisonFactory quickstep_types_operations_comparisons_ComparisonID @@ -157,7 +154,6 @@ target_link_libraries(quickstep_expressions_windowaggregation_WindowAggregationH quickstep_types_containers_ColumnVectorsValueAccessor quickstep_types_operations_binaryoperations_BinaryOperation quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_types_operations_comparisons_Comparison quickstep_utility_Macros) http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/window_aggregation/WindowAggregateFunctionAvg.cpp ---------------------------------------------------------------------- diff --git a/expressions/window_aggregation/WindowAggregateFunctionAvg.cpp b/expressions/window_aggregation/WindowAggregateFunctionAvg.cpp index 20c296b..1114c84 100644 --- a/expressions/window_aggregation/WindowAggregateFunctionAvg.cpp +++ b/expressions/window_aggregation/WindowAggregateFunctionAvg.cpp @@ -27,7 +27,6 @@ #include "types/TypeID.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "glog/logging.h" @@ -42,9 +41,9 @@ bool WindowAggregateFunctionAvg::canApplyToTypes( // Argument must be addable and divisible. return BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .canApplyToTypes(*argument_types.front(), *argument_types.front()) && + .canApplyTo(*argument_types.front(), *argument_types.front()) && BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .canApplyToTypes(*argument_types.front(), TypeFactory::GetType(kDouble)); + .canApplyTo(*argument_types.front(), TypeFactory::GetType(kDouble)); } const Type* WindowAggregateFunctionAvg::resultTypeForArgumentTypes( @@ -68,7 +67,7 @@ const Type* WindowAggregateFunctionAvg::resultTypeForArgumentTypes( } return BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .resultTypeForArgumentTypes(*sum_type, TypeFactory::GetType(kDouble)); + .getResultType(*sum_type, TypeFactory::GetType(kDouble)); } WindowAggregationHandle* WindowAggregateFunctionAvg::createHandle( http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/window_aggregation/WindowAggregateFunctionSum.cpp ---------------------------------------------------------------------- diff --git a/expressions/window_aggregation/WindowAggregateFunctionSum.cpp b/expressions/window_aggregation/WindowAggregateFunctionSum.cpp index 14c51d8..406edb5 100644 --- a/expressions/window_aggregation/WindowAggregateFunctionSum.cpp +++ b/expressions/window_aggregation/WindowAggregateFunctionSum.cpp @@ -27,7 +27,6 @@ #include "types/TypeID.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "glog/logging.h" @@ -42,7 +41,7 @@ bool WindowAggregateFunctionSum::canApplyToTypes( // Argument must be addable. return BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .canApplyToTypes(*argument_types.front(), *argument_types.front()); + .canApplyTo(*argument_types.front(), *argument_types.front()); } const Type* WindowAggregateFunctionSum::resultTypeForArgumentTypes( http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/window_aggregation/WindowAggregationHandle.cpp ---------------------------------------------------------------------- diff --git a/expressions/window_aggregation/WindowAggregationHandle.cpp b/expressions/window_aggregation/WindowAggregationHandle.cpp index f26656d..df63095 100644 --- a/expressions/window_aggregation/WindowAggregationHandle.cpp +++ b/expressions/window_aggregation/WindowAggregationHandle.cpp @@ -32,7 +32,6 @@ #include "types/containers/ColumnVectorsValueAccessor.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "types/operations/comparisons/Comparison.hpp" #include "glog/logging.h" @@ -84,7 +83,7 @@ WindowAggregationHandle::WindowAggregationHandle( range_add_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .makeUncheckedBinaryOperatorForTypes(*first_order_key_type, long_type)); + .makeUncheckedBinaryOperator(*first_order_key_type, long_type)); range_comparator_.reset( ComparisonFactory::GetComparison(ComparisonID::kLessOrEqual) .makeUncheckedComparatorForTypes(*range_compare_type_, *range_compare_type_)); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/window_aggregation/WindowAggregationHandle.hpp ---------------------------------------------------------------------- diff --git a/expressions/window_aggregation/WindowAggregationHandle.hpp b/expressions/window_aggregation/WindowAggregationHandle.hpp index 3569123..c33f947 100644 --- a/expressions/window_aggregation/WindowAggregationHandle.hpp +++ b/expressions/window_aggregation/WindowAggregationHandle.hpp @@ -38,7 +38,6 @@ #include "types/operations/comparisons/ComparisonID.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "utility/Macros.hpp" namespace quickstep { http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/expressions/window_aggregation/WindowAggregationHandleAvg.cpp ---------------------------------------------------------------------- diff --git a/expressions/window_aggregation/WindowAggregationHandleAvg.cpp b/expressions/window_aggregation/WindowAggregationHandleAvg.cpp index b1c6e3b..921579b 100644 --- a/expressions/window_aggregation/WindowAggregationHandleAvg.cpp +++ b/expressions/window_aggregation/WindowAggregationHandleAvg.cpp @@ -33,7 +33,6 @@ #include "types/containers/ColumnVectorsValueAccessor.hpp" #include "types/operations/binary_operations/BinaryOperation.hpp" #include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "types/operations/comparisons/Comparison.hpp" #include "glog/logging.h" @@ -75,24 +74,24 @@ WindowAggregationHandleAvg::WindowAggregationHandleAvg( // NULL. result_type_ = &(BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .resultTypeForArgumentTypes(*sum_type_, TypeFactory::GetType(kDouble)) + .getResultType(*sum_type_, TypeFactory::GetType(kDouble)) ->getNullableVersion()); // Make operators to do arithmetic: // Add operator for summing argument values. fast_add_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd) - .makeUncheckedBinaryOperatorForTypes(*sum_type_, *argument_type)); + .makeUncheckedBinaryOperator(*sum_type_, *argument_type)); // Subtract operator for dropping argument values off the window. fast_subtract_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kSubtract) - .makeUncheckedBinaryOperatorForTypes(*sum_type_, *argument_type)); + .makeUncheckedBinaryOperator(*sum_type_, *argument_type)); // Divide operator for dividing sum by count to get final average. divide_operator_.reset( BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kDivide) - .makeUncheckedBinaryOperatorForTypes(*sum_type_, TypeFactory::GetType(kDouble))); + .makeUncheckedBinaryOperator(*sum_type_, TypeFactory::GetType(kDouble))); } ColumnVector* WindowAggregationHandleAvg::calculate( http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/parser/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/parser/CMakeLists.txt b/parser/CMakeLists.txt index 7a8e04e..6eb3c47 100644 --- a/parser/CMakeLists.txt +++ b/parser/CMakeLists.txt @@ -359,9 +359,6 @@ target_link_libraries(quickstep_parser_SqlParser quickstep_types_Type quickstep_types_TypeFactory quickstep_types_TypeID - quickstep_types_operations_binaryoperations_BinaryOperation - quickstep_types_operations_binaryoperations_BinaryOperationFactory - quickstep_types_operations_binaryoperations_BinaryOperationID quickstep_types_operations_comparisons_Comparison quickstep_types_operations_comparisons_ComparisonFactory quickstep_types_operations_comparisons_ComparisonID http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/parser/ParseBasicExpressions.cpp ---------------------------------------------------------------------- diff --git a/parser/ParseBasicExpressions.cpp b/parser/ParseBasicExpressions.cpp index 8212286..580cd09 100644 --- a/parser/ParseBasicExpressions.cpp +++ b/parser/ParseBasicExpressions.cpp @@ -68,33 +68,6 @@ void ParseAttribute::getFieldStringItems( } } -std::string ParseBinaryExpression::getName() const { - return op_.getName(); -} - -string ParseBinaryExpression::generateName() const { - string name("("); - name.append(left_operand_->generateName()); - name.append(op_.getShortName()); - name.append(right_operand_->generateName()); - name.push_back(')'); - return name; -} - -void ParseBinaryExpression::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<const ParseTreeNode*> *non_container_child_fields, - std::vector<std::string> *container_child_field_names, - std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const { - non_container_child_field_names->push_back("left_operand"); - non_container_child_fields->push_back(left_operand_.get()); - - non_container_child_field_names->push_back("right_operand"); - non_container_child_fields->push_back(right_operand_.get()); -} - std::string ParseFunctionCall::generateName() const { string name(name_->value()); name.push_back('('); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/parser/ParseBasicExpressions.hpp ---------------------------------------------------------------------- diff --git a/parser/ParseBasicExpressions.hpp b/parser/ParseBasicExpressions.hpp index edf5aab..4572214 100644 --- a/parser/ParseBasicExpressions.hpp +++ b/parser/ParseBasicExpressions.hpp @@ -36,9 +36,6 @@ namespace quickstep { -class BinaryOperation; -class UnaryOperation; - /** \addtogroup Parser * @{ */ @@ -173,88 +170,6 @@ class ParseAttribute : public ParseExpression { /** - * @brief The parsed representation of a binary operation applied to two - * expressions. - **/ -class ParseBinaryExpression : public ParseExpression { - public: - /** - * @brief Constructor. - * - * @param line_number Line number of the binary operator token in the SQL statement. - * @param column_number Column number of the binary operator token in the SQL statement. - * @param op The BinaryOperation from the quickstep type system to apply. - * @param left_operand The parsed scalar representation of the binary - * operation's left argument, which becomes owned by this - * ParseScalarBinaryExpression. - * @param right_operand The parsed scalar representation of the binary - * operation's right argument, which becomes owned by this - * ParseScalarBinaryExpression. - **/ - ParseBinaryExpression(const int line_number, - const int column_number, - const BinaryOperation &op, - ParseExpression *left_operand, - ParseExpression *right_operand) - : ParseExpression(line_number, column_number), - op_(op), - left_operand_(left_operand), - right_operand_(right_operand) { - } - - /** - * @brief Destructor. - */ - ~ParseBinaryExpression() override { - } - - ExpressionType getExpressionType() const override { - return kBinaryExpression; - } - - std::string getName() const override; - - /** - * @return The binary operation. - */ - const BinaryOperation& op() const { - return op_; - } - - /** - * @return The left operand expression. - */ - const ParseExpression* left_operand() const { - return left_operand_.get(); - } - - /** - * @return The right operand expression. - */ - const ParseExpression* right_operand() const { - return right_operand_.get(); - } - - std::string generateName() const override; - - 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<const ParseTreeNode*> *non_container_child_fields, - std::vector<std::string> *container_child_field_names, - std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override; - - private: - const BinaryOperation &op_; - std::unique_ptr<ParseExpression> left_operand_; - std::unique_ptr<ParseExpression> right_operand_; - - DISALLOW_COPY_AND_ASSIGN(ParseBinaryExpression); -}; - -/** * @brief The parsed representation of '*' as a function argument. */ class ParseStar : public ParseTreeNode { @@ -279,6 +194,7 @@ class ParseStar : public ParseTreeNode { DISALLOW_COPY_AND_ASSIGN(ParseStar); }; + /** * @brief Parsed function call in the form of a name with a list of arguments in parentheses. */ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/4005df6e/parser/SqlParser.ypp ---------------------------------------------------------------------- diff --git a/parser/SqlParser.ypp b/parser/SqlParser.ypp index fd13aa7..68f5f72 100644 --- a/parser/SqlParser.ypp +++ b/parser/SqlParser.ypp @@ -101,9 +101,6 @@ typedef struct YYLTYPE { #include "types/Type.hpp" #include "types/TypeFactory.hpp" #include "types/TypeID.hpp" -#include "types/operations/binary_operations/BinaryOperation.hpp" -#include "types/operations/binary_operations/BinaryOperationFactory.hpp" -#include "types/operations/binary_operations/BinaryOperationID.hpp" #include "types/operations/comparisons/Comparison.hpp" #include "types/operations/comparisons/ComparisonFactory.hpp" #include "types/operations/comparisons/ComparisonID.hpp" @@ -185,7 +182,7 @@ typedef void* yyscan_t; const quickstep::Comparison *comparison_; quickstep::ParseString *unary_operation_; - const quickstep::BinaryOperation *binary_operation_; + quickstep::ParseString *binary_operation_; quickstep::ParseFunctionCall *function_call_; quickstep::PtrList<quickstep::ParseExpression> *expression_list_; @@ -612,7 +609,6 @@ void NotSupported(const YYLTYPE *location, yyscan_t yyscanner, const std::string %destructor { } <boolean_value_> %destructor { } <comparison_> -%destructor { } <binary_operation_> %destructor { } <join_type_> %destructor { @@ -1614,7 +1610,10 @@ predicate_expression_base: /* Scalars */ add_expression: add_expression add_operation multiply_expression { - $$ = new quickstep::ParseBinaryExpression(@2.first_line, @2.first_column, *$2, $1, $3); + auto *arguments = new quickstep::PtrList<quickstep::ParseExpression>(); + arguments->push_back($1); + arguments->push_back($3); + $$ = new quickstep::ParseFunctionCall(@1.first_line, @1.first_column, false, $2, arguments); } | multiply_expression { $$ = $1; @@ -1622,7 +1621,10 @@ add_expression: multiply_expression: multiply_expression multiply_operation unary_expression { - $$ = new quickstep::ParseBinaryExpression(@2.first_line, @2.first_column, *$2, $1, $3); + auto *arguments = new quickstep::PtrList<quickstep::ParseExpression>(); + arguments->push_back($1); + arguments->push_back($3); + $$ = new quickstep::ParseFunctionCall(@1.first_line, @1.first_column, false, $2, arguments); } | unary_expression { $$ = $1; @@ -1632,8 +1634,7 @@ unary_expression: unary_operation expression_base { auto *arguments = new quickstep::PtrList<quickstep::ParseExpression>(); arguments->push_back($2); - $$ = new quickstep::ParseFunctionCall( - @1.first_line, @1.first_column, false, $1, arguments); + $$ = new quickstep::ParseFunctionCall(@1.first_line, @1.first_column, false, $1, arguments); } | expression_base { $$ = $1; @@ -1693,7 +1694,7 @@ function_call: }; cast_function: - TOKEN_CAST '(' add_expression TOKEN_AS data_type ')' { + TOKEN_CAST '(' add_expression TOKEN_AS data_type ')' { auto *arguments = new quickstep::PtrList<quickstep::ParseExpression>(); arguments->push_back($3); arguments->push_back(new quickstep::ParseScalarLiteral( @@ -1706,6 +1707,15 @@ cast_function: auto *name = new quickstep::ParseString(@1.first_line, @1.first_column, "cast"); $$ = new quickstep::ParseFunctionCall( @1.first_line, @1.first_column, false, name, arguments); + } + | TOKEN_CAST '(' add_expression TOKEN_AS any_name ')' { + auto *arguments = new quickstep::PtrList<quickstep::ParseExpression>(); + arguments->push_back($3); + arguments->push_back(new quickstep::ParseScalarLiteral( + new quickstep::StringParseLiteralValue($5, nullptr))); + auto *name = new quickstep::ParseString(@1.first_line, @1.first_column, "cast"); + $$ = new quickstep::ParseFunctionCall( + @1.first_line, @1.first_column, false, name, arguments); }; extract_function: @@ -1960,21 +1970,21 @@ unary_operation: add_operation: '+' { - $$ = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kAdd); + $$ = new quickstep::ParseString(@1.first_line, @1.first_column, std::string("+")); } | '-' { - $$ = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kSubtract); + $$ = new quickstep::ParseString(@1.first_line, @1.first_column, std::string("-")); }; multiply_operation: '%' { - $$ = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kModulo); + $$ = new quickstep::ParseString(@1.first_line, @1.first_column, std::string("%")); } | '*' { - $$ = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kMultiply); + $$ = new quickstep::ParseString(@1.first_line, @1.first_column, std::string("*")); } | '/' { - $$ = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kDivide); + $$ = new quickstep::ParseString(@1.first_line, @1.first_column, std::string("/")); }; /* General Utility Stuff */