Search in sources :

Example 46 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class CaseInsensitiveContainsExprMacro method apply.

@Override
public Expr apply(final List<Expr> args) {
    if (args.size() != 2) {
        throw new IAE("Function[%s] must have 2 arguments", name());
    }
    final Expr arg = args.get(0);
    final Expr searchStr = args.get(1);
    return new ContainsExpr(FN_NAME, arg, searchStr, false, shuttle -> apply(shuttle.visitAll(args)));
}
Also used : Expr(org.apache.druid.math.expr.Expr) IAE(org.apache.druid.java.util.common.IAE)

Example 47 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class LikeExprMacro method apply.

@Override
public Expr apply(final List<Expr> args) {
    if (args.size() < 2 || args.size() > 3) {
        throw new IAE("Function[%s] must have 2 or 3 arguments", name());
    }
    final Expr arg = args.get(0);
    final Expr patternExpr = args.get(1);
    final Expr escapeExpr = args.size() > 2 ? args.get(2) : null;
    if (!patternExpr.isLiteral() || (escapeExpr != null && !escapeExpr.isLiteral())) {
        throw new IAE("pattern and escape must be literals");
    }
    final String escape = escapeExpr == null ? null : (String) escapeExpr.getLiteralValue();
    final Character escapeChar;
    if (escape != null && escape.length() != 1) {
        throw new IllegalArgumentException("Escape must be null or a single character");
    } else {
        escapeChar = escape == null ? null : escape.charAt(0);
    }
    final LikeDimFilter.LikeMatcher likeMatcher = LikeDimFilter.LikeMatcher.from(NullHandling.nullToEmptyIfNeeded((String) patternExpr.getLiteralValue()), escapeChar);
    class LikeExtractExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

        private LikeExtractExpr(Expr arg) {
            super(FN_NAME, arg);
        }

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            return ExprEval.ofLongBoolean(likeMatcher.matches(arg.eval(bindings).asString()));
        }

        @Override
        public Expr visit(Shuttle shuttle) {
            return shuttle.visit(apply(shuttle.visitAll(args)));
        }

        @Nullable
        @Override
        public ExpressionType getOutputType(InputBindingInspector inspector) {
            return ExpressionType.LONG;
        }

        @Override
        public String stringify() {
            if (escapeExpr != null) {
                return StringUtils.format("%s(%s, %s, %s)", FN_NAME, arg.stringify(), patternExpr.stringify(), escapeExpr.stringify());
            }
            return StringUtils.format("%s(%s, %s)", FN_NAME, arg.stringify(), patternExpr.stringify());
        }
    }
    return new LikeExtractExpr(arg);
}
Also used : Expr(org.apache.druid.math.expr.Expr) LikeDimFilter(org.apache.druid.query.filter.LikeDimFilter) IAE(org.apache.druid.java.util.common.IAE)

Example 48 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class TimestampParseExprMacro method apply.

@Override
public Expr apply(final List<Expr> args) {
    if (args.size() < 1 || args.size() > 3) {
        throw new IAE("Function[%s] must have 1 to 3 arguments", name());
    }
    final Expr arg = args.get(0);
    final String formatString = args.size() > 1 ? (String) args.get(1).getLiteralValue() : null;
    final DateTimeZone timeZone;
    if (args.size() > 2 && args.get(2).getLiteralValue() != null) {
        timeZone = DateTimes.inferTzFromString((String) args.get(2).getLiteralValue());
    } else {
        timeZone = DateTimeZone.UTC;
    }
    final DateTimes.UtcFormatter formatter = formatString == null ? createDefaultParser(timeZone) : DateTimes.wrapFormatter(DateTimeFormat.forPattern(formatString).withZone(timeZone));
    class TimestampParseExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

        private TimestampParseExpr(Expr arg) {
            super(FN_NAME, arg);
        }

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            final String value = arg.eval(bindings).asString();
            if (value == null) {
                return ExprEval.of(null);
            }
            try {
                return ExprEval.of(formatter.parse(value).getMillis());
            } catch (IllegalArgumentException e) {
                // are returned as nulls.
                return ExprEval.of(null);
            }
        }

        @Override
        public Expr visit(Shuttle shuttle) {
            return shuttle.visit(apply(shuttle.visitAll(args)));
        }

        @Nullable
        @Override
        public ExpressionType getOutputType(InputBindingInspector inspector) {
            return ExpressionType.LONG;
        }

        @Override
        public String stringify() {
            if (args.size() > 2) {
                return StringUtils.format("%s(%s, %s, %s)", FN_NAME, arg.stringify(), args.get(1).stringify(), args.get(2).stringify());
            }
            if (args.size() > 1) {
                return StringUtils.format("%s(%s, %s)", FN_NAME, arg.stringify(), args.get(1).stringify());
            }
            return super.stringify();
        }
    }
    return new TimestampParseExpr(arg);
}
Also used : Expr(org.apache.druid.math.expr.Expr) DateTimes(org.apache.druid.java.util.common.DateTimes) IAE(org.apache.druid.java.util.common.IAE) DateTimeZone(org.joda.time.DateTimeZone)

