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 01:15:03 UTC
svn commit: r409501 - in
/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne:
DataRow.java access/ObjectResolver.java access/ObjectTreeResolver.java
Author: aadamchik
Date: Thu May 25 16:15:02 2006
New Revision: 409501
URL: http://svn.apache.org/viewvc?rev=409501&view=rev
Log:
CAY-525 - optimizing ObjectId creation on select
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/DataRow.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/ObjectTreeResolver.java
Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/DataRow.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/DataRow.java?rev=409501&r1=409500&r2=409501&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/DataRow.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/DataRow.java Thu May 25 16:15:02 2006
@@ -160,6 +160,7 @@
* Creates an ObjectId from the values in the snapshot. If needed attributes are
* missing in a snapshot, CayenneRuntimeException is thrown.
*/
+ // TODO: andrus, 5/25/2006 - deprecate this method - it is unused
public ObjectId createObjectId(ObjEntity entity) {
return createObjectId(entity.getName(), entity.getDbEntity());
}
@@ -186,6 +187,7 @@
relationship);
}
+ // TODO: andrus, 5/25/2006 - deprecate this method - it is unused
public ObjectId createObjectId(String entityName, DbEntity entity) {
return createObjectId(entityName, entity, null);
}
@@ -216,6 +218,7 @@
*
* @since 1.2
*/
+ // TODO: andrus, 5/25/2006 - deprecate this method - it is unused
public ObjectId createObjectId(String entityName, DbEntity entity, String namePrefix) {
boolean prefix = namePrefix != null && namePrefix.length() > 0;
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=409501&r1=409500&r2=409501&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 16:15:02 2006
@@ -56,14 +56,17 @@
package org.objectstyle.cayenne.access;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.objectstyle.cayenne.CayenneRuntimeException;
import org.objectstyle.cayenne.DataObject;
import org.objectstyle.cayenne.DataRow;
import org.objectstyle.cayenne.ObjectId;
import org.objectstyle.cayenne.PersistenceState;
+import org.objectstyle.cayenne.map.DbAttribute;
import org.objectstyle.cayenne.map.DbEntity;
import org.objectstyle.cayenne.map.EntityInheritanceTree;
import org.objectstyle.cayenne.map.ObjEntity;
@@ -78,6 +81,8 @@
DataContext context;
ObjEntity entity;
+ List primaryKey;
+
EntityInheritanceTree inheritanceTree;
boolean refreshObjects;
boolean resolveInheritance;
@@ -101,7 +106,8 @@
+ "' has no DbEntity.");
}
- if (dbEntity.getPrimaryKey().size() == 0) {
+ this.primaryKey = dbEntity.getPrimaryKey();
+ if (primaryKey.size() == 0) {
throw new CayenneRuntimeException("Won't be able to create ObjectId for '"
+ entity.getName()
+ "'. Reason: DbEntity '"
@@ -186,9 +192,7 @@
// The algorithm below of building an ID doesn't take inheritance into
// account, so there maybe a miss...
- ObjectId id = row.createObjectId(sourceObjEntity.getName(), sourceObjEntity
- .getDbEntity(), relatedIdPrefix);
-
+ ObjectId id = createObjectId(row, sourceObjEntity, relatedIdPrefix);
DataObject parentObject = (DataObject) context.getObjectStore().getNode(id);
// don't attach to hollow objects
@@ -211,7 +215,7 @@
DataObject objectFromDataRow(DataRow row) {
// determine entity to use
- ObjEntity objectEntity = entity;
+ ObjEntity objectEntity;
if (resolveInheritance) {
objectEntity = inheritanceTree.entityMatchingRow(row);
@@ -221,8 +225,13 @@
objectEntity = entity;
}
}
+ else {
+ objectEntity = entity;
+ }
- ObjectId anId = row.createObjectId(objectEntity);
+ // not using DataRow.createObjectId for performance reasons - ObjectResolver has
+ // all needed metadata already cached.
+ ObjectId anId = createObjectId(row, objectEntity, null);
// this will create a HOLLOW object if it is not registered yet
DataObject object = (DataObject) context.localObject(anId, null);
@@ -250,5 +259,63 @@
ObjEntity getEntity() {
return entity;
+ }
+
+ ObjectId createObjectId(DataRow dataRow, ObjEntity objEntity, String namePrefix) {
+
+ List pk = objEntity == this.entity ? this.primaryKey : objEntity
+ .getDbEntity()
+ .getPrimaryKey();
+
+ boolean prefix = namePrefix != null && namePrefix.length() > 0;
+
+ // ... handle special case - PK.size == 1
+ // use some not-so-significant optimizations...
+
+ if (pk.size() == 1) {
+ DbAttribute attribute = (DbAttribute) pk.get(0);
+
+ String key = (prefix) ? namePrefix + attribute.getName() : attribute
+ .getName();
+
+ Object val = dataRow.get(key);
+ if (val == null) {
+ throw new CayenneRuntimeException("Null value for '"
+ + key
+ + "'. Snapshot: "
+ + dataRow
+ + ". Prefix: "
+ + namePrefix);
+ }
+
+ // PUT without a prefix
+ return new ObjectId(objEntity.getName(), attribute.getName(), val);
+ }
+
+ // ... handle generic case - PK.size > 1
+
+ Map idMap = new HashMap(pk.size() * 2);
+ Iterator it = pk.iterator();
+ while (it.hasNext()) {
+ DbAttribute attribute = (DbAttribute) it.next();
+
+ String key = (prefix) ? namePrefix + attribute.getName() : attribute
+ .getName();
+
+ Object val = dataRow.get(key);
+ if (val == null) {
+ throw new CayenneRuntimeException("Null value for '"
+ + key
+ + "'. Snapshot: "
+ + dataRow
+ + ". Prefix: "
+ + namePrefix);
+ }
+
+ // PUT without a prefix
+ idMap.put(attribute.getName(), val);
+ }
+
+ return new ObjectId(objEntity.getName(), idMap);
}
}
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=409501&r1=409500&r2=409501&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 16:15:02 2006
@@ -381,9 +381,9 @@
DataRow snapshot = objectStore.getSnapshot(destinationObject
.getObjectId());
- ObjectId id = snapshot.createObjectId(
- sourceObjEntity.getName(),
- sourceObjEntity.getDbEntity(),
+ ObjectId id = processorNode.getResolver().createObjectId(
+ snapshot,
+ sourceObjEntity,
relatedIdPrefix);
sourceObject = (DataObject) objectStore.getNode(id);