@Override protected final ExprEval eval(ExprEval x, ExprEval y) { if (x.type() == ExprType.STRING || y.type() == ExprType.STRING) { return ExprEval.of(null); } if (x.type() == ExprType.LONG && y.type() == ExprType.LONG) { return eval(x.asLong(), y.asLong()); } else { return eval(x.asDouble(), y.asDouble()); } }
@Nonnull @Override public ExprEval eval(ObjectBinding bindings) { ExprEval ret = expr.eval(bindings); if (NullHandling.sqlCompatible() && (ret.value() == null)) { return ExprEval.of(null); } if (ret.type() == ExprType.LONG) { return ExprEval.of(-ret.asLong()); } if (ret.type() == ExprType.DOUBLE) { return ExprEval.of(-ret.asDouble()); } throw new IAE("unsupported type " + ret.type()); }
@Override public ExprEval apply(List<Expr> args, Expr.ObjectBinding bindings) { if (args.size() != 1 && args.size() != 2) { throw new IAE("Function[%s] needs 1 or 2 arguments", name()); } ExprEval value = args.get(0).eval(bindings); if (value.type() != ExprType.STRING) { throw new IAE("first argument should be string type but got %s type", value.type()); } DateTimes.UtcFormatter formatter = DateTimes.ISO_DATE_OPTIONAL_TIME; if (args.size() > 1) { ExprEval format = args.get(1).eval(bindings); if (format.type() != ExprType.STRING) { throw new IAE("second argument should be string type but got %s type", format.type()); } formatter = DateTimes.wrapFormatter(DateTimeFormat.forPattern(format.asString())); } DateTime date; try { date = formatter.parse(value.asString()); } catch (IllegalArgumentException e) { throw new IAE(e, "invalid value %s", value.asString()); } return toValue(date); }
@Override protected final ExprEval eval(ExprEval param) { if (NullHandling.sqlCompatible() && param.isNumericNull()) { return ExprEval.of(null); } if (param.type() == ExprType.LONG) { return eval(param.asLong()); } else if (param.type() == ExprType.DOUBLE) { return eval(param.asDouble()); } return ExprEval.of(null); }
@Nonnull @Override public ExprEval eval(ObjectBinding bindings) { ExprEval ret = expr.eval(bindings); if (NullHandling.sqlCompatible() && (ret.value() == null)) { return ExprEval.of(null); } // conforming to other boolean-returning binary operators ExprType retType = ret.type() == ExprType.DOUBLE ? ExprType.DOUBLE : ExprType.LONG; return ExprEval.of(!ret.asBoolean(), retType); }
private double evalDouble(String x, Expr.ObjectBinding bindings) { ExprEval ret = eval(x, bindings); Assert.assertEquals(ExprType.DOUBLE, ret.type()); return ret.asDouble(); }
private long evalLong(String x, Expr.ObjectBinding bindings) { ExprEval ret = eval(x, bindings); Assert.assertEquals(ExprType.LONG, ret.type()); return ret.asLong(); }
@Nonnull @Override public ExprEval eval(ObjectBinding bindings) { ExprEval leftVal = left.eval(bindings); ExprEval rightVal = right.eval(bindings); // Result of any Binary expressions is null if any of the argument is null. // e.g "select null * 2 as c;" or "select null + 1 as c;" will return null as per Standard SQL spec. if (NullHandling.sqlCompatible() && (leftVal.value() == null || rightVal.value() == null)) { return ExprEval.of(null); } if (leftVal.type() == ExprType.STRING && rightVal.type() == ExprType.STRING) { return evalString(leftVal.asString(), rightVal.asString()); } else if (leftVal.type() == ExprType.LONG && rightVal.type() == ExprType.LONG) { if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { return ExprEval.of(null); } return ExprEval.of(evalLong(leftVal.asLong(), rightVal.asLong())); } else { if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { return ExprEval.of(null); } return ExprEval.of(evalDouble(leftVal.asDouble(), rightVal.asDouble())); } }
ExprEval eval = Parser.parse("x==y", ExprMacroTable.nil()).eval(bindings); Assert.assertTrue(eval.asBoolean()); Assert.assertEquals(ExprType.LONG, eval.type()); Assert.assertEquals(ExprType.LONG, eval.type()); Assert.assertEquals(ExprType.DOUBLE, eval.type()); Assert.assertEquals(ExprType.DOUBLE, eval.type()); Assert.assertEquals(ExprType.DOUBLE, eval.type()); Assert.assertEquals(ExprType.DOUBLE, eval.type());
final BigDecimal bigDecimal; if (exprResult.type() == ExprType.LONG) { bigDecimal = BigDecimal.valueOf(exprResult.asLong()); } else {
@Override protected final ExprEval eval(ExprEval x, ExprEval y) { if (x.type() == ExprType.STRING || y.type() == ExprType.STRING) { return ExprEval.of(null); } if (x.type() == ExprType.LONG && y.type() == ExprType.LONG) { return eval(x.asLong(), y.asLong()); } else { return eval(x.asDouble(), y.asDouble()); } }
@Nonnull @Override public ExprEval eval(ObjectBinding bindings) { ExprEval ret = expr.eval(bindings); if (NullHandling.sqlCompatible() && (ret.value() == null)) { return ExprEval.of(null); } if (ret.type() == ExprType.LONG) { return ExprEval.of(-ret.asLong()); } if (ret.type() == ExprType.DOUBLE) { return ExprEval.of(-ret.asDouble()); } throw new IAE("unsupported type " + ret.type()); }
@Override public ExprEval apply(List<Expr> args, Expr.ObjectBinding bindings) { if (args.size() != 1 && args.size() != 2) { throw new IAE("Function[%s] needs 1 or 2 arguments", name()); } ExprEval value = args.get(0).eval(bindings); if (value.type() != ExprType.STRING) { throw new IAE("first argument should be string type but got %s type", value.type()); } DateTimes.UtcFormatter formatter = DateTimes.ISO_DATE_OPTIONAL_TIME; if (args.size() > 1) { ExprEval format = args.get(1).eval(bindings); if (format.type() != ExprType.STRING) { throw new IAE("second argument should be string type but got %s type", format.type()); } formatter = DateTimes.wrapFormatter(DateTimeFormat.forPattern(format.asString())); } DateTime date; try { date = formatter.parse(value.asString()); } catch (IllegalArgumentException e) { throw new IAE(e, "invalid value %s", value.asString()); } return toValue(date); }
@Override protected final ExprEval eval(ExprEval param) { if (NullHandling.sqlCompatible() && param.isNumericNull()) { return ExprEval.of(null); } if (param.type() == ExprType.LONG) { return eval(param.asLong()); } else if (param.type() == ExprType.DOUBLE) { return eval(param.asDouble()); } return ExprEval.of(null); }
@Nonnull @Override public ExprEval eval(ObjectBinding bindings) { ExprEval ret = expr.eval(bindings); if (NullHandling.sqlCompatible() && (ret.value() == null)) { return ExprEval.of(null); } // conforming to other boolean-returning binary operators ExprType retType = ret.type() == ExprType.DOUBLE ? ExprType.DOUBLE : ExprType.LONG; return ExprEval.of(!ret.asBoolean(), retType); }
@Nonnull @Override public ExprEval eval(ObjectBinding bindings) { ExprEval leftVal = left.eval(bindings); ExprEval rightVal = right.eval(bindings); // Result of any Binary expressions is null if any of the argument is null. // e.g "select null * 2 as c;" or "select null + 1 as c;" will return null as per Standard SQL spec. if (NullHandling.sqlCompatible() && (leftVal.value() == null || rightVal.value() == null)) { return ExprEval.of(null); } if (leftVal.type() == ExprType.STRING && rightVal.type() == ExprType.STRING) { return evalString(leftVal.asString(), rightVal.asString()); } else if (leftVal.type() == ExprType.LONG && rightVal.type() == ExprType.LONG) { if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { return ExprEval.of(null); } return ExprEval.of(evalLong(leftVal.asLong(), rightVal.asLong())); } else { if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { return ExprEval.of(null); } return ExprEval.of(evalDouble(leftVal.asDouble(), rightVal.asDouble())); } }
final BigDecimal bigDecimal; if (exprResult.type() == ExprType.LONG) { bigDecimal = BigDecimal.valueOf(exprResult.asLong()); } else {