| 578 | } // namespace |
| 579 | |
| 580 | std::optional<std::pair<common::Subfield, std::unique_ptr<common::Filter>>> |
| 581 | PrestoExprToSubfieldFilterParser::leafCallToSubfieldFilter( |
| 582 | const core::CallTypedExpr& call, |
| 583 | core::ExpressionEvaluator* evaluator, |
| 584 | bool negated) { |
| 585 | if (call.inputs().empty()) { |
| 586 | return std::nullopt; |
| 587 | } |
| 588 | |
| 589 | const auto* leftSide = call.inputs()[0].get(); |
| 590 | |
| 591 | common::Subfield subfield; |
| 592 | if (call.name() == "eq") { |
| 593 | if (toSubfield(leftSide, subfield)) { |
| 594 | auto filter = negated ? makeNotEqualFilter(call.inputs()[1], evaluator) |
| 595 | : makeEqualFilter(call.inputs()[1], evaluator); |
| 596 | |
| 597 | return combine(subfield, filter); |
| 598 | } |
| 599 | } else if (call.name() == "neq") { |
| 600 | if (toSubfield(leftSide, subfield)) { |
| 601 | auto filter = negated ? makeEqualFilter(call.inputs()[1], evaluator) |
| 602 | : makeNotEqualFilter(call.inputs()[1], evaluator); |
| 603 | return combine(subfield, filter); |
| 604 | } |
| 605 | } else if (call.name() == "lte") { |
| 606 | if (toSubfield(leftSide, subfield)) { |
| 607 | auto filter = negated |
| 608 | ? makeGreaterThanFilter(call.inputs()[1], evaluator) |
| 609 | : makeLessThanOrEqualFilter(call.inputs()[1], evaluator); |
| 610 | return combine(subfield, filter); |
| 611 | } |
| 612 | } else if (call.name() == "lt") { |
| 613 | if (toSubfield(leftSide, subfield)) { |
| 614 | auto filter = negated |
| 615 | ? makeGreaterThanOrEqualFilter(call.inputs()[1], evaluator) |
| 616 | : makeLessThanFilter(call.inputs()[1], evaluator); |
| 617 | return combine(subfield, filter); |
| 618 | } |
| 619 | } else if (call.name() == "gte") { |
| 620 | if (toSubfield(leftSide, subfield)) { |
| 621 | auto filter = negated |
| 622 | ? makeLessThanFilter(call.inputs()[1], evaluator) |
| 623 | : makeGreaterThanOrEqualFilter(call.inputs()[1], evaluator); |
| 624 | return combine(subfield, filter); |
| 625 | } |
| 626 | } else if (call.name() == "gt") { |
| 627 | if (toSubfield(leftSide, subfield)) { |
| 628 | auto filter = negated |
| 629 | ? makeLessThanOrEqualFilter(call.inputs()[1], evaluator) |
| 630 | : makeGreaterThanFilter(call.inputs()[1], evaluator); |
| 631 | return combine(subfield, filter); |
| 632 | } |
| 633 | } else if (call.name() == "between") { |
| 634 | if (toSubfield(leftSide, subfield)) { |
| 635 | auto filter = makeBetweenFilter( |
| 636 | call.inputs()[1], call.inputs()[2], evaluator, negated); |
| 637 | return combine(subfield, filter); |
no test coverage detected