You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by kk...@apache.org on 2005/03/03 23:58:46 UTC

svn commit: r156099 - in xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store: DomImpl.java Locale.java

Author: kkrouse
Date: Thu Mar  3 14:58:46 2005
New Revision: 156099

URL: http://svn.apache.org/viewcvs?view=rev&rev=156099
Log:
first cut at adding a DOM nth node cache

Modified:
    xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/DomImpl.java
    xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java

Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/DomImpl.java
URL: http://svn.apache.org/viewcvs/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/DomImpl.java?view=diff&r1=156098&r2=156099
==============================================================================
--- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/DomImpl.java (original)
+++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/DomImpl.java Thu Mar  3 14:58:46 2005
@@ -98,6 +98,7 @@
     static Dom parent      ( Dom d ) { return node_getParentNode ( d ); }
     static Dom firstChild  ( Dom d ) { return node_getFirstChild ( d ); }
     static Dom nextSibling ( Dom d ) { return node_getNextSibling( d ); }
+    static Dom prevSibling ( Dom d ) { return node_getPreviousSibling( d ); }
 
     public static Dom append ( Dom n, Dom p )
     {
@@ -1644,6 +1645,8 @@
         while ( ! c.isAtEndOfLastPush() );
 
         c.release();
+        
+        n.locale().invalidateDomCaches(n);
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2526,11 +2529,15 @@
 
         // *Really* inefficient impl for now
 
-        for ( Dom c = node_getFirstChild( n ) ; c != null ; c = node_getNextSibling( c ) )
-            if (i-- == 0)
-                return c;
-
-        return null;
+        //for ( Dom c = node_getFirstChild( n ) ; c != null ; c = node_getNextSibling( c ) )
+        //    if (i-- == 0)
+        //        return c;
+        //        
+        //return null;
+        
+        // TODO - optimize for the 0 and 1 child case
+        
+        return n.locale().findDomNthChild(n, i);
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2576,12 +2583,17 @@
 
         // *Really* inefficient impl for now
 
-        int len = 0;
+        //int len = 0;
 
-        for ( Dom c = node_getFirstChild( n ) ; c != null ; c = node_getNextSibling( c ) )
-            len++;
+        //for ( Dom c = node_getFirstChild( n ) ; c != null ; c = node_getNextSibling( c ) )
+        //    len++;
 
-        return len;
+        //return len;
+        
+        
+        // TODO - optimize for the 0 and 1 child case
+        
+        return n.locale().domLength(n);
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3397,8 +3409,11 @@
         Dom p = (Dom) _node_getParentNode( t );
 
         if (p != null)
+        {
             _node_insertBefore( p, (Text) t2, _node_getNextSibling( t ) );
-
+            t.locale().invalidateDomCaches(p);
+        }
+        
         return (Text) t2;
     }
     
@@ -4825,4 +4840,4 @@
     }
     
 }
- 
\ No newline at end of file
+ 

Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java
URL: http://svn.apache.org/viewcvs/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java?view=diff&r1=156098&r2=156099
==============================================================================
--- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java (original)
+++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java Thu Mar  3 14:58:46 2005
@@ -2384,6 +2384,198 @@
     //
     //
     //
