You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/05/24 03:45:32 UTC

svn commit: r409034 - /incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java

Author: aadamchik
Date: Tue May 23 18:45:32 2006
New Revision: 409034

URL: http://svn.apache.org/viewvc?rev=409034&view=rev
Log:
CAY-525 - a very minor performance enhancement that speeds up batch row-to-object conversions by reusing
snapshot query instance.

Modified:
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java?rev=409034&r1=409033&r2=409034&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java Tue May 23 18:45:32 2006
@@ -64,6 +64,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.objectstyle.cayenne.DataChannel;
 import org.objectstyle.cayenne.DataObject;
 import org.objectstyle.cayenne.DataRow;
 import org.objectstyle.cayenne.Fault;
@@ -516,6 +517,12 @@
 
         synchronized (this) {
             int size = objects.size();
+            
+            // used to manually do what 'getCachedSnapshot' does, saving some CPU
+            // cycles in the loop....
+            CachedSnapshotQuery idQuery = null;
+            DataChannel channel = context.getChannel();
+            
             for (int i = 0; i < size; i++) {
                 DataObject object = (DataObject) objects.get(i);
 
@@ -528,7 +535,19 @@
 
                 // add snapshots if refresh is forced, or if a snapshot is
                 // missing
-                DataRow cachedSnapshot = getCachedSnapshot(oid);
+
+                if (idQuery == null) {
+                    idQuery = new CachedSnapshotQuery(oid);
+                }
+                else {
+                    idQuery.resetId(oid);
+                }
+
+                List cachedSnapshotList = channel.onQuery(context, idQuery).firstList();
+
+                DataRow cachedSnapshot = cachedSnapshotList.isEmpty()
+                        ? null
+                        : (DataRow) cachedSnapshotList.get(0);
                 if (refresh || cachedSnapshot == null) {
 
                     DataRow newSnapshot = (DataRow) snapshots.get(i);
@@ -728,10 +747,7 @@
     public DataRow getCachedSnapshot(ObjectId oid) {
 
         if (context != null && context.getChannel() != null) {
-            ObjectIdQuery query = new ObjectIdQuery(
-                    oid,
-                    true,
-                    ObjectIdQuery.CACHE_NOREFRESH);
+            ObjectIdQuery query = new CachedSnapshotQuery(oid);
             List results = context.getChannel().onQuery(context, query).firstList();
             return results.isEmpty() ? null : (DataRow) results.get(0);
         }
@@ -1359,6 +1375,21 @@
      */
     public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
         // noop
+    }
+    
+    
+    // an ObjectIdQuery optimized for retrieval of multiple snapshots - it can be reset
+    // with the new id
+    final class CachedSnapshotQuery extends ObjectIdQuery {
+
+        CachedSnapshotQuery(ObjectId oid) {
+            super(oid, true, ObjectIdQuery.CACHE_NOREFRESH);
+        }
+        
+        void resetId(ObjectId oid) {
+            this.objectId = oid;
+            this.replacementQuery = null;
+        }
     }
 
     class SnapshotEventDecorator implements GraphDiff {