Search in sources :

Example 96 with Expr

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

the class TrimExprMacro method apply.

@Override
public Expr apply(final List<Expr> args) {
    if (args.size() < 1 || args.size() > 2) {
        throw new IAE("Function[%s] must have 1 or 2 arguments", name());
    }
    final Function<Expr.Shuttle, Expr> visitFn = shuttle -> shuttle.visit(apply(shuttle.visitAll(args)));
    if (args.size() == 1) {
        return new TrimStaticCharsExpr(mode, args.get(0), DEFAULT_CHARS, null, visitFn);
    } else {
        final Expr charsArg = args.get(1);
        if (charsArg.isLiteral()) {
            final String charsString = charsArg.eval(InputBindings.nilBindings()).asString();
            final char[] chars = charsString == null ? EMPTY_CHARS : charsString.toCharArray();
            return new TrimStaticCharsExpr(mode, args.get(0), chars, charsArg, visitFn);
        } else {
            return new TrimDynamicCharsExpr(mode, args.get(0), args.get(1), visitFn);
        }
    }
}
Also used : InputBindings(org.apache.druid.math.expr.InputBindings) Arrays(java.util.Arrays) ImmutableSet(com.google.common.collect.ImmutableSet) StringUtils(org.apache.druid.java.util.common.StringUtils) Function(java.util.function.Function) ExprEval(org.apache.druid.math.expr.ExprEval) ExprMacroTable(org.apache.druid.math.expr.ExprMacroTable) Objects(java.util.Objects) List(java.util.List) ExpressionType(org.apache.druid.math.expr.ExpressionType) Expr(org.apache.druid.math.expr.Expr) VisibleForTesting(com.google.common.annotations.VisibleForTesting) IAE(org.apache.druid.java.util.common.IAE) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) Expr(org.apache.druid.math.expr.Expr) IAE(org.apache.druid.java.util.common.IAE)

Example 97 with Expr

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

the class LookupExprMacro 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 lookupExpr = args.get(1);
    if (!lookupExpr.isLiteral() || lookupExpr.getLiteralValue() == null) {
        throw new IAE("Function[%s] second argument must be a registered lookup name", name());
    }
    final String lookupName = lookupExpr.getLiteralValue().toString();
    final RegisteredLookupExtractionFn extractionFn = new RegisteredLookupExtractionFn(lookupExtractorFactoryContainerProvider, lookupName, false, null, false, null);
    class LookupExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

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

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            return ExprEval.of(extractionFn.apply(NullHandling.emptyToNullIfNeeded(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.STRING;
        }

        @Override
        public String stringify() {
            return StringUtils.format("%s(%s, %s)", FN_NAME, arg.stringify(), lookupExpr.stringify());
        }

        @Override
        public byte[] getCacheKey() {
            return new CacheKeyBuilder(Exprs.LOOKUP_EXPR_CACHE_KEY).appendString(stringify()).appendCacheable(extractionFn).build();
        }
    }
    return new LookupExpr(arg);
}
Also used : Expr(org.apache.druid.math.expr.Expr) RegisteredLookupExtractionFn(org.apache.druid.query.lookup.RegisteredLookupExtractionFn) CacheKeyBuilder(org.apache.druid.query.cache.CacheKeyBuilder) IAE(org.apache.druid.java.util.common.IAE)

Example 98 with Expr

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

the class RegexpLikeExprMacro 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 patternExpr = args.get(1);
    if (!ExprUtils.isStringLiteral(patternExpr)) {
        throw new IAE("Function[%s] pattern must be a string literal", name());
    }
    // Precompile the pattern.
    final Pattern pattern = Pattern.compile(StringUtils.nullToEmptyNonDruidDataString((String) patternExpr.getLiteralValue()));
    class RegexpLikeExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

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

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            final String s = NullHandling.nullToEmptyIfNeeded(arg.eval(bindings).asString());
            if (s == null) {
                // True nulls do not match anything. Note: this branch only executes in SQL-compatible null handling mode.
                return ExprEval.ofLongBoolean(false);
            } else {
                final Matcher matcher = pattern.matcher(s);
                return ExprEval.ofLongBoolean(matcher.find());
            }
        }

        @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() {
            return StringUtils.format("%s(%s, %s)", FN_NAME, arg.stringify(), patternExpr.stringify());
        }
    }
    return new RegexpLikeExpr(arg);
}
Also used : Pattern(java.util.regex.Pattern) Expr(org.apache.druid.math.expr.Expr) Matcher(java.util.regex.Matcher) IAE(org.apache.druid.java.util.common.IAE)

Example 99 with Expr

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

the class ContainsExprMacro 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, true, shuttle -> shuttle.visit(apply(shuttle.visitAll(args))));
}
Also used : Expr(org.apache.druid.math.expr.Expr) IAE(org.apache.druid.java.util.common.IAE)

Example 100 with Expr

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

the class RegexpExtractExprMacro 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 to 3 arguments", name());
    }
    final Expr arg = args.get(0);
    final Expr patternExpr = args.get(1);
    final Expr indexExpr = args.size() > 2 ? args.get(2) : null;
    if (!ExprUtils.isStringLiteral(patternExpr)) {
        throw new IAE("Function[%s] pattern must be a string literal", name());
    }
    if (indexExpr != null && (!indexExpr.isLiteral() || !(indexExpr.getLiteralValue() instanceof Number))) {
        throw new IAE("Function[%s] index must be a numeric literal", name());
    }
    // Precompile the pattern.
    final Pattern pattern = Pattern.compile(StringUtils.nullToEmptyNonDruidDataString((String) patternExpr.getLiteralValue()));
    final int index = indexExpr == null ? 0 : ((Number) indexExpr.getLiteralValue()).intValue();
    class RegexpExtractExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

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

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            final String s = NullHandling.nullToEmptyIfNeeded(arg.eval(bindings).asString());
            if (s == null) {
                // True nulls do not match anything. Note: this branch only executes in SQL-compatible null handling mode.
                return ExprEval.of(null);
            } else {
                final Matcher matcher = pattern.matcher(NullHandling.nullToEmptyIfNeeded(s));
                final String retVal = matcher.find() ? matcher.group(index) : null;
                return ExprEval.of(retVal);
            }
        }

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

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

        @Override
        public String stringify() {
            if (indexExpr != null) {
                return StringUtils.format("%s(%s, %s, %s)", FN_NAME, arg.stringify(), patternExpr.stringify(), indexExpr.stringify());
            }
            return StringUtils.format("%s(%s, %s)", FN_NAME, arg.stringify(), patternExpr.stringify());
        }
    }
    return new RegexpExtractExpr(arg);
}
Also used : Pattern(java.util.regex.Pattern) Expr(org.apache.druid.math.expr.Expr) Matcher(java.util.regex.Matcher) IAE(org.apache.druid.java.util.common.IAE)

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