You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mm...@locus.apache.org on 2000/08/17 23:00:02 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/transformer NodeSorter.java

mmidy       00/08/17 14:00:01

  Modified:    java/src/org/apache/xalan/transformer NodeSorter.java
  Log:
  When primary sort key fails, do not sort on secondary
  
  Revision  Changes    Path
  1.3       +27 -6     xml-xalan/java/src/org/apache/xalan/transformer/NodeSorter.java
  
  Index: NodeSorter.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/NodeSorter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- NodeSorter.java	2000/07/05 14:42:54	1.2
  +++ NodeSorter.java	2000/08/17 21:00:01	1.3
  @@ -63,6 +63,7 @@
   import org.apache.xpath.XPathContext;
   import org.apache.xpath.NodeSet;
   import org.apache.xpath.objects.XObject;
  +import org.apache.xpath.objects.XNodeSet;
   import org.apache.xalan.utils.NodeVector;
   import org.xml.sax.SAXException;
   
  @@ -411,11 +412,21 @@
       
       NodeCompareElem(Node node) throws org.xml.sax.SAXException
       {
  +      boolean tryNextKey = true;
         m_node = node;
         if (!m_keys.isEmpty())
         { 
   		    NodeSortKey k1 = (NodeSortKey)m_keys.elementAt(0);
           XObject r = k1.m_selectPat.execute(m_execContext, node, k1.m_namespaceContext);
  +        
  +        if (r.getType()== XObject.CLASS_NODESET)
  +        {
  +          if (((XNodeSet)r).nodeset().nextNode() == null)
  +            tryNextKey = false;
  +        }
  +        else if (r == null)
  +          tryNextKey = false;
  +        
           double d ;
           if(k1.m_treatAsNumbers)
           {  
  @@ -429,14 +440,24 @@
   		    if (m_keys.size()>1)
   		    {
   			    NodeSortKey k2 = (NodeSortKey)m_keys.elementAt(1);
  -          XObject r2 = k2.m_selectPat.execute(m_execContext, node, k2.m_namespaceContext);
  -          if(k2.m_treatAsNumbers)
  -          {
  -            d = r2.num();
  -            m_key2Value = new Double(Double.isNaN(d)? 0.0 : d);
  +          if (!tryNextKey)
  +          {  
  +            if(k2.m_treatAsNumbers)            
  +              m_key2Value =  new Double(0.0);              
  +            else
  +              m_key2Value = k2.m_col.getCollationKey("");
             }  
             else
  -            m_key2Value = k2.m_col.getCollationKey(r2.str());  
  +          {  
  +            XObject r2 = k2.m_selectPat.execute(m_execContext, node, k2.m_namespaceContext);
  +            if(k2.m_treatAsNumbers)
  +            {
  +              d = r2.num();
  +              m_key2Value = new Double(Double.isNaN(d)? 0.0 : d);
  +            }  
  +            else
  +              m_key2Value = k2.m_col.getCollationKey(r2.str());
  +          }
   		    }	  
           /* Leave this in case we decide to use an array later
           while (kIndex <= m_keys.size() && kIndex < maxkey)