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