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)));
}
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);
}
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);
}
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));
}
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);
}
Aggregations