This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new 90553be  New select translator lost warning about a joint prefetch + 
limit
90553be is described below

commit 90553be6dc187a82360e82c214cd8fe8a56dbd40
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Mon May 18 13:07:25 2020 +0300

    New select translator lost warning about a joint prefetch + limit
---
 .../translator/select/PrefetchNodeStage.java       | 22 ++++++++++++++++++++--
 .../org/apache/cayenne/access/JointPrefetchIT.java |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
index 885c916..3aa795d 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
@@ -32,8 +32,11 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.query.PrefetchSelectQuery;
 import org.apache.cayenne.query.PrefetchTreeNode;
+import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.Select;
 import org.apache.cayenne.reflect.ClassDescriptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static org.apache.cayenne.access.sqlbuilder.SQLBuilder.table;
 
@@ -42,6 +45,8 @@ import static 
org.apache.cayenne.access.sqlbuilder.SQLBuilder.table;
  */
 class PrefetchNodeStage implements TranslationStage {
 
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(SelectTranslator.class);
+
     @Override
     public void perform(TranslatorContext context) {
         updatePrefetchNodes(context);
@@ -62,12 +67,14 @@ class PrefetchNodeStage implements TranslationStage {
     }
 
     private void processJoint(TranslatorContext context) {
-        PrefetchTreeNode prefetch = context.getMetadata().getPrefetchTree();
+        QueryMetadata queryMetadata = context.getMetadata();
+        PrefetchTreeNode prefetch = queryMetadata.getPrefetchTree();
         if(prefetch == null) {
             return;
         }
 
-        ObjEntity objEntity = context.getMetadata().getObjEntity();
+        ObjEntity objEntity = queryMetadata.getObjEntity();
+        boolean warnPrefetchWithLimit = false;
 
         for(PrefetchTreeNode node : prefetch.adjacentJointNodes()) {
             Expression prefetchExp = ExpressionFactory.exp(node.getPath());
@@ -94,6 +101,17 @@ class PrefetchNodeStage implements TranslationStage {
 
             DescriptorColumnExtractor columnExtractor = new 
DescriptorColumnExtractor(context, prefetchClassDescriptor);
             columnExtractor.extract("p:" + dbPath);
+
+            if(!warnPrefetchWithLimit && targetRel.isToMany()
+                    && (queryMetadata.getFetchLimit() > 0 || 
queryMetadata.getFetchOffset() > 0)) {
+                warnPrefetchWithLimit = true;
+            }
+        }
+
+        // warn about a potentially faulty joint prefetch + limit combination
+        if(warnPrefetchWithLimit) {
+            LOGGER.warn("The query uses both limit/offset and a joint 
prefetch, this most probably will lead to an incorrect result. " +
+                    "Either use disjointById prefetch or get a full result 
set.");
         }
     }
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
index 18ad1d8..1f34af5 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
@@ -130,7 +130,7 @@ public class JointPrefetchIT extends ServerCase {
 
         final List<Artist> objects = ObjectSelect.query(Artist.class)
                 .limit(2).offset(0)
-                .orderBy("db:ARTIST_ID", SortOrder.ASCENDING)
+                .orderBy(Artist.ARTIST_ID_PK_PROPERTY.asc())
                 .prefetch(Artist.PAINTING_ARRAY.joint())
                 .select(context);
 

Reply via email to