if (minLiteral.getValue().compareTo(literal.getValue()) > 0 || maxLiteral.getValue().compareTo(literal.getValue()) < 0) { return rexBuilder.makeLiteral(false); if (minLiteral.getValue().compareTo(literal.getValue()) > 0) { return rexBuilder.makeLiteral(true); } else if (maxLiteral.getValue().compareTo(literal.getValue()) <= 0) { return rexBuilder.makeLiteral(false); if (minLiteral.getValue().compareTo(literal.getValue()) >= 0) { return rexBuilder.makeLiteral(true); } else if (maxLiteral.getValue().compareTo(literal.getValue()) < 0) { return rexBuilder.makeLiteral(false); if (minLiteral.getValue().compareTo(literal.getValue()) >= 0) { return rexBuilder.makeLiteral(false); } else if (maxLiteral.getValue().compareTo(literal.getValue()) < 0) { return rexBuilder.makeLiteral(true); if (minLiteral.getValue().compareTo(literal.getValue()) > 0) { return rexBuilder.makeLiteral(false); } else if (maxLiteral.getValue().compareTo(literal.getValue()) <= 0) { return rexBuilder.makeLiteral(true);
case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: if (literal.getValue() == null) { return ASTBuilder.construct(HiveParser.TOK_NULL, "TOK_NULL").node(); case INTERVAL_YEAR_MONTH: { type = HiveParser.TOK_INTERVAL_YEAR_MONTH_LITERAL; BigDecimal monthsBd = (BigDecimal) literal.getValue(); HiveIntervalYearMonth intervalYearMonth = new HiveIntervalYearMonth(monthsBd.intValue()); val = "'" + intervalYearMonth.toString() + "'"; case INTERVAL_SECOND: { type = HiveParser.TOK_INTERVAL_DAY_TIME_LITERAL; BigDecimal millisBd = (BigDecimal) literal.getValue();
patternStr = pattern.getValue().toString(); } else if (pattern.getTypeName() == SqlTypeName.CHAR) { patternStr = pattern.getValue2().toString(); patternStr = pattern.getValue().toString(); } else if (pattern.getTypeName() == SqlTypeName.CHAR) { patternStr = pattern.getValue2().toString(); escapeStr = escape.getValue().toString(); } else if (escape.getTypeName() == SqlTypeName.CHAR) { escapeStr = escape.getValue2().toString();
if (minLiteral.getValue().compareTo(literal.getValue()) > 0 || maxLiteral.getValue().compareTo(literal.getValue()) < 0) { return rexBuilder.makeLiteral(false); if (minLiteral.getValue().compareTo(literal.getValue()) > 0) { return rexBuilder.makeLiteral(true); } else if (maxLiteral.getValue().compareTo(literal.getValue()) <= 0) { return rexBuilder.makeLiteral(false); if (minLiteral.getValue().compareTo(literal.getValue()) >= 0) { return rexBuilder.makeLiteral(true); } else if (maxLiteral.getValue().compareTo(literal.getValue()) < 0) { return rexBuilder.makeLiteral(false); if (minLiteral.getValue().compareTo(literal.getValue()) >= 0) { return rexBuilder.makeLiteral(false); } else if (maxLiteral.getValue().compareTo(literal.getValue()) < 0) { return rexBuilder.makeLiteral(true); if (minLiteral.getValue().compareTo(literal.getValue()) > 0) { return rexBuilder.makeLiteral(false); } else if (maxLiteral.getValue().compareTo(literal.getValue()) <= 0) { return rexBuilder.makeLiteral(true);
case INTERVAL_MONTH: case INTERVAL_YEAR_MONTH: { BigDecimal monthsBd = (BigDecimal) literal.getValue(); return new ExprNodeConstantDesc(TypeInfoFactory.intervalYearMonthTypeInfo, new HiveIntervalYearMonth(monthsBd.intValue())); case INTERVAL_MINUTE_SECOND: case INTERVAL_SECOND: { BigDecimal millisBd = (BigDecimal) literal.getValue();
@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; }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { // EXTRACT(timeUnit FROM arg) final RexCall call = (RexCall) rexNode; final RexLiteral flag = (RexLiteral) call.getOperands().get(0); final TimeUnitRange calciteUnit = (TimeUnitRange) flag.getValue(); final RexNode arg = call.getOperands().get(1); final DruidExpression input = Expressions.toDruidExpression(plannerContext, rowSignature, arg); if (input == null) { return null; } final TimestampExtractExprMacro.Unit druidUnit = EXTRACT_UNIT_MAP.get(calciteUnit); if (druidUnit == null) { // Don't know how to extract this time unit. return null; } return TimeExtractOperatorConversion.applyTimeExtract(input, druidUnit, plannerContext.getTimeZone()); } }
final SqlTrimFunction.Flag trimStyle = (SqlTrimFunction.Flag) flag.getValue();
@Override public void implementOLAP(OLAPImplementor implementor) { implementor.fixSharedOlapTableScan(this); implementor.visitChild(getInput(), this); this.columnRowType = buildColumnRowType(); this.context = implementor.getContext(); // ignore limit after having clause // ignore limit after another limit, e.g. select A, count(*) from (select A,B from fact group by A,B limit 100) limit 10 // ignore limit after outer aggregate, e.g. select count(1) from (select A,B from fact group by A,B ) limit 10 if (!context.afterHavingClauseFilter && !context.afterLimit && !context.afterOuterAggregate && !context.disableLimitPushdown) { Number limitValue = (Number) (((RexLiteral) localFetch).getValue()); int limit = limitValue.intValue(); this.context.storageContext.setLimit(limit); if (localOffset != null) { Number offsetValue = (Number) (((RexLiteral) localOffset).getValue()); int offset = offsetValue.intValue(); this.context.storageContext.setOffset(offset); } context.afterLimit = true; } else { this.context.storageContext.setOverlookOuterLimit(); } }
if (!(elseNode instanceof RexLiteral && ((RexLiteral) elseNode).getValue() == null)) { elseExpr = elseNode.accept(this);
/** Infers the alias of an expression. * * <p>If the expression was created by {@link #alias}, replaces the expression * in the project list. */ private String inferAlias(List<RexNode> exprList, RexNode expr) { switch (expr.getKind()) { case INPUT_REF: final RexInputRef ref = (RexInputRef) expr; return peek(0).getRowType().getFieldNames().get(ref.getIndex()); case CAST: return inferAlias(exprList, ((RexCall) expr).getOperands().get(0)); case AS: final RexCall call = (RexCall) expr; for (;;) { final int i = exprList.indexOf(expr); if (i < 0) { break; } exprList.set(i, call.getOperands().get(0)); } return ((NlsString) ((RexLiteral) call.getOperands().get(1)).getValue()) .getValue(); default: return null; } }
/** Infers the alias of an expression. * * <p>If the expression was created by {@link #alias}, replaces the expression * in the project list. */ private String inferAlias(List<RexNode> exprList, RexNode expr) { switch (expr.getKind()) { case INPUT_REF: final RexInputRef ref = (RexInputRef) expr; return peek(0).getRowType().getFieldNames().get(ref.getIndex()); case CAST: return inferAlias(exprList, ((RexCall) expr).getOperands().get(0)); case AS: final RexCall call = (RexCall) expr; for (;;) { final int i = exprList.indexOf(expr); if (i < 0) { break; } exprList.set(i, call.getOperands().get(0)); } return ((NlsString) ((RexLiteral) call.getOperands().get(1)).getValue()) .getValue(); default: return null; } }
final TimeUnitRange timeUnit = (TimeUnitRange) flag.getValue(); final PeriodGranularity granularity = TimeUnits.toQueryGranularity(timeUnit, plannerContext.getTimeZone()); if (granularity == null) {
@Override public TupleExpression visitLiteral(RexLiteral literal) { TupleExpression tuple; Object value = literal.getValue(); if (value instanceof Number) { tuple = new NumberTupleExpression(value); } else { if (value == null) { tuple = new StringTupleExpression(null); } else if (value instanceof NlsString) { tuple = new StringTupleExpression(((NlsString) value).getValue()); } else { tuple = new StringTupleExpression(value.toString()); } } tuple.setDigest(literal.toString()); return tuple; } }
final TimeUnitRange timeUnit = (TimeUnitRange) flag.getValue(); final PeriodGranularity granularity = TimeUnits.toQueryGranularity(timeUnit, plannerContext.getTimeZone()); if (granularity == null) {
@Test public void testIsNull_all() { // @formatter:off final RelNode basePlan = builder .scan("t") .filter( builder.call(SqlStdOperatorTable.IS_NULL, builder.field("_str") ) ) .build(); // @formatter:on statObj.setNumNulls(3); planner.setRoot(basePlan); System.out.println(RelOptUtil.toString(basePlan)); RelNode optimizedRelNode = planner.findBestExp(); System.out.println(RelOptUtil.toString(optimizedRelNode)); assertEquals("missing literal", SqlKind.LITERAL, optimizedRelNode.getChildExps().get(0).getKind()); RexLiteral val = (RexLiteral) optimizedRelNode.getChildExps().get(0); assertEquals(true, val.getValue()); }
@Test public void testIsNull_zero() { // @formatter:off final RelNode basePlan = builder .scan("t") .filter( builder.call(SqlStdOperatorTable.IS_NULL, builder.field("_str") ) ) .build(); // @formatter:on statObj.setNumNulls(0); planner.setRoot(basePlan); System.out.println(RelOptUtil.toString(basePlan)); RelNode optimizedRelNode = planner.findBestExp(); System.out.println(RelOptUtil.toString(optimizedRelNode)); assertEquals("missing literal", SqlKind.LITERAL, optimizedRelNode.getChildExps().get(0).getKind()); RexLiteral val = (RexLiteral) optimizedRelNode.getChildExps().get(0); assertEquals(false, val.getValue()); }
@Test public void testIsNotNull() { // @formatter:off final RelNode basePlan = builder .scan("t") .filter( builder.call(SqlStdOperatorTable.IS_NOT_NULL, builder.field("_str") ) ) .build(); // @formatter:on statObj.setNumNulls(0); planner.setRoot(basePlan); System.out.println(RelOptUtil.toString(basePlan)); RelNode optimizedRelNode = planner.findBestExp(); System.out.println(RelOptUtil.toString(optimizedRelNode)); assertEquals("missing literal", SqlKind.LITERAL, optimizedRelNode.getChildExps().get(0).getKind()); RexLiteral val = (RexLiteral) optimizedRelNode.getChildExps().get(0); assertEquals(true, val.getValue()); }
@Test public void testGreaterThan_Below() { // @formatter:off final RelNode basePlan = builder .scan("t") .filter( builder.call(SqlStdOperatorTable.GREATER_THAN, builder.field("_int"), builder.literal(0) ) ) .build(); // @formatter:on statObj.setRange(100, 200); planner.setRoot(basePlan); RelNode optimizedRelNode = planner.findBestExp(); assertEquals("missing literal", SqlKind.LITERAL, optimizedRelNode.getChildExps().get(0).getKind()); RexLiteral val = (RexLiteral) optimizedRelNode.getChildExps().get(0); assertEquals(true, val.getValue()); }