+    
+    Dom findDomNthChild ( Dom parent, int n )
+    {
+        assert n >= 0;
+        
+        if (parent == null)
+            return null;
+        
+        int da = _domNthCache_A.distance( parent, n );
+        int db = _domNthCache_B.distance( parent, n );
+        
+        Dom x =
+            da <= db
+            ? _domNthCache_A.fetch( parent, n )
+            : _domNthCache_B.fetch( parent, n );
+        
+        if (da == db)
+        {
+            domNthCache temp = _domNthCache_A;
+            _domNthCache_A = _domNthCache_B;
+            _domNthCache_B = temp;
+        }
+        
+        return x;
+    }
+    
+    int domLength ( Dom parent )
+    {
+        if (parent == null)
+            return 0;
+        
+        int da = _domNthCache_A.distance( parent, 0 );
+        int db = _domNthCache_B.distance( parent, 0 );
+        
+        int len =
+            da <= db
+            ? _domNthCache_A.length( parent )
+            : _domNthCache_B.length( parent );
+        
+        if (da == db)
+        {
+            domNthCache temp = _domNthCache_A;
+            _domNthCache_A = _domNthCache_B;
+            _domNthCache_B = temp;
+        }
+        
+        return len;
+    }
+    
+    void invalidateDomCaches ( Dom d )
+    {
+        if (_domNthCache_A._parent == d)
+            _domNthCache_A._version = -1;
+        if (_domNthCache_B._parent == d)
+            _domNthCache_B._version = -1;
+    }
+    
+    boolean isDomCached ( Dom d )
+    {
+        return _domNthCache_A._parent == d || _domNthCache_B._parent == d;
+    }
+    
+    class domNthCache
+    {
+        
+        int distance ( Dom parent, int n )
+        {
+            assert n >= 0;
+            
+            if (_version != Locale.this.version())
+                return Integer.MAX_VALUE - 1;
+            
+            if (parent != _parent)
+                return Integer.MAX_VALUE;
+            
+            return n > _n ? n - _n : _n - n;
+        }
+        
+        int length ( Dom parent )
+        {
+            if (_version != Locale.this.version() || _parent != parent)
+            {
+                _parent = parent;
+                _version = Locale.this.version();
+                _child = null;
+                _n = -1;
+                _len = -1;
+            }
+            
+            if (_len == -1)
+            {
+                Dom x = null;
+                
+                if (_child != null && _n != -1)
+                {
+                    x = _child;
+                    _len = _n;
+                }
+                else
+                {
+                    x = DomImpl.firstChild(_parent);
+                    _len = 0;
+                    
+                    // cache the 0th child
+                    _child = x;
+                    _n = 0;
+                }
+                
+                for (; x != null; x = DomImpl.nextSibling(x) )
+                {
+                    _len++;
+                }
+            }
+            
+            
+            return _len;
+        }
+        
+        Dom fetch ( Dom parent, int n )
+        {
+            assert n >= 0;
+            
+            if (_version != Locale.this.version() || _parent != parent)
+            {
+                _parent = parent;
+                _version = Locale.this.version();
+                _child = null;
+                _n = -1;
+                _len = -1;
+                
+                for (Dom x = DomImpl.firstChild(_parent); x != null; x = DomImpl.nextSibling(x) )
+                {
+                    _n++;
+                    if (_child == null && n == _n )
+                    {
+                        _child = x;
+                        break;
+                    }
+                }
+                
+                return _child;
+            }
+            
+            if (_n < 0)
+                return null;
+            
+            if (n > _n)
+            {
+                while ( n > _n )
+                {
+                    for (Dom x = DomImpl.nextSibling(_child); ; x = DomImpl.nextSibling(x) )
+                    {
+                        if (x == null)
+                            return null;
+                        
+                        _child = x;
+                        _n++;
+                        
+                        break;
+                    }
+                }
+            }
+            else if (n < _n)
+            {
+                while ( n < _n )
+                {
+                    for (Dom x = DomImpl.prevSibling(_child); ; x = DomImpl.prevSibling(x) )
+                    {
+                        if (x == null)
+                            return null;
+                        
+                        _child = x;
+                        _n--;
+                        
+                        break;
+                    }
+                }
+            }
+            
+            return _child;
+        }
+        
+        private long  _version;
+        private Dom   _parent;
+        private Dom   _child;
+        private int   _n;
+        private int   _len;
+    }
+    
+    //
+    // 
+    //
 
     CharUtil getCharUtil()
     {
@@ -3412,4 +3604,7 @@
 
     nthCache _nthCache_A = new nthCache();
     nthCache _nthCache_B = new nthCache();
-}
\ No newline at end of file
+
+    domNthCache _domNthCache_A = new domNthCache();
+    domNthCache _domNthCache_B = new domNthCache();
+}



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