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

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v2 by this push:
     new 3d16c64  ISIS-2020: fixes the listAll issue
3d16c64 is described below

commit 3d16c64e9bdb4b7a23f2ff0673d445b6eeecc75f
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Fri Nov 9 11:41:00 2018 +0100

    ISIS-2020: fixes the listAll issue
    
    I believe, that the issue is on DN's side with the PersistenceManager
    not creating queries that act upon the correct DB connection.
    
    As of DN-5.2 FederatedJDOQLQuery is still work in progress.
    
    We fixed this by utilizing the new type-safe queries as provided with
    DN-5, which appear do work correctly on Federated Data Stores.
    
    As a side-effect we fixed the 'disable-MultivaluedFetch' optimization,
    which was not working in our implementation since ther was a key
    renaming in DN's migration from 4.1.0.M1 to 4.1.0.M2
    
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2020
---
 .../PersistenceQueryFindAllInstancesProcessor.java |  7 +++--
 .../services/jdosupport/IsisJdoSupportDN5.java     | 34 +++++++++++++-------
 .../services/jdosupport/IsisJdoSupport_v3_2.java   | 36 ++++++++++++++++++++--
 .../PersistenceQueryFindAllInstancesProcessor.java | 26 ++++++++--------
 4 files changed, 75 insertions(+), 28 deletions(-)

diff --git 
a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
 
b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index 0bc11e4..aae550b 100644
--- 
a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ 
b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -22,12 +22,13 @@ import java.util.List;
 
 import javax.jdo.Query;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import 
org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class PersistenceQueryFindAllInstancesProcessor extends 
PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
 
@@ -44,7 +45,7 @@ public class PersistenceQueryFindAllInstancesProcessor 
extends PersistenceQueryP
 
         Class<?> cls = specification.getCorrespondingClass();
         final Query jdoQuery = persistenceSession.newJdoQuery(cls);
-
+        
         // http://www.datanucleus.org/servlet/jira/browse/NUCCORE-1103
         jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
 
diff --git 
a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
 
