You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2014/07/25 16:50:45 UTC

svn commit: r1613443 - in /poi/trunk/src/java/org/apache/poi/ss/formula: LazyAreaEval.java LazyRefEval.java OperationEvaluationContext.java SheetRangeEvaluator.java WorkbookEvaluator.java

Author: nick
Date: Fri Jul 25 14:50:44 2014
New Revision: 1613443

URL: http://svn.apache.org/r1613443
Log:
Start preparing LazyAreaEval and LazyRefEval to handle sheet ranges, for #55906

Modified:
    poi/trunk/src/java/org/apache/poi/ss/formula/LazyAreaEval.java
    poi/trunk/src/java/org/apache/poi/ss/formula/LazyRefEval.java
    poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java
    poi/trunk/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java
    poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/LazyAreaEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/LazyAreaEval.java?rev=1613443&r1=1613442&r2=1613443&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/LazyAreaEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/LazyAreaEval.java Fri Jul 25 14:50:44 2014
@@ -17,28 +17,28 @@
 
 package org.apache.poi.ss.formula;
 
-import org.apache.poi.ss.formula.ptg.AreaI;
-import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
 import org.apache.poi.ss.formula.eval.AreaEval;
 import org.apache.poi.ss.formula.eval.AreaEvalBase;
 import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.ptg.AreaI;
