/** * 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_PREDICATELEAF_HH #define ORC_PREDICATELEAF_HH #include "orc/Common.hh" #include "orc/sargs/Literal.hh" #include "orc/sargs/TruthValue.hh" #include "wrap/orc-proto-wrapper.hh" #include <string> #include <vector> namespace orc { static constexpr uint64_t INVALID_COLUMN_ID = std::numeric_limits<uint64_t>::max(); class BloomFilter; /** * The primitive predicates that form a SearchArgument. */ class PredicateLeaf { public: /** * The possible operators for predicates. To get the opposites, construct * an expression with a not operator. */ enum class Operator { EQUALS = 0, NULL_SAFE_EQUALS, LESS_THAN, LESS_THAN_EQUALS, IN, BETWEEN, IS_NULL }; // The possible types for sargs. enum class Type { LONG = 0, // all of the integer types FLOAT, // float and double STRING, // string, char, varchar DATE, DECIMAL, TIMESTAMP, BOOLEAN }; PredicateLeaf() = default; PredicateLeaf(Operator op, PredicateDataType type, const std::string& colName, Literal literal); PredicateLeaf(Operator op, PredicateDataType type, uint64_t columnId, Literal literal); PredicateLeaf(Operator op, PredicateDataType type, const std::string& colName, const std::initializer_list<Literal>& literalList); PredicateLeaf(Operator op, PredicateDataType type, uint64_t columnId, const std::initializer_list<Literal>& literalList); PredicateLeaf(Operator op, PredicateDataType type, const std::string& colName, const std::vector<Literal>& literalList); PredicateLeaf(Operator op, PredicateDataType type, uint64_t columnId, const std::vector<Literal>& literalList); /** * Get the operator for the leaf. */ Operator getOperator() const; /** * Get the type of the column and literal by the file format. */ PredicateDataType getType() const; /** * Get whether the predicate is created using column name. */ bool hasColumnName() const; /** * Get the simple column name. */ const std::string& getColumnName() const; /** * Get the column id. */ uint64_t getColumnId() const; /** * Get the literal half of the predicate leaf. */ Literal getLiteral() const; /** * For operators with multiple literals (IN and BETWEEN), get the literals. */ const std::vector<Literal>& getLiteralList() const; /** * Evaluate current PredicateLeaf based on ColumnStatistics and BloomFilter */ TruthValue evaluate(const WriterVersion writerVersion, const proto::ColumnStatistics& colStats, const BloomFilter* bloomFilter) const; std::string toString() const; bool operator==(const PredicateLeaf& r) const; size_t getHashCode() const { return hashCode_; } private: size_t hashCode() const; void validate() const; void validateColumn() const; std::string columnDebugString() const; TruthValue evaluatePredicateMinMax(const proto::ColumnStatistics& colStats) const; TruthValue evaluatePredicateBloomFiter(const BloomFilter* bloomFilter, bool hasNull) const; private: Operator operator_; PredicateDataType type_; std::string columnName_; bool hasColumnName_; uint64_t columnId_; std::vector<Literal> literals_; size_t hashCode_; }; struct PredicateLeafHash { size_t operator()(const PredicateLeaf& leaf) const { return leaf.getHashCode(); } }; struct PredicateLeafComparator { bool operator()(const PredicateLeaf& lhs, const PredicateLeaf& rhs) const { return lhs == rhs; } }; } // namespace orc #endif // ORC_PREDICATELEAF_HH