]> source.dussan.org Git - poi.git/commitdiff
Created new TwoDEval interface for AreaEvals (in preparation for patch 48292)
authorJosh Micich <josh@apache.org>
Wed, 9 Dec 2009 00:50:11 +0000 (00:50 +0000)
committerJosh Micich <josh@apache.org>
Wed, 9 Dec 2009 00:50:11 +0000 (00:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@888665 13f79535-47bb-0310-9956-ffa450edef68

18 files changed:
src/java/org/apache/poi/hssf/record/formula/eval/AreaEval.java
src/java/org/apache/poi/hssf/record/formula/eval/AreaEvalBase.java
src/java/org/apache/poi/hssf/record/formula/functions/BooleanFunction.java
src/java/org/apache/poi/hssf/record/formula/functions/Columns.java
src/java/org/apache/poi/hssf/record/formula/functions/CountUtils.java
src/java/org/apache/poi/hssf/record/formula/functions/Countblank.java
src/java/org/apache/poi/hssf/record/formula/functions/Countif.java
src/java/org/apache/poi/hssf/record/formula/functions/Hlookup.java
src/java/org/apache/poi/hssf/record/formula/functions/Index.java
src/java/org/apache/poi/hssf/record/formula/functions/Lookup.java
src/java/org/apache/poi/hssf/record/formula/functions/LookupUtils.java
src/java/org/apache/poi/hssf/record/formula/functions/Match.java
src/java/org/apache/poi/hssf/record/formula/functions/Mode.java
src/java/org/apache/poi/hssf/record/formula/functions/Rows.java
src/java/org/apache/poi/hssf/record/formula/functions/Sumproduct.java
src/java/org/apache/poi/hssf/record/formula/functions/Vlookup.java
src/java/org/apache/poi/hssf/record/formula/functions/XYNumericFunction.java
src/java/org/apache/poi/ss/formula/TwoDEval.java [new file with mode: 0644]

index 7428ad716396004cfdebce5b502c53b3de5d4323..4c5fb9f681695ac1c7c183f8c4c7606ff64e5f88 100644 (file)
 
 package org.apache.poi.hssf.record.formula.eval;
 
+import org.apache.poi.ss.formula.TwoDEval;
 /**
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
  *
  */
-public interface AreaEval extends ValueEval {
+public interface AreaEval extends TwoDEval {
 
     /**
      * returns the 0-based index of the first row in
@@ -47,20 +48,6 @@ public interface AreaEval extends ValueEval {
      */
     int getLastColumn();
 
-    /**
-     * returns true if the Area's start and end row indexes
-     * are same. This result of this method should agree
-     * with getFirstRow() == getLastRow().
-     */
-    boolean isRow();
-
-    /**
-     * returns true if the Area's start and end col indexes
-     * are same. This result of this method should agree
-     * with getFirstColumn() == getLastColumn().
-     */
-    boolean isColumn();
-
     /**
      * @return the ValueEval from within this area at the specified row and col index. Never
      * <code>null</code> (possibly {@link BlankEval}).  The specified indexes should be absolute
index d435264ae5f25862b93eeb065bb5577009d9ccca..12e21cf9adfeaa5f8a9f7fb78ddf9d81f3b2331f 100644 (file)
@@ -66,7 +66,6 @@ public abstract class AreaEvalBase implements AreaEval {
        public final int getLastRow() {
                return _lastRow;
        }
-
        public final ValueEval getAbsoluteValue(int row, int col) {
                int rowOffsetIx = row - _firstRow;
                int colOffsetIx = col - _firstColumn;
@@ -106,6 +105,10 @@ public abstract class AreaEvalBase implements AreaEval {
                return _lastRow-_firstRow+1;
        }
 
+       public final ValueEval getValue(int row, int col) {
+               return getRelativeValue(row, col);
+       }
+
        public abstract ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex);
 
        public int getWidth() {
index 0165e501a5674ab878be1cf64aae11d4259b17c9..e3381a0ae9f440dabb0295a874d661970cfabc9b 100644 (file)
 
 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.ValueEval;
 import org.apache.poi.hssf.record.formula.eval.EvaluationException;
 import org.apache.poi.hssf.record.formula.eval.OperandResolver;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Here are the general rules concerning Boolean functions:
@@ -61,13 +61,13 @@ public abstract class BooleanFunction implements Function {
                 */
                for (int i=0, iSize=args.length; i<iSize; i++) {
                        ValueEval arg = args[i];
-                       if (arg instanceof AreaEval) {
-                               AreaEval ae = (AreaEval) arg;
+                       if (arg instanceof TwoDEval) {
+                               TwoDEval ae = (TwoDEval) arg;
                                int height = ae.getHeight();
                                int width = ae.getWidth();
                                for (int rrIx=0; rrIx<height; rrIx++) {
                                        for (int rcIx=0; rcIx<width; rcIx++) {
-                                               ValueEval ve = ae.getRelativeValue(rrIx, rcIx);
+                                               ValueEval ve = ae.getValue(rrIx, rcIx);
                                                Boolean tempVe = OperandResolver.coerceValueToBoolean(ve, true);
                                                if (tempVe != null) {
                                                        result = partialEvaluate(result, tempVe.booleanValue());
index 0ef7e0632437acdc2ca4e0196344945d5671349f..83880e497b6df52d1cc4d38accadea30bdd6b6ec 100644 (file)
 
 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.ErrorEval;
 import org.apache.poi.hssf.record.formula.eval.NumberEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Implementation for Excel COLUMNS function.
@@ -33,8 +33,8 @@ public final class Columns extends Fixed1ArgFunction {
        public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
 
                int result;
-               if (arg0 instanceof AreaEval) {
-                       result = ((AreaEval) arg0).getWidth();
+               if (arg0 instanceof TwoDEval) {
+                       result = ((TwoDEval) arg0).getWidth();
                } else if (arg0 instanceof RefEval) {
                        result = 1;
                } else { // anything else is not valid argument
index 5dbda15dfb7c4a8b592b3da2df72db156e9333ad..592fb985cc0f1c3a3f33d118c36b541ede41759b 100644 (file)
@@ -17,9 +17,9 @@
 
 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.RefEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Common logic for COUNT, COUNTA and COUNTIF
@@ -41,14 +41,14 @@ final class CountUtils {
        /**
         * @return the number of evaluated cells in the range that match the specified criteria
         */
-       public static int countMatchingCellsInArea(AreaEval areaEval, I_MatchPredicate criteriaPredicate) {
+       public static int countMatchingCellsInArea(TwoDEval areaEval, I_MatchPredicate criteriaPredicate) {
                int result = 0;
 
                int height = areaEval.getHeight();
                int width = areaEval.getWidth();
                for (int rrIx=0; rrIx<height; rrIx++) {
                        for (int rcIx=0; rcIx<width; rcIx++) {
-                               ValueEval ve = areaEval.getRelativeValue(rrIx, rcIx);
+                               ValueEval ve = areaEval.getValue(rrIx, rcIx);
                                if(criteriaPredicate.matches(ve)) {
                                        result++;
                                }
@@ -69,8 +69,8 @@ final class CountUtils {
                if (eval == null) {
                        throw new IllegalArgumentException("eval must not be null");
                }
-               if (eval instanceof AreaEval) {
-                       return CountUtils.countMatchingCellsInArea((AreaEval) eval, criteriaPredicate);
+               if (eval instanceof TwoDEval) {
+                       return countMatchingCellsInArea((TwoDEval) eval, criteriaPredicate);
                }
                if (eval instanceof RefEval) {
                        return CountUtils.countMatchingCell((RefEval) eval, criteriaPredicate);
index 447c1b87b1d0ea3820c467fa1a88caf9b7b38208..b155b84d867a8ccc2490335e95f214e936194b12 100644 (file)
 
 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.NumberEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Implementation for the function COUNTBLANK
@@ -42,8 +42,8 @@ public final class Countblank extends Fixed1ArgFunction {
                double result;
                if (arg0 instanceof RefEval) {
                        result = CountUtils.countMatchingCell((RefEval) arg0, predicate);
-               } else if (arg0 instanceof AreaEval) {
-                       result = CountUtils.countMatchingCellsInArea((AreaEval) arg0, predicate);
+               } else if (arg0 instanceof TwoDEval) {
+                       result = CountUtils.countMatchingCellsInArea((TwoDEval) arg0, predicate);
                } else {
                        throw new IllegalArgumentException("Bad range arg type (" + arg0.getClass().getName() + ")");
                }
index 25fa0ecadd5004734dcb4eea86a7c4a4bed14143..93b2ea8f0cb4bed3721e16607b3b433d033c72c8 100644 (file)
@@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
 
 import java.util.regex.Pattern;
 
-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.BoolEval;
 import org.apache.poi.hssf.record.formula.eval.ErrorEval;
@@ -30,6 +29,7 @@ import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.StringEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
+import org.apache.poi.ss.formula.TwoDEval;
 import org.apache.poi.ss.usermodel.ErrorConstants;
 
 /**
@@ -417,8 +417,8 @@ public final class Countif extends Fixed2ArgFunction {
 
                if (rangeArg instanceof RefEval) {
                        return CountUtils.countMatchingCell((RefEval) rangeArg, criteriaPredicate);
-               } else if (rangeArg instanceof AreaEval) {
-                       return CountUtils.countMatchingCellsInArea((AreaEval) rangeArg, criteriaPredicate);
+               } else if (rangeArg instanceof TwoDEval) {
+                       return CountUtils.countMatchingCellsInArea((TwoDEval) rangeArg, criteriaPredicate);
                } else {
                        throw new IllegalArgumentException("Bad range arg type (" + rangeArg.getClass().getName() + ")");
                }
index 03faa25b550ac4b75d371bbd0be190bb95ade753..df5ecad6ef2cc180624316490d2ae227187c3586 100644 (file)
 
 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.EvaluationException;
 import org.apache.poi.hssf.record.formula.eval.OperandResolver;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
+import org.apache.poi.ss.formula.TwoDEval;
 /**
  * Implementation of the HLOOKUP() function.<p/>
  *
@@ -53,7 +53,7 @@ public final class Hlookup extends Var3or4ArgFunction  {
                        // Evaluation order:
                        // arg0 lookup_value, arg1 table_array, arg3 range_lookup, find lookup value, arg2 row_index, fetch result
                        ValueEval lookupValue = OperandResolver.getSingleValue(arg0, srcRowIndex, srcColumnIndex);
-                       AreaEval tableArray = LookupUtils.resolveTableArrayArg(arg1);
+                       TwoDEval tableArray = LookupUtils.resolveTableArrayArg(arg1);
                        boolean isRangeLookup = LookupUtils.resolveRangeLookupArg(arg3, srcRowIndex, srcColumnIndex);
                        int colIndex = LookupUtils.lookupIndexOfValue(lookupValue, LookupUtils.createRowVector(tableArray, 0), isRangeLookup);
                        int rowIndex = LookupUtils.resolveRowOrColIndexArg(arg2, srcRowIndex, srcColumnIndex);
@@ -71,7 +71,7 @@ public final class Hlookup extends Var3or4ArgFunction  {
         *
         * @throws EvaluationException (#REF!) if colIndex is too high
         */
-       private ValueVector createResultColumnVector(AreaEval tableArray, int rowIndex) throws EvaluationException {
+       private ValueVector createResultColumnVector(TwoDEval tableArray, int rowIndex) throws EvaluationException {
                if(rowIndex >= tableArray.getHeight()) {
                        throw EvaluationException.invalidRef();
                }
index d4b25193356f73677fb1d7617d91644c2e1d8501..c005adffa449441259c79015027ed13ff1e02da7 100644 (file)
@@ -25,6 +25,7 @@ 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.RefEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Implementation for the Excel function INDEX
@@ -47,7 +48,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
 public final class Index implements Function2Arg, Function3Arg, Function4Arg {
 
        public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
-               AreaEval reference = convertFirstArg(arg0);
+               TwoDEval reference = convertFirstArg(arg0);
 
                boolean colArgWasPassed = false;
                int columnIx = 0;
@@ -60,7 +61,7 @@ public final class Index implements Function2Arg, Function3Arg, Function4Arg {
        }
        public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
                        ValueEval arg2) {
-               AreaEval reference = convertFirstArg(arg0);
+               TwoDEval reference = convertFirstArg(arg0);
 
                boolean colArgWasPassed = true;
                try {
@@ -81,14 +82,14 @@ public final class Index implements Function2Arg, Function3Arg, Function4Arg {
                // The formula parser doesn't seem to support this yet. Not sure if the evaluator does either
        }
 
-       private static AreaEval convertFirstArg(ValueEval arg0) {
+       private static TwoDEval convertFirstArg(ValueEval arg0) {
                ValueEval firstArg = arg0;
                if (firstArg instanceof RefEval) {
                        // convert to area ref for simpler code in getValueFromArea()
                        return ((RefEval)firstArg).offset(0, 0, 0, 0);
                }
-               if((firstArg instanceof AreaEval)) {
-                       return (AreaEval) firstArg;
+               if((firstArg instanceof TwoDEval)) {
+                       return (TwoDEval) firstArg;
                }
                // else the other variation of this function takes an array as the first argument
                // it seems like interface 'ArrayEval' does not even exist yet
@@ -117,7 +118,7 @@ public final class Index implements Function2Arg, Function3Arg, Function4Arg {
         *            <code>true</code>.  This parameter is needed because error codes are slightly
         *            different when only 2 args are passed.
         */
-       private static ValueEval getValueFromArea(AreaEval ae, int pRowIx, int pColumnIx,
+       private static ValueEval getValueFromArea(TwoDEval ae, int pRowIx, int pColumnIx,
                        boolean colArgWasPassed, int srcRowIx, int srcColIx) throws EvaluationException {
                boolean rowArgWasEmpty = pRowIx == 0;
                boolean colArgWasEmpty = pColumnIx == 0;
@@ -145,7 +146,13 @@ public final class Index implements Function2Arg, Function3Arg, Function4Arg {
                        }
                } else if (ae.isColumn()) {
                        if (rowArgWasEmpty) {
-                               rowIx = srcRowIx - ae.getFirstRow();
+                               if (ae instanceof AreaEval) {
+                                       rowIx = srcRowIx - ((AreaEval) ae).getFirstRow();
+                               } else {
+                                       // TODO - ArrayEval
+                                       // rowIx = relative row of evaluating cell in its array formula cell group
+                                       throw new RuntimeException("incomplete code - ");
+                               }
                        } else {
                                rowIx = pRowIx-1;
                        }
@@ -164,12 +171,24 @@ public final class Index implements Function2Arg, Function3Arg, Function4Arg {
                        // Normal case - area ref is 2-D, and both index args were provided
                        // if either arg is missing (or blank) the logic is similar to OperandResolver.getSingleValue()
                        if (rowArgWasEmpty) {
-                               rowIx = srcRowIx - ae.getFirstRow();
+                               if (ae instanceof AreaEval) {
+                                       rowIx = srcRowIx - ((AreaEval) ae).getFirstRow();
+                               } else {
+                                       // TODO - ArrayEval
+                                       // rowIx = relative row of evaluating cell in its array formula cell group
+                                       throw new RuntimeException("incomplete code - ");
+                               }
                        } else {
                                rowIx = pRowIx-1;
                        }
                        if (colArgWasEmpty) {
-                               columnIx = srcColIx - ae.getFirstColumn();
+                               if (ae instanceof AreaEval) {
+                                       columnIx = srcColIx - ((AreaEval) ae).getFirstColumn();
+                               } else {
+                                       // TODO - ArrayEval
+                                       // colIx = relative col of evaluating cell in its array formula cell group
+                                       throw new RuntimeException("incomplete code - ");
+                               }
                        } else {
                                columnIx = pColumnIx-1;
                        }
@@ -185,7 +204,7 @@ public final class Index implements Function2Arg, Function3Arg, Function4Arg {
                if (rowIx < 0 || columnIx < 0 || rowIx >= height || columnIx >= width) {
                        throw new EvaluationException(ErrorEval.VALUE_INVALID);
                }
-               return ae.getRelativeValue(rowIx, columnIx);
+               return ae.getValue(rowIx, columnIx);
        }
 
 
index 6a2bafe7e6ea5f2fa9b4c4e3f2deeeec5a51e420..09baff5dbb221898cd9755ba2d674eae4ed176e8 100644 (file)
 
 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.EvaluationException;
 import org.apache.poi.hssf.record.formula.eval.OperandResolver;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Implementation of Excel function LOOKUP.<p/>
@@ -48,8 +48,8 @@ public final class Lookup extends Var2or3ArgFunction {
                        ValueEval arg2) {
                try {
                        ValueEval lookupValue = OperandResolver.getSingleValue(arg0, srcRowIndex, srcColumnIndex);
-                       AreaEval aeLookupVector = LookupUtils.resolveTableArrayArg(arg1);
-                       AreaEval aeResultVector = LookupUtils.resolveTableArrayArg(arg2);
+                       TwoDEval aeLookupVector = LookupUtils.resolveTableArrayArg(arg1);
+                       TwoDEval aeResultVector = LookupUtils.resolveTableArrayArg(arg2);
 
                        ValueVector lookupVector = createVector(aeLookupVector);
                        ValueVector resultVector = createVector(aeResultVector);
@@ -65,7 +65,7 @@ public final class Lookup extends Var2or3ArgFunction {
                }
        }
 
-       private static ValueVector createVector(AreaEval ae) {
+       private static ValueVector createVector(TwoDEval ae) {
                ValueVector result = LookupUtils.createVector(ae);
                if (result != null) {
                        return result;
index b6a9d7bc8bc4c5b4a46366fdd8c57b90d647ff9d..430565c59762b0bcda69464ffe5d23ff90b33c2b 100644 (file)
@@ -17,7 +17,6 @@
 
 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.BoolEval;
 import org.apache.poi.hssf.record.formula.eval.ErrorEval;
@@ -28,6 +27,7 @@ import org.apache.poi.hssf.record.formula.eval.OperandResolver;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.StringEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Common functionality used by VLOOKUP, HLOOKUP, LOOKUP and MATCH
@@ -47,15 +47,14 @@ final class LookupUtils {
 
        private static final class RowVector implements ValueVector {
 
-               private final AreaEval _tableArray;
+               private final TwoDEval _tableArray;
                private final int _size;
                private final int _rowIndex;
 
-               public RowVector(AreaEval tableArray, int rowIndex) {
+               public RowVector(TwoDEval tableArray, int rowIndex) {
                        _rowIndex = rowIndex;
-                       int _rowAbsoluteIndex = tableArray.getFirstRow() + rowIndex;
-                       if(!tableArray.containsRow(_rowAbsoluteIndex)) {
-                               int lastRowIx =  tableArray.getLastRow() -  tableArray.getFirstRow();
+                       int lastRowIx =  tableArray.getHeight() - 1;
+                       if(rowIndex < 0 || rowIndex > lastRowIx) {
                                throw new IllegalArgumentException("Specified row index (" + rowIndex
                                                + ") is outside the allowed range (0.." + lastRowIx + ")");
                        }
@@ -68,7 +67,7 @@ final class LookupUtils {
                                throw new ArrayIndexOutOfBoundsException("Specified index (" + index
                                                + ") is outside the allowed range (0.." + (_size-1) + ")");
                        }
-                       return _tableArray.getRelativeValue(_rowIndex, index);
+                       return _tableArray.getValue(_rowIndex, index);
                }
                public int getSize() {
                        return _size;
@@ -77,15 +76,14 @@ final class LookupUtils {
 
        private static final class ColumnVector implements ValueVector {
 
-               private final AreaEval _tableArray;
+               private final TwoDEval _tableArray;
                private final int _size;
                private final int _columnIndex;
 
-               public ColumnVector(AreaEval tableArray, int columnIndex) {
+               public ColumnVector(TwoDEval tableArray, int columnIndex) {
                        _columnIndex = columnIndex;
-                       int _columnAbsoluteIndex = tableArray.getFirstColumn() + columnIndex;
-                       if(!tableArray.containsColumn((short)_columnAbsoluteIndex)) {
-                               int lastColIx =  tableArray.getLastColumn() -  tableArray.getFirstColumn();
+                       int lastColIx =  tableArray.getWidth()-1;
+                       if(columnIndex < 0 || columnIndex > lastColIx) {
                                throw new IllegalArgumentException("Specified column index (" + columnIndex
                                                + ") is outside the allowed range (0.." + lastColIx + ")");
                        }
@@ -98,23 +96,23 @@ final class LookupUtils {
                                throw new ArrayIndexOutOfBoundsException("Specified index (" + index
                                                + ") is outside the allowed range (0.." + (_size-1) + ")");
                        }
-                       return _tableArray.getRelativeValue(index, _columnIndex);
+                       return _tableArray.getValue(index, _columnIndex);
                }
                public int getSize() {
                        return _size;
                }
        }
 
-       public static ValueVector createRowVector(AreaEval tableArray, int relativeRowIndex) {
+       public static ValueVector createRowVector(TwoDEval tableArray, int relativeRowIndex) {
                return new RowVector(tableArray, relativeRowIndex);
        }
-       public static ValueVector createColumnVector(AreaEval tableArray, int relativeColumnIndex) {
+       public static ValueVector createColumnVector(TwoDEval tableArray, int relativeColumnIndex) {
                return new ColumnVector(tableArray, relativeColumnIndex);
        }
        /**
         * @return <code>null</code> if the supplied area is neither a single row nor a single colum
         */
-       public static ValueVector createVector(AreaEval ae) {
+       public static ValueVector createVector(TwoDEval ae) {
                if (ae.isColumn()) {
                        return createColumnVector(ae, 0);
                }
@@ -361,9 +359,9 @@ final class LookupUtils {
         * The second argument (table_array) should be an area ref, but can actually be a cell ref, in
         * which case it is interpreted as a 1x1 area ref.  Other scalar values cause #VALUE! error.
         */
-       public static AreaEval resolveTableArrayArg(ValueEval eval) throws EvaluationException {
-               if (eval instanceof AreaEval) {
-                       return (AreaEval) eval;
+       public static TwoDEval resolveTableArrayArg(ValueEval eval) throws EvaluationException {
+               if (eval instanceof TwoDEval) {
+                       return (TwoDEval) eval;
                }
 
                if(eval instanceof RefEval) {
index c2208196fa7534fe280f4ff1acfc19c0a715aa23..d774c67bc17d23322048b85e02a06008adf30061 100644 (file)
@@ -17,7 +17,6 @@
 
 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.ErrorEval;
 import org.apache.poi.hssf.record.formula.eval.EvaluationException;
 import org.apache.poi.hssf.record.formula.eval.NumberEval;
@@ -29,6 +28,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.CompareResult;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.LookupValueComparer;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Implementation for the MATCH() Excel function.<p/>
@@ -130,8 +130,8 @@ public final class Match extends Var2or3ArgFunction {
                        RefEval re = (RefEval) eval;
                        return new SingleValueVector(re.getInnerValueEval());
                }
-               if (eval instanceof AreaEval) {
-                       ValueVector result = LookupUtils.createVector((AreaEval)eval);
+               if (eval instanceof TwoDEval) {
+                       ValueVector result = LookupUtils.createVector((TwoDEval)eval);
                        if (result == null) {
                                throw new EvaluationException(ErrorEval.NA);
                        }
index 4280bb11e596a5b8c48a64a40409460d06241c6b..4ede174d21c334571a997c452c157ddcdaab1f25 100644 (file)
@@ -21,7 +21,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-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.BoolEval;
 import org.apache.poi.hssf.record.formula.eval.ErrorEval;
@@ -30,6 +29,7 @@ import org.apache.poi.hssf.record.formula.eval.NumberEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.StringEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
@@ -92,13 +92,13 @@ public final class Mode implements Function {
        }
 
        private static void collectValues(ValueEval arg, List<Double> temp) throws EvaluationException {
-               if (arg instanceof AreaEval) {
-                       AreaEval ae = (AreaEval) arg;
+               if (arg instanceof TwoDEval) {
+                       TwoDEval ae = (TwoDEval) arg;
                        int width = ae.getWidth();
                        int height = ae.getHeight();
                        for (int rrIx = 0; rrIx < height; rrIx++) {
                                for (int rcIx = 0; rcIx < width; rcIx++) {
-                                       ValueEval ve1 = ae.getRelativeValue(rrIx, rcIx);
+                                       ValueEval ve1 = ae.getValue(rrIx, rcIx);
                                        collectValue(ve1, temp, false);
                                }
                        }
index dfde69ae3115185707c4c4df8eb76e598a515963..91da8e157d144f64388ea73a0c04c5c374a9dff2 100644 (file)
 
 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.ErrorEval;
 import org.apache.poi.hssf.record.formula.eval.NumberEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * Implementation for Excel ROWS function.
@@ -33,8 +33,8 @@ public final class Rows extends Fixed1ArgFunction {
        public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
 
                int result;
-               if (arg0 instanceof AreaEval) {
-                       result = ((AreaEval) arg0).getHeight();
+               if (arg0 instanceof TwoDEval) {
+                       result = ((TwoDEval) arg0).getHeight();
                } else if (arg0 instanceof RefEval) {
                        result = 1;
                } else { // anything else is not valid argument
index 8c2d2b173bcb391ee0c8e210c51f66cbb4a5d55b..41de8ef392bae60356676172b3d18ca31b81d107 100644 (file)
@@ -26,6 +26,7 @@ import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.StringEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.TwoDEval;
 
 
 /**
@@ -68,8 +69,8 @@ public final class Sumproduct implements Function {
                        if(firstArg instanceof RefEval) {
                                return evaluateSingleProduct(args);
                        }
-                       if(firstArg instanceof AreaEval) {
-                               AreaEval ae = (AreaEval) firstArg;
+                       if (firstArg instanceof TwoDEval) {
+                               TwoDEval ae = (TwoDEval) firstArg;
                                if(ae.isRow() && ae.isColumn()) {
                                        return evaluateSingleProduct(args);
                                }
@@ -120,7 +121,7 @@ public final class Sumproduct implements Function {
 
        private static ValueEval evaluateAreaSumProduct(ValueEval[] evalArgs) throws EvaluationException {
                int maxN = evalArgs.length;
-               AreaEval[] args = new AreaEval[maxN];
+               TwoDEval[] args = new TwoDEval[maxN];
                try {
                        System.arraycopy(evalArgs, 0, args, 0, maxN);
                } catch (ArrayStoreException e) {
@@ -129,7 +130,7 @@ public final class Sumproduct implements Function {
                }
 
 
-               AreaEval firstArg = args[0];
+               TwoDEval firstArg = args[0];
 
                int height = firstArg.getHeight();
                int width = firstArg.getWidth(); // TODO - junit
@@ -150,7 +151,7 @@ public final class Sumproduct implements Function {
                        for (int rcIx=0; rcIx<width; rcIx++) {
                                double term = 1D;
                                for(int n=0; n<maxN; n++) {
-                                       double val = getProductTerm(args[n].getRelativeValue(rrIx, rcIx), false);
+                                       double val = getProductTerm(args[n].getValue(rrIx, rcIx), false);
                                        term *= val;
                                }
                                acc += term;
@@ -160,12 +161,12 @@ public final class Sumproduct implements Function {
                return new NumberEval(acc);
        }
 
-       private static void throwFirstError(AreaEval areaEval) throws EvaluationException {
+       private static void throwFirstError(TwoDEval areaEval) throws EvaluationException {
                int height = areaEval.getHeight();
                int width = areaEval.getWidth();
                for (int rrIx=0; rrIx<height; rrIx++) {
                        for (int rcIx=0; rcIx<width; rcIx++) {
-                               ValueEval ve = areaEval.getRelativeValue(rrIx, rcIx);
+                               ValueEval ve = areaEval.getValue(rrIx, rcIx);
                                if (ve instanceof ErrorEval) {
                                        throw new EvaluationException((ErrorEval) ve);
                                }
@@ -173,9 +174,9 @@ public final class Sumproduct implements Function {
                }
        }
 
-       private static boolean areasAllSameSize(AreaEval[] args, int height, int width) {
+       private static boolean areasAllSameSize(TwoDEval[] args, int height, int width) {
                for (int i = 0; i < args.length; i++) {
-                       AreaEval areaEval = args[i];
+                       TwoDEval areaEval = args[i];
                        // check that height and width match
                        if(areaEval.getHeight() != height) {
                                return false;
index ebd35caaf55a375d21826d6e18e8f8b40a5d8d7a..1e240eb886488a52de9e0d7dbaf497aa0c329b9d 100644 (file)
 
 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.EvaluationException;
 import org.apache.poi.hssf.record.formula.eval.OperandResolver;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
+import org.apache.poi.ss.formula.TwoDEval;
 /**
  * Implementation of the VLOOKUP() function.<p/>
  *
@@ -53,7 +53,7 @@ public final class Vlookup extends Var3or4ArgFunction {
                        // Evaluation order:
                        // arg0 lookup_value, arg1 table_array, arg3 range_lookup, find lookup value, arg2 col_index, fetch result
                        ValueEval lookupValue = OperandResolver.getSingleValue(arg0, srcRowIndex, srcColumnIndex);
-                       AreaEval tableArray = LookupUtils.resolveTableArrayArg(arg1);
+                       TwoDEval tableArray = LookupUtils.resolveTableArrayArg(arg1);
                        boolean isRangeLookup = LookupUtils.resolveRangeLookupArg(arg3, srcRowIndex, srcColumnIndex);
                        int rowIndex = LookupUtils.lookupIndexOfValue(lookupValue, LookupUtils.createColumnVector(tableArray, 0), isRangeLookup);
                        int colIndex = LookupUtils.resolveRowOrColIndexArg(arg2, srcRowIndex, srcColumnIndex);
@@ -72,7 +72,7 @@ public final class Vlookup extends Var3or4ArgFunction {
         *
         * @throws EvaluationException (#REF!) if colIndex is too high
         */
-       private ValueVector createResultColumnVector(AreaEval tableArray, int colIndex) throws EvaluationException {
+       private ValueVector createResultColumnVector(TwoDEval tableArray, int colIndex) throws EvaluationException {
                if(colIndex >= tableArray.getWidth()) {
                        throw EvaluationException.invalidRef();
                }
index e2c919489b609634f2ef8380522558c32db046ef..2c7a4d393983de6d6b74427c33750f00cd713bac 100644 (file)
 
 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.ErrorEval;
 import org.apache.poi.hssf.record.formula.eval.EvaluationException;
 import org.apache.poi.hssf.record.formula.eval.NumberEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
 import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
+import org.apache.poi.ss.formula.TwoDEval;
 
 /**
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
@@ -71,10 +71,10 @@ public abstract class XYNumericFunction extends Fixed2ArgFunction {
        }
 
        private static final class AreaValueArray extends ValueArray {
-               private final AreaEval _ae;
+               private final TwoDEval _ae;
                private final int _width;
 
-               public AreaValueArray(AreaEval ae) {
+               public AreaValueArray(TwoDEval ae) {
                        super(ae.getWidth() * ae.getHeight());
                        _ae = ae;
                        _width = ae.getWidth();
@@ -82,7 +82,7 @@ public abstract class XYNumericFunction extends Fixed2ArgFunction {
                protected ValueEval getItemInternal(int index) {
                        int rowIx = index / _width;
                        int colIx = index % _width;
-                       return _ae.getRelativeValue(rowIx, colIx);
+                       return _ae.getValue(rowIx, colIx);
                }
        }
 
@@ -166,8 +166,8 @@ public abstract class XYNumericFunction extends Fixed2ArgFunction {
                if (arg instanceof ErrorEval) {
                        throw new EvaluationException((ErrorEval) arg);
                }
-               if (arg instanceof AreaEval) {
-                       return new AreaValueArray((AreaEval) arg);
+               if (arg instanceof TwoDEval) {
+                       return new AreaValueArray((TwoDEval) arg);
                }
                if (arg instanceof RefEval) {
                        return new RefValueArray((RefEval) arg);
diff --git a/src/java/org/apache/poi/ss/formula/TwoDEval.java b/src/java/org/apache/poi/ss/formula/TwoDEval.java
new file mode 100644 (file)
index 0000000..f2e5145
--- /dev/null
@@ -0,0 +1,51 @@
+/* ====================================================================
+   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.ss.formula;
+
+import org.apache.poi.hssf.record.formula.eval.AreaEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
+/**
+ * Common interface of {@link AreaEval} and {@link ArrayEval}
+ *
+ * @author Josh Micich
+ */
+public interface TwoDEval extends ValueEval {
+
+       /**
+        * @param row relative row index (zero based)
+        * @param col relative column index (zero based)
+        * @return element at the specified row and col position
+        */
+       public ValueEval getValue(int row, int col);
+
+       int getWidth();
+       int getHeight();
+
+       /**
+        * @return <code>true</code> if the area has just a single row, this also includes
+        * the trivial case when the area has just a single cell.
+        */
+       boolean isRow();
+
+       /**
+        * @return <code>true</code> if the area has just a single column, this also includes
+        * the trivial case when the area has just a single cell.
+        */
+       boolean isColumn();
+}