+import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
 import org.apache.poi.ss.util.CellReference;
 
 /**
- *
- * @author Josh Micich
+ * Provides Lazy Evaluation to a 3D Ranges
+ * 
+ * TODO Provide access to multiple sheets where present
  */
 final class LazyAreaEval extends AreaEvalBase {
+	private final SheetRangeEvaluator _evaluator;
 
-	private final SheetRefEvaluator _evaluator;
-
-	LazyAreaEval(AreaI ptg, SheetRefEvaluator evaluator) {
+	LazyAreaEval(AreaI ptg, SheetRangeEvaluator evaluator) {
 		super(ptg);
 		_evaluator = evaluator;
 	}
 
 	public LazyAreaEval(int firstRowIndex, int firstColumnIndex, int lastRowIndex,
-			int lastColumnIndex, SheetRefEvaluator evaluator) {
+			int lastColumnIndex, SheetRangeEvaluator evaluator) {
 		super(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex);
 		_evaluator = evaluator;
 	}
@@ -48,7 +48,7 @@ final class LazyAreaEval extends AreaEva
 		int rowIx = (relativeRowIndex + getFirstRow() ) ;
 		int colIx = (relativeColumnIndex + getFirstColumn() ) ;
 
-		return _evaluator.getEvalForCell(rowIx, colIx);
+		return _evaluator.getEvalForCell(_evaluator.getFirstSheetIndex(), rowIx, colIx);
 	}
 
 	public AreaEval offset(int relFirstRowIx, int relLastRowIx, int relFirstColIx, int relLastColIx) {
@@ -79,7 +79,7 @@ final class LazyAreaEval extends AreaEva
 		CellReference crB = new CellReference(getLastRow(), getLastColumn());
 		StringBuffer sb = new StringBuffer();
 		sb.append(getClass().getName()).append("[");
-		sb.append(_evaluator.getSheetName());
+		sb.append(_evaluator.getSheetNameRange());
 		sb.append('!');
 		sb.append(crA.formatAsString());
 		sb.append(':');
@@ -93,6 +93,7 @@ final class LazyAreaEval extends AreaEva
     */
     public boolean isSubTotal(int rowIndex, int columnIndex){
         // delegate the query to the sheet evaluator which has access to internal ptgs
-        return _evaluator.isSubTotal(getFirstRow() + rowIndex, getFirstColumn() + columnIndex);
+        SheetRefEvaluator _sre = _evaluator.getSheetEvaluator(_evaluator.getFirstSheetIndex());
+        return _sre.isSubTotal(getFirstRow() + rowIndex, getFirstColumn() + columnIndex);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/LazyRefEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/LazyRefEval.java?rev=1613443&r1=1613442&r2=1613443&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/LazyRefEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/LazyRefEval.java Fri Jul 25 14:50:44 2014
@@ -17,22 +17,22 @@
 
 package org.apache.poi.ss.formula;
 
-import org.apache.poi.ss.formula.ptg.AreaI;
-import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
 import org.apache.poi.ss.formula.eval.AreaEval;
 import org.apache.poi.ss.formula.eval.RefEvalBase;
 import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.ptg.AreaI;
+import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
 import org.apache.poi.ss.util.CellReference;
 
 /**
-*
-* @author Josh Micich
-*/
+ * Provides Lazy Evaluation to a 3D Reference
+ * 
+ * TODO Provide access to multiple sheets where present
+ */
 final class LazyRefEval extends RefEvalBase {
+	private final SheetRangeEvaluator _evaluator;
 
-	private final SheetRefEvaluator _evaluator;
-
-	public LazyRefEval(int rowIndex, int columnIndex, SheetRefEvaluator sre) {
+	public LazyRefEval(int rowIndex, int columnIndex, SheetRangeEvaluator sre) {
 		super(rowIndex, columnIndex);
 		if (sre == null) {
 			throw new IllegalArgumentException("sre must not be null");
@@ -41,7 +41,7 @@ final class LazyRefEval extends RefEvalB
 	}
 
 	public ValueEval getInnerValueEval() {
-		return _evaluator.getEvalForCell(getRow(), getColumn());
+		return _evaluator.getEvalForCell(_evaluator.getFirstSheetIndex(), getRow(), getColumn());
 	}
 
 	public AreaEval offset(int relFirstRowIx, int relLastRowIx, int relFirstColIx, int relLastColIx) {
@@ -56,7 +56,7 @@ final class LazyRefEval extends RefEvalB
 		CellReference cr = new CellReference(getRow(), getColumn());
 		StringBuffer sb = new StringBuffer();
 		sb.append(getClass().getName()).append("[");
-		sb.append(_evaluator.getSheetName());
+		sb.append(_evaluator.getSheetNameRange());
 		sb.append('!');
 		sb.append(cr.formatAsString());
 		sb.append("]");

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java?rev=1613443&r1=1613442&r2=1613443&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java Fri Jul 25 14:50:44 2014
@@ -21,6 +21,7 @@ import org.apache.poi.ss.SpreadsheetVers
 import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException;
 import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName;
 import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
+import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheetRange;
 import org.apache.poi.ss.formula.eval.AreaEval;
 import org.apache.poi.ss.formula.eval.ErrorEval;
 import org.apache.poi.ss.formula.eval.ExternalNameEval;
@@ -75,24 +76,30 @@ public final class OperationEvaluationCo
 		return _columnIndex;
 	}
 
-	SheetRefEvaluator createExternSheetRefEvaluator(ExternSheetReferenceToken ptg) {
+	SheetRangeEvaluator createExternSheetRefEvaluator(ExternSheetReferenceToken ptg) {
 		return createExternSheetRefEvaluator(ptg.getExternSheetIndex());
 	}
-    SheetRefEvaluator createExternSheetRefEvaluator(String sheetName, int externalWorkbookNumber) {
+	SheetRangeEvaluator createExternSheetRefEvaluator(String sheetName, int externalWorkbookNumber) {
         ExternalSheet externalSheet = _workbook.getExternalSheet(sheetName, null, externalWorkbookNumber);
         return createExternSheetRefEvaluator(externalSheet);
     }
-	SheetRefEvaluator createExternSheetRefEvaluator(int externSheetIndex) {
+	SheetRangeEvaluator createExternSheetRefEvaluator(int externSheetIndex) {
 		ExternalSheet externalSheet = _workbook.getExternalSheet(externSheetIndex);
         return createExternSheetRefEvaluator(externalSheet);
 	}
-    SheetRefEvaluator createExternSheetRefEvaluator(ExternalSheet externalSheet) {
+	SheetRangeEvaluator createExternSheetRefEvaluator(ExternalSheet externalSheet) {
 		WorkbookEvaluator targetEvaluator;
-		int otherSheetIndex;
+		int otherFirstSheetIndex;
+		int otherLastSheetIndex = -1;
 		if (externalSheet == null || externalSheet.getWorkbookName() == null) {
 			// sheet is in same workbook
-			otherSheetIndex = _workbook.getSheetIndex(externalSheet.getSheetName());
 			targetEvaluator = _bookEvaluator;
+			otherFirstSheetIndex = _workbook.getSheetIndex(externalSheet.getSheetName());
+			
+			if (externalSheet instanceof ExternalSheetRange) {
+			    String lastSheetName = ((ExternalSheetRange)externalSheet).getLastSheetName();
+			    otherLastSheetIndex = _workbook.getSheetIndex(lastSheetName);
+			}
 		} else {
 			// look up sheet by name from external workbook
 			String workbookName = externalSheet.getWorkbookName();
@@ -101,13 +108,30 @@ public final class OperationEvaluationCo
 			} catch (WorkbookNotFoundException e) {
 				throw new RuntimeException(e.getMessage(), e);
 			}
-			otherSheetIndex = targetEvaluator.getSheetIndex(externalSheet.getSheetName());
-			if (otherSheetIndex < 0) {
+			
+			otherFirstSheetIndex = targetEvaluator.getSheetIndex(externalSheet.getSheetName());
+            if (externalSheet instanceof ExternalSheetRange) {
+                String lastSheetName = ((ExternalSheetRange)externalSheet).getLastSheetName();
+                otherLastSheetIndex = targetEvaluator.getSheetIndex(lastSheetName);
+            }
+			
+			if (otherFirstSheetIndex < 0) {
 				throw new RuntimeException("Invalid sheet name '" + externalSheet.getSheetName()
 						+ "' in bool '" + workbookName + "'.");
 			}
 		}
-		return new SheetRefEvaluator(targetEvaluator, _tracker, otherSheetIndex);
+		
+		if (otherLastSheetIndex == -1) {
+		    // Reference to just one sheet
+		    otherLastSheetIndex = otherFirstSheetIndex;
+		}
+		
+		SheetRefEvaluator[] evals = new SheetRefEvaluator[otherLastSheetIndex-otherFirstSheetIndex+1];
+		for (int i=0; i<evals.length; i++) {
+		    int otherSheetIndex = i+otherFirstSheetIndex;
+		    evals[i] = new SheetRefEvaluator(targetEvaluator, _tracker, otherSheetIndex); 
+		}
+		return new SheetRangeEvaluator(otherFirstSheetIndex, otherLastSheetIndex, evals);
 	}
 
 	/**
@@ -134,8 +158,9 @@ public final class OperationEvaluationCo
 		return new SheetRefEvaluator(targetEvaluator, _tracker, otherSheetIndex);
 	}
 
-	public SheetRefEvaluator getRefEvaluatorForCurrentSheet() {
-		return new SheetRefEvaluator(_bookEvaluator, _tracker, _sheetIndex);
+	public SheetRangeEvaluator getRefEvaluatorForCurrentSheet() {
+		SheetRefEvaluator sre = new SheetRefEvaluator(_bookEvaluator, _tracker, _sheetIndex);
+		return new SheetRangeEvaluator(_sheetIndex, sre);
 	}
 
 
@@ -162,10 +187,12 @@ public final class OperationEvaluationCo
 		if (!isA1Style) {
 			throw new RuntimeException("R1C1 style not supported yet");
 		}
-		SheetRefEvaluator sre = createExternSheetRefEvaluator(workbookName, sheetName);
-		if (sre == null) {
+		SheetRefEvaluator se = createExternSheetRefEvaluator(workbookName, sheetName);
+		if (se == null) {
 			return ErrorEval.REF_INVALID;
 		}
+		SheetRangeEvaluator sre = new SheetRangeEvaluator(_sheetIndex, se);
+		
 		// ugly typecast - TODO - make spreadsheet version more easily accessible
 		SpreadsheetVersion ssVersion = ((FormulaParsingWorkbook)_workbook).getSpreadsheetVersion();
 
@@ -271,30 +298,30 @@ public final class OperationEvaluationCo
 	}
 
 	public ValueEval getRefEval(int rowIndex, int columnIndex) {
-		SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
+	    SheetRangeEvaluator sre = getRefEvaluatorForCurrentSheet();
 		return new LazyRefEval(rowIndex, columnIndex, sre);
 	}
 	public ValueEval getRef3DEval(Ref3DPtg rptg) {
-		SheetRefEvaluator sre = createExternSheetRefEvaluator(rptg.getExternSheetIndex());
+	    SheetRangeEvaluator sre = createExternSheetRefEvaluator(rptg.getExternSheetIndex());
 		return new LazyRefEval(rptg.getRow(), rptg.getColumn(), sre);
 	}
     public ValueEval getRef3DEval(Ref3DPxg rptg) {
-        SheetRefEvaluator sre = createExternSheetRefEvaluator(rptg.getSheetName(), rptg.getExternalWorkbookNumber());
+        SheetRangeEvaluator sre = createExternSheetRefEvaluator(rptg.getSheetName(), rptg.getExternalWorkbookNumber());
         return new LazyRefEval(rptg.getRow(), rptg.getColumn(), sre);
     }
     
 	public ValueEval getAreaEval(int firstRowIndex, int firstColumnIndex,
 			int lastRowIndex, int lastColumnIndex) {
-		SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
+	    SheetRangeEvaluator sre = getRefEvaluatorForCurrentSheet();
 		return new LazyAreaEval(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex, sre);
 	}
     public ValueEval getArea3DEval(Area3DPtg aptg) {
-        SheetRefEvaluator sre = createExternSheetRefEvaluator(aptg.getExternSheetIndex());
+        SheetRangeEvaluator sre = createExternSheetRefEvaluator(aptg.getExternSheetIndex());
         return new LazyAreaEval(aptg.getFirstRow(), aptg.getFirstColumn(),
                 aptg.getLastRow(), aptg.getLastColumn(), sre);
     }
     public ValueEval getArea3DEval(Area3DPxg aptg) {
-        SheetRefEvaluator sre = createExternSheetRefEvaluator(aptg.getSheetName(), aptg.getExternalWorkbookNumber());
+        SheetRangeEvaluator sre = createExternSheetRefEvaluator(aptg.getSheetName(), aptg.getExternalWorkbookNumber());
         return new LazyAreaEval(aptg.getFirstRow(), aptg.getFirstColumn(),
                 aptg.getLastRow(), aptg.getLastColumn(), sre);
     }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java?rev=1613443&r1=1613442&r2=1613443&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java Fri Jul 25 14:50:44 2014
@@ -38,6 +38,9 @@ final class SheetRangeEvaluator {
         _lastSheetIndex = lastSheetIndex;
         _sheetEvaluators = sheetEvaluators;
 	}
+    public SheetRangeEvaluator(int onlySheetIndex, SheetRefEvaluator sheetEvaluator) {
+        this(onlySheetIndex, onlySheetIndex, new SheetRefEvaluator[] {sheetEvaluator});
+    }
 	
 	public SheetRefEvaluator getSheetEvaluator(int sheetIndex) {
 	    if (sheetIndex < _firstSheetIndex || sheetIndex > _lastSheetIndex) {
@@ -46,10 +49,26 @@ final class SheetRangeEvaluator {
 	    }
 	    return _sheetEvaluators[sheetIndex-_firstSheetIndex];
 	}
+	
+	public int getFirstSheetIndex() {
+	    return _firstSheetIndex;
+	}
+    public int getLastSheetIndex() {
+        return _lastSheetIndex;
+    }
 
 	public String getSheetName(int sheetIndex) {
 	    return getSheetEvaluator(sheetIndex).getSheetName();
 	}
+	public String getSheetNameRange() {
+	    StringBuilder sb = new StringBuilder();
+	    sb.append(getSheetName(_firstSheetIndex));
+	    if (_firstSheetIndex != _lastSheetIndex) {
+	        sb.append(':');
+	        sb.append(getSheetName(_lastSheetIndex));
+	    }
+	    return sb.toString();
+	}
 
 	public ValueEval getEvalForCell(int sheetIndex, int rowIndex, int columnIndex) {
         return getSheetEvaluator(sheetIndex).getEvalForCell(rowIndex, columnIndex);

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java?rev=1613443&r1=1613442&r2=1613443&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java Fri Jul 25 14:50:44 2014
@@ -427,7 +427,7 @@ public final class WorkbookEvaluator {
 			dbgIndentStr = "                                                                                                    ";
 			dbgIndentStr = dbgIndentStr.substring(0, Math.min(dbgIndentStr.length(), dbgEvaluationOutputIndent*2));
 			EVAL_LOG.log(POILogger.WARN, dbgIndentStr
-			                   + "- evaluateFormula('" + ec.getRefEvaluatorForCurrentSheet().getSheetName()
+			                   + "- evaluateFormula('" + ec.getRefEvaluatorForCurrentSheet().getSheetNameRange()
 			                   + "'/" + new CellReference(ec.getRowIndex(), ec.getColumnIndex()).formatAsString()
 			                   + "): " + Arrays.toString(ptgs).replaceAll("\\Qorg.apache.poi.ss.formula.ptg.\\E", ""));
 			dbgEvaluationOutputIndent++;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org