b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
index 8668909..8cfefd9 100644
--- 
a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
+++ 
b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
@@ -171,15 +171,21 @@ public class IsisJdoSupportDN5 implements 
IsisJdoSupport_v3_2 {
 
     @Programmatic
     @Override
-    public <T> List<T> executeQuery(final Class<T> cls, final 
BooleanExpression expression) {
-        final JDOQLTypedQuery<T> query = 
newTypesafeQuery(cls).filter(expression);
+    public <T> List<T> executeQuery(final Class<T> cls, final 
BooleanExpression filter) {
+        JDOQLTypedQuery<T> query = newTypesafeQuery(cls);
+        if(filter!=null) {
+            query = query.filter(filter);
+        }
         return executeListAndClose(query);
     }
 
     @Programmatic
     @Override
-    public <T> T executeQueryUnique(final Class<T> cls, final 
BooleanExpression expression) {
-        final JDOQLTypedQuery<T> query = 
newTypesafeQuery(cls).filter(expression);
+    public <T> T executeQueryUnique(final Class<T> cls, final 
BooleanExpression filter) {
+        JDOQLTypedQuery<T> query = newTypesafeQuery(cls);
+        if(filter!=null) {
+            query = query.filter(filter);
+        }
         return executeUniqueAndClose(query);
     }
 
@@ -190,16 +196,22 @@ public class IsisJdoSupportDN5 implements 
IsisJdoSupport_v3_2 {
     }
 
     private static <T> List<T> executeListAndClose(final JDOQLTypedQuery<T> 
query) {
-        final List<T> elements = query.executeList();
-        final List<T> list = _Lists.newArrayList(elements);
-        query.closeAll();
-        return list;
+        try {
+            final List<T> elements = query.executeList();
+            final List<T> list = _Lists.newArrayList(elements); 
+            return list;    
+        } finally {
+            query.closeAll();
+        }
     }
 
     private static <T> T executeUniqueAndClose(final JDOQLTypedQuery<T> query) 
{
-        final T result = query.executeUnique();
-        query.closeAll();
-        return result;
+        try {
+            final T result = query.executeUnique();
+            return result;
+        } finally {
+            query.closeAll();
+        }
     }
 
     // //////////////////////////////////////
diff --git 
a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport_v3_2.java
 
b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport_v3_2.java
index fa4e16c..9508b8e 100644
--- 
a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport_v3_2.java
+++ 
b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport_v3_2.java
@@ -21,9 +21,12 @@ package org.apache.isis.applib.services.jdosupport;
 
 import java.util.List;
 
+import javax.annotation.Nullable;
 import javax.jdo.JDOQLTypedQuery;
 import javax.jdo.query.BooleanExpression;
 
+import org.datanucleus.store.rdbms.RDBMSPropertyNames;
+
 import org.apache.isis.applib.annotation.Programmatic;
 
 /**
@@ -49,7 +52,12 @@ public interface IsisJdoSupport_v3_2 extends 
org.apache.isis.applib.services.jdo
      * </p>
      */
     @Programmatic
-    <T> List<T> executeQuery(final Class<T> cls, final BooleanExpression 
booleanExpression);
+    <T> List<T> executeQuery(final Class<T> cls, @Nullable final 
BooleanExpression filter);
+    
+    @Programmatic
+    default <T> List<T> executeQuery(final Class<T> cls) {
+        return executeQuery(cls, null);
+    }
 
     /**
      * To perform a common use-case of executing a (type-safe) query against 
the specified class,
@@ -68,7 +76,12 @@ public interface IsisJdoSupport_v3_2 extends 
org.apache.isis.applib.services.jdo
      * </p>
      */
     @Programmatic
-    <T> T executeQueryUnique(final Class<T> cls, final BooleanExpression 
booleanExpression);
+    <T> T executeQueryUnique(final Class<T> cls, @Nullable final 
BooleanExpression filter);
+    
+    @Programmatic
+    default <T> T executeQueryUnique(final Class<T> cls) {
+        return executeQueryUnique(cls, null);
+    }
 
     /**
      * To support the execution of type-safe queries using DataNucleus' 
lower-level APIs
@@ -81,4 +94,23 @@ public interface IsisJdoSupport_v3_2 extends 
org.apache.isis.applib.services.jdo
      */
     @Programmatic
     <T> JDOQLTypedQuery<T> newTypesafeQuery(Class<T> cls);
+    
+    // -- UTILITY
+    
+    /**
+     * from <a 
href="http://www.datanucleus.org/products/accessplatform/jdo/query.html";>DN-5.2</a>
+     * <p>
+     * For RDBMS any single-valued member will be fetched in the original SQL 
query, but with 
+     * multiple-valued members this is not supported. However what will happen 
is that any 
+     * collection/array field will be retrieved in a single SQL query for all 
candidate objects 
+     * (by default using an EXISTS subquery); this avoids the "N+1" problem, 
resulting in 1 original 
+     * SQL query plus 1 SQL query per collection member. Note that you can 
disable this by either 
+     * not putting multi-valued fields in the FetchPlan, or by setting the 
query extension 
+     * datanucleus.rdbms.query.multivaluedFetch to none (default is "exists" 
using the single SQL per field).
+     */
+    default void disableMultivaluedFetch(JDOQLTypedQuery<?> query) {
+        String key = RDBMSPropertyNames.PROPERTY_RDBMS_QUERY_MULTIVALUED_FETCH;
+        query.extension(key, "none");
+    }
+
 }
diff --git 
a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
 
b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index bf33ca3..d2d292d 100644
--- 
a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ 
b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -20,14 +20,16 @@ package 
org.apache.isis.objectstore.jdo.datanucleus.persistence.queries;
 
 import java.util.List;
 
-import javax.jdo.Query;
+import javax.jdo.JDOQLTypedQuery;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport_v3_2;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import 
org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 
 public class PersistenceQueryFindAllInstancesProcessor extends 
PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
@@ -41,23 +43,23 @@ public class PersistenceQueryFindAllInstancesProcessor 
extends PersistenceQueryP
     @Override
     public List<ObjectAdapter> process(final PersistenceQueryFindAllInstances 
persistenceQuery) {
 
+        final IsisJdoSupport_v3_2 isisJdoSupport = 
+                
IsisContext.getServicesInjector().lookupServiceElseFail(IsisJdoSupport_v3_2.class);
+        
         final ObjectSpecification specification = 
persistenceQuery.getSpecification();
+        final Class<?> cls = specification.getCorrespondingClass();
 
-        Class<?> cls = specification.getCorrespondingClass();
-        final Query<?> jdoQuery = persistenceSession.newJdoQuery(cls);
-
-        // http://www.datanucleus.org/servlet/jira/browse/NUCCORE-1103
-        jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
+        JDOQLTypedQuery<?> typesafeQuery = 
isisJdoSupport.newTypesafeQuery(cls);
+        isisJdoSupport.disableMultivaluedFetch(typesafeQuery); // fetch 
optimization
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("allInstances(): class={}", 
specification.getFullIdentifier());
         }
+        
+        final List<?> pojos = isisJdoSupport.executeQuery(cls);
+        return loadAdapters(pojos);
 
-        try {
-            final List<?> pojos = (List<?>) jdoQuery.execute();
-            return loadAdapters(pojos);
-        } finally {
-            jdoQuery.closeAll();
-        }
     }
+    
+    
 }

Reply via email to