MCPcopy Create free account
hub / github.com/apache/calcite / sargRef

Method sargRef

core/src/main/java/org/apache/calcite/rex/RexUtil.java:628–668  ·  view source on GitHub ↗
(SqlParserPos pos, RexBuilder rexBuilder,
      RexNode ref, Sarg<C> sarg, RelDataType type, RexUnknownAs unknownAs)

Source from the content-addressed store, hash-verified

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.

Callers 2

fixMethod · 0.95
visitCallMethod · 0.80

Calls 15

simpleSargMethod · 0.95
composeConjunctionMethod · 0.95
forEachMethod · 0.95
composeDisjunctionMethod · 0.95
makeCallMethod · 0.80
isPointsMethod · 0.80
makeLiteralMethod · 0.80
isComplementedPointsMethod · 0.80
toImmutableListMethod · 0.80
addMethod · 0.65
forEachMethod · 0.65
mapMethod · 0.65

Tested by

no test coverage detected