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 20:28:06 UTC

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

mmidy       00/08/17 11:28:06

  Modified:    src/org/apache/xalan/xslt NodeSorter.java
  Log:
  If primary sort fails, don't sort on secondary
  
  Revision  Changes    Path
  1.10      +34 -11    xml-xalan/src/org/apache/xalan/xslt/NodeSorter.java
  
  Index: NodeSorter.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/NodeSorter.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- NodeSorter.java	2000/03/02 10:23:05	1.9
  +++ NodeSorter.java	2000/08/17 18:28:05	1.10
  @@ -112,8 +112,9 @@
         NodeCompareElem elem = new NodeCompareElem((Node)v.elementAt(i)); 
         nodes.addElement(elem);
       }
  +    
       Vector scratchVector = new Vector();
  -    mergesort(nodes, scratchVector, 0, n - 1, support);
  +    mergesort(nodes, scratchVector, 0, n - 1, support);    
       
       // return sorted vector of nodes
       for (int i = 0; i<n; i++) 
  @@ -417,12 +418,22 @@
       
       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);
  -        double d ;
  +        
  +        if (r.getType()== XObject.CLASS_NODESET)
  +        {
  +          if (((XNodeSet)r).nodeset().getLength() <= 0)
  +            tryNextKey = false;
  +        }
  +        else if (r == null)
  +          tryNextKey = false;
  +        
  +        double d ;        
           if(k1.m_treatAsNumbers)
           {  
             d = r.num();
  @@ -430,19 +441,31 @@
             m_key1Value = new Double(Double.isNaN(d)? 0.0 : d);
           }  
           else
  +        {
             m_key1Value = k1.m_col.getCollationKey(r.str());
  +        }  
   		  
   		    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);
  +          NodeSortKey k2 = (NodeSortKey)m_keys.elementAt(1);            
  +          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)
  @@ -455,8 +478,8 @@
               m_KeyValue[kIndex] = r.str();
           } */
   		  
  -      } // end if not empty    
  -    }  
  +      } // end if not empty          
  +    }        
     } // end NodeCompareElem class
   
   }