]> source.dussan.org Git - poi.git/commitdiff
Moved handling of MissingArgEval into IF() or CHOOSE() for non-optimised (eager argum...
authorJosh Micich <josh@apache.org>
Thu, 26 Nov 2009 02:57:24 +0000 (02:57 +0000)
committerJosh Micich <josh@apache.org>
Thu, 26 Nov 2009 02:57:24 +0000 (02:57 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@884389 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/formula/functions/Choose.java
src/java/org/apache/poi/hssf/record/formula/functions/If.java
src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java

index 3495571340b49af170f6f2f12e30f4646784b1fb..01fa4590f8eb82aa4485c5d55c7c1a05e68544aa 100644 (file)
 
 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();
                }
index 3f74019844c614c85b6ca3b9cdd53a4b559b5ef0..6cdbcd6a1663bb43c9e72629cba60118562e5cdb 100644 (file)
 
 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)
index ddd5f5d36d0d57fee12799091d19c1743f8b39d8..3accf93f310211601a8b8ae09508195f783ddfbd 100644 (file)
@@ -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);
                        }