Example 49 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class BloomFilterExpressionsTest method testAddLong.

@Test
public void testAddLong() {
    Expr expr = Parser.parse("bloom_filter_add(1234, bloomy)", macroTable);
    ExprEval eval = expr.eval(inputBindings);
    Assert.assertEquals(BloomFilterExpressions.BLOOM_FILTER_TYPE, eval.type());
    Assert.assertTrue(eval.value() instanceof BloomKFilter);
    Assert.assertTrue(((BloomKFilter) eval.value()).testLong(SOME_LONG));
    expr = Parser.parse("bloom_filter_add(long, bloomy)", macroTable);
    eval = expr.eval(inputBindings);
    Assert.assertEquals(BloomFilterExpressions.BLOOM_FILTER_TYPE, eval.type());
    Assert.assertTrue(eval.value() instanceof BloomKFilter);
    Assert.assertTrue(((BloomKFilter) eval.value()).testLong(SOME_LONG));
}
Also used : ExprEval(org.apache.druid.math.expr.ExprEval) Expr(org.apache.druid.math.expr.Expr) BloomKFilter(org.apache.druid.query.filter.BloomKFilter) InitializedNullHandlingTest(org.apache.druid.testing.InitializedNullHandlingTest) Test(org.junit.Test)

Example 50 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class BloomFilterExpressionsTest method testAddWrongArgType2.

@Test
public void testAddWrongArgType2() {
    expectedException.expect(IAE.class);
    expectedException.expectMessage("Function[bloom_filter_add] cannot add [ARRAY<LONG>] to a bloom filter");
    Expr expr = Parser.parse("bloom_filter_add(ARRAY<LONG>[], bloomy)", macroTable);
    expr.eval(inputBindings);
}
Also used : Expr(org.apache.druid.math.expr.Expr) InitializedNullHandlingTest(org.apache.druid.testing.InitializedNullHandlingTest) Test(org.junit.Test)

Aggregations

Expr (org.apache.druid.math.expr.Expr)104 Test (org.junit.Test)58 ExprEval (org.apache.druid.math.expr.ExprEval)18 InitializedNullHandlingTest (org.apache.druid.testing.InitializedNullHandlingTest)17 IAE (org.apache.druid.java.util.common.IAE)14 ExpressionType (org.apache.druid.math.expr.ExpressionType)8 DruidExpression (org.apache.druid.sql.calcite.expression.DruidExpression)7 ArrayList (java.util.ArrayList)6 Nullable (javax.annotation.Nullable)6 HashSet (java.util.HashSet)5 List (java.util.List)4 HyperLogLogCollector (org.apache.druid.hll.HyperLogLogCollector)4 BloomKFilter (org.apache.druid.query.filter.BloomKFilter)4 InDimFilter (org.apache.druid.query.filter.InDimFilter)4 RexNode (org.apache.calcite.rex.RexNode)3 Filter (org.apache.druid.query.filter.Filter)3 VirtualColumn (org.apache.druid.segment.VirtualColumn)3 FalseFilter (org.apache.druid.segment.filter.FalseFilter)3 OrFilter (org.apache.druid.segment.filter.OrFilter)3 SelectorFilter (org.apache.druid.segment.filter.SelectorFilter)3