in src/kudu/common/column_predicate.cc [192:287]
void ColumnPredicate::Simplify() {
auto type_info = column_.type_info();
switch (predicate_type_) {
case PredicateType::None:
case PredicateType::Equality:
case PredicateType::IsNotNull:
case PredicateType::IsNull:
return;
case PredicateType::Range: {
DCHECK(lower_ != nullptr || upper_ != nullptr);
if (lower_ != nullptr && upper_ != nullptr) {
// _ <= VALUE < _
if (type_info->Compare(lower_, upper_) >= 0) {
// If the range bounds are empty then no results can be returned.
SetToNone();
} else if (type_info->AreConsecutive(lower_, upper_)) {
// If the values are consecutive, then it is an equality bound.
predicate_type_ = PredicateType::Equality;
upper_ = nullptr;
}
} else if (lower_ != nullptr) {
// VALUE >= _
if (type_info->IsMinValue(lower_)) {
predicate_type_ = PredicateType::IsNotNull;
lower_ = nullptr;
} else if (type_info->IsMaxValue(lower_)) {
predicate_type_ = PredicateType::Equality;
}
} else if (upper_ != nullptr) {
// VALUE < _
if (type_info->IsMinValue(upper_)) {
SetToNone();
}
}
return;
}
case PredicateType::InList: {
if (values_.empty()) {
// If the list is empty, no results can be returned.
SetToNone();
} else if (values_.size() == 1) {
// List has only one value, so convert to Equality
predicate_type_ = PredicateType::Equality;
lower_ = values_[0];
values_.clear();
} else if (type_info->type() == BOOL) {
// If this is a boolean IN list with both true and false in the list,
// then we can just convert it to IS NOT NULL. This same simplification
// could be done for other integer types, but it's probably not as
// common (and hard to test).
predicate_type_ = PredicateType::IsNotNull;
lower_ = nullptr;
upper_ = nullptr;
values_.clear();
}
return;
}
case PredicateType::InBloomFilter: {
if (lower_ == nullptr && upper_ == nullptr) {
return;
}
// Merge the optional lower and upper bound.
if (lower_ != nullptr && upper_ != nullptr) {
if (type_info->Compare(lower_, upper_) >= 0) {
// If the range bounds are empty then no results can be returned.
SetToNone();
} else if (type_info->AreConsecutive(lower_, upper_)) {
if (CheckValueInBloomFilter(lower_)) {
predicate_type_ = PredicateType::Equality;
upper_ = nullptr;
bloom_filters_.clear();
} else {
SetToNone();
}
}
} else if (lower_ != nullptr) {
if (type_info->IsMinValue(lower_)) {
lower_ = nullptr;
} else if (type_info->IsMaxValue(lower_)) {
if (CheckValueInBloomFilter(lower_)) {
predicate_type_ = PredicateType::Equality;
bloom_filters_.clear();
} else {
SetToNone();
}
}
} else if (upper_ != nullptr) {
if (type_info->IsMinValue(upper_)) {
SetToNone();
}
}
return;
}
}
LOG(FATAL) << "unknown predicate type";
}