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/11/27 14:22:24 UTC

[1/7] cayenne git commit: CAY-2141 Skip repetitive query parameters

Repository: cayenne
Updated Branches:
  refs/heads/master 0e3a07c1e -> 949e3831a


CAY-2141
Skip repetitive query parameters


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

Branch: refs/heads/master
Commit: a11769410261056bc21d018b85a0176acf999974
Parents: b0d0faf
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Nov 18 18:34:11 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Nov 18 18:34:11 2016 +0300

----------------------------------------------------------------------
 .../access/HierarchicalObjectResolver.java      | 35 +++++++++++++-------
 1 file changed, 23 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/a1176941/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index ec45d7c..9d1e5f6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -176,34 +176,45 @@ class HierarchicalObjectResolver {
             List<PrefetchSelectQuery> queries = new ArrayList<PrefetchSelectQuery>();
             int qualifiersCount = 0;
             PrefetchSelectQuery currentQuery = null;
+            List<DbJoin> joins = lastDbRelationship.getJoins();
+            Set<List<Object>> values = new HashSet<>();
 
             for (Object dataRow : parentDataRows) {
                 Expression allJoinsQualifier = null;
-                List<DbJoin> joins = lastDbRelationship.getJoins();
 
                 // handling too big qualifiers
                 if (currentQuery == null
                         || (maxIdQualifierSize > 0 && qualifiersCount + joins.size() > maxIdQualifierSize)) {
+
+                    if(currentQuery != null) {
+                        for(List<Object> joinValues : values) {
+                            for(int i=0; i<joins.size(); i++) {
+                                Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix
+                                        + joins.get(i).getTargetName(), joinValues.get(i));
+                                if (allJoinsQualifier == null) {
+                                    allJoinsQualifier = joinQualifier;
+                                } else {
+                                    allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier);
+                                }
+                            }
+                            currentQuery.orQualifier(allJoinsQualifier);
+                        }
+                    }
+
                     currentQuery = new PrefetchSelectQuery(node.getPath(), relationship);
                     queries.add(currentQuery);
                     qualifiersCount = 0;
                 }
 
+                List<Object> joinValues = new ArrayList<>();
                 for (DbJoin join : joins) {
-
                     Object targetValue = ((DataRow) dataRow).get(join.getSourceName());
-                    Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix
-                            + join.getTargetName(), targetValue);
-                    if (allJoinsQualifier == null) {
-                        allJoinsQualifier = joinQualifier;
-                    }
-                    else {
-                        allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier);
-                    }
+                    joinValues.add(targetValue);
                 }
 
-                currentQuery.orQualifier(allJoinsQualifier);
-                qualifiersCount += joins.size();
+                if(values.add(joinValues)) {
+                    qualifiersCount += joins.size();
+                }
             }
 
             PrefetchTreeNode jointSubtree = node.cloneJointSubtree();


[5/7] cayenne git commit: refreshing older API in tests

Posted by aa...@apache.org.
refreshing older API in tests


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

Branch: refs/heads/master
Commit: e73365ab581ed6afa6aec3e890179e24e8da7f56
Parents: 47887fb
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sun Nov 27 17:11:13 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sun Nov 27 17:11:16 2016 +0300

----------------------------------------------------------------------
 .../access/DataContextDisjointByIdPrefetchIT.java   | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e73365ab/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
index 6e633fb..57831f5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
@@ -21,7 +21,6 @@ package org.apache.cayenne.access;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
@@ -117,8 +116,7 @@ public class DataContextDisjointByIdPrefetchIT extends ServerCase {
         createArtistWithTwoPaintingsDataSet();
 
         SelectQuery query = new SelectQuery(Artist.class);
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjointById());
 
         final List<Artist> result = context.performQuery(query);
         queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
