diff options
author | Josh Micich <josh@apache.org> | 2009-11-26 02:57:24 +0000 |
---|---|---|
committer | Josh Micich <josh@apache.org> | 2009-11-26 02:57:24 +0000 |
commit | 43e6a9c88516229bd4e341124e4cd57e48c2ab54 (patch) | |
tree | 4023adaf94fe60062124d5c4ff5390533b91aec7 | |
parent | 61fc4d0329a186a6a0b5e0654c14c1945654e493 (diff) | |
download | poi-43e6a9c88516229bd4e341124e4cd57e48c2ab54.tar.gz poi-43e6a9c88516229bd4e341124e4cd57e48c2ab54.zip |
Moved handling of MissingArgEval into IF() or CHOOSE() for non-optimised (eager argument evaluation) case
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@884389 13f79535-47bb-0310-9956-ffa450edef68
3 files changed, 26 insertions, 6 deletions
diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java b/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java index 3495571340..01fa4590f8 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java @@ -17,8 +17,10 @@ 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.EvaluationException; +import org.apache.poi.hssf.record.formula.eval.MissingArgEval; import org.apache.poi.hssf.record.formula.eval.OperandResolver; import org.apache.poi.hssf.record.formula.eval.ValueEval; @@ -37,7 +39,11 @@ public final class Choose implements Function { if (ix < 1 || ix >= args.length) { return ErrorEval.VALUE_INVALID; } - return OperandResolver.getSingleValue(args[ix], srcRowIndex, srcColumnIndex); + ValueEval result = OperandResolver.getSingleValue(args[ix], srcRowIndex, srcColumnIndex); + if (result == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return result; } catch (EvaluationException e) { return e.getErrorEval(); } diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/If.java b/src/java/org/apache/poi/hssf/record/formula/functions/If.java index 3f74019844..6cdbcd6a16 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/If.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/If.java @@ -17,8 +17,10 @@ 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.BoolEval; import org.apache.poi.hssf.record.formula.eval.EvaluationException; +import org.apache.poi.hssf.record.formula.eval.MissingArgEval; import org.apache.poi.hssf.record.formula.eval.OperandResolver; import org.apache.poi.hssf.record.formula.eval.ValueEval; @@ -34,7 +36,13 @@ public final class If extends Var2or3ArgFunction { } catch (EvaluationException e) { return e.getErrorEval(); } - return b ? arg1 : BoolEval.FALSE; + if (b) { + if (arg1 == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return arg1; + } + return BoolEval.FALSE; } public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1, @@ -45,7 +53,16 @@ public final class If extends Var2or3ArgFunction { } catch (EvaluationException e) { return e.getErrorEval(); } - return b ? arg1 : arg2; + if (b) { + if (arg1 == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return arg1; + } + if (arg2 == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return arg2; } public static boolean evaluateFirstArg(ValueEval arg, int srcCellRow, int srcCellCol) diff --git a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java index ddd5f5d36d..3accf93f31 100644 --- a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java +++ b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java @@ -435,9 +435,6 @@ public final class WorkbookEvaluator { } // logDebug("invoke " + operation + " (nAgs=" + numops + ")"); opResult = OperationEvaluatorFactory.evaluate(optg, ops, ec); - if (opResult == MissingArgEval.instance) { - opResult = BlankEval.INSTANCE; - } } else { opResult = getEvalForPtg(ptg, ec); } |