private static List<RexNode> createInClauses(RexBuilder rexBuilder, Map<String, RexNode> stringToExpr, Multimap<String, String> inLHSExprToRHSExprs) { List<RexNode> newExpressions = Lists.newArrayList(); for (Entry<String,Collection<String>> entry : inLHSExprToRHSExprs.asMap().entrySet()) { String ref = entry.getKey(); Collection<String> exprs = entry.getValue(); if (exprs.isEmpty()) { newExpressions.add(rexBuilder.makeLiteral(false)); } else { List<RexNode> newOperands = new ArrayList<RexNode>(exprs.size() + 1); newOperands.add(stringToExpr.get(ref)); for (String expr : exprs) { newOperands.add(stringToExpr.get(expr)); } newExpressions.add(rexBuilder.makeCall(HiveIn.INSTANCE, newOperands)); } } return newExpressions; }
private RexNode integerLiteral(final int integer) { return rexBuilder.makeLiteral(new BigDecimal(integer), typeFactory.createSqlType(SqlTypeName.INTEGER), true); }
SqlStdOperatorTable.EQUALS, leftExpressions.get(i), getCluster().getRexBuilder().makeLiteral(value)
@Override public double estimateRowCount(RelMetadataQuery mq) { return mq.getDistinctRowCount(this, groupSet, getCluster().getRexBuilder().makeLiteral(true)); }
@Override public double estimateRowCount(RelMetadataQuery mq) { return mq.getDistinctRowCount(this, groupSet, getCluster().getRexBuilder().makeLiteral(true)); }
public static Double getDistinctRowCount(RelNode r, RelMetadataQuery mq, int indx) { ImmutableBitSet bitSetOfRqdProj = ImmutableBitSet.of(indx); return mq.getDistinctRowCount(r, bitSetOfRqdProj, r .getCluster().getRexBuilder().makeLiteral(true)); }
public static Double getDistinctRowCount(RelNode r, RelMetadataQuery mq, int indx) { ImmutableBitSet bitSetOfRqdProj = ImmutableBitSet.of(indx); return mq.getDistinctRowCount(r, bitSetOfRqdProj, r .getCluster().getRexBuilder().makeLiteral(true)); }
@Test public void testTimeShift() { testExpression( rexBuilder.makeCall( new TimeShiftOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("PT2H"), rexBuilder.makeLiteral(-3, typeFactory.createSqlType(SqlTypeName.INTEGER), true) ), DruidExpression.fromExpression("timestamp_shift(\"t\",'PT2H',-3)"), DateTimes.of("2000-02-02T22:05:06").getMillis() ); }
@Override public Double getDistinctRowCount(Join rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { if (rel instanceof HiveJoin) { HiveJoin hjRel = (HiveJoin) rel; //TODO: Improve this if (rel instanceof SemiJoin) { return mq.getDistinctRowCount(hjRel.getLeft(), groupKey, rel.getCluster().getRexBuilder().makeLiteral(true)); } else { return RelMdUtil.getJoinDistinctRowCount(mq, rel, rel.getJoinType(), groupKey, predicate, true); } } return mq.getDistinctRowCount(rel, groupKey, predicate); }
@Test public void testConcat() { testExpression( rexBuilder.makeCall( typeFactory.createSqlType(SqlTypeName.VARCHAR), SqlStdOperatorTable.CONCAT, ImmutableList.of( inputRef("s"), rexBuilder.makeLiteral("bar") ) ), DruidExpression.fromExpression("concat(\"s\",'bar')"), "foobar" ); }
@Override public Double getDistinctRowCount(Join rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { if (rel instanceof HiveJoin) { HiveJoin hjRel = (HiveJoin) rel; //TODO: Improve this if (rel instanceof SemiJoin) { return mq.getDistinctRowCount(hjRel.getLeft(), groupKey, rel.getCluster().getRexBuilder().makeLiteral(true)); } else { return RelMdUtil.getJoinDistinctRowCount(mq, rel, rel.getJoinType(), groupKey, predicate, true); } } return mq.getDistinctRowCount(rel, groupKey, predicate); }
@Test public void testTimeParse() { testExpression( rexBuilder.makeCall( new TimeParseOperatorConversion().calciteOperator(), inputRef("tstr"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss") ), DruidExpression.fromExpression("timestamp_parse(\"tstr\",'yyyy-MM-dd HH:mm:ss')"), DateTimes.of("2000-02-03T04:05:06").getMillis() ); testExpression( rexBuilder.makeCall( new TimeParseOperatorConversion().calciteOperator(), inputRef("tstr"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss"), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_parse(\"tstr\",'yyyy-MM-dd HH:mm:ss','America/Los_Angeles')"), DateTimes.of("2000-02-03T04:05:06-08:00").getMillis() ); }
@Test public void testTimeExtract() { testExpression( rexBuilder.makeCall( new TimeExtractOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("QUARTER") ), DruidExpression.fromExpression("timestamp_extract(\"t\",'QUARTER','UTC')"), 1L ); testExpression( rexBuilder.makeCall( new TimeExtractOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("DAY"), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_extract(\"t\",'DAY','America/Los_Angeles')"), 2L ); }
@Test public void testTimeFormat() { testExpression( rexBuilder.makeCall( new TimeFormatOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss") ), DruidExpression.fromExpression("timestamp_format(\"t\",'yyyy-MM-dd HH:mm:ss','UTC')"), "2000-02-03 04:05:06" ); testExpression( rexBuilder.makeCall( new TimeFormatOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss"), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_format(\"t\",'yyyy-MM-dd HH:mm:ss','America/Los_Angeles')"), "2000-02-02 20:05:06" ); }
rexBuilder.makeCall( SqlStdOperatorTable.POSITION, rexBuilder.makeLiteral("oo"), inputRef("s") ), rexBuilder.makeCall( SqlStdOperatorTable.POSITION, rexBuilder.makeLiteral("oo"), inputRef("s"), rexBuilder.makeExactLiteral(BigDecimal.valueOf(2)) rexBuilder.makeCall( SqlStdOperatorTable.POSITION, rexBuilder.makeLiteral("oo"), inputRef("s"), rexBuilder.makeExactLiteral(BigDecimal.valueOf(3))
@Test public void testTimeFloor() { testExpression( rexBuilder.makeCall( new TimeFloorOperatorConversion().calciteOperator(), timestampLiteral(DateTimes.of("2000-02-03T04:05:06Z")), rexBuilder.makeLiteral("PT1H") ), DruidExpression.fromExpression("timestamp_floor(949550706000,'PT1H',null,'UTC')"), DateTimes.of("2000-02-03T04:00:00").getMillis() ); testExpression( rexBuilder.makeCall( new TimeFloorOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("P1D"), rexBuilder.makeNullLiteral(typeFactory.createSqlType(SqlTypeName.TIMESTAMP)), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_floor(\"t\",'P1D',null,'America/Los_Angeles')"), DateTimes.of("2000-02-02T08:00:00").getMillis() ); }
@Test public void testDateTrunc() { testExpression( rexBuilder.makeCall( new DateTruncOperatorConversion().calciteOperator(), rexBuilder.makeLiteral("hour"), timestampLiteral(DateTimes.of("2000-02-03T04:05:06Z")) ), DruidExpression.fromExpression("timestamp_floor(949550706000,'PT1H',null,'UTC')"), DateTimes.of("2000-02-03T04:00:00").getMillis() ); testExpression( rexBuilder.makeCall( new DateTruncOperatorConversion().calciteOperator(), rexBuilder.makeLiteral("DAY"), timestampLiteral(DateTimes.of("2000-02-03T04:05:06Z")) ), DruidExpression.fromExpression("timestamp_floor(949550706000,'P1D',null,'UTC')"), DateTimes.of("2000-02-03T00:00:00").getMillis() ); }
SqlStdOperatorTable.TRIM, rexBuilder.makeFlag(SqlTrimFunction.Flag.BOTH), rexBuilder.makeLiteral(" "), inputRef("spacey") ), SqlStdOperatorTable.TRIM, rexBuilder.makeFlag(SqlTrimFunction.Flag.LEADING), rexBuilder.makeLiteral(" h"), inputRef("spacey") ), SqlStdOperatorTable.TRIM, rexBuilder.makeFlag(SqlTrimFunction.Flag.TRAILING), rexBuilder.makeLiteral(" e"), inputRef("spacey") ),
new StrposOperatorConversion().calciteOperator(), inputRef("s"), rexBuilder.makeLiteral("oo") ), DruidExpression.fromExpression("(strpos(\"s\",'oo') + 1)"), new StrposOperatorConversion().calciteOperator(), inputRef("s"), rexBuilder.makeLiteral("ax") ), DruidExpression.fromExpression("(strpos(\"s\",'ax') + 1)"), new StrposOperatorConversion().calciteOperator(), rexBuilder.makeNullLiteral(typeFactory.createSqlType(SqlTypeName.VARCHAR)), rexBuilder.makeLiteral("ax") ), DruidExpression.fromExpression("(strpos(null,'ax') + 1)"),
@Test public void testRegexpExtract() { testExpression( rexBuilder.makeCall( new RegexpExtractOperatorConversion().calciteOperator(), inputRef("s"), rexBuilder.makeLiteral("f(.)"), integerLiteral(1) ), DruidExpression.of( SimpleExtraction.of("s", new RegexDimExtractionFn("f(.)", 1, true, null)), "regexp_extract(\"s\",'f(.)',1)" ), "o" ); testExpression( rexBuilder.makeCall( new RegexpExtractOperatorConversion().calciteOperator(), inputRef("s"), rexBuilder.makeLiteral("f(.)") ), DruidExpression.of( SimpleExtraction.of("s", new RegexDimExtractionFn("f(.)", 0, true, null)), "regexp_extract(\"s\",'f(.)')" ), "fo" ); }