From eae43fa85b96224eabf3729dbe39087efa0203d7 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Mon, 8 Sep 2008 21:34:45 +0000 Subject: [PATCH] Refactored OperandResolver coerce functions to convert BlankEval to 0.0 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@693289 13f79535-47bb-0310-9956-ffa450edef68 --- .../record/formula/atp/ParityFunction.java | 3 -- .../poi/hssf/record/formula/atp/YearFrac.java | 3 -- .../record/formula/eval/OperandResolver.java | 18 ++++++--- .../hssf/record/formula/eval/PercentEval.java | 11 ++---- .../eval/TwoOperandNumericOperation.java | 25 ++++++------ .../record/formula/eval/UnaryMinusEval.java | 11 ++---- .../record/formula/eval/UnaryPlusEval.java | 37 ++++++++---------- .../functions/CalendarFieldFunction.java | 8 +--- .../record/formula/functions/LookupUtils.java | 26 ++++++------ .../hssf/record/formula/functions/Mid.java | 9 +---- .../poi/hssf/data/FormulaEvalTestData.xls | Bin 154624 -> 154624 bytes .../poi/hssf/data/externalFunctionExample.xls | Bin 16896 -> 16896 bytes .../formula/TestExternalFunctionFormulas.java | 5 ++- 13 files changed, 66 insertions(+), 90 deletions(-) diff --git a/src/java/org/apache/poi/hssf/record/formula/atp/ParityFunction.java b/src/java/org/apache/poi/hssf/record/formula/atp/ParityFunction.java index dd9ecc2af3..f7ea76a367 100644 --- a/src/java/org/apache/poi/hssf/record/formula/atp/ParityFunction.java +++ b/src/java/org/apache/poi/hssf/record/formula/atp/ParityFunction.java @@ -61,9 +61,6 @@ final class ParityFunction implements FreeRefFunction { private static int evaluateArgParity(Eval arg, int srcCellRow, short srcCellCol) throws EvaluationException { ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); - if (ve == BlankEval.INSTANCE) { - return 0; - } double d = OperandResolver.coerceValueToDouble(ve); if (d < 0) { d = -d; diff --git a/src/java/org/apache/poi/hssf/record/formula/atp/YearFrac.java b/src/java/org/apache/poi/hssf/record/formula/atp/YearFrac.java index ac196723e2..005599d45f 100644 --- a/src/java/org/apache/poi/hssf/record/formula/atp/YearFrac.java +++ b/src/java/org/apache/poi/hssf/record/formula/atp/YearFrac.java @@ -97,9 +97,6 @@ final class YearFrac implements FreeRefFunction { Calendar date = parseDate(strVal); return HSSFDateUtil.getExcelDate(date, false); } - if (ve instanceof BlankEval) { - return 0.0; - } return OperandResolver.coerceValueToDouble(ve); } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java b/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java index 627b269989..87f45236bf 100755 --- a/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java @@ -171,7 +171,8 @@ public final class OperandResolver { /** * Applies some conversion rules if the supplied value is not already an integer.
- * Value is first coerced to a double ( See coerceValueToDouble() ).

+ * Value is first coerced to a double ( See coerceValueToDouble() ). + * Note - BlankEval is converted to 0.

* * Excel typically converts doubles to integers by truncating toward negative infinity.
* The equivalent java code is:
@@ -181,6 +182,9 @@ public final class OperandResolver { * */ public static int coerceValueToInt(ValueEval ev) throws EvaluationException { + if (ev == BlankEval.INSTANCE) { + return 0; + } double d = coerceValueToDouble(ev); // Note - the standard java type conversion from double to int truncates toward zero. // but Math.floor() truncates toward negative infinity @@ -189,16 +193,20 @@ public final class OperandResolver { /** * Applies some conversion rules if the supplied value is not already a number. - * Note - BlankEval is not supported and must be handled by the caller. - * @param ev must be a NumberEval, StringEval or BoolEval + * Note - BlankEval is converted to {@link NumberEval#ZERO}. + * @param ev must be a {@link NumberEval}, {@link StringEval}, {@link BoolEval} or + * {@link BlankEval} * @return actual, parsed or interpreted double value (respectively). * @throws EvaluationException(#VALUE!) only if a StringEval is supplied and cannot be parsed * as a double (See parseDouble() for allowable formats). - * @throws RuntimeException if the supplied parameter is not NumberEval, - * StringEval or BoolEval + * @throws RuntimeException if the supplied parameter is not {@link NumberEval}, + * {@link StringEval}, {@link BoolEval} or {@link BlankEval} */ public static double coerceValueToDouble(ValueEval ev) throws EvaluationException { + if (ev == BlankEval.INSTANCE) { + return 0.0; + } if (ev instanceof NumericValueEval) { // this also handles booleans return ((NumericValueEval)ev).getNumberValue(); diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java index d03e447452..d8a579c42d 100755 --- a/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java @@ -33,12 +33,9 @@ public final class PercentEval implements OperationEval { if (args.length != 1) { return ErrorEval.VALUE_INVALID; } - double d0; + double d0; try { ValueEval ve = OperandResolver.getSingleValue(args[0], srcRow, srcCol); - if (ve instanceof BlankEval) { - return NumberEval.ZERO; - } d0 = OperandResolver.coerceValueToDouble(ve); } catch (EvaluationException e) { return e.getErrorEval(); @@ -50,7 +47,7 @@ public final class PercentEval implements OperationEval { return 1; } public final int getType() { - // TODO - remove - throw new RuntimeException("obsolete code should not be called"); - } + // TODO - remove + throw new RuntimeException("obsolete code should not be called"); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java b/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java index 665ba4b460..0f2933faea 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java @@ -23,18 +23,15 @@ package org.apache.poi.hssf.record.formula.eval; abstract class TwoOperandNumericOperation implements OperationEval { public final int getType() { - // TODO - remove - throw new RuntimeException("obsolete code should not be called"); - } - protected final double singleOperandEvaluate(Eval arg, int srcCellRow, short srcCellCol) throws EvaluationException { - ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); - if (ve instanceof BlankEval) { - return 0.0; - } - return OperandResolver.coerceValueToDouble(ve); - } - - public final Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) { + // TODO - remove + throw new RuntimeException("obsolete code should not be called"); + } + protected final double singleOperandEvaluate(Eval arg, int srcCellRow, short srcCellCol) throws EvaluationException { + ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); + return OperandResolver.coerceValueToDouble(ve); + } + + public final Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) { double result; try { double d0 = singleOperandEvaluate(args[0], srcCellRow, srcCellCol); @@ -46,8 +43,8 @@ abstract class TwoOperandNumericOperation implements OperationEval { } catch (EvaluationException e) { return e.getErrorEval(); } - return new NumberEval(result); - } + return new NumberEval(result); + } protected abstract double evaluate(double d0, double d1) throws EvaluationException; public final int getNumberOfOperands() { return 2; diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java index 8174429e01..780334ae8d 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java @@ -33,12 +33,9 @@ public final class UnaryMinusEval implements OperationEval { if (args.length != 1) { return ErrorEval.VALUE_INVALID; } - double d; + double d; try { ValueEval ve = OperandResolver.getSingleValue(args[0], srcRow, srcCol); - if (ve instanceof BlankEval) { - return NumberEval.ZERO; - } d = OperandResolver.coerceValueToDouble(ve); } catch (EvaluationException e) { return e.getErrorEval(); @@ -50,7 +47,7 @@ public final class UnaryMinusEval implements OperationEval { return 1; } public final int getType() { - // TODO - remove - throw new RuntimeException("obsolete code should not be called"); - } + // TODO - remove + throw new RuntimeException("obsolete code should not be called"); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java index 66c5f68017..831d342866 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java @@ -24,21 +24,18 @@ package org.apache.poi.hssf.record.formula.eval; */ public final class UnaryPlusEval implements OperationEval { - public static final OperationEval instance = new UnaryPlusEval(); - - private UnaryPlusEval() { - } + public static final OperationEval instance = new UnaryPlusEval(); + + private UnaryPlusEval() { + } - public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) { - if(args.length != 1) { - return ErrorEval.VALUE_INVALID; - } - double d; + public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) { + if(args.length != 1) { + return ErrorEval.VALUE_INVALID; + } + double d; try { ValueEval ve = OperandResolver.getSingleValue(args[0], srcCellRow, srcCellCol); - if(ve instanceof BlankEval) { - return NumberEval.ZERO; - } if(ve instanceof StringEval) { // Note - asymmetric with UnaryMinus // -"hello" evaluates to #VALUE! @@ -49,14 +46,14 @@ public final class UnaryPlusEval implements OperationEval { } catch (EvaluationException e) { return e.getErrorEval(); } - return new NumberEval(+d); - } + return new NumberEval(+d); + } - public int getNumberOfOperands() { - return 1; - } + public int getNumberOfOperands() { + return 1; + } - public int getType() { - throw new RuntimeException("obsolete code should not be called"); - } + public int getType() { + throw new RuntimeException("obsolete code should not be called"); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/CalendarFieldFunction.java b/src/java/org/apache/poi/hssf/record/formula/functions/CalendarFieldFunction.java index 3df7c9c5d5..b1ea02fdc0 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/CalendarFieldFunction.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/CalendarFieldFunction.java @@ -21,7 +21,6 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; -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.EvaluationException; @@ -58,12 +57,7 @@ public final class CalendarFieldFunction implements Function { int val; try { ValueEval ve = OperandResolver.getSingleValue(operands[0], srcCellRow, srcCellCol); - - if (ve == BlankEval.INSTANCE) { - val = 0; - } else { - val = OperandResolver.coerceValueToInt(ve); - } + val = OperandResolver.coerceValueToInt(ve); } catch (EvaluationException e) { return e.getErrorEval(); } diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/LookupUtils.java b/src/java/org/apache/poi/hssf/record/formula/functions/LookupUtils.java index ee67ef8ec5..613a3d144c 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/LookupUtils.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/LookupUtils.java @@ -339,23 +339,19 @@ final class LookupUtils { throw EvaluationException.invalidRef(); } int oneBasedIndex; - if(veRowColIndexArg instanceof BlankEval) { - oneBasedIndex = 0; - } else { - if(veRowColIndexArg instanceof StringEval) { - StringEval se = (StringEval) veRowColIndexArg; - String strVal = se.getStringValue(); - Double dVal = OperandResolver.parseDouble(strVal); - if(dVal == null) { - // String does not resolve to a number. Raise #REF! error. - throw EvaluationException.invalidRef(); - // This includes text booleans "TRUE" and "FALSE". They are not valid. - } - // else - numeric value parses OK + if(veRowColIndexArg instanceof StringEval) { + StringEval se = (StringEval) veRowColIndexArg; + String strVal = se.getStringValue(); + Double dVal = OperandResolver.parseDouble(strVal); + if(dVal == null) { + // String does not resolve to a number. Raise #REF! error. + throw EvaluationException.invalidRef(); + // This includes text booleans "TRUE" and "FALSE". They are not valid. } - // actual BoolEval values get interpreted as FALSE->0 and TRUE->1 - oneBasedIndex = OperandResolver.coerceValueToInt(veRowColIndexArg); + // else - numeric value parses OK } + // actual BoolEval values get interpreted as FALSE->0 and TRUE->1 + oneBasedIndex = OperandResolver.coerceValueToInt(veRowColIndexArg); if (oneBasedIndex < 1) { // note this is asymmetric with the errors when the index is too large (#REF!) throw EvaluationException.invalidValue(); diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Mid.java b/src/java/org/apache/poi/hssf/record/formula/functions/Mid.java index 7f30aa4cec..b9d679d3d3 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/Mid.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/Mid.java @@ -17,7 +17,6 @@ package org.apache.poi.hssf.record.formula.functions; -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.EvaluationException; @@ -81,12 +80,8 @@ public class Mid implements Function { private static int evaluateNumberArg(Eval arg, int srcCellRow, short srcCellCol) throws EvaluationException { ValueEval ev = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); - if (ev instanceof BlankEval) { - // Note - for start_num arg, blank causes error(#VALUE!), - // but for num_chars causes empty string to be returned. - return 0; - } - + // Note - for start_num arg, blank/zero causes error(#VALUE!), + // but for num_chars causes empty string to be returned. return OperandResolver.coerceValueToInt(ev); } } \ No newline at end of file diff --git a/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls b/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls index 68a12d834fed0d5ed7268b383a765729e8c9fa0e..e4c8e42dcbc4679e72ef4d458fe7686fc19333dd 100644 GIT binary patch delta 2349 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 diff --git a/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java b/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java index b3a82c6de7..dbfc8269da 100755 --- a/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java @@ -77,8 +77,9 @@ public final class TestExternalFunctionFormulas extends TestCase { HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(sheet, wb); confirmCellEval(sheet, 0, 0, fe, "YEARFRAC(B1,C1)", 29.0/90.0); confirmCellEval(sheet, 1, 0, fe, "YEARFRAC(B2,C2)", 0.0); - confirmCellEval(sheet, 2, 0, fe, "IF(ISEVEN(3),1.2,1.6)", 1.6); - confirmCellEval(sheet, 3, 0, fe, "IF(ISODD(3),1.2,1.6)", 1.2); + confirmCellEval(sheet, 2, 0, fe, "YEARFRAC(B3,C3,D3)", 0.0); + confirmCellEval(sheet, 3, 0, fe, "IF(ISEVEN(3),1.2,1.6)", 1.6); + confirmCellEval(sheet, 4, 0, fe, "IF(ISODD(3),1.2,1.6)", 1.2); } private static void confirmCellEval(HSSFSheet sheet, int rowIx, int colIx, -- 2.39.5