dbertoni    00/07/07 15:53:49

  Modified:    c/src/XSLT NodeSorter.cpp NodeSorter.hpp
  Log:
  Cache sort results.
  
  Revision  Changes    Path
  1.10      +89 -18    xml-xalan/c/src/XSLT/NodeSorter.cpp
  
  Index: NodeSorter.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/NodeSorter.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- NodeSorter.cpp    2000/07/06 20:33:37     1.9
  +++ NodeSorter.cpp    2000/07/07 22:53:48     1.10
  @@ -167,27 +167,12 @@
   
        const NodeSortKey&      theKey = m_nodeSortKeys[theKeyIndex];
   
  -     const XPath&            xpath = theKey.getSelectPattern();
  -
  -     const XObjectGuard      r1(
  -             m_executionContext.getXObjectFactory(),
  -             xpath.execute(theLHS, theKey.getPrefixResolver(), 
NodeRefList(), m_executionContext));
  -     assert(r1.get() != 0);
  -
  -     const XObjectGuard      r2(
  -             m_executionContext.getXObjectFactory(),
  -             xpath.execute(theRHS, theKey.getPrefixResolver(), 
NodeRefList(), m_executionContext));
  -     assert(r2.get() != 0);
  -
        // Compare as numbers
        if(theKey.getTreatAsNumbers() == true)
        {
  -             double  n1Num = r1->num();
  -             double  n2Num = r2->num();
  +             double  n1Num = getNumberResult(theKey, theLHS);
  +             double  n2Num = getNumberResult(theKey, theRHS);
   
  -             const XalanDOMString    r1str(r1->str());
  -             const XalanDOMString    r2str(r2->str());
  -
                if (DoubleSupport::isNaN(n1Num))
                        n1Num = 0.0;
   
  @@ -222,7 +207,9 @@
        // Compare as strings
        else
        {
  -             const int       theCompareResult = collationCompare(r1->str(), 
r2->str());
  +             const int       theCompareResult = collationCompare(
  +                             getStringResult(theKey, theLHS),
  +                             getStringResult(theKey, theRHS));
   
                if(0 == theCompareResult)
                {
  @@ -279,6 +266,90 @@
                        break;
                }
        }
  +
  +     return theResult;
  +}
  +
  +
  +
  +static const NodeRefList     dummy;
  +
  +
  +
  +double
  +NodeSorter::NodeSortKeyCompare::getNumberResult(
  +                             const NodeSortKey&      theKey,
  +                             XalanNode*                      node) const
  +{
  +     const XPath&            xpath = theKey.getSelectPattern();
  +
  +     const NumberResultsCacheMapType::const_iterator         i =
  +             m_numberResultsCache.find(&xpath);
  +
  +     if (i != m_numberResultsCache.end())
  +     {
  +             const NumberResultsNodeCacheMapType::const_iterator     j =
  +                     i->second.find(node);
  +
  +             if (j != i->second.end())
  +             {
  +                     // Yuck!!!!  Big ugly return here!!!
  +                     return j->second;
  +             }
  +     }
  +
  +     const XObjectGuard      result(
  +             m_executionContext.getXObjectFactory(),
  +             xpath.execute(node, theKey.getPrefixResolver(), dummy, 
m_executionContext));
  +     assert(result.get() != 0);
  +
  +     const double    theResult = result->num();
  +
  +#if defined(XALAN_NO_MUTABLE)
  +     ((NodeSortKeyCompare*)this)->m_numberResultsCache[&xpath][node] = 
theResult;
  +#else
  +     m_numberResultsCache[&xpath][node] = theResult;
  +#endif
  +
  +     return theResult;
  +}
  +
  +
  +
  +const XalanDOMString
  +NodeSorter::NodeSortKeyCompare::getStringResult(
  +                             const NodeSortKey&      theKey,
  +                             XalanNode*                      node) const
  +{
  +     const XPath&            xpath = theKey.getSelectPattern();
  +
  +     const StringResultsCacheMapType::const_iterator         i =
  +             m_stringResultsCache.find(&xpath);
  +
  +     if (i != m_stringResultsCache.end())
  +     {
  +             const StringResultsNodeCacheMapType::const_iterator     j =
  +                     i->second.find(node);
  +
  +             if (j != i->second.end())
  +             {
  +                     // Yuck!!!!  Big ugly return here!!!
  +                     return j->second;
  +             }
  +     }
  +
  +     const XObjectGuard      result(
  +             m_executionContext.getXObjectFactory(),
  +             xpath.execute(node, theKey.getPrefixResolver(), dummy, 
m_executionContext));
  +     assert(result.get() != 0);
  +
  +     const XalanDOMString    theResult = result->str();
  +
  +#if defined(XALAN_NO_MUTABLE)
  +     ((NodeSortKeyCompare*)this)->m_stringResultsCache[&xpath][node] = 
theResult;
  +#else
  +     m_stringResultsCache[&xpath][node] = theResult;
  +#endif
   
        return theResult;
   }
  
  
  
  1.6       +39 -5     xml-xalan/c/src/XSLT/NodeSorter.hpp
  
  Index: NodeSorter.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/NodeSorter.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NodeSorter.hpp    2000/07/06 20:19:25     1.5
  +++ NodeSorter.hpp    2000/07/07 22:53:48     1.6
  @@ -70,6 +70,7 @@
   
   
   #include <functional>
  +#include <map>
   #include <vector>
   
   
  @@ -154,7 +155,9 @@
                        m_executionContext(executionContext),
                        m_list(theList),
                        m_nodes(theNodes),
  -                     m_nodeSortKeys(theNodeSortKeys)
  +                     m_nodeSortKeys(theNodeSortKeys),
  +                     m_numberResultsCache(),
  +                     m_stringResultsCache()
                {
                }
   
  @@ -170,15 +173,46 @@
                                   second_argument_type         theRHS,
                                   unsigned int                         
