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());