public static FieldValue evaluate( DefineFunction defineFunction, List<FieldValue> values, EvaluationContext context) { List<ParameterField> parameterFields = defineFunction.getParameterFields(); if (parameterFields.size() < 1) { throw new InvalidFeatureException(defineFunction); } // End if if (parameterFields.size() != values.size()) { throw new EvaluationException(); } FunctionEvaluationContext functionContext = new FunctionEvaluationContext(context); for (int i = 0; i < parameterFields.size(); i++) { ParameterField parameterField = parameterFields.get(i); FieldValue value = FieldValueUtil.refine(parameterField, values.get(i)); functionContext.declare(parameterField.getName(), value); } Expression expression = defineFunction.getExpression(); if (expression == null) { throw new InvalidFeatureException(defineFunction); } FieldValue result = ExpressionUtil.evaluate(expression, functionContext); return FieldValueUtil.refine(defineFunction.getDataType(), defineFunction.getOptype(), result); }
@Override public FieldValue evaluate(List<FieldValue> values) { StorelessUnivariateStatistic statistic = createStatistic(); DataType dataType = null; for (FieldValue value : values) { // "Missing values in the input to an aggregate function are simply ignored" if (value == null) { continue; } statistic.increment((value.asNumber()).doubleValue()); if (dataType != null) { dataType = TypeUtil.getResultDataType(dataType, value.getDataType()); } else { dataType = value.getDataType(); } } if (statistic.getN() == 0) { throw new MissingResultException(null); } Object result = cast(getResultType(dataType), statistic.getResult()); return FieldValueUtil.create(result); }
@Override public FieldValue evaluate(List<FieldValue> values) { if (values.size() != 2) { throw new EvaluationException(); } FieldValue left = values.get(0); FieldValue right = values.get(1); // "If one of the input fields of a simple arithmetic function is a missing value, the result // evaluates to missing value" if (left == null || right == null) { return null; } DataType dataType = TypeUtil.getResultDataType(left.getDataType(), right.getDataType()); Number result; try { result = evaluate(left.asNumber(), right.asNumber()); } catch (ArithmeticException ae) { throw new InvalidResultException(null); } return FieldValueUtil.create(cast(dataType, result)); }
@Override public FieldValue evaluate(List<FieldValue> values) { checkVariableArguments(values, 2); Boolean result = evaluate(values.get(0), values.subList(1, values.size())); return FieldValueUtil.create(result); }
@Override public FieldValue evaluate(List<FieldValue> values) { checkArguments(values, 1); FieldValue value = values.get(0); String result = evaluate(value.asString()); return FieldValueUtil.create(result); }
@Override public FieldValue evaluate(List<FieldValue> values) { checkArguments(values, 1, true); FieldValue value = values.get(0); Boolean result = evaluate(value); return FieldValueUtil.create(result); }
@Override public FieldValue evaluate(List<FieldValue> values) { checkArguments(values, 1); FieldValue value = values.get(0); Number result = cast(getResultType(value.getDataType()), evaluate(value.asNumber())); return FieldValueUtil.create(result); }
@Override public FieldValue evaluate(List<FieldValue> values) { checkArguments(values, 2); FieldValue left = values.get(0); FieldValue right = values.get(1); Boolean result = evaluate((left).compareToValue(right)); return FieldValueUtil.create(result); }
@Override public FieldValue evaluate(List<FieldValue> values) { checkVariableArguments(values, 2); Boolean result = (values.get(0)).asBoolean(); for (int i = 1; i < values.size(); i++) { result = evaluate(result, (values.get(i)).asBoolean()); } return FieldValueUtil.create(result); }