+++ /dev/null
-/* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hssf.record.formula.eval;
-
-import org.apache.poi.hssf.record.formula.atp.AnalysisToolPak;
-import org.apache.poi.hssf.record.formula.functions.FreeRefFunction;
-import org.apache.poi.ss.formula.EvaluationWorkbook;
-import org.apache.poi.ss.formula.eval.NotImplementedException;
-/**
- *
- * Common entry point for all user-defined (non-built-in) functions (where
- * <tt>AbstractFunctionPtg.field_2_fnc_index</tt> == 255)
- *
- * TODO rename to UserDefinedFunction
- * @author Josh Micich
- */
-final class ExternalFunction implements FreeRefFunction {
-
- public ValueEval evaluate(Eval[] args, EvaluationWorkbook workbook,
- int srcCellSheet, int srcCellRow,int srcCellCol) {
-
- int nIncomingArgs = args.length;
- if(nIncomingArgs < 1) {
- throw new RuntimeException("function name argument missing");
- }
-
- Eval nameArg = args[0];
- FreeRefFunction targetFunc;
- if (nameArg instanceof NameEval) {
- targetFunc = findInternalUserDefinedFunction((NameEval) nameArg);
- } else if (nameArg instanceof NameXEval) {
- targetFunc = findExternalUserDefinedFunction(workbook, (NameXEval) nameArg);
- } else {
- throw new RuntimeException("First argument should be a NameEval, but got ("
- + nameArg.getClass().getName() + ")");
- }
- int nOutGoingArgs = nIncomingArgs -1;
- Eval[] outGoingArgs = new Eval[nOutGoingArgs];
- System.arraycopy(args, 1, outGoingArgs, 0, nOutGoingArgs);
- return targetFunc.evaluate(outGoingArgs, workbook, srcCellSheet, srcCellRow, srcCellCol);
- }
-
- private static FreeRefFunction findExternalUserDefinedFunction(EvaluationWorkbook workbook,
- NameXEval n) {
- String functionName = workbook.resolveNameXText(n.getPtg());
-
- if(false) {
- System.out.println("received call to external user defined function (" + functionName + ")");
- }
- // currently only looking for functions from the 'Analysis TookPak' e.g. "YEARFRAC" or "ISEVEN"
- // not sure how much this logic would need to change to support other or multiple add-ins.
- FreeRefFunction result = AnalysisToolPak.findFunction(functionName);
- if (result != null) {
- return result;
- }
- throw new NotImplementedException(functionName);
- }
-
- private static FreeRefFunction findInternalUserDefinedFunction(NameEval functionNameEval) {
-
- String functionName = functionNameEval.getFunctionName();
- if(false) {
- System.out.println("received call to internal user defined function (" + functionName + ")");
- }
- // TODO find the implementation for the user defined function
-
- throw new NotImplementedException(functionName);
- }
-}
+++ /dev/null
-/* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hssf.record.formula.eval;
-
-import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
-import org.apache.poi.hssf.record.formula.functions.Function;
-import org.apache.poi.ss.formula.eval.NotImplementedException;
-
-/**
- * @author Amol S. Deshmukh < amolweb at ya hoo dot com >
- *
- */
-public final class FuncVarEval extends FunctionEval {
-
- private AbstractFunctionPtg delegate;
-
- public FuncVarEval(AbstractFunctionPtg funcPtg) {
- delegate = funcPtg;
- }
-
- public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
- Function f = getFunction();
- if (f == null) {
- throw new NotImplementedException("FuncIx=" + getFunctionIndex());
- }
- return f.evaluate(operands, srcRow, srcCol);
- }
-
- public int getNumberOfOperands() {
- return delegate.getNumberOfOperands();
- }
-
- public short getFunctionIndex() {
- return delegate.getFunctionIndex();
- }
-}
package org.apache.poi.hssf.record.formula.eval;
-import java.util.HashMap;
-import java.util.Map;
-
+import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
import org.apache.poi.hssf.record.formula.functions.*;
+import org.apache.poi.ss.formula.eval.NotImplementedException;
/**
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
*/
-public abstract class FunctionEval implements OperationEval {
+public final class FunctionEval implements OperationEval {
/**
* Some function IDs that require special treatment
*/
// convenient access to namespace
private static final FunctionID ID = null;
- protected static final Function[] functions ;
-
- private static Map<Integer, FreeRefFunction> freeRefFunctionsByIdMap;
-
- static {
- Map<Integer, FreeRefFunction> m = new HashMap<Integer, FreeRefFunction>();
- m.put(createFRFKey(ID.INDIRECT), new Indirect());
- m.put(createFRFKey(ID.EXTERNAL_FUNC), new ExternalFunction());
- freeRefFunctionsByIdMap = m;
- functions = produceFunctions();
- }
- private static Integer createFRFKey(int functionIndex) {
- return new Integer(functionIndex);
- }
+ protected static final Function[] functions = produceFunctions();
- public Function getFunction() {
+ /**
+ * @return <code>null</code> if specified function
+ */
+ private Function getFunction() {
short fidx = getFunctionIndex();
return functions[fidx];
}
public boolean isFreeRefFunction() {
- return freeRefFunctionsByIdMap.containsKey(createFRFKey(getFunctionIndex()));
+ return getFreeRefFunction() != null;
}
public FreeRefFunction getFreeRefFunction() {
- return freeRefFunctionsByIdMap.get(createFRFKey(getFunctionIndex()));
+ switch (getFunctionIndex()) {
+ case FunctionID.INDIRECT: return Indirect.instance;
+ case FunctionID.EXTERNAL_FUNC: return UserDefinedFunction.instance;
+ }
+ return null;
}
- public abstract short getFunctionIndex();
-
private static Function[] produceFunctions() {
Function[] retval = new Function[368];
}
return retval;
}
+
+ private AbstractFunctionPtg _delegate;
+
+ public FunctionEval(AbstractFunctionPtg funcPtg) {
+ _delegate = funcPtg;
+ }
+
+ public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
+ Function f = getFunction();
+ if (f == null) {
+ throw new NotImplementedException("FuncIx=" + getFunctionIndex());
+ }
+ return f.evaluate(operands, srcRow, srcCol);
+ }
+
+ public int getNumberOfOperands() {
+ return _delegate.getNumberOfOperands();
+ }
+
+ private short getFunctionIndex() {
+ return _delegate.getFunctionIndex();
+ }
}
--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record.formula.eval;
+
+import org.apache.poi.hssf.record.formula.atp.AnalysisToolPak;
+import org.apache.poi.hssf.record.formula.functions.FreeRefFunction;
+import org.apache.poi.ss.formula.EvaluationWorkbook;
+import org.apache.poi.ss.formula.eval.NotImplementedException;
+/**
+ *
+ * Common entry point for all user-defined (non-built-in) functions (where
+ * <tt>AbstractFunctionPtg.field_2_fnc_index</tt> == 255)
+ *
+ * @author Josh Micich
+ */
+final class UserDefinedFunction implements FreeRefFunction {
+
+ public static final FreeRefFunction instance = new UserDefinedFunction();
+
+ private UserDefinedFunction() {
+ // enforce singleton
+ }
+
+ public ValueEval evaluate(Eval[] args, EvaluationWorkbook workbook,
+ int srcCellSheet, int srcCellRow,int srcCellCol) {
+
+ int nIncomingArgs = args.length;
+ if(nIncomingArgs < 1) {
+ throw new RuntimeException("function name argument missing");
+ }
+
+ Eval nameArg = args[0];
+ FreeRefFunction targetFunc;
+ if (nameArg instanceof NameEval) {
+ targetFunc = findInternalUserDefinedFunction((NameEval) nameArg);
+ } else if (nameArg instanceof NameXEval) {
+ targetFunc = findExternalUserDefinedFunction(workbook, (NameXEval) nameArg);
+ } else {
+ throw new RuntimeException("First argument should be a NameEval, but got ("
+ + nameArg.getClass().getName() + ")");
+ }
+ int nOutGoingArgs = nIncomingArgs -1;
+ Eval[] outGoingArgs = new Eval[nOutGoingArgs];
+ System.arraycopy(args, 1, outGoingArgs, 0, nOutGoingArgs);
+ return targetFunc.evaluate(outGoingArgs, workbook, srcCellSheet, srcCellRow, srcCellCol);
+ }
+
+ private static FreeRefFunction findExternalUserDefinedFunction(EvaluationWorkbook workbook,
+ NameXEval n) {
+ String functionName = workbook.resolveNameXText(n.getPtg());
+
+ if(false) {
+ System.out.println("received call to external user defined function (" + functionName + ")");
+ }
+ // currently only looking for functions from the 'Analysis TookPak' e.g. "YEARFRAC" or "ISEVEN"
+ // not sure how much this logic would need to change to support other or multiple add-ins.
+ FreeRefFunction result = AnalysisToolPak.findFunction(functionName);
+ if (result != null) {
+ return result;
+ }
+ throw new NotImplementedException(functionName);
+ }
+
+ private static FreeRefFunction findInternalUserDefinedFunction(NameEval functionNameEval) {
+
+ String functionName = functionNameEval.getFunctionName();
+ if(false) {
+ System.out.println("received call to internal user defined function (" + functionName + ")");
+ }
+ // TODO find the implementation for the user defined function
+
+ throw new NotImplementedException(functionName);
+ }
+}
*/
public final class Indirect implements FreeRefFunction {
+ public static final FreeRefFunction instance = new Indirect();
+
+ private Indirect() {
+ // enforce singleton
+ }
+
public ValueEval evaluate(Eval[] args, EvaluationWorkbook workbook, int srcCellSheet, int srcCellRow, int srcCellCol) {
// TODO - implement INDIRECT()
throw new NotImplementedException("INDIRECT");
import java.util.HashMap;
import java.util.Map;
+import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
import org.apache.poi.hssf.record.formula.AddPtg;
import org.apache.poi.hssf.record.formula.ConcatPtg;
import org.apache.poi.hssf.record.formula.DividePtg;
import org.apache.poi.hssf.record.formula.EqualPtg;
-import org.apache.poi.hssf.record.formula.FuncPtg;
-import org.apache.poi.hssf.record.formula.FuncVarPtg;
import org.apache.poi.hssf.record.formula.GreaterEqualPtg;
import org.apache.poi.hssf.record.formula.GreaterThanPtg;
import org.apache.poi.hssf.record.formula.LessEqualPtg;
import org.apache.poi.hssf.record.formula.eval.ConcatEval;
import org.apache.poi.hssf.record.formula.eval.DivideEval;
import org.apache.poi.hssf.record.formula.eval.EqualEval;
-import org.apache.poi.hssf.record.formula.eval.FuncVarEval;
+import org.apache.poi.hssf.record.formula.eval.FunctionEval;
import org.apache.poi.hssf.record.formula.eval.GreaterEqualEval;
import org.apache.poi.hssf.record.formula.eval.GreaterThanEval;
import org.apache.poi.hssf.record.formula.eval.LessEqualEval;
return result;
}
- if (ptgClass == FuncPtg.class) {
- return new FuncVarEval((FuncPtg)ptg);
- }
- if (ptgClass == FuncVarPtg.class) {
- return new FuncVarEval((FuncVarPtg)ptg);
+ if (ptg instanceof AbstractFunctionPtg) {
+ return new FunctionEval((AbstractFunctionPtg)ptg);
}
throw new RuntimeException("Unexpected operation ptg class (" + ptgClass.getName() + ")");
}