(SqlParserPos pos, RexBuilder rexBuilder,
RexNode ref, Sarg<C> sarg, RelDataType type, RexUnknownAs unknownAs)
| 626 | } |
| 627 | |
| 628 | public static <C extends Comparable<C>> RexNode sargRef(SqlParserPos pos, RexBuilder rexBuilder, |
| 629 | RexNode ref, Sarg<C> sarg, RelDataType type, RexUnknownAs unknownAs) { |
| 630 | if (sarg.isAll() || sarg.isNone()) { |
| 631 | return simpleSarg(pos, rexBuilder, ref, sarg, unknownAs); |
| 632 | } |
| 633 | final List<RexNode> orList = new ArrayList<>(); |
| 634 | if (sarg.nullAs == RexUnknownAs.TRUE |
| 635 | && unknownAs == RexUnknownAs.UNKNOWN) { |
| 636 | orList.add(rexBuilder.makeCall(pos, SqlStdOperatorTable.IS_NULL, ref)); |
| 637 | } |
| 638 | if (sarg.isPoints()) { |
| 639 | // Generate 'ref = value1 OR ... OR ref = valueN' |
| 640 | sarg.rangeSet.asRanges().forEach(range -> |
| 641 | orList.add( |
| 642 | rexBuilder.makeCall(pos, SqlStdOperatorTable.EQUALS, ref, |
| 643 | rexBuilder.makeLiteral(range.lowerEndpoint(), |
| 644 | type, true, true)))); |
| 645 | } else if (sarg.isComplementedPoints()) { |
| 646 | // Generate 'ref <> value1 AND ... AND ref <> valueN' |
| 647 | final List<RexNode> list = sarg.rangeSet.complement().asRanges().stream() |
| 648 | .map(range -> |
| 649 | rexBuilder.makeCall(pos, SqlStdOperatorTable.NOT_EQUALS, ref, |
| 650 | rexBuilder.makeLiteral(range.lowerEndpoint(), |
| 651 | type, true, true))) |
| 652 | .collect(toImmutableList()); |
| 653 | orList.add(composeConjunction(rexBuilder, list)); |
| 654 | } else { |
| 655 | final RangeSets.Consumer<C> consumer = |
| 656 | new RangeToRex<>(pos, ref, orList, rexBuilder, type); |
| 657 | RangeSets.forEach(sarg.rangeSet, consumer); |
| 658 | } |
| 659 | RexNode node = composeDisjunction(rexBuilder, orList); |
| 660 | if (sarg.nullAs == RexUnknownAs.FALSE |
| 661 | && unknownAs == RexUnknownAs.UNKNOWN) { |
| 662 | node = |
| 663 | rexBuilder.makeCall(pos, SqlStdOperatorTable.AND, |
| 664 | rexBuilder.makeCall(pos, SqlStdOperatorTable.IS_NOT_NULL, ref), |
| 665 | node); |
| 666 | } |
| 667 | return node; |
| 668 | } |
| 669 | |
| 670 | /** |
| 671 | * Create a sargRef object. |
no test coverage detected