Search in sources :

Example 41 with Expr

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

the class SleepExprTest method assertExpr.

private void assertExpr(final String expression) {
    final Expr expr = Parser.parse(expression, exprMacroTable);
    Assert.assertNull(expression, expr.eval(InputBindings.nilBindings()).value());
    final Expr exprNoFlatten = Parser.parse(expression, exprMacroTable, false);
    final Expr roundTrip = Parser.parse(exprNoFlatten.stringify(), exprMacroTable);
    Assert.assertNull(expr.stringify(), roundTrip.eval(InputBindings.nilBindings()).value());
    final Expr roundTripFlatten = Parser.parse(expr.stringify(), exprMacroTable);
    Assert.assertNull(expr.stringify(), roundTripFlatten.eval(InputBindings.nilBindings()).value());
    Assert.assertEquals(expr.stringify(), roundTrip.stringify());
    Assert.assertEquals(expr.stringify(), roundTripFlatten.stringify());
    Assert.assertArrayEquals(expr.getCacheKey(), roundTrip.getCacheKey());
    Assert.assertArrayEquals(expr.getCacheKey(), roundTripFlatten.getCacheKey());
}
Also used : Expr(org.apache.druid.math.expr.Expr)

Example 42 with Expr

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

the class ExpressionLambdaAggregatorFactory method finalizeComputation.

@Nullable
@Override
public Object finalizeComputation(@Nullable Object object) {
    Expr finalizeExpr;
    finalizeExpr = finalizeExpression.get();
    if (finalizeExpr != null) {
        return finalizeExpr.eval(finalizeBindings.get().withBinding(FINALIZE_IDENTIFIER, object)).value();
    }
    return object;
}
Also used : Expr(org.apache.druid.math.expr.Expr) Nullable(javax.annotation.Nullable)

Example 43 with Expr

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

the class IPv4AddressMatchExprMacro method apply.

@Override
public Expr apply(final List<Expr> args) {
    if (args.size() != 2) {
        throw new IAE(ExprUtils.createErrMsg(name(), "must have 2 arguments"));
    }
    SubnetUtils.SubnetInfo subnetInfo = getSubnetInfo(args);
    Expr arg = args.get(0);
    class IPv4AddressMatchExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

        private final SubnetUtils.SubnetInfo subnetInfo;

        private IPv4AddressMatchExpr(Expr arg, SubnetUtils.SubnetInfo subnetInfo) {
            super(FN_NAME, arg);
            this.subnetInfo = subnetInfo;
        }

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            ExprEval eval = arg.eval(bindings);
            boolean match;
            switch(eval.type().getType()) {
                case STRING:
                    match = isStringMatch(eval.asString());
                    break;
                case LONG:
                    match = !eval.isNumericNull() && isLongMatch(eval.asLong());
                    break;
                default:
                    match = false;
            }
            return ExprEval.ofLongBoolean(match);
        }

        private boolean isStringMatch(String stringValue) {
            return IPv4AddressExprUtils.isValidAddress(stringValue) && subnetInfo.isInRange(stringValue);
        }

        private boolean isLongMatch(long longValue) {
            return !IPv4AddressExprUtils.overflowsUnsignedInt(longValue) && subnetInfo.isInRange((int) longValue);
        }

        @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(), args.get(ARG_SUBNET).stringify());
        }
    }
    return new IPv4AddressMatchExpr(arg, subnetInfo);
}
Also used : SubnetUtils(org.apache.commons.net.util.SubnetUtils) IAE(org.apache.druid.java.util.common.IAE) ExprEval(org.apache.druid.math.expr.ExprEval) Expr(org.apache.druid.math.expr.Expr)

Example 44 with Expr

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

the class IPv4AddressMatchExprMacro method getSubnetInfo.

private SubnetUtils.SubnetInfo getSubnetInfo(List<Expr> args) {
    String subnetArgName = "subnet";
    Expr arg = args.get(ARG_SUBNET);
    ExprUtils.checkLiteralArgument(name(), arg, subnetArgName);
    String subnet = (String) arg.getLiteralValue();
    SubnetUtils subnetUtils;
    try {
        subnetUtils = new SubnetUtils(subnet);
    } catch (IllegalArgumentException e) {
        throw new IAE(e, ExprUtils.createErrMsg(name(), subnetArgName + " arg has an invalid format: " + subnet));
    }
    // make network and broadcast addresses match
    subnetUtils.setInclusiveHostCount(true);
    return subnetUtils.getInfo();
}
Also used : SubnetUtils(org.apache.commons.net.util.SubnetUtils) Expr(org.apache.druid.math.expr.Expr) IAE(org.apache.druid.java.util.common.IAE)

