in cpp/velox/operators/functions/SparkExprToSubfieldFilterParser.cc [23:78]
std::unique_ptr<common::Filter> SparkExprToSubfieldFilterParser::leafCallToSubfieldFilter(
const core::CallTypedExpr& call,
common::Subfield& subfield,
core::ExpressionEvaluator* evaluator,
bool negated) {
if (call.inputs().empty()) {
return nullptr;
}
const auto* leftSide = call.inputs()[0].get();
if (call.name() == "equalto") {
if (toSubfield(leftSide, subfield)) {
return negated ? makeNotEqualFilter(call.inputs()[1], evaluator) : makeEqualFilter(call.inputs()[1], evaluator);
}
} else if (call.name() == "lessthanorequal") {
if (toSubfield(leftSide, subfield)) {
return negated ? makeGreaterThanFilter(call.inputs()[1], evaluator)
: makeLessThanOrEqualFilter(call.inputs()[1], evaluator);
}
} else if (call.name() == "lessthan") {
if (toSubfield(leftSide, subfield)) {
return negated ? makeGreaterThanOrEqualFilter(call.inputs()[1], evaluator)
: makeLessThanFilter(call.inputs()[1], evaluator);
}
} else if (call.name() == "greaterthanorequal") {
if (toSubfield(leftSide, subfield)) {
return negated ? makeLessThanFilter(call.inputs()[1], evaluator)
: makeGreaterThanOrEqualFilter(call.inputs()[1], evaluator);
}
} else if (call.name() == "greaterthan") {
if (toSubfield(leftSide, subfield)) {
return negated ? makeLessThanOrEqualFilter(call.inputs()[1], evaluator)
: makeGreaterThanFilter(call.inputs()[1], evaluator);
}
} else if (call.name() == "in") {
if (toSubfield(leftSide, subfield)) {
return makeInFilter(call.inputs()[1], evaluator, negated);
}
} else if (call.name() == "isnull") {
if (toSubfield(leftSide, subfield)) {
if (negated) {
return exec::isNotNull();
}
return exec::isNull();
}
} else if (call.name() == "isnotnull") {
if (toSubfield(leftSide, subfield)) {
if (negated) {
return exec::isNull();
}
return exec::isNotNull();
}
}
return nullptr;
}