in velox/type/Filter.cpp [977:1051]
std::unique_ptr<Filter> BytesRange::mergeWith(const Filter* other) const {
switch (other->kind()) {
case FilterKind::kAlwaysTrue:
case FilterKind::kAlwaysFalse:
case FilterKind::kIsNull:
return other->mergeWith(this);
case FilterKind::kIsNotNull:
return this->clone(false);
case FilterKind::kBytesValues:
case FilterKind::kMultiRange:
return other->mergeWith(this);
case FilterKind::kBytesRange: {
bool bothNullAllowed = nullAllowed_ && other->testNull();
auto otherRange = static_cast<const BytesRange*>(other);
bool upperUnbounded = false;
bool lowerUnbounded = false;
bool upperExclusive = false;
bool lowerExclusive = false;
std::string upper = "";
std::string lower = "";
if (lowerUnbounded_) {
lowerUnbounded = otherRange->lowerUnbounded_;
lowerExclusive = otherRange->lowerExclusive_;
lower = otherRange->lower_;
} else if (otherRange->lowerUnbounded_) {
lowerUnbounded = lowerUnbounded_;
lowerExclusive = lowerExclusive_;
lower = lower_;
} else {
lowerUnbounded = false;
auto compare = lower_.compare(otherRange->lower_);
lower = compare < 0 ? otherRange->lower_ : lower_;
lowerExclusive = mergeExclusive(
-compare, lowerExclusive_, otherRange->lowerExclusive_);
}
if (upperUnbounded_) {
upperUnbounded = otherRange->upperUnbounded_;
upperExclusive = otherRange->upperExclusive_;
upper = otherRange->upper_;
} else if (otherRange->upperUnbounded_) {
upperUnbounded = upperUnbounded_;
upperExclusive = upperExclusive_;
upper = upper_;
} else {
upperUnbounded = false;
auto compare = upper_.compare(otherRange->upper_);
upper = compare < 0 ? upper_ : otherRange->upper_;
upperExclusive = mergeExclusive(
compare, upperExclusive_, otherRange->upperExclusive_);
}
if (!lowerUnbounded && !upperUnbounded &&
(lower > upper ||
(lower == upper && (lowerExclusive || upperExclusive)))) {
return nullOrFalse(bothNullAllowed);
}
return std::make_unique<BytesRange>(
lower,
lowerUnbounded,
lowerExclusive,
upper,
upperUnbounded,
upperExclusive,
bothNullAllowed);
}
default:
VELOX_UNREACHABLE();
}
}