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 23:45:51 UTC

svn commit: r409758 - in /incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query: ObjectIdQuery.java RelationshipQuery.java

Author: aadamchik
Date: Fri May 26 14:45:51 2006
New Revision: 409758

URL: http://svn.apache.org/viewvc?rev=409758&view=rev
Log:
CAY-525 speeding up ObjectId and relationship queries - caching metadata that is used repeatedly

Modified:
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/ObjectIdQuery.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/RelationshipQuery.java

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/ObjectIdQuery.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/ObjectIdQuery.java?rev=409758&r1=409757&r2=409758&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/ObjectIdQuery.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/ObjectIdQuery.java Fri May 26 14:45:51 2006
@@ -85,6 +85,9 @@
     protected int cachePolicy;
     protected boolean fetchingDataRows;
 
+    protected transient EntityResolver metadataResolver;
+    protected transient QueryMetadata metadata;
+
     // needed for hessian serialization
     private ObjectIdQuery() {
         this.cachePolicy = CACHE_REFRESH;
@@ -116,16 +119,23 @@
     // return metadata without creating replacement, as this is not always possible to
     // create replacement (e.g. temp ObjectId).
     public QueryMetadata getMetaData(final EntityResolver resolver) {
-        return new DefaultQueryMetadata() {
+        // caching metadata as it may be accessed multiple times (at a DC and DD level)
+        if (metadata == null || metadataResolver != resolver) {
+            this.metadata = new DefaultQueryMetadata() {
+
+                public ObjEntity getObjEntity() {
+                    return resolver.lookupObjEntity(objectId.getEntityName());
+                }
+
+                public boolean isFetchingDataRows() {
+                    return fetchingDataRows;
+                }
+            };
+
+            this.metadataResolver = resolver;
+        }
 
-            public ObjEntity getObjEntity() {
-                return resolver.lookupObjEntity(objectId.getEntityName());
-            }
-
-            public boolean isFetchingDataRows() {
-                return fetchingDataRows;
-            }
-        };
+        return metadata;
     }
 
     public ObjectId getObjectId() {

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/RelationshipQuery.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/RelationshipQuery.java?rev=409758&r1=409757&r2=409758&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/RelationshipQuery.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/query/RelationshipQuery.java Fri May 26 14:45:51 2006
@@ -79,6 +79,10 @@
     protected String relationshipName;
     protected boolean refreshing;
 
+    protected transient EntityResolver metadataResolver;
+    protected transient QueryMetadata metadata;
+    protected transient ObjRelationship relationship;
+
     // exists for deserialization with Hessian
     private RelationshipQuery() {
 
@@ -124,16 +128,8 @@
     // return metadata without creating replacement, as this is not always possible to
     // create replacement (one-way relationships, etc.)
     public QueryMetadata getMetaData(final EntityResolver resolver) {
-        return new DefaultQueryMetadata() {
-
-            public boolean isRefreshingObjects() {
-                return refreshing;
-            }
-
-            public ObjEntity getObjEntity() {
-                return (ObjEntity) getRelationship(resolver).getTargetEntity();
-            }
-        };
+        updateMetadata(resolver);
+        return metadata;
     }
 
     public ObjectId getObjectId() {
@@ -174,24 +170,45 @@
      * Returns a non-null relationship object for this query.
      */
     public ObjRelationship getRelationship(EntityResolver resolver) {
-        if (objectId == null) {
-            throw new CayenneRuntimeException("Can't resolve query - objectID is null.");
-        }
+        updateMetadata(resolver);
+        return relationship;
+    }
 
-        ObjEntity entity = resolver.lookupObjEntity(objectId.getEntityName());
-        ObjRelationship relationship = (ObjRelationship) entity
-                .getRelationship(relationshipName);
+    void updateMetadata(EntityResolver resolver) {
+        // caching metadata as it may be accessed multiple times (at a DC and DD level)
+        if (metadataResolver != resolver) {
+
+            if (objectId == null) {
+                throw new CayenneRuntimeException(
+                        "Can't resolve query - objectID is null.");
+            }
 
-        if (relationship == null) {
-            throw new CayenneRuntimeException("No relationship named "
-                    + relationshipName
-                    + " found in entity "
-                    + entity.getName()
-                    + "; object id: "
-                    + objectId);
-        }
+            ObjEntity entity = resolver.lookupObjEntity(objectId.getEntityName());
+            this.relationship = (ObjRelationship) entity
+                    .getRelationship(relationshipName);
+
+            if (relationship == null) {
+                throw new CayenneRuntimeException("No relationship named "
+                        + relationshipName
+                        + " found in entity "
+                        + entity.getName()
+                        + "; object id: "
+                        + objectId);
+            }
 
-        return relationship;
+            this.metadata = new DefaultQueryMetadata() {
+
+                public boolean isRefreshingObjects() {
+                    return refreshing;
+                }
+
+                public ObjEntity getObjEntity() {
+                    return (ObjEntity) relationship.getTargetEntity();
+                }
+            };
+
+            this.metadataResolver = resolver;
+        }
     }
 
     /**