| // 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 IMPALA_EXPRS_CONDITIONAL_FUNCTIONS_H |
| #define IMPALA_EXPRS_CONDITIONAL_FUNCTIONS_H |
| |
| #include <stdint.h> |
| |
| #include "exprs/scalar-expr.h" |
| #include "udf/udf.h" |
| |
| namespace impala { |
| |
| using impala_udf::FunctionContext; |
| using impala_udf::AnyVal; |
| using impala_udf::BooleanVal; |
| using impala_udf::TinyIntVal; |
| using impala_udf::SmallIntVal; |
| using impala_udf::IntVal; |
| using impala_udf::BigIntVal; |
| using impala_udf::FloatVal; |
| using impala_udf::DoubleVal; |
| using impala_udf::TimestampVal; |
| using impala_udf::StringVal; |
| using impala_udf::DecimalVal; |
| using impala_udf::DateVal; |
| |
| class ScalarExprEvaluator; |
| class TupleRow; |
| |
| /// Conditional functions that can be expressed as UDFs |
| class ConditionalFunctions { |
| public: |
| static TinyIntVal NullIfZero(FunctionContext* context, const TinyIntVal& val); |
| static SmallIntVal NullIfZero(FunctionContext* context, const SmallIntVal& val); |
| static IntVal NullIfZero(FunctionContext* context, const IntVal& val); |
| static BigIntVal NullIfZero(FunctionContext* context, const BigIntVal& val); |
| static FloatVal NullIfZero(FunctionContext* context, const FloatVal& val); |
| static DoubleVal NullIfZero(FunctionContext* context, const DoubleVal& val); |
| static DecimalVal NullIfZero(FunctionContext* context, const DecimalVal& val); |
| |
| static TinyIntVal ZeroIfNull(FunctionContext* context, const TinyIntVal& val); |
| static SmallIntVal ZeroIfNull(FunctionContext* context, const SmallIntVal& val); |
| static IntVal ZeroIfNull(FunctionContext* context, const IntVal& val); |
| static BigIntVal ZeroIfNull(FunctionContext* context, const BigIntVal& val); |
| static FloatVal ZeroIfNull(FunctionContext* context, const FloatVal& val); |
| static DoubleVal ZeroIfNull(FunctionContext* context, const DoubleVal& val); |
| static DecimalVal ZeroIfNull(FunctionContext* context, const DecimalVal& val); |
| |
| /// Functions IsFalse and IsTrue return false when the input is NULL. |
| /// Functions IsNotFalse and IsNotTrue return true when the input is NULL. |
| static BooleanVal IsFalse(FunctionContext* ctx, const BooleanVal& val); |
| static BooleanVal IsNotFalse(FunctionContext* ctx, const BooleanVal& val); |
| static BooleanVal IsTrue(FunctionContext* ctx, const BooleanVal& val); |
| static BooleanVal IsNotTrue(FunctionContext* ctx, const BooleanVal& val); |
| }; |
| |
| /// The following conditional functions require separate Expr classes to take advantage of |
| /// short circuiting |
| |
| class IsNullExpr : public ScalarExpr { |
| public: |
| virtual Status GetCodegendComputeFnImpl(LlvmCodeGen* codegen, llvm::Function** fn) |
| override WARN_UNUSED_RESULT; |
| virtual std::string DebugString() const override { |
| return ScalarExpr::DebugString("IsNullExpr"); |
| } |
| |
| protected: |
| friend class ScalarExpr; |
| friend class ScalarExprEvaluator; |
| IsNullExpr(const TExprNode& node) : ScalarExpr(node) {} |
| GENERATE_GET_VAL_INTERPRETED_OVERRIDES_FOR_ALL_SCALAR_TYPES |
| }; |
| |
| class IfExpr : public ScalarExpr { |
| public: |
| virtual Status GetCodegendComputeFnImpl(LlvmCodeGen* codegen, llvm::Function** fn) |
| override WARN_UNUSED_RESULT; |
| virtual std::string DebugString() const override { |
| return ScalarExpr::DebugString("IfExpr"); |
| } |
| |
| protected: |
| friend class ScalarExpr; |
| friend class ScalarExprEvaluator; |
| |
| IfExpr(const TExprNode& node) : ScalarExpr(node) {} |
| GENERATE_GET_VAL_INTERPRETED_OVERRIDES_FOR_ALL_SCALAR_TYPES |
| }; |
| |
| class CoalesceExpr : public ScalarExpr { |
| public: |
| virtual Status GetCodegendComputeFnImpl(LlvmCodeGen* codegen, llvm::Function** fn) |
| override WARN_UNUSED_RESULT; |
| virtual std::string DebugString() const override { |
| return ScalarExpr::DebugString("CoalesceExpr"); |
| } |
| |
| protected: |
| friend class ScalarExpr; |
| friend class ScalarExprEvaluator; |
| |
| CoalesceExpr(const TExprNode& node) : ScalarExpr(node) { } |
| GENERATE_GET_VAL_INTERPRETED_OVERRIDES_FOR_ALL_SCALAR_TYPES |
| }; |
| |
| } |
| |
| #endif |