blob: 6d52b7c6cfcfc8780a7152b0c75716b7457490f2 [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 KUDU_COMMON_SCAN_PREDICATE_H
#define KUDU_COMMON_SCAN_PREDICATE_H
#include <string>
#include <gtest/gtest_prod.h>
#include "kudu/common/schema.h"
#include "kudu/util/bitmap.h"
#include "kudu/util/faststring.h"
namespace kudu {
using std::string;
class RowBlock;
class SelectionVector;
class ValueRange {
public:
// Construct a new column range predicate.
//
// The min_value and upper_bound pointers should point to storage
// which represents a constant cell value to be used as a range.
// The range is inclusive on both ends.
// The cells are not copied by this object, so should remain unchanged
// for the lifetime of this object.
//
// If either optional is unspecified (i.e. NULL), then the range is
// open on that end.
//
// A range must be bounded on at least one end.
ValueRange(const TypeInfo* type,
const void* lower_bound,
const void* upper_bound);
bool has_lower_bound() const {
return lower_bound_;
}
bool has_upper_bound() const {
return upper_bound_;
}
const void* lower_bound() const {
return lower_bound_;
}
const void* upper_bound() const {
return upper_bound_;
}
bool IsEquality() const;
bool ContainsCell(const void* cell) const;
private:
const TypeInfo* type_info_;
const void* lower_bound_;
const void* upper_bound_;
};
// Predicate which evaluates to true when the value for a given column
// is within a specified range.
//
// TODO: extract an interface for this once it's clearer what the interface should
// look like. Column range is not the only predicate in the world.
class ColumnRangePredicate {
public:
// Construct a new column range predicate.
// The lower_bound and upper_bound pointers should point to storage
// which represents a constant cell value to be used as a range.
// The range is inclusive on both ends.
// If either optional is unspecified (i.e. NULL), then the range is
// open on that end.
ColumnRangePredicate(ColumnSchema col, const void* lower_bound,
const void* upper_bound);
const ColumnSchema &column() const {
return col_;
}
string ToString() const;
// Return the value range for which this predicate passes.
const ValueRange &range() const { return range_; }
private:
// For Evaluate.
friend class MaterializingIterator;
friend class PredicateEvaluatingIterator;
FRIEND_TEST(TestPredicate, TestColumnRange);
FRIEND_TEST(TestPredicate, TestDontEvalauteOnUnselectedRows);
// Evaluate the predicate on every row in the rowblock.
//
// This is evaluated as an 'AND' with the current contents of *sel:
// - wherever the predicate evaluates false, set the appropriate bit in the selection
// vector to 0.
// - If the predicate evalutes true, does not make any change to the
// selection vector.
//
// On any rows where the current value of *sel is false, the predicate evaluation
// may be skipped.
//
// NOTE: the evaluation result is stored into '*sel' which may or may not be the
// same vector as block->selection_vector().
void Evaluate(RowBlock *block, SelectionVector *sel) const;
ColumnSchema col_;
ValueRange range_;
};
} // namespace kudu
#endif