You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ga...@apache.org on 2019/01/03 00:08:52 UTC
svn commit: r1850212 - in /poi/trunk/src: java/org/apache/poi/hssf/usermodel/
ooxml/java/org/apache/poi/xssf/streaming/
ooxml/java/org/apache/poi/xssf/usermodel/
ooxml/testcases/org/apache/poi/xssf/streaming/
ooxml/testcases/org/apache/poi/xssf/usermod...
Author: gallon
Date: Thu Jan 3 00:08:52 2019
New Revision: 1850212
URL: http://svn.apache.org/viewvc?rev=1850212&view=rev
Log:
Bug 62993: XSSFEvaluationSheet now retrieves valid last row index from underlying XSSFSheet. Thanks to Axel Howind.
Added:
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFEvaluationSheet.java (with props)
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFEvaluationSheet.java (with props)
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestXEvaluationSheet.java (with props)
Modified:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationSheet.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFEvaluationSheet.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFEvaluationSheet.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationSheet.java?rev=1850212&r1=1850211&r2=1850212&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -28,11 +28,9 @@ import org.apache.poi.util.Internal;
final class HSSFEvaluationSheet implements EvaluationSheet {
private final HSSFSheet _hs;
- private int _lastDefinedRow = -1;
public HSSFEvaluationSheet(HSSFSheet hs) {
_hs = hs;
- _lastDefinedRow = _hs.getLastRowNum();
}
public HSSFSheet getHSSFSheet() {
@@ -45,7 +43,7 @@ final class HSSFEvaluationSheet implemen
*/
@Override
public int getLastRowNum() {
- return _lastDefinedRow;
+ return _hs.getLastRowNum();
}
@Override
@@ -66,6 +64,5 @@ final class HSSFEvaluationSheet implemen
*/
@Override
public void clearAllCachedResultValues() {
- _lastDefinedRow = _hs.getLastRowNum();
}
}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFEvaluationSheet.java?rev=1850212&r1=1850211&r2=1850212&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFEvaluationSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -27,11 +27,9 @@ import org.apache.poi.util.Internal;
@Internal
final class SXSSFEvaluationSheet implements EvaluationSheet {
private final SXSSFSheet _xs;
- private int _lastDefinedRow = -1;
public SXSSFEvaluationSheet(SXSSFSheet sheet) {
_xs = sheet;
- _lastDefinedRow = _xs.getLastRowNum();
}
public SXSSFSheet getSXSSFSheet() {
@@ -44,7 +42,7 @@ final class SXSSFEvaluationSheet impleme
*/
@Override
public int getLastRowNum() {
- return _lastDefinedRow;
+ return _xs.getLastRowNum();
}
@Override
@@ -68,6 +66,5 @@ final class SXSSFEvaluationSheet impleme
*/
@Override
public void clearAllCachedResultValues() {
- _lastDefinedRow = _xs.getLastRowNum();
}
}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java?rev=1850212&r1=1850211&r2=1850212&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -34,11 +34,9 @@ final class XSSFEvaluationSheet implemen
private final XSSFSheet _xs;
private Map<CellKey, EvaluationCell> _cellCache;
- private int _lastDefinedRow = -1;
public XSSFEvaluationSheet(XSSFSheet sheet) {
_xs = sheet;
- _lastDefinedRow = _xs.getLastRowNum();
}
public XSSFSheet getXSSFSheet() {
@@ -51,7 +49,7 @@ final class XSSFEvaluationSheet implemen
*/
@Override
public int getLastRowNum() {
- return _lastDefinedRow;
+ return _xs.getLastRowNum();
}
/* (non-JavaDoc), inherit JavaDoc from EvaluationWorkbook
@@ -60,15 +58,16 @@ final class XSSFEvaluationSheet implemen
@Override
public void clearAllCachedResultValues() {
_cellCache = null;
- _lastDefinedRow = _xs.getLastRowNum();
}
@Override
public EvaluationCell getCell(int rowIndex, int columnIndex) {
// shortcut evaluation if reference is outside the bounds of existing data
// see issue #61841 for impact on VLOOKUP in particular
- if (rowIndex > _lastDefinedRow) return null;
-
+ if (rowIndex > getLastRowNum()) {
+ return null;
+ }
+
// cache for performance: ~30% speedup due to caching
if (_cellCache == null) {
_cellCache = new HashMap<>(_xs.getLastRowNum() * 3);
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1850212&r1=1850211&r2=1850212&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Thu Jan 3 00:08:52 2019
@@ -27,7 +27,6 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -131,7 +130,6 @@ import org.openxmlformats.schemas.spread
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTablePart;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableParts;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheetSource;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane;
@@ -1211,6 +1209,10 @@ public class XSSFSheet extends POIXMLDoc
@Override
public int getLastRowNum() {
+ // _rows.getLastKey() (O(logN)) or caching last row (O(1))?
+ // A test with 1_000_000 rows shows that querying getLastRowNum with lastKey() implementation takes ~40 ms,
+ // and ~1.2 ms with cached implementation. 40 ms is negligible compared to the time of evaluation a million
+ // cells, and the lastKey implementation is much more elegant and less error prone than caching.
return _rows.isEmpty() ? 0 : _rows.lastKey();
}
Added: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFEvaluationSheet.java?rev=1850212&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFEvaluationSheet.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -0,0 +1,32 @@
+/* ====================================================================
+ 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.xssf.streaming;
+
+import org.apache.poi.ss.formula.EvaluationSheet;
+import org.apache.poi.ss.usermodel.BaseTestXEvaluationSheet;
+import org.apache.poi.ss.usermodel.Sheet;
+
+import java.util.AbstractMap;
+import java.util.Map;
+
+public class TestSXSSFEvaluationSheet extends BaseTestXEvaluationSheet {
+ @Override
+ protected Map.Entry<Sheet, EvaluationSheet> getInstance() {
+ SXSSFSheet sheet = new SXSSFWorkbook().createSheet();
+ return new AbstractMap.SimpleEntry<>(sheet, new SXSSFEvaluationSheet(sheet));
+ }
+}
Propchange: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFEvaluationSheet.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFEvaluationSheet.java?rev=1850212&r1=1850211&r2=1850212&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFEvaluationSheet.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -16,11 +16,19 @@
==================================================================== */
package org.apache.poi.xssf.usermodel;
+import org.apache.poi.ss.formula.EvaluationSheet;
+import org.apache.poi.ss.usermodel.BaseTestXEvaluationSheet;
+import org.apache.poi.ss.usermodel.Sheet;
import org.junit.Test;
+import java.util.AbstractMap;
+import java.util.Map;
+
import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
-public class TestXSSFEvaluationSheet {
+public class TestXSSFEvaluationSheet extends BaseTestXEvaluationSheet {
@Test
public void test() throws Exception {
@@ -52,4 +60,10 @@ public class TestXSSFEvaluationSheet {
// other things
assertEquals(sheet, evalsheet.getXSSFSheet());
}
-}
\ No newline at end of file
+
+ @Override
+ protected Map.Entry<Sheet, EvaluationSheet> getInstance() {
+ XSSFSheet sheet = new XSSFWorkbook().createSheet();
+ return new AbstractMap.SimpleEntry<>(sheet, new XSSFEvaluationSheet(sheet));
+ }
+}
Added: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFEvaluationSheet.java?rev=1850212&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFEvaluationSheet.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -0,0 +1,33 @@
+/* ====================================================================
+ 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.hssf.usermodel;
+
+import org.apache.poi.ss.formula.EvaluationSheet;
+import org.apache.poi.ss.usermodel.BaseTestXEvaluationSheet;
+import org.apache.poi.ss.usermodel.Sheet;
+
+import java.util.AbstractMap;
+import java.util.Map;
+
+public class TestHSSFEvaluationSheet extends BaseTestXEvaluationSheet {
+ @Override
+ protected Map.Entry<Sheet, EvaluationSheet> getInstance() {
+ HSSFSheet sheet = new HSSFWorkbook().createSheet();
+ return new AbstractMap.SimpleEntry<>(sheet, new HSSFEvaluationSheet(sheet));
+ }
+}
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFEvaluationSheet.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestXEvaluationSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestXEvaluationSheet.java?rev=1850212&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestXEvaluationSheet.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestXEvaluationSheet.java Thu Jan 3 00:08:52 2019
@@ -0,0 +1,49 @@
+/* ====================================================================
+ 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.usermodel;
+
+import org.apache.poi.ss.formula.EvaluationSheet;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public abstract class BaseTestXEvaluationSheet {
+ /**
+ * Get a pair of underlying sheet and evaluation sheet.
+ */
+ protected abstract Map.Entry<Sheet, EvaluationSheet> getInstance();
+
+ @Test
+ public void lastRowNumIsUpdatedFromUnderlyingSheet_bug62993() {
+ Map.Entry<Sheet, EvaluationSheet> sheetPair = getInstance();
+ Sheet underlyingSheet = sheetPair.getKey();
+ EvaluationSheet instance = sheetPair.getValue();
+
+ assertEquals(0, instance.getLastRowNum());
+
+ underlyingSheet.createRow(0);
+ underlyingSheet.createRow(1);
+ underlyingSheet.createRow(2);
+ assertEquals(2, instance.getLastRowNum());
+
+ underlyingSheet.removeRow(underlyingSheet.getRow(2));
+ assertEquals(1, instance.getLastRowNum());
+ }
+}
Propchange: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestXEvaluationSheet.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org