blob: 4b2789af04c049b5c32a59ee124195129102244c [file] [log] [blame]
// 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 GANDIVA_EXPR_TREE_BUILDER_H
#define GANDIVA_EXPR_TREE_BUILDER_H
#include <memory>
#include <string>
#include <unordered_set>
#include <vector>
#include "arrow/type.h"
#include "gandiva/condition.h"
#include "gandiva/decimal_scalar.h"
#include "gandiva/expression.h"
#include "gandiva/visibility.h"
namespace gandiva {
/// \brief Tree Builder for a nested expression.
class GANDIVA_EXPORT TreeExprBuilder {
public:
/// \brief create a node on a literal.
static NodePtr MakeLiteral(bool value);
static NodePtr MakeLiteral(uint8_t value);
static NodePtr MakeLiteral(uint16_t value);
static NodePtr MakeLiteral(uint32_t value);
static NodePtr MakeLiteral(uint64_t value);
static NodePtr MakeLiteral(int8_t value);
static NodePtr MakeLiteral(int16_t value);
static NodePtr MakeLiteral(int32_t value);
static NodePtr MakeLiteral(int64_t value);
static NodePtr MakeLiteral(float value);
static NodePtr MakeLiteral(double value);
static NodePtr MakeStringLiteral(const std::string& value);
static NodePtr MakeBinaryLiteral(const std::string& value);
static NodePtr MakeDecimalLiteral(const DecimalScalar128& value);
/// \brief create a node on a null literal.
/// returns null if data_type is null or if it's not a supported datatype.
static NodePtr MakeNull(DataTypePtr data_type);
/// \brief create a node on arrow field.
/// returns null if input is null.
static NodePtr MakeField(FieldPtr field);
/// \brief create a node with a function.
/// returns null if return_type is null
static NodePtr MakeFunction(const std::string& name, const NodeVector& params,
DataTypePtr return_type);
/// \brief create a node with an if-else expression.
/// returns null if any of the inputs is null.
static NodePtr MakeIf(NodePtr condition, NodePtr then_node, NodePtr else_node,
DataTypePtr result_type);
/// \brief create a node with a boolean AND expression.
static NodePtr MakeAnd(const NodeVector& children);
/// \brief create a node with a boolean OR expression.
static NodePtr MakeOr(const NodeVector& children);
/// \brief create an expression with the specified root_node, and the
/// result written to result_field.
/// returns null if the result_field is null.
static ExpressionPtr MakeExpression(NodePtr root_node, FieldPtr result_field);
/// \brief convenience function for simple function expressions.
/// returns null if the out_field is null.
static ExpressionPtr MakeExpression(const std::string& function,
const FieldVector& in_fields, FieldPtr out_field);
/// \brief create a condition with the specified root_node
static ConditionPtr MakeCondition(NodePtr root_node);
/// \brief convenience function for simple function conditions.
static ConditionPtr MakeCondition(const std::string& function,
const FieldVector& in_fields);
/// \brief creates an in expression
static NodePtr MakeInExpressionInt32(NodePtr node,
const std::unordered_set<int32_t>& constants);
static NodePtr MakeInExpressionInt64(NodePtr node,
const std::unordered_set<int64_t>& constants);
static NodePtr MakeInExpressionString(NodePtr node,
const std::unordered_set<std::string>& constants);
static NodePtr MakeInExpressionBinary(NodePtr node,
const std::unordered_set<std::string>& constants);
/// \brief Date as s/millis since epoch.
static NodePtr MakeInExpressionDate32(NodePtr node,
const std::unordered_set<int32_t>& constants);
/// \brief Date as millis/us/ns since epoch.
static NodePtr MakeInExpressionDate64(NodePtr node,
const std::unordered_set<int64_t>& constants);
/// \brief Time as s/millis of day
static NodePtr MakeInExpressionTime32(NodePtr node,
const std::unordered_set<int32_t>& constants);
/// \brief Time as millis/us/ns of day
static NodePtr MakeInExpressionTime64(NodePtr node,
const std::unordered_set<int64_t>& constants);
/// \brief Timestamp as millis since epoch.
static NodePtr MakeInExpressionTimeStamp(NodePtr node,
const std::unordered_set<int64_t>& constants);
};
} // namespace gandiva
#endif // GANDIVA_EXPR_TREE_BUILDER_H