From f7bfb10141c84a07c126a98c13cf7b97e9b5c9c4 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Wed, 10 Sep 2008 19:33:58 +0000 Subject: [PATCH] (Should have been submitted with 693939) Fixing error value handling for numeric functions. Refactored hierarchy. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@693947 13f79535-47bb-0310-9956-ffa450edef68 --- .../formula/functions/FinanceFunction.java | 34 ++++++++++++++++++- .../MultiOperandNumericFunction.java | 32 ++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/FinanceFunction.java b/src/java/org/apache/poi/hssf/record/formula/functions/FinanceFunction.java index c054c6dac4..a6956752be 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/FinanceFunction.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/FinanceFunction.java @@ -17,6 +17,7 @@ package org.apache.poi.hssf.record.formula.functions; +import org.apache.poi.hssf.record.formula.eval.AreaEval; import org.apache.poi.hssf.record.formula.eval.BoolEval; import org.apache.poi.hssf.record.formula.eval.ErrorEval; import org.apache.poi.hssf.record.formula.eval.Eval; @@ -30,7 +31,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEvalToNumericXlator; * Super class for all Evals for financial function evaluation. * */ -public abstract class FinanceFunction extends NumericFunction { +public abstract class FinanceFunction implements Function { private static final ValueEvalToNumericXlator DEFAULT_NUM_XLATOR = new ValueEvalToNumericXlator((short) (0 | ValueEvalToNumericXlator.BOOL_IS_PARSED @@ -68,4 +69,35 @@ public abstract class FinanceFunction extends NumericFunction { } return retval; } + + protected final ValueEval singleOperandEvaluate(Eval eval, int srcRow, short srcCol) { + + if (eval instanceof AreaEval) { + AreaEval ae = (AreaEval) eval; + if (ae.contains(srcRow, srcCol)) { // circular ref! + return ErrorEval.CIRCULAR_REF_ERROR; + } + if (ae.isRow()) { + if (ae.isColumn()) { + return ae.getRelativeValue(0, 0); + } + if (ae.containsColumn(srcCol)) { + ValueEval ve = ae.getValueAt(ae.getFirstRow(), srcCol); + ve = getXlator().attemptXlateToNumeric(ve); + return getXlator().attemptXlateToNumeric(ve); + } + return ErrorEval.VALUE_INVALID; + } + if (ae.isColumn()) { + if (ae.containsRow(srcRow)) { + ValueEval ve = ae.getValueAt(srcRow, ae.getFirstColumn()); + return getXlator().attemptXlateToNumeric(ve); + } + return ErrorEval.VALUE_INVALID; + } + return ErrorEval.VALUE_INVALID; + } + return getXlator().attemptXlateToNumeric((ValueEval) eval); + } + } diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/MultiOperandNumericFunction.java b/src/java/org/apache/poi/hssf/record/formula/functions/MultiOperandNumericFunction.java index a9e98ae313..7d07ddc1c1 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/MultiOperandNumericFunction.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/MultiOperandNumericFunction.java @@ -19,6 +19,7 @@ package org.apache.poi.hssf.record.formula.functions; import org.apache.poi.hssf.record.formula.eval.AreaEval; import org.apache.poi.hssf.record.formula.eval.BlankEval; +import org.apache.poi.hssf.record.formula.eval.ErrorEval; import org.apache.poi.hssf.record.formula.eval.Eval; import org.apache.poi.hssf.record.formula.eval.NumericValueEval; import org.apache.poi.hssf.record.formula.eval.Ref2DEval; @@ -32,7 +33,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEvalToNumericXlator; * classes that take variable number of operands, and * where the order of operands does not matter */ -public abstract class MultiOperandNumericFunction extends NumericFunction { +public abstract class MultiOperandNumericFunction implements Function { static final double[] EMPTY_DOUBLE_ARRAY = { }; private static class DoubleList { @@ -202,5 +203,34 @@ public abstract class MultiOperandNumericFunction extends NumericFunction { } + protected final ValueEval singleOperandEvaluate(Eval eval, int srcRow, short srcCol) { + + if (eval instanceof AreaEval) { + AreaEval ae = (AreaEval) eval; + if (ae.contains(srcRow, srcCol)) { // circular ref! + return ErrorEval.CIRCULAR_REF_ERROR; + } + if (ae.isRow()) { + if (ae.isColumn()) { + return ae.getRelativeValue(0, 0); + } + if (ae.containsColumn(srcCol)) { + ValueEval ve = ae.getValueAt(ae.getFirstRow(), srcCol); + ve = getXlator().attemptXlateToNumeric(ve); + return getXlator().attemptXlateToNumeric(ve); + } + return ErrorEval.VALUE_INVALID; + } + if (ae.isColumn()) { + if (ae.containsRow(srcRow)) { + ValueEval ve = ae.getValueAt(srcRow, ae.getFirstColumn()); + return getXlator().attemptXlateToNumeric(ve); + } + return ErrorEval.VALUE_INVALID; + } + return ErrorEval.VALUE_INVALID; + } + return getXlator().attemptXlateToNumeric((ValueEval) eval); + } } -- 2.39.5