/** * Calculates function value * * @return Function value as double. */ public double calculate() { if (functionBodyType == BODY_RUNTIME) return functionExpression.calculate(); else if (isVariadic == false) return functionExtension.calculate(); else { List<Double> paramsList = functionExpression.UDFVariadicParamsAtRunTime; if (paramsList != null) { int n = paramsList.size(); double[] parameters = new double[n]; for (int i = 0; i < n; i++) parameters[i] = paramsList.get(i); return functionExtensionVariadic.calculate(parameters); } else return Double.NaN; } } /**
/** * Private constructor used for function cloning. * * @param function the function, which is going * to be cloned. */ private Function(Function function) { super(Function.TYPE_ID); functionName = function.functionName; description = function.description; parametersNumber = function.parametersNumber; functionExpression = function.functionExpression.clone(); functionBodyType = function.functionBodyType; isVariadic = function.isVariadic; if (functionBodyType == BODY_EXTENDED) { if (function.functionExtension != null) functionExtension = function.functionExtension.clone(); if (function.functionExtensionVariadic != null) functionExtensionVariadic = function.functionExtensionVariadic.clone(); } } /**
return functionExpression.calculate(); else return functionExtensionVariadic.calculate(parameters); } else if (parameters.length == this.getParametersNumber()) { if (functionBodyType == BODY_RUNTIME) {
return functionExpression.calculate(); else return functionExtensionVariadic.calculate(parameters); } else if (arguments.length == this.getParametersNumber()) { if (functionBodyType == BODY_RUNTIME) {