/**
* 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 ORC_SEARCHARGUMENT_HH
#define ORC_SEARCHARGUMENT_HH
#include "orc/sargs/Literal.hh"
#include "orc/sargs/TruthValue.hh"
namespace orc {
/**
* Primary interface for a search argument, which are the subset of predicates
* that can be pushed down to the RowReader. Each SearchArgument consists
* of a series of search clauses that must each be true for the row to be
* accepted by the filter.
*
* This requires that the filter be normalized into conjunctive normal form
* (CNF).
*/
class SearchArgument {
public:
virtual ~SearchArgument();
/**
* Evaluate the entire predicate based on the values for the leaf predicates.
* @param leaves the value of each leaf predicate
* @return the value of hte entire predicate
*/
virtual TruthValue evaluate(const std::vector& leaves) const = 0;
virtual std::string toString() const = 0;
};
/**
* A builder object to create a SearchArgument from expressions. The user
* must call startOr, startAnd, or startNot before adding any leaves.
*/
class SearchArgumentBuilder {
public:
virtual ~SearchArgumentBuilder();
/**
* Start building an or operation and push it on the stack.
* @return this
*/
virtual SearchArgumentBuilder& startOr() = 0;
/**
* Start building an and operation and push it on the stack.
* @return this
*/
virtual SearchArgumentBuilder& startAnd() = 0;
/**
* Start building a not operation and push it on the stack.
* @return this
*/
virtual SearchArgumentBuilder& startNot() = 0;
/**
* Finish the current operation and pop it off of the stack. Each start
* call must have a matching end.
* @return this
*/
virtual SearchArgumentBuilder& end() = 0;
/**
* Add a less than leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& lessThan(const std::string& column, PredicateDataType type,
Literal literal) = 0;
/**
* Add a less than leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& lessThan(uint64_t columnId, PredicateDataType type,
Literal literal) = 0;
/**
* Add a less than equals leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& lessThanEquals(const std::string& column, PredicateDataType type,
Literal literal) = 0;
/**
* Add a less than equals leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& lessThanEquals(uint64_t columnId, PredicateDataType type,
Literal literal) = 0;
/**
* Add an equals leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& equals(const std::string& column, PredicateDataType type,
Literal literal) = 0;
/**
* Add an equals leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& equals(uint64_t columnId, PredicateDataType type,
Literal literal) = 0;
/**
* Add a null safe equals leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& nullSafeEquals(const std::string& column, PredicateDataType type,
Literal literal) = 0;
/**
* Add a null safe equals leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param literal the literal
* @return this
*/
virtual SearchArgumentBuilder& nullSafeEquals(uint64_t columnId, PredicateDataType type,
Literal literal) = 0;
/**
* Add an in leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param literals the literals
* @return this
*/
virtual SearchArgumentBuilder& in(const std::string& column, PredicateDataType type,
const std::initializer_list& literals) = 0;
/**
* Add an in leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param literals the literals
* @return this
*/
virtual SearchArgumentBuilder& in(uint64_t columnId, PredicateDataType type,
const std::initializer_list& literals) = 0;
/**
* Add an in leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param literals the literals
* @return this
*/
virtual SearchArgumentBuilder& in(const std::string& column, PredicateDataType type,
const std::vector& literals) = 0;
/**
* Add an in leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param literals the literals
* @return this
*/
virtual SearchArgumentBuilder& in(uint64_t columnId, PredicateDataType type,
const std::vector& literals) = 0;
/**
* Add an is null leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @return this
*/
virtual SearchArgumentBuilder& isNull(const std::string& column, PredicateDataType type) = 0;
/**
* Add an is null leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @return this
*/
virtual SearchArgumentBuilder& isNull(uint64_t columnId, PredicateDataType type) = 0;
/**
* Add a between leaf to the current item on the stack.
* @param column the field name of the column
* @param type the type of the expression
* @param lower the literal
* @param upper the literal
* @return this
*/
virtual SearchArgumentBuilder& between(const std::string& column, PredicateDataType type,
Literal lower, Literal upper) = 0;
/**
* Add a between leaf to the current item on the stack.
* @param columnId the column id of the column
* @param type the type of the expression
* @param lower the literal
* @param upper the literal
* @return this
*/
virtual SearchArgumentBuilder& between(uint64_t columnId, PredicateDataType type, Literal lower,
Literal upper) = 0;
/**
* Add a truth value to the expression.
* @param truth truth value
* @return this
*/
virtual SearchArgumentBuilder& literal(TruthValue truth) = 0;
/**
* Build and return the SearchArgument that has been defined. All of the
* starts must have been ended before this call.
* @return the new SearchArgument
*/
virtual std::unique_ptr build() = 0;
};
/**
* Factory to create SearchArgumentBuilder which builds SearchArgument
*/
class SearchArgumentFactory {
public:
static std::unique_ptr newBuilder();
};
} // namespace orc
#endif // ORC_SEARCHARGUMENT_HH