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;
+ }
}
/**