theKeyIndex = 0) const;
   
  -             XPathExecutionContext&                  m_executionContext;
  -             const MutableNodeRefList&               m_list;
  -             const NodeVectorType&                   m_nodes;
  -             const NodeSortKeyVectorType&    m_nodeSortKeys;
  +     protected:
   
                bool
                isNodeBefore(
                                const XalanNode*        node1,
                                const XalanNode*        node2) const;
  +
  +             double
  +             getNumberResult(
  +                             const NodeSortKey&      theKey,
  +                             XalanNode*                      node) const;
  +
  +             const XalanDOMString
  +             getStringResult(
  +                             const NodeSortKey&      theKey,
  +                             XalanNode*                      node) const;
  +
  +     private:
  +
  +             XPathExecutionContext&                  m_executionContext;
  +             const MutableNodeRefList&               m_list;
  +             const NodeVectorType&                   m_nodes;
  +             const NodeSortKeyVectorType&    m_nodeSortKeys;
  +
  +#if defined(XALAN_NO_NAMESPACES)
  +             typedef map<const XalanNode*, double>                   
NumberResultsNodeCacheMapType;
  +             typedef map<const XalanNode*, XalanDOMString>   
StringResultsNodeCacheMapType;
  +
  +             typedef map<const XPath*, NumberResultsNodeCacheMapType>        
NumberResultsCacheMapType;
  +             typedef map<const XPath*, StringResultsNodeCacheMapType>        
StringResultsCacheMapType;
  +#else
  +             typedef std::map<const XalanNode*, double>                      
NumberResultsNodeCacheMapType;
  +             typedef std::map<const XalanNode*, XalanDOMString>      
StringResultsNodeCacheMapType;
  +
  +             typedef std::map<const XPath*, NumberResultsNodeCacheMapType>   
NumberResultsCacheMapType;
  +             typedef std::map<const XPath*, StringResultsNodeCacheMapType>   
StringResultsCacheMapType;
  +#endif
  +
  +             mutable NumberResultsCacheMapType       m_numberResultsCache;
  +             mutable StringResultsCacheMapType       m_stringResultsCache;
        };
   
   private:
  
  
  

Reply via email to