@@ -126,7 +124,7 @@ public class DataContextDisjointByIdPrefetchIT extends ServerCase {
             public void execute() {
                 assertFalse(result.isEmpty());
                 Artist b1 = result.get(0);
-                List<Painting> toMany = (List<Painting>) b1.readPropertyDirectly(Artist.PAINTING_ARRAY_PROPERTY);
+                List<Painting> toMany = (List<Painting>) b1.readPropertyDirectly(Artist.PAINTING_ARRAY.getName());
                 assertNotNull(toMany);
                 assertFalse(((ValueHolder) toMany).isFault());
                 assertEquals(2, toMany.size());
@@ -148,7 +146,7 @@ public class DataContextDisjointByIdPrefetchIT extends ServerCase {
         createArtistWithTwoPaintingsDataSet();
 
         SelectQuery query = new SelectQuery(Painting.class);
-        query.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Painting.TO_ARTIST.disjointById());
 
         final List<Painting> result = context.performQuery(query);
         queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
@@ -168,8 +166,7 @@ public class DataContextDisjointByIdPrefetchIT extends ServerCase {
         createThreeArtistsWithPlentyOfPaintingsDataSet();
 
         final SelectQuery query = new SelectQuery(Artist.class);
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjointById());
         query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, SortOrder.ASCENDING);
 
         query.setFetchLimit(2);
@@ -203,8 +200,7 @@ public class DataContextDisjointByIdPrefetchIT extends ServerCase {
         createTwoPaintingsWithInfosDataSet();
 
         SelectQuery query = new SelectQuery(Painting.class);
-        query.addPrefetch(Painting.TO_PAINTING_INFO_PROPERTY).setSemantics(
-                PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Painting.TO_PAINTING_INFO.disjointById());
         final List<Painting> result = context.performQuery(query);
         queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
 
@@ -212,7 +208,7 @@ public class DataContextDisjointByIdPrefetchIT extends ServerCase {
                 assertFalse(result.isEmpty());
                 List<String> boxColors = new ArrayList<String>();
                 for (Painting box : result) {
-                    PaintingInfo info = (PaintingInfo) box.readPropertyDirectly(Painting.TO_PAINTING_INFO_PROPERTY);
+                    PaintingInfo info = (PaintingInfo) box.readPropertyDirectly(Painting.TO_PAINTING_INFO.getName());
                     assertNotNull(info);
                     boxColors.add(info.getTextReview());
                     assertEquals(PersistenceState.COMMITTED, info.getPersistenceState());


[7/7] cayenne git commit: CAY-2141 Disjoint-by-id prefetch generates repeating ID conditions

Posted by aa...@apache.org.
CAY-2141 Disjoint-by-id prefetch generates repeating ID conditions

* micro-optimization


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

Branch: refs/heads/master
Commit: 949e3831a534a33b576ba43ae1c4e44b8d6ac679
Parents: 2656dc8
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sun Nov 27 17:22:15 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sun Nov 27 17:22:15 2016 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/access/HierarchicalObjectResolver.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/949e3831/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index 104dd76..613c88d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -194,7 +194,7 @@ class HierarchicalObjectResolver {
                     values = new HashSet<>();
                 }
 
-                List<Object> joinValues = new ArrayList<>();
+                List<Object> joinValues = new ArrayList<>(joins.size());
                 for (DbJoin join : joins) {
                     Object targetValue = ((DataRow) dataRow).get(join.getSourceName());
                     joinValues.add(targetValue);


[3/7] cayenne git commit: Merge branch '136'

Posted by aa...@apache.org.
Merge branch '136'


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

Branch: refs/heads/master
Commit: 8355d729ca1ef73208fea511c291d4b60ab548e2
Parents: 0e3a07c 6818800
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sun Nov 27 16:49:40 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sun Nov 27 16:49:40 2016 +0300

----------------------------------------------------------------------
 .../access/HierarchicalObjectResolver.java      | 49 ++++++++++++++------
 1 file changed, 34 insertions(+), 15 deletions(-)
----------------------------------------------------------------------



[4/7] cayenne git commit: CAY-2141 Disjoint-by-id prefetch generates repeating ID conditions

Posted by aa...@apache.org.
CAY-2141 Disjoint-by-id prefetch generates repeating ID conditions

* release notes


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

Branch: refs/heads/master
Commit: 47887fb813c543a7d4777d4b4993e50cbe33ab2f
Parents: 8355d72
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sun Nov 27 16:51:21 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sun Nov 27 16:51:21 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/47887fb8/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 5cf1320..d472619 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -67,6 +67,7 @@ CAY-2126 Modeler cannot upgrade project from v7 to v9
 CAY-2128 Modeler stored procedures are not imported
 CAY-2131 Modeler NullPointerException in reverse engineering when importing different catalogs in one datamap
 CAY-2138 NVARCHAR, LONGNVARCHAR and NCLOB types are missing from Firebird types.xml
+CAY-2141 Disjoint-by-id prefetch generates repeating ID conditions
 CAY-2143 NPE in BaseSchemaUpdateStrategy
 CAY-2144 cdbimport always fails for databases which don't support catalogs
 CAY-2146 Vertical inheritance: record still inserted into parent db table when child validation fails


[2/7] cayenne git commit: CAY-2141 Skip repetitive query parameters

Posted by aa...@apache.org.
CAY-2141
Skip repetitive query parameters


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

Branch: refs/heads/master
Commit: 6818800aa84fbd2857cc15ca9ccf032cbb177442
Parents: a117694
Author: Nikita Timofeev <nt...@objectstyle.com>
Authored: Mon Nov 21 11:12:58 2016 +0300
Committer: Nikita Timofeev <nt...@objectstyle.com>
Committed: Mon Nov 21 11:12:58 2016 +0300

----------------------------------------------------------------------
 .../access/HierarchicalObjectResolver.java      | 42 ++++++++++++--------
 1 file changed, 25 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/6818800a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index 9d1e5f6..e220f9c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -173,37 +173,23 @@ class HierarchicalObjectResolver {
                     .getParentDataDomain()
                     .getMaxIdQualifierSize();
 
-            List<PrefetchSelectQuery> queries = new ArrayList<PrefetchSelectQuery>();
+            List<PrefetchSelectQuery> queries = new ArrayList<>();
             int qualifiersCount = 0;
             PrefetchSelectQuery currentQuery = null;
             List<DbJoin> joins = lastDbRelationship.getJoins();
             Set<List<Object>> values = new HashSet<>();
 
             for (Object dataRow : parentDataRows) {
-                Expression allJoinsQualifier = null;
-
                 // handling too big qualifiers
                 if (currentQuery == null
                         || (maxIdQualifierSize > 0 && qualifiersCount + joins.size() > maxIdQualifierSize)) {
 
-                    if(currentQuery != null) {
-                        for(List<Object> joinValues : values) {
-                            for(int i=0; i<joins.size(); i++) {
-                                Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix
-                                        + joins.get(i).getTargetName(), joinValues.get(i));
-                                if (allJoinsQualifier == null) {
-                                    allJoinsQualifier = joinQualifier;
-                                } else {
-                                    allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier);
-                                }
-                            }
-                            currentQuery.orQualifier(allJoinsQualifier);
-                        }
-                    }
+                    createDisjointByIdPrefetchQualifier(pathPrefix, currentQuery, joins, values);
 
                     currentQuery = new PrefetchSelectQuery(node.getPath(), relationship);
                     queries.add(currentQuery);
                     qualifiersCount = 0;
+                    values = new HashSet<>();
                 }
 
                 List<Object> joinValues = new ArrayList<>();
@@ -216,6 +202,8 @@ class HierarchicalObjectResolver {
                     qualifiersCount += joins.size();
                 }
             }
+            // add final part of values
+            createDisjointByIdPrefetchQualifier(pathPrefix, currentQuery, joins, values);
 
             PrefetchTreeNode jointSubtree = node.cloneJointSubtree();
 
@@ -240,6 +228,26 @@ class HierarchicalObjectResolver {
             return startDisjointPrefetch(node);
         }
 
+        private void createDisjointByIdPrefetchQualifier(String pathPrefix, PrefetchSelectQuery currentQuery,
+                                                         List<DbJoin> joins, Set<List<Object>> values) {
+            Expression allJoinsQualifier;
+            if(currentQuery != null) {
+                for(List<Object> joinValues : values) {
+                    allJoinsQualifier = null;
+                    for(int i=0; i<joins.size(); i++) {
+                        Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix
+                                + joins.get(i).getTargetName(), joinValues.get(i));
+                        if (allJoinsQualifier == null) {
+                            allJoinsQualifier = joinQualifier;
+                        } else {
+                            allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier);
+                        }
+                    }
+                    currentQuery.orQualifier(allJoinsQualifier);
+                }
+            }
+        }
+
         public boolean startJointPrefetch(PrefetchTreeNode node) {
 
             // delegate processing of the top level joint prefetch to a joint processor,


[6/7] cayenne git commit: adding missing @Override's

Posted by aa...@apache.org.
adding missing @Override's


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

Branch: refs/heads/master
Commit: 2656dc804c8c8e22ad7f63debffa3bf05c17d902
Parents: e73365a
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sun Nov 27 17:15:27 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sun Nov 27 17:15:27 2016 +0300

----------------------------------------------------------------------
 .../access/HierarchicalObjectResolver.java      | 32 +++++++++++++++-----
 1 file changed, 25 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2656dc80/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index e220f9c..104dd76 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -19,13 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.Persistent;
@@ -40,6 +33,13 @@ import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * Processes a number of DataRow sets corresponding to a given prefetch tree, resolving
  * DataRows to an object tree. Can process any combination of joint and disjoint sets, per
@@ -103,6 +103,7 @@ class HierarchicalObjectResolver {
 
     final class DisjointProcessor implements PrefetchProcessor {
 
+        @Override
         public boolean startDisjointPrefetch(PrefetchTreeNode node) {
 
             PrefetchProcessorNode processorNode = (PrefetchProcessorNode) node;
@@ -124,6 +125,7 @@ class HierarchicalObjectResolver {
             return true;
         }
 
+        @Override
         public boolean startDisjointByIdPrefetch(PrefetchTreeNode node) {
             PrefetchProcessorNode processorNode = (PrefetchProcessorNode) node;
 
@@ -248,6 +250,7 @@ class HierarchicalObjectResolver {
             }
         }
 
+        @Override
         public boolean startJointPrefetch(PrefetchTreeNode node) {
 
             // delegate processing of the top level joint prefetch to a joint processor,
@@ -297,14 +300,17 @@ class HierarchicalObjectResolver {
             return true;
         }
 
+        @Override
         public boolean startPhantomPrefetch(PrefetchTreeNode node) {
             return true;
         }
 
+        @Override
         public boolean startUnknownPrefetch(PrefetchTreeNode node) {
             throw new CayenneRuntimeException("Unknown prefetch node: " + node);
         }
 
+        @Override
         public void finishPrefetch(PrefetchTreeNode node) {
             // now that all the children are processed, we can clear the dupes
 
@@ -346,16 +352,19 @@ class HierarchicalObjectResolver {
             this.currentFlatRow = currentFlatRow;
         }
 
+        @Override
         public boolean startDisjointPrefetch(PrefetchTreeNode node) {
             // disjoint prefetch that is not the root terminates the walk...
             // don't process the root node itself..
             return node == rootNode;
         }
 
+        @Override
         public boolean startDisjointByIdPrefetch(PrefetchTreeNode node) {
             return startDisjointPrefetch(node);
         }
 
+        @Override
         public boolean startJointPrefetch(PrefetchTreeNode node) {
             PrefetchProcessorJointNode processorNode = (PrefetchProcessorJointNode) node;
 
@@ -388,14 +397,17 @@ class HierarchicalObjectResolver {
             return processorNode.isJointChildren();
         }
 
+        @Override
         public boolean startPhantomPrefetch(PrefetchTreeNode node) {
             return ((PrefetchProcessorNode) node).isJointChildren();
         }
 
+        @Override
         public boolean startUnknownPrefetch(PrefetchTreeNode node) {
             throw new CayenneRuntimeException("Unknown prefetch node: " + node);
         }
 
+        @Override
         public void finishPrefetch(PrefetchTreeNode node) {
             // noop
         }
@@ -405,18 +417,22 @@ class HierarchicalObjectResolver {
     // relationships and also fires snapshot update events
     final class PostProcessor implements PrefetchProcessor {
 
+        @Override
         public void finishPrefetch(PrefetchTreeNode node) {
         }
 
+        @Override
         public boolean startDisjointPrefetch(PrefetchTreeNode node) {
             ((PrefetchProcessorNode) node).connectToParents();
             return true;
         }
 
+        @Override
         public boolean startDisjointByIdPrefetch(PrefetchTreeNode node) {
             return startDisjointPrefetch(node);
         }
 
+        @Override
         public boolean startJointPrefetch(PrefetchTreeNode node) {
             PrefetchProcessorJointNode processorNode = (PrefetchProcessorJointNode) node;
 
@@ -433,10 +449,12 @@ class HierarchicalObjectResolver {
             return true;
         }
 
+        @Override
         public boolean startPhantomPrefetch(PrefetchTreeNode node) {
             return true;
         }
 
+        @Override
         public boolean startUnknownPrefetch(PrefetchTreeNode node) {
             throw new CayenneRuntimeException("Unknown prefetch node: " + node);
         }