moved lazy ref creation methods to OperationEvaluationContext
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@882375 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f2b76afe66
commit
cf7f47fbe1
@ -31,12 +31,22 @@ public abstract class AreaEvalBase implements AreaEval {
|
|||||||
private final int _nColumns;
|
private final int _nColumns;
|
||||||
private final int _nRows;
|
private final int _nRows;
|
||||||
|
|
||||||
|
protected AreaEvalBase(int firstRow, int firstColumn, int lastRow, int lastColumn) {
|
||||||
|
_firstColumn = firstColumn;
|
||||||
|
_firstRow = firstRow;
|
||||||
|
_lastColumn = lastColumn;
|
||||||
|
_lastRow = lastRow;
|
||||||
|
|
||||||
|
_nColumns = _lastColumn - _firstColumn + 1;
|
||||||
|
_nRows = _lastRow - _firstRow + 1;
|
||||||
|
}
|
||||||
|
|
||||||
protected AreaEvalBase(AreaI ptg) {
|
protected AreaEvalBase(AreaI ptg) {
|
||||||
_firstRow = ptg.getFirstRow();
|
_firstRow = ptg.getFirstRow();
|
||||||
_firstColumn = ptg.getFirstColumn();
|
_firstColumn = ptg.getFirstColumn();
|
||||||
_lastRow = ptg.getLastRow();
|
_lastRow = ptg.getLastRow();
|
||||||
_lastColumn = ptg.getLastColumn();
|
_lastColumn = ptg.getLastColumn();
|
||||||
|
|
||||||
_nColumns = _lastColumn - _firstColumn + 1;
|
_nColumns = _lastColumn - _firstColumn + 1;
|
||||||
_nRows = _lastRow - _firstRow + 1;
|
_nRows = _lastRow - _firstRow + 1;
|
||||||
}
|
}
|
||||||
@ -60,20 +70,20 @@ public abstract class AreaEvalBase implements AreaEval {
|
|||||||
public final ValueEval getValueAt(int row, int col) {
|
public final ValueEval getValueAt(int row, int col) {
|
||||||
int rowOffsetIx = row - _firstRow;
|
int rowOffsetIx = row - _firstRow;
|
||||||
int colOffsetIx = col - _firstColumn;
|
int colOffsetIx = col - _firstColumn;
|
||||||
|
|
||||||
if(rowOffsetIx < 0 || rowOffsetIx >= _nRows) {
|
if(rowOffsetIx < 0 || rowOffsetIx >= _nRows) {
|
||||||
throw new IllegalArgumentException("Specified row index (" + row
|
throw new IllegalArgumentException("Specified row index (" + row
|
||||||
+ ") is outside the allowed range (" + _firstRow + ".." + _lastRow + ")");
|
+ ") is outside the allowed range (" + _firstRow + ".." + _lastRow + ")");
|
||||||
}
|
}
|
||||||
if(colOffsetIx < 0 || colOffsetIx >= _nColumns) {
|
if(colOffsetIx < 0 || colOffsetIx >= _nColumns) {
|
||||||
throw new IllegalArgumentException("Specified column index (" + col
|
throw new IllegalArgumentException("Specified column index (" + col
|
||||||
+ ") is outside the allowed range (" + _firstColumn + ".." + col + ")");
|
+ ") is outside the allowed range (" + _firstColumn + ".." + col + ")");
|
||||||
}
|
}
|
||||||
return getRelativeValue(rowOffsetIx, colOffsetIx);
|
return getRelativeValue(rowOffsetIx, colOffsetIx);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean contains(int row, int col) {
|
public final boolean contains(int row, int col) {
|
||||||
return _firstRow <= row && _lastRow >= row
|
return _firstRow <= row && _lastRow >= row
|
||||||
&& _firstColumn <= col && _lastColumn >= col;
|
&& _firstColumn <= col && _lastColumn >= col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,22 +26,28 @@ import org.apache.poi.hssf.util.CellReference;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
*/
|
*/
|
||||||
final class LazyAreaEval extends AreaEvalBase {
|
final class LazyAreaEval extends AreaEvalBase {
|
||||||
|
|
||||||
private final SheetRefEvaluator _evaluator;
|
private final SheetRefEvaluator _evaluator;
|
||||||
|
|
||||||
public LazyAreaEval(AreaI ptg, SheetRefEvaluator evaluator) {
|
LazyAreaEval(AreaI ptg, SheetRefEvaluator evaluator) {
|
||||||
super(ptg);
|
super(ptg);
|
||||||
_evaluator = evaluator;
|
_evaluator = evaluator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex) {
|
public LazyAreaEval(int firstRowIndex, int firstColumnIndex, int lastRowIndex,
|
||||||
|
int lastColumnIndex, SheetRefEvaluator evaluator) {
|
||||||
|
super(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex);
|
||||||
|
_evaluator = evaluator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex) {
|
||||||
|
|
||||||
int rowIx = (relativeRowIndex + getFirstRow() ) & 0xFFFF;
|
int rowIx = (relativeRowIndex + getFirstRow() ) & 0xFFFF;
|
||||||
int colIx = (relativeColumnIndex + getFirstColumn() ) & 0x00FF;
|
int colIx = (relativeColumnIndex + getFirstColumn() ) & 0x00FF;
|
||||||
|
|
||||||
return _evaluator.getEvalForCell(rowIx, colIx);
|
return _evaluator.getEvalForCell(rowIx, colIx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
package org.apache.poi.ss.formula;
|
package org.apache.poi.ss.formula;
|
||||||
|
|
||||||
import org.apache.poi.hssf.record.formula.AreaI;
|
import org.apache.poi.hssf.record.formula.AreaI;
|
||||||
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
|
||||||
import org.apache.poi.hssf.record.formula.RefPtg;
|
|
||||||
import org.apache.poi.hssf.record.formula.AreaI.OffsetArea;
|
import org.apache.poi.hssf.record.formula.AreaI.OffsetArea;
|
||||||
import org.apache.poi.hssf.record.formula.eval.AreaEval;
|
import org.apache.poi.hssf.record.formula.eval.AreaEval;
|
||||||
import org.apache.poi.hssf.record.formula.eval.RefEvalBase;
|
import org.apache.poi.hssf.record.formula.eval.RefEvalBase;
|
||||||
@ -41,12 +39,6 @@ final class LazyRefEval extends RefEvalBase {
|
|||||||
}
|
}
|
||||||
_evaluator = sre;
|
_evaluator = sre;
|
||||||
}
|
}
|
||||||
public LazyRefEval(RefPtg ptg, SheetRefEvaluator sre) {
|
|
||||||
this(ptg.getRow(), ptg.getColumn(), sre);
|
|
||||||
}
|
|
||||||
public LazyRefEval(Ref3DPtg ptg, SheetRefEvaluator sre) {
|
|
||||||
this(ptg.getRow(), ptg.getColumn(), sre);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ValueEval getInnerValueEval() {
|
public ValueEval getInnerValueEval() {
|
||||||
return _evaluator.getEvalForCell(getRow(), getColumn());
|
return _evaluator.getEvalForCell(getRow(), getColumn());
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.formula;
|
package org.apache.poi.ss.formula;
|
||||||
|
|
||||||
import org.apache.poi.hssf.record.formula.AreaI;
|
|
||||||
import org.apache.poi.hssf.record.formula.eval.AreaEval;
|
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.ErrorEval;
|
||||||
import org.apache.poi.hssf.record.formula.eval.RefEval;
|
import org.apache.poi.hssf.record.formula.eval.RefEval;
|
||||||
@ -68,8 +67,10 @@ public final class OperationEvaluationContext {
|
|||||||
return _columnIndex;
|
return _columnIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* package */ SheetRefEvaluator createExternSheetRefEvaluator(ExternSheetReferenceToken ptg) {
|
SheetRefEvaluator createExternSheetRefEvaluator(ExternSheetReferenceToken ptg) {
|
||||||
int externSheetIndex = ptg.getExternSheetIndex();
|
return createExternSheetRefEvaluator(ptg.getExternSheetIndex());
|
||||||
|
}
|
||||||
|
SheetRefEvaluator createExternSheetRefEvaluator(int externSheetIndex) {
|
||||||
ExternalSheet externalSheet = _workbook.getExternalSheet(externSheetIndex);
|
ExternalSheet externalSheet = _workbook.getExternalSheet(externSheetIndex);
|
||||||
WorkbookEvaluator targetEvaluator;
|
WorkbookEvaluator targetEvaluator;
|
||||||
int otherSheetIndex;
|
int otherSheetIndex;
|
||||||
@ -212,7 +213,7 @@ public final class OperationEvaluationContext {
|
|||||||
default:
|
default:
|
||||||
throw new IllegalStateException("Unexpected reference classification of '" + refStrPart1 + "'.");
|
throw new IllegalStateException("Unexpected reference classification of '" + refStrPart1 + "'.");
|
||||||
}
|
}
|
||||||
return new LazyAreaEval(new AI(firstRow, firstCol, lastRow, lastCol), sre);
|
return new LazyAreaEval(firstRow, firstCol, lastRow, lastCol, sre);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int parseRowRef(String refStrPart) {
|
private static int parseRowRef(String refStrPart) {
|
||||||
@ -223,33 +224,6 @@ public final class OperationEvaluationContext {
|
|||||||
return Integer.parseInt(refStrPart) - 1;
|
return Integer.parseInt(refStrPart) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class AI implements AreaI {
|
|
||||||
|
|
||||||
private final int _fr;
|
|
||||||
private final int _lr;
|
|
||||||
private final int _fc;
|
|
||||||
private final int _lc;
|
|
||||||
|
|
||||||
public AI(int fr, int fc, int lr, int lc) {
|
|
||||||
_fr = Math.min(fr, lr);
|
|
||||||
_lr = Math.max(fr, lr);
|
|
||||||
_fc = Math.min(fc, lc);
|
|
||||||
_lc = Math.max(fc, lc);
|
|
||||||
}
|
|
||||||
public int getFirstColumn() {
|
|
||||||
return _fc;
|
|
||||||
}
|
|
||||||
public int getFirstRow() {
|
|
||||||
return _fr;
|
|
||||||
}
|
|
||||||
public int getLastColumn() {
|
|
||||||
return _lc;
|
|
||||||
}
|
|
||||||
public int getLastRow() {
|
|
||||||
return _lr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static NameType classifyCellReference(String str, SpreadsheetVersion ssVersion) {
|
private static NameType classifyCellReference(String str, SpreadsheetVersion ssVersion) {
|
||||||
int len = str.length();
|
int len = str.length();
|
||||||
if (len < 1) {
|
if (len < 1) {
|
||||||
@ -261,4 +235,23 @@ public final class OperationEvaluationContext {
|
|||||||
public FreeRefFunction findUserDefinedFunction(String functionName) {
|
public FreeRefFunction findUserDefinedFunction(String functionName) {
|
||||||
return _bookEvaluator.findUserDefinedFunction(functionName);
|
return _bookEvaluator.findUserDefinedFunction(functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ValueEval getRefEval(int rowIndex, int columnIndex) {
|
||||||
|
SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
|
||||||
|
return new LazyRefEval(rowIndex, columnIndex, sre);
|
||||||
|
}
|
||||||
|
public ValueEval getRef3DEval(int rowIndex, int columnIndex, int extSheetIndex) {
|
||||||
|
SheetRefEvaluator sre = createExternSheetRefEvaluator(extSheetIndex);
|
||||||
|
return new LazyRefEval(rowIndex, columnIndex, sre);
|
||||||
|
}
|
||||||
|
public ValueEval getAreaEval(int firstRowIndex, int firstColumnIndex,
|
||||||
|
int lastRowIndex, int lastColumnIndex) {
|
||||||
|
SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
|
||||||
|
return new LazyAreaEval(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex, sre);
|
||||||
|
}
|
||||||
|
public ValueEval getArea3DEval(int firstRowIndex, int firstColumnIndex,
|
||||||
|
int lastRowIndex, int lastColumnIndex, int extSheetIndex) {
|
||||||
|
SheetRefEvaluator sre = createExternSheetRefEvaluator(extSheetIndex);
|
||||||
|
return new LazyAreaEval(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex, sre);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -560,21 +560,20 @@ public final class WorkbookEvaluator {
|
|||||||
return ErrorEval.REF_INVALID;
|
return ErrorEval.REF_INVALID;
|
||||||
}
|
}
|
||||||
if (ptg instanceof Ref3DPtg) {
|
if (ptg instanceof Ref3DPtg) {
|
||||||
Ref3DPtg refPtg = (Ref3DPtg) ptg;
|
Ref3DPtg rptg = (Ref3DPtg) ptg;
|
||||||
SheetRefEvaluator sre = ec.createExternSheetRefEvaluator(refPtg);
|
return ec.getRef3DEval(rptg.getRow(), rptg.getColumn(), rptg.getExternSheetIndex());
|
||||||
return new LazyRefEval(refPtg, sre);
|
|
||||||
}
|
}
|
||||||
if (ptg instanceof Area3DPtg) {
|
if (ptg instanceof Area3DPtg) {
|
||||||
Area3DPtg aptg = (Area3DPtg) ptg;
|
Area3DPtg aptg = (Area3DPtg) ptg;
|
||||||
SheetRefEvaluator sre = ec.createExternSheetRefEvaluator(aptg);
|
return ec.getArea3DEval(aptg.getFirstRow(), aptg.getFirstColumn(), aptg.getLastRow(), aptg.getLastColumn(), aptg.getExternSheetIndex());
|
||||||
return new LazyAreaEval(aptg, sre);
|
|
||||||
}
|
}
|
||||||
SheetRefEvaluator sre = ec.getRefEvaluatorForCurrentSheet();
|
|
||||||
if (ptg instanceof RefPtg) {
|
if (ptg instanceof RefPtg) {
|
||||||
return new LazyRefEval(((RefPtg) ptg), sre);
|
RefPtg rptg = (RefPtg) ptg;
|
||||||
|
return ec.getRefEval(rptg.getRow(), rptg.getColumn());
|
||||||
}
|
}
|
||||||
if (ptg instanceof AreaPtg) {
|
if (ptg instanceof AreaPtg) {
|
||||||
return new LazyAreaEval(((AreaPtg) ptg), sre);
|
AreaPtg aptg = (AreaPtg) ptg;
|
||||||
|
return ec.getAreaEval(aptg.getFirstRow(), aptg.getFirstColumn(), aptg.getLastRow(), aptg.getLastColumn());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptg instanceof UnknownPtg) {
|
if (ptg instanceof UnknownPtg) {
|
||||||
|
Loading…
Reference in New Issue
Block a user