Example 45 with Expr

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

the class TimestampExtractExprMacro 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());
    }
    if (!args.get(1).isLiteral() || args.get(1).getLiteralValue() == null) {
        throw new IAE("Function[%s] unit arg must be literal", name());
    }
    if (args.size() > 2 && !args.get(2).isLiteral()) {
        throw new IAE("Function[%s] timezone arg must be literal", name());
    }
    final Expr arg = args.get(0);
    final Unit unit = Unit.valueOf(StringUtils.toUpperCase((String) args.get(1).getLiteralValue()));
    final DateTimeZone timeZone;
    if (args.size() > 2) {
        timeZone = ExprUtils.toTimeZone(args.get(2));
    } else {
        timeZone = DateTimeZone.UTC;
    }
    final ISOChronology chronology = ISOChronology.getInstance(timeZone);
    class TimestampExtractExpr extends ExprMacroTable.BaseScalarUnivariateMacroFunctionExpr {

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

        @Nonnull
        @Override
        public ExprEval eval(final ObjectBinding bindings) {
            Object val = arg.eval(bindings).value();
            if (val == null) {
                // Return null if the argument if null.
                return ExprEval.of(null);
            }
            final DateTime dateTime = new DateTime(val, chronology);
            long epoch = dateTime.getMillis() / 1000;
            switch(unit) {
                case EPOCH:
                    return ExprEval.of(epoch);
                case MICROSECOND:
                    return ExprEval.of(epoch / 1000);
                case MILLISECOND:
                    return ExprEval.of(dateTime.millisOfSecond().get());
                case SECOND:
                    return ExprEval.of(dateTime.secondOfMinute().get());
                case MINUTE:
                    return ExprEval.of(dateTime.minuteOfHour().get());
                case HOUR:
                    return ExprEval.of(dateTime.hourOfDay().get());
                case DAY:
                    return ExprEval.of(dateTime.dayOfMonth().get());
                case DOW:
                    return ExprEval.of(dateTime.dayOfWeek().get());
                case ISODOW:
                    return ExprEval.of(dateTime.dayOfWeek().get());
                case DOY:
                    return ExprEval.of(dateTime.dayOfYear().get());
                case WEEK:
                    return ExprEval.of(dateTime.weekOfWeekyear().get());
                case MONTH:
                    return ExprEval.of(dateTime.monthOfYear().get());
                case QUARTER:
                    return ExprEval.of((dateTime.monthOfYear().get() - 1) / 3 + 1);
                case YEAR:
                    return ExprEval.of(dateTime.year().get());
                case ISOYEAR:
                    return ExprEval.of(dateTime.year().get());
                case DECADE:
                    // The year field divided by 10, See https://www.postgresql.org/docs/10/functions-datetime.html
                    return ExprEval.of(dateTime.year().get() / 10);
                case CENTURY:
                    return ExprEval.of(Math.ceil((double) dateTime.year().get() / 100));
                case MILLENNIUM:
                    // See https://www.postgresql.org/docs/10/functions-datetime.html
                    return ExprEval.of(Math.ceil((double) dateTime.year().get() / 1000));
                default:
                    throw new ISE("Unhandled unit[%s]", unit);
            }
        }

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

        @Nullable
        @Override
        public ExpressionType getOutputType(InputBindingInspector inspector) {
            switch(unit) {
                case CENTURY:
                case MILLENNIUM:
                    return ExpressionType.DOUBLE;
                default:
                    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());
            }
            return StringUtils.format("%s(%s, %s)", FN_NAME, arg.stringify(), args.get(1).stringify());
        }
    }
    return new TimestampExtractExpr(arg);
}
Also used : IAE(org.apache.druid.java.util.common.IAE) DateTimeZone(org.joda.time.DateTimeZone) DateTime(org.joda.time.DateTime) ISOChronology(org.joda.time.chrono.ISOChronology) Expr(org.apache.druid.math.expr.Expr) ISE(org.apache.druid.java.util.common.ISE)

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