private final List<Record> _unknownRecords;
private final SharedValueManager _sharedValueManager;
+ // Cache values to speed up performance of
+ // getStartRowNumberForBlock / getEndRowNumberForBlock, see Bugzilla 47405
+ private RowRecord[] _rowRecordValues = null;
+
/** Creates a new instance of ValueRecordsAggregate */
public RowRecordsAggregate() {
this(SharedValueManager.createEmpty());
public void insertRow(RowRecord row) {
// Integer integer = Integer.valueOf(row.getRowNumber());
_rowRecords.put(Integer.valueOf(row.getRowNumber()), row);
+ // Clear the cached values
+ _rowRecordValues = null;
if ((row.getRowNumber() < _firstrow) || (_firstrow == -1)) {
_firstrow = row.getRowNumber();
}
_rowRecords.put(key, rr);
throw new RuntimeException("Attempt to remove row that does not belong to this sheet");
}
+
+ // Clear the cached values
+ _rowRecordValues = null;
}
public RowRecord getRow(int rowIndex) {
/** Returns the physical row number of the first row in a block*/
private int getStartRowNumberForBlock(int block) {
- //Given that we basically iterate through the rows in order,
- // TODO - For a performance improvement, it would be better to return an instance of
- //an iterator and use that instance throughout, rather than recreating one and
- //having to move it to the right position.
- int startIndex = block * DBCellRecord.BLOCK_SIZE;
- Iterator<RowRecord> rowIter = _rowRecords.values().iterator();
- RowRecord row = null;
- //Position the iterator at the start of the block
- for (int i=0; i<=startIndex;i++) {
- row = rowIter.next();
- }
- if (row == null) {
- throw new RuntimeException("Did not find start row for block " + block);
- }
+ int startIndex = block * DBCellRecord.BLOCK_SIZE;
- return row.getRowNumber();
+ if(_rowRecordValues == null){
+ _rowRecordValues = _rowRecords.values().toArray(new RowRecord[_rowRecords.size()]);
+ }
+
+ try {
+ return _rowRecordValues[startIndex].getRowNumber();
+ } catch(ArrayIndexOutOfBoundsException e) {
+ throw new RuntimeException("Did not find start row for block " + block);
+ }
}
/** Returns the physical row number of the end row in a block*/
if (endIndex >= _rowRecords.size())
endIndex = _rowRecords.size()-1;
- Iterator<RowRecord> rowIter = _rowRecords.values().iterator();
- RowRecord row = null;
- for (int i=0; i<=endIndex;i++) {
- row = rowIter.next();
- }
- if (row == null) {
- throw new RuntimeException("Did not find start row for block " + block);
+ if(_rowRecordValues == null){
+ _rowRecordValues = _rowRecords.values().toArray(new RowRecord[_rowRecords.size()]);
+ }
+
+ try {
+ return _rowRecordValues[endIndex].getRowNumber();
+ } catch(ArrayIndexOutOfBoundsException e) {
+ throw new RuntimeException("Did not find end row for block " + block);
}
- return row.getRowNumber();
}
private int visitRowRecordsForBlock(int blockIndex, RecordVisitor rv) {