CAY-2406 Add prefetch-related API to SQLSelect

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

Branch: refs/heads/master
Commit: 9183314a9e1d361e14c13cd5f208a71533b5fe8e
Parents: 90e5273
Author: Maxim Petrusevich <maks1...@gmail.com>
Authored: Wed Feb 14 10:30:37 2018 +0300
Committer: Maxim Petrusevich <maks1...@gmail.com>
Committed: Wed Feb 14 10:30:37 2018 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/query/SQLTemplate.java | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/9183314a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
index 5a84322..c86bb00 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.query;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.QueryEngine;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -34,7 +35,6 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.TreeSet;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
@@ -502,9 +502,24 @@ public class SQLTemplate extends AbstractQuery implements 
ParameterizedQuery {
         * @since 4.0
         */
        public void addPrefetch(PrefetchTreeNode prefetchElement) {
+               if (hasDisjointNode(prefetchElement)) {
+                       throw new CayenneRuntimeException("This query supports 
only 'joint' and 'disjointById' prefetching semantics.");
+               }
                metaData.mergePrefetch(prefetchElement);
        }
 
+       private boolean hasDisjointNode(PrefetchTreeNode prefetchElement) {
+               if (prefetchElement.isDisjointPrefetch()) {
+                       return true;
+               }
+               for (PrefetchTreeNode child : prefetchElement.getChildren()) {
+                       if (hasDisjointNode(child)) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        /**
         * @since 1.2
         */

Reply via email to