Combined FuncVarEval into FunctionEval. Simplified selection of free ref functions.

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@805088 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Josh Micich 2009-08-17 18:29:40 +00:00
parent 457a13f8a4
commit ab0268434e
5 changed files with 60 additions and 91 deletions

View File

@ -1,51 +0,0 @@
/* ====================================================================
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();
}
}

View File

@ -17,17 +17,16 @@
package org.apache.poi.hssf.record.formula.eval; package org.apache.poi.hssf.record.formula.eval;
import java.util.HashMap; import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
import java.util.Map;
import org.apache.poi.hssf.record.formula.function.FunctionMetadata; 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.function.FunctionMetadataRegistry;
import org.apache.poi.hssf.record.formula.functions.*; 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 > * @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 * Some function IDs that require special treatment
*/ */
@ -44,34 +43,26 @@ public abstract class FunctionEval implements OperationEval {
// convenient access to namespace // convenient access to namespace
private static final FunctionID ID = null; private static final FunctionID ID = null;
protected static final Function[] functions ; protected static final Function[] functions = produceFunctions();
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);
}
public Function getFunction() { /**
* @return <code>null</code> if specified function
*/
private Function getFunction() {
short fidx = getFunctionIndex(); short fidx = getFunctionIndex();
return functions[fidx]; return functions[fidx];
} }
public boolean isFreeRefFunction() { public boolean isFreeRefFunction() {
return freeRefFunctionsByIdMap.containsKey(createFRFKey(getFunctionIndex())); return getFreeRefFunction() != null;
} }
public FreeRefFunction getFreeRefFunction() { 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() { private static Function[] produceFunctions() {
Function[] retval = new Function[368]; Function[] retval = new Function[368];
@ -245,4 +236,26 @@ public abstract class FunctionEval implements OperationEval {
} }
return retval; 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();
}
} }

View File

@ -26,10 +26,15 @@ import org.apache.poi.ss.formula.eval.NotImplementedException;
* Common entry point for all user-defined (non-built-in) functions (where * Common entry point for all user-defined (non-built-in) functions (where
* <tt>AbstractFunctionPtg.field_2_fnc_index</tt> == 255) * <tt>AbstractFunctionPtg.field_2_fnc_index</tt> == 255)
* *
* TODO rename to UserDefinedFunction
* @author Josh Micich * @author Josh Micich
*/ */
final class ExternalFunction implements FreeRefFunction { final class UserDefinedFunction implements FreeRefFunction {
public static final FreeRefFunction instance = new UserDefinedFunction();
private UserDefinedFunction() {
// enforce singleton
}
public ValueEval evaluate(Eval[] args, EvaluationWorkbook workbook, public ValueEval evaluate(Eval[] args, EvaluationWorkbook workbook,
int srcCellSheet, int srcCellRow,int srcCellCol) { int srcCellSheet, int srcCellRow,int srcCellCol) {

View File

@ -40,6 +40,12 @@ import org.apache.poi.ss.formula.eval.NotImplementedException;
*/ */
public final class Indirect implements FreeRefFunction { 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) { public ValueEval evaluate(Eval[] args, EvaluationWorkbook workbook, int srcCellSheet, int srcCellRow, int srcCellCol) {
// TODO - implement INDIRECT() // TODO - implement INDIRECT()
throw new NotImplementedException("INDIRECT"); throw new NotImplementedException("INDIRECT");

View File

@ -20,12 +20,11 @@ package org.apache.poi.ss.formula;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; 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.AddPtg;
import org.apache.poi.hssf.record.formula.ConcatPtg; import org.apache.poi.hssf.record.formula.ConcatPtg;
import org.apache.poi.hssf.record.formula.DividePtg; import org.apache.poi.hssf.record.formula.DividePtg;
import org.apache.poi.hssf.record.formula.EqualPtg; 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.GreaterEqualPtg;
import org.apache.poi.hssf.record.formula.GreaterThanPtg; import org.apache.poi.hssf.record.formula.GreaterThanPtg;
import org.apache.poi.hssf.record.formula.LessEqualPtg; import org.apache.poi.hssf.record.formula.LessEqualPtg;
@ -44,7 +43,7 @@ import org.apache.poi.hssf.record.formula.eval.AddEval;
import org.apache.poi.hssf.record.formula.eval.ConcatEval; 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.DivideEval;
import org.apache.poi.hssf.record.formula.eval.EqualEval; 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.GreaterEqualEval;
import org.apache.poi.hssf.record.formula.eval.GreaterThanEval; import org.apache.poi.hssf.record.formula.eval.GreaterThanEval;
import org.apache.poi.hssf.record.formula.eval.LessEqualEval; import org.apache.poi.hssf.record.formula.eval.LessEqualEval;
@ -114,11 +113,8 @@ final class OperationEvaluatorFactory {
return result; return result;
} }
if (ptgClass == FuncPtg.class) { if (ptg instanceof AbstractFunctionPtg) {
return new FuncVarEval((FuncPtg)ptg); return new FunctionEval((AbstractFunctionPtg)ptg);
}
if (ptgClass == FuncVarPtg.class) {
return new FuncVarEval((FuncVarPtg)ptg);
} }
throw new RuntimeException("Unexpected operation ptg class (" + ptgClass.getName() + ")"); throw new RuntimeException("Unexpected operation ptg class (" + ptgClass.getName() + ")");
} }