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 2016/10/08 15:10:49 UTC

cayenne git commit: CAY-2122 Vertical Inheritance: Cannot Insert Record For Implementing Class with Attribute And Relationship

Repository: cayenne
Updated Branches:
  refs/heads/master 377a1ef27 -> 5611ca2aa


CAY-2122 Vertical Inheritance: Cannot Insert Record For Implementing Class with Attribute And Relationship

a note on performance degradation of the flattened queries


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/5611ca2a
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/5611ca2a
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/5611ca2a

Branch: refs/heads/master
Commit: 5611ca2aa24de41184e876bc80b2ab4151130eb1
Parents: 377a1ef
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sat Oct 8 16:43:34 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sat Oct 8 18:10:31 2016 +0300

----------------------------------------------------------------------
 .../access/DataDomainFlattenedBucket.java       | 28 ++++++++++++++------
 1 file changed, 20 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/5611ca2a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
index 6ac7db5..817ada7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
@@ -19,14 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -35,6 +27,14 @@ import org.apache.cayenne.query.DeleteBatchQuery;
 import org.apache.cayenne.query.InsertBatchQuery;
 import org.apache.cayenne.query.Query;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 /**
  * A sync bucket that holds flattened queries.
  * 
@@ -97,12 +97,22 @@ class DataDomainFlattenedBucket {
      * @param queries
      */
     void appendInserts(Collection<Query> queries) {
+
+        // TODO: see "O(N) lookups" TODO's below. The first is relatively benign, as N is the number of DbEntities in the
+        // preceeding DataDomainInsertBucket processing. The second nested one is potentially much worse, as it may
+        // result in a linear scan of thousands of objects. E.g. it will affect cases with vertical inheritance with
+        // relationships in subclasses...
+
+        // The fix to the above is to merge this code into DataDomainInsertBucket, so that we can combine regular and
+        // flattened snapshots at the point of InsertBatchQuery creation.
+
         for (Map.Entry<DbEntity, List<FlattenedArcKey>> entry : insertArcKeys.entrySet()) {
             DbEntity dbEntity = entry.getKey();
             List<FlattenedArcKey> flattenedArcKeys = entry.getValue();
 
             DataNode node = parent.getDomain().lookupDataNode(dbEntity.getDataMap());
 
+            // TODO: O(N) lookup
             InsertBatchQuery existingQuery = findInsertBatchQuery(queries, dbEntity);
             InsertBatchQuery newQuery = new InsertBatchQuery(dbEntity, 50);
 
@@ -110,6 +120,8 @@ class DataDomainFlattenedBucket {
                 Map<String, Object> snapshot = flattenedArcKey.buildJoinSnapshotForInsert(node);
 
                 if (existingQuery != null) {
+
+                    // TODO: O(N) lookup
                     BatchQueryRow existingRow = findRowForObjectId(existingQuery.getRows(), flattenedArcKey.id1.getSourceId());
                     // todo: do we need to worry about flattenedArcKey.id2 ?