You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by on...@apache.org on 2017/10/25 18:19:12 UTC

svn commit: r1813332 - /poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java

Author: onealj
Date: Wed Oct 25 18:19:12 2017
New Revision: 1813332

URL: http://svn.apache.org/viewvc?rev=1813332&view=rev
Log:
bug 61630: further XSSFExportToXML performance improvements from Daniel (bug 61630 comment 15, attachment 35450)

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java?rev=1813332&r1=1813331&r2=1813332&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java Wed Oct 25 18:19:12 2017
@@ -82,7 +82,7 @@ public class XSSFExportToXml implements
     private static final POILogger LOG = POILogFactory.getLogger(XSSFExportToXml.class);
 
     private XSSFMap map;
-
+    private final HashMap<String, Integer> indexMap = new HashMap<>();
     /**
      * Creates a new exporter and sets the mapping to be used when generating the XML output document
      *
@@ -146,8 +146,10 @@ public class XSSFExportToXml implements
             tableMappings.put(commonXPath, table);
         }
 
+        indexMap.clear();
         xpaths.sort(this);
-
+        indexMap.clear();
+        
         for(String xpath : xpaths) {
 
             XSSFSingleXmlCell simpleXmlCell = singleXmlCellsMappings.get(xpath);
@@ -401,6 +403,7 @@ public class XSSFExportToXml implements
 
         String[] leftTokens = leftXpath.split("/");
         String[] rightTokens = rightXpath.split("/");
+        String samePath = "";
 
         int minLength = leftTokens.length< rightTokens.length? leftTokens.length : rightTokens.length;
 
@@ -412,47 +415,52 @@ public class XSSFExportToXml implements
             String rightElementName = rightTokens[i];
 
             if (leftElementName.equals(rightElementName)) {
+                samePath += "/" + leftElementName;
                 localComplexTypeRootNode = getComplexTypeForElement(leftElementName, xmlSchema, localComplexTypeRootNode);
             } else {
-                int leftIndex = indexOfElementInComplexType(leftElementName,localComplexTypeRootNode);
-                int rightIndex = indexOfElementInComplexType(rightElementName,localComplexTypeRootNode);
-                if (leftIndex!=-1 && rightIndex!=-1) {
-                    if ( leftIndex < rightIndex) {
-                        return -1;
-                    }if ( leftIndex > rightIndex) {
-                        return 1;
-                    }
-                } /*else {
-                    // NOTE: the xpath doesn't match correctly in the schema
-                }*/
+                return indexOfElementInComplexType(samePath, leftElementName, rightElementName,localComplexTypeRootNode);
             }
         }
 
         return 0;
     }
 
-    private int indexOfElementInComplexType(String elementName,Node complexType) {
+    private int indexOfElementInComplexType(String samePath,String leftElementName,String rightElementName,Node complexType) {
         if(complexType == null) {
-            return -1;
+            return 0;
         }
 
-        int indexOf = -1;
         int i = 0;
         Node node = complexType.getFirstChild();
-        final String elementNameWithoutNamespace = removeNamespace(elementName);
+        final String leftWithoutNamespace = removeNamespace(leftElementName);
+        int leftIndexOf = getAndStoreIndex(samePath, leftWithoutNamespace);
+        final String rightWithoutNamespace = removeNamespace(rightElementName);
+        int rightIndexOf = getAndStoreIndex(samePath, rightWithoutNamespace);
 
-        while (node != null) {
+        while (node != null && (rightIndexOf==-1||leftIndexOf==-1)) {
             if (node instanceof Element && "element".equals(node.getLocalName())) {
-                Node element = getNameOrRefElement(node);
-                if (element.getNodeValue().equals(elementNameWithoutNamespace)) {
-                    indexOf = i;
-                    break;
+                String elementValue = getNameOrRefElement(node).getNodeValue();
+                if (elementValue.equals(leftWithoutNamespace)) {
+                    leftIndexOf = i;
+                    indexMap.put(samePath+"/"+leftWithoutNamespace, leftIndexOf);
+                }
+                if (elementValue.equals(rightWithoutNamespace)) {
+                    rightIndexOf = i;
+                    indexMap.put(samePath+"/"+rightWithoutNamespace, leftIndexOf);
                 }
             }
             i++;
             node = node.getNextSibling();
         }
-        return indexOf;
+        if(leftIndexOf == -1 || rightIndexOf == -1) {
+            return 0;
+        }
+        return Integer.compare(leftIndexOf, rightIndexOf);
+    }
+    
+    private int getAndStoreIndex(String samePath,String withoutNamespace) {
+        String withPath = samePath+"/"+withoutNamespace;
+        return indexMap.getOrDefault(withPath, -1);
     }
 
 	private Node getNameOrRefElement(Node node) {



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