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/26 00:15:02 UTC

svn commit: r409486 - in /incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access: DataRowStore.java ObjectResolver.java ObjectStore.java ObjectTreeResolver.java

Author: aadamchik
Date: Thu May 25 15:15:02 2006
New Revision: 409486

URL: http://svn.apache.org/viewvc?rev=409486&view=rev
Log:
CAY-525 - speeding up snapshot lookups when converting rows to objects on select

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

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java?rev=409486&r1=409485&r2=409486&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java Thu May 25 15:15:02 2006
@@ -69,16 +69,18 @@
 import org.apache.commons.collections.map.LRUMap;
 import org.apache.log4j.Logger;
 import org.objectstyle.cayenne.CayenneRuntimeException;
-import org.objectstyle.cayenne.DataRow;
 import org.objectstyle.cayenne.DataChannel;
+import org.objectstyle.cayenne.DataObject;
+import org.objectstyle.cayenne.DataRow;
 import org.objectstyle.cayenne.ObjectId;
+import org.objectstyle.cayenne.PersistenceState;
 import org.objectstyle.cayenne.access.event.SnapshotEvent;
 import org.objectstyle.cayenne.event.EventBridge;
 import org.objectstyle.cayenne.event.EventBridgeFactory;
 import org.objectstyle.cayenne.event.EventManager;
 import org.objectstyle.cayenne.event.EventSubject;
-import org.objectstyle.cayenne.query.Query;
 import org.objectstyle.cayenne.query.ObjectIdQuery;
+import org.objectstyle.cayenne.query.Query;
 
 /**
  * A fixed size cache of DataRows keyed by ObjectId.
@@ -241,6 +243,76 @@
             }
 
             startListeners();
+        }
+    }
+    
+    /**
+     * Updates cached snapshots for the list of objects.
+     * 
+     * @since 1.2 
+     */
+    void snapshotsUpdatedForObjects(List objects, List snapshots, boolean refresh) {
+
+        // sanity check
+        if (objects.size() != snapshots.size()) {
+            throw new IllegalArgumentException(
+                    "Counts of objects and corresponding snapshots do not match. "
+                            + "Objects count: "
+                            + objects.size()
+                            + ", snapshots count: "
+                            + snapshots.size());
+        }
+
+        Map modified = null;
+
+        synchronized (this) {
+            int size = objects.size();
+
+            for (int i = 0; i < size; i++) {
+                DataObject object = (DataObject) objects.get(i);
+
+                // skip HOLLOW objects as they likely were created from partial snapshots
+                if (object.getPersistenceState() == PersistenceState.HOLLOW) {
+                    continue;
+                }
+
+                ObjectId oid = object.getObjectId();
+
+                // add snapshots if refresh is forced, or if a snapshot is
+                // missing
+
+                DataRow cachedSnapshot = (DataRow) this.snapshots.get(oid);
+                if (refresh || cachedSnapshot == null) {
+
+                    DataRow newSnapshot = (DataRow) snapshots.get(i);
+
+                    if (cachedSnapshot != null) {
+                        // use old snapshot if no changes occurred
+                        if (cachedSnapshot.equals(newSnapshot)) {
+                            object.setSnapshotVersion(cachedSnapshot.getVersion());
+                            continue;
+                        }
+                        else {
+                            newSnapshot.setReplacesVersion(cachedSnapshot.getVersion());
+                        }
+                    }
+
+                    if (modified == null) {
+                        modified = new HashMap();
+                    }
+
+                    modified.put(oid, newSnapshot);
+                }
+            }
+
+            if (modified != null) {
+                processSnapshotChanges(
+                        this,
+                        modified,
+                        Collections.EMPTY_LIST,
+                        Collections.EMPTY_LIST,
+                        Collections.EMPTY_LIST);
+            }
         }
     }
 

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java?rev=409486&r1=409485&r2=409486&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java Thu May 25 15:15:02 2006
@@ -66,10 +66,7 @@
 import org.objectstyle.cayenne.PersistenceState;
 import org.objectstyle.cayenne.map.DbEntity;
 import org.objectstyle.cayenne.map.EntityInheritanceTree;
-import org.objectstyle.cayenne.map.EntityResolver;
 import org.objectstyle.cayenne.map.ObjEntity;
-import org.objectstyle.cayenne.query.Query;
-import org.objectstyle.cayenne.query.QueryMetadata;
 
 /**
  * DataRows-to-objects converter for a specific ObjEntity.
@@ -84,14 +81,7 @@
     EntityInheritanceTree inheritanceTree;
     boolean refreshObjects;
     boolean resolveInheritance;
-
-    ObjectResolver(DataContext context, Query query) {
-
-        EntityResolver resolver = context.getEntityResolver();
-        QueryMetadata metadata = query.getMetaData(resolver);
-        init(context, metadata.getObjEntity(), metadata.isRefreshingObjects(), metadata
-                .isResolvingInherited());
-    }
+    DataRowStore cache;
 
     ObjectResolver(DataContext context, ObjEntity entity, boolean refresh,
             boolean resolveInheritanceHierarchy) {
@@ -120,6 +110,7 @@
         }
 
         this.context = context;
+        this.cache = context.getObjectStore().getDataRowCache();
         this.refreshObjects = refresh;
         this.entity = entity;
         this.inheritanceTree = context.getEntityResolver().lookupInheritanceTree(entity);
@@ -159,9 +150,7 @@
         }
 
         // now deal with snapshots
-        context
-                .getObjectStore()
-                .snapshotsUpdatedForObjects(results, rows, refreshObjects);
+        cache.snapshotsUpdatedForObjects(results, rows, refreshObjects);
 
         return results;
     }
@@ -210,9 +199,7 @@
         }
 
         // now deal with snapshots
-        context
-                .getObjectStore()
-                .snapshotsUpdatedForObjects(results, rows, refreshObjects);
+        cache.snapshotsUpdatedForObjects(results, rows, refreshObjects);
 
         return results;
     }

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=409486&r1=409485&r2=409486&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 Thu May 25 15:15:02 2006
@@ -64,7 +64,6 @@
 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;
@@ -436,8 +435,9 @@
                     object.setPersistenceState(PersistenceState.TRANSIENT);
                     break;
                 case PersistenceState.DELETED:
-                // Do the same as for modified... deleted is only a persistence state, so
-                // rolling the object back will set the state to committed
+                    // Do the same as for modified... deleted is only a persistence state,
+                    // so
+                    // rolling the object back will set the state to committed
                 case PersistenceState.MODIFIED:
                     // this will clean any modifications and defer refresh from snapshot
                     // till the next object accessor is called
@@ -501,84 +501,12 @@
      *            the new ones.
      * @since 1.1
      */
+    // TODO:, andrus 5/25/2006 - mark as deprecated after 1.2 - this method is no longer
+    // used.
     public void snapshotsUpdatedForObjects(List objects, List snapshots, boolean refresh) {
-
-        // sanity check
-        if (objects.size() != snapshots.size()) {
-            throw new IllegalArgumentException(
-                    "Counts of objects and corresponding snapshots do not match. "
-                            + "Objects count: "
-                            + objects.size()
-                            + ", snapshots count: "
-                            + snapshots.size());
-        }
-
-        Map modified = null;
-
-        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);
-
-                // skip HOLLOW objects as they likely were created from partial snapshots
-                if (object.getPersistenceState() == PersistenceState.HOLLOW) {
-                    continue;
-                }
-
-                ObjectId oid = object.getObjectId();
-
-                // add snapshots if refresh is forced, or if a snapshot is
-                // missing
-
-                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);
-
-                    if (cachedSnapshot != null) {
-                        // use old snapshot if no changes occurred
-                        if (cachedSnapshot.equals(newSnapshot)) {
-                            object.setSnapshotVersion(cachedSnapshot.getVersion());
-                            continue;
-                        }
-                        else {
-                            newSnapshot.setReplacesVersion(cachedSnapshot.getVersion());
-                        }
-                    }
-
-                    if (modified == null) {
-                        modified = new HashMap();
-                    }
-
-                    modified.put(oid, newSnapshot);
-                }
-            }
-
-            if (modified != null && getDataRowCache() != null) {
-                getDataRowCache().processSnapshotChanges(
-                        this,
-                        modified,
-                        Collections.EMPTY_LIST,
-                        Collections.EMPTY_LIST,
-                        Collections.EMPTY_LIST);
-            }
+        DataRowStore cache = getDataRowCache();
+        if (cache != null) {
+            cache.snapshotsUpdatedForObjects(objects, snapshots, refresh);
         }
     }
 
@@ -1376,8 +1304,7 @@
     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 {
@@ -1385,7 +1312,7 @@
         CachedSnapshotQuery(ObjectId oid) {
             super(oid, true, ObjectIdQuery.CACHE_NOREFRESH);
         }
-        
+
         void resetId(ObjectId oid) {
             this.objectId = oid;
             this.replacementQuery = null;

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java?rev=409486&r1=409485&r2=409486&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java Thu May 25 15:15:02 2006
@@ -84,10 +84,12 @@
 
     DataContext context;
     QueryMetadata queryMetadata;
+    DataRowStore cache;
 
     ObjectTreeResolver(DataContext context, QueryMetadata queryMetadata) {
         this.queryMetadata = queryMetadata;
         this.context = context;
+        this.cache = context.getObjectStore().getDataRowCache();
     }
 
     List resolveObjectTree(
@@ -294,7 +296,7 @@
 
                 objects = processorNode.getObjects();
 
-                context.getObjectStore().snapshotsUpdatedForObjects(
+                cache.snapshotsUpdatedForObjects(
                         objects,
                         ((PrefetchProcessorJointNode) processorNode).getResolvedRows(),
                         queryMetadata.isRefreshingObjects());
@@ -482,7 +484,7 @@
             PrefetchProcessorJointNode processorNode = (PrefetchProcessorJointNode) node;
 
             if (!processorNode.getObjects().isEmpty()) {
-                context.getObjectStore().snapshotsUpdatedForObjects(
+                cache.snapshotsUpdatedForObjects(
                         processorNode.getObjects(),
                         processorNode.getResolvedRows(),
                         queryMetadata.isRefreshingObjects());