@Override public TupleFilter visitLiteral(RexLiteral literal) { String strValue = null; Object literalValue = literal.getValue(); if (literalValue instanceof NlsString) { strValue = ((NlsString) literalValue).getValue(); } else if (literalValue instanceof GregorianCalendar) { GregorianCalendar g = (GregorianCalendar) literalValue; strValue = Long.toString(g.getTimeInMillis()); } else if (literalValue instanceof TimeUnitRange) { // Extract(x from y) in where clause strValue = ((TimeUnitRange) literalValue).name(); } else if (literalValue == null) { strValue = null; } else { strValue = literalValue.toString(); } TupleFilter filter = new ConstantTupleFilter(strValue); return filter; }
public SqlIntervalQualifier( TimeUnit startUnit, int startPrecision, TimeUnit endUnit, int fractionalSecondPrecision, SqlParserPos pos) { super(pos); if (endUnit == startUnit) { endUnit = null; } this.timeUnitRange = TimeUnitRange.of(Objects.requireNonNull(startUnit), endUnit); this.startPrecision = startPrecision; this.fractionalSecondPrecision = fractionalSecondPrecision; }
final List<RexNode> exprs = new LinkedList<>(); String timeUnit = ((SqlIntervalQualifier) operands.get(0)).timeUnitRange.toString();
private static Map<Pair<TimeUnit>, TimeUnitRange> createMap() { Map<Pair<TimeUnit>, TimeUnitRange> map = new HashMap<Pair<TimeUnit>, TimeUnitRange>(); for (TimeUnitRange value : values()) { map.put(new Pair<TimeUnit>(value.startUnit, value.endUnit), value); } return Collections.unmodifiableMap(map); }
public SqlIntervalQualifier( TimeUnit startUnit, int startPrecision, TimeUnit endUnit, int fractionalSecondPrecision, SqlParserPos pos) { super(pos); if (endUnit == startUnit) { endUnit = null; } this.timeUnitRange = TimeUnitRange.of(Objects.requireNonNull(startUnit), endUnit); this.startPrecision = startPrecision; this.fractionalSecondPrecision = fractionalSecondPrecision; }
assertThat(floorSimplifiedExpr.getKind(), is(SqlKind.FLOOR)); assertThat(((RexLiteral) floorSimplifiedExpr.getOperands().get(1)).getValue().toString(), is(timeUnitRanges.get(j).toString())); assertThat(floorSimplifiedExpr.getOperands().get(0).toString(), is(literalTs.toString())); final RexCall ceilSimplifiedExpr = (RexCall) defaultSimplifier.apply(outerCeilCall); assertThat(ceilSimplifiedExpr.getKind(), is(SqlKind.CEIL)); assertThat(((RexLiteral) ceilSimplifiedExpr.getOperands().get(1)).getValue().toString(), is(timeUnitRanges.get(j).toString())); assertThat(ceilSimplifiedExpr.getOperands().get(0).toString(), is(literalTs.toString()));
private static Map<Pair<TimeUnit>, TimeUnitRange> createMap() { Map<Pair<TimeUnit>, TimeUnitRange> map = new HashMap<>(); for (TimeUnitRange value : values()) { map.put(new Pair<>(value.startUnit, value.endUnit), value); } return Collections.unmodifiableMap(map); }
@Override public TupleFilter visitLiteral(RexLiteral literal) { String strValue = null; Object literalValue = literal.getValue(); if (literalValue instanceof NlsString) { strValue = ((NlsString) literalValue).getValue(); } else if (literalValue instanceof GregorianCalendar) { GregorianCalendar g = (GregorianCalendar) literalValue; strValue = Long.toString(g.getTimeInMillis()); } else if (literalValue instanceof TimeUnitRange) { // Extract(x from y) in where clause strValue = ((TimeUnitRange) literalValue).name(); } else if (literalValue == null) { strValue = null; } else { strValue = literalValue.toString(); } TupleFilter filter = new ConstantTupleFilter(strValue); return filter; }
@Test public void testTimeUnitRange() { assertSame(TimeUnitRange.of(TimeUnit.YEAR, null), TimeUnitRange.YEAR); assertSame(TimeUnitRange.of(TimeUnit.YEAR, TimeUnit.MONTH), TimeUnitRange.YEAR_TO_MONTH); assertSame(TimeUnitRange.of(TimeUnit.MONTH, null), TimeUnitRange.MONTH); assertSame(TimeUnitRange.of(TimeUnit.DAY, null), TimeUnitRange.DAY); assertSame(TimeUnitRange.of(TimeUnit.DAY, TimeUnit.HOUR), TimeUnitRange.DAY_TO_HOUR); assertSame(TimeUnitRange.of(TimeUnit.DAY, TimeUnit.MINUTE), TimeUnitRange.DAY_TO_MINUTE); assertSame(TimeUnitRange.of(TimeUnit.DAY, TimeUnit.SECOND), TimeUnitRange.DAY_TO_SECOND); assertSame(TimeUnitRange.of(TimeUnit.HOUR, null), TimeUnitRange.HOUR); assertSame(TimeUnitRange.of(TimeUnit.HOUR, TimeUnit.MINUTE), TimeUnitRange.HOUR_TO_MINUTE); assertSame(TimeUnitRange.of(TimeUnit.HOUR, TimeUnit.SECOND), TimeUnitRange.HOUR_TO_SECOND); assertSame(TimeUnitRange.of(TimeUnit.MINUTE, null), TimeUnitRange.MINUTE); assertSame(TimeUnitRange.of(TimeUnit.MINUTE, TimeUnit.SECOND), TimeUnitRange.MINUTE_TO_SECOND); assertSame(TimeUnitRange.of(TimeUnit.SECOND, null), TimeUnitRange.SECOND); assertSame(TimeUnitRange.of(TimeUnit.ISOYEAR, null), TimeUnitRange.ISOYEAR); assertSame(TimeUnitRange.of(TimeUnit.QUARTER, null), TimeUnitRange.QUARTER); assertSame(TimeUnitRange.of(TimeUnit.WEEK, null), TimeUnitRange.WEEK); assertSame(TimeUnitRange.of(TimeUnit.MILLISECOND, null), TimeUnitRange.MILLISECOND); assertSame(TimeUnitRange.of(TimeUnit.MICROSECOND, null), TimeUnitRange.MICROSECOND); assertSame(TimeUnitRange.of(TimeUnit.NANOSECOND, null), TimeUnitRange.NANOSECOND); assertSame(TimeUnitRange.of(TimeUnit.DOW, null), TimeUnitRange.DOW); assertSame(TimeUnitRange.of(TimeUnit.ISODOW, null), TimeUnitRange.ISODOW); assertSame(TimeUnitRange.of(TimeUnit.DOY, null), TimeUnitRange.DOY); assertSame(TimeUnitRange.of(TimeUnit.EPOCH, null), TimeUnitRange.EPOCH); assertSame(TimeUnitRange.of(TimeUnit.DECADE, null), TimeUnitRange.DECADE); assertSame(TimeUnitRange.of(TimeUnit.CENTURY, null), TimeUnitRange.CENTURY); assertSame(TimeUnitRange.of(TimeUnit.MILLENNIUM, null), TimeUnitRange.MILLENNIUM); }
assertThat(((RexLiteral) floorSimplifiedExpr.getOperands().get(1)) .getValue().toString(), is(timeUnitRanges.get(j).toString())); assertThat(floorSimplifiedExpr.getOperands().get(0).toString(), is(literalTs.toString())); assertThat(ceilSimplifiedExpr.getKind(), is(SqlKind.CEIL)); assertThat(((RexLiteral) ceilSimplifiedExpr.getOperands().get(1)).getValue().toString(), is(timeUnitRanges.get(j).toString())); assertThat(ceilSimplifiedExpr.getOperands().get(0).toString(), is(literalTs.toString()));
private static Map<Pair<TimeUnit>, TimeUnitRange> createMap() { Map<Pair<TimeUnit>, TimeUnitRange> map = new HashMap<>(); for (TimeUnitRange value : values()) { map.put(new Pair<>(value.startUnit, value.endUnit), value); } return Collections.unmodifiableMap(map); }
@Override public void unparseCall(SqlWriter writer, SqlCall call, int leftPrec, int rightPrec) { switch (call.getKind()) { case FLOOR: if (call.operandCount() != 2) { super.unparseCall(writer, call, leftPrec, rightPrec); return; } final SqlLiteral timeUnitNode = call.operand(1); final TimeUnitRange timeUnit = timeUnitNode.getValueAs(TimeUnitRange.class); SqlCall call2 = SqlFloorFunction.replaceTimeUnitOperand(call, timeUnit.name(), timeUnitNode.getParserPosition()); SqlFloorFunction.unparseDatetimeFunction(writer, call2, "DATE_TRUNC", false); break; default: super.unparseCall(writer, call, leftPrec, rightPrec); } } }
@Test public void testTimeUnitRange() { assertSame(TimeUnitRange.of(TimeUnit.YEAR, null), TimeUnitRange.YEAR); assertSame(TimeUnitRange.of(TimeUnit.YEAR, TimeUnit.MONTH), TimeUnitRange.YEAR_TO_MONTH); assertSame(TimeUnitRange.of(TimeUnit.MONTH, null), TimeUnitRange.MONTH); assertSame(TimeUnitRange.of(TimeUnit.DAY, null), TimeUnitRange.DAY); assertSame(TimeUnitRange.of(TimeUnit.DAY, TimeUnit.HOUR), TimeUnitRange.DAY_TO_HOUR); assertSame(TimeUnitRange.of(TimeUnit.DAY, TimeUnit.MINUTE), TimeUnitRange.DAY_TO_MINUTE); assertSame(TimeUnitRange.of(TimeUnit.DAY, TimeUnit.SECOND), TimeUnitRange.DAY_TO_SECOND); assertSame(TimeUnitRange.of(TimeUnit.HOUR, null), TimeUnitRange.HOUR); assertSame(TimeUnitRange.of(TimeUnit.HOUR, TimeUnit.MINUTE), TimeUnitRange.HOUR_TO_MINUTE); assertSame(TimeUnitRange.of(TimeUnit.HOUR, TimeUnit.SECOND), TimeUnitRange.HOUR_TO_SECOND); assertSame(TimeUnitRange.of(TimeUnit.MINUTE, null), TimeUnitRange.MINUTE); assertSame(TimeUnitRange.of(TimeUnit.MINUTE, TimeUnit.SECOND), TimeUnitRange.MINUTE_TO_SECOND); assertSame(TimeUnitRange.of(TimeUnit.SECOND, null), TimeUnitRange.SECOND); assertSame(TimeUnitRange.of(TimeUnit.ISOYEAR, null), TimeUnitRange.ISOYEAR); assertSame(TimeUnitRange.of(TimeUnit.QUARTER, null), TimeUnitRange.QUARTER); assertSame(TimeUnitRange.of(TimeUnit.WEEK, null), TimeUnitRange.WEEK); assertSame(TimeUnitRange.of(TimeUnit.MILLISECOND, null), TimeUnitRange.MILLISECOND); assertSame(TimeUnitRange.of(TimeUnit.MICROSECOND, null), TimeUnitRange.MICROSECOND); assertSame(TimeUnitRange.of(TimeUnit.NANOSECOND, null), TimeUnitRange.NANOSECOND); assertSame(TimeUnitRange.of(TimeUnit.DOW, null), TimeUnitRange.DOW); assertSame(TimeUnitRange.of(TimeUnit.ISODOW, null), TimeUnitRange.ISODOW); assertSame(TimeUnitRange.of(TimeUnit.DOY, null), TimeUnitRange.DOY); assertSame(TimeUnitRange.of(TimeUnit.EPOCH, null), TimeUnitRange.EPOCH); assertSame(TimeUnitRange.of(TimeUnit.DECADE, null), TimeUnitRange.DECADE); assertSame(TimeUnitRange.of(TimeUnit.CENTURY, null), TimeUnitRange.CENTURY); assertSame(TimeUnitRange.of(TimeUnit.MILLENNIUM, null), TimeUnitRange.MILLENNIUM); }
@Override public void unparseCall(SqlWriter writer, SqlCall call, int leftPrec, int rightPrec) { switch (call.getKind()) { case FLOOR: if (call.operandCount() != 2) { super.unparseCall(writer, call, leftPrec, rightPrec); return; } final SqlLiteral timeUnitNode = call.operand(1); final TimeUnitRange timeUnit = timeUnitNode.getValueAs(TimeUnitRange.class); SqlCall call2 = SqlFloorFunction.replaceTimeUnitOperand(call, timeUnit.name(), timeUnitNode.getParserPosition()); SqlFloorFunction.unparseDatetimeFunction(writer, call2, "DATE_TRUNC", false); break; default: super.unparseCall(writer, call, leftPrec, rightPrec); } } }