You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/12/24 16:25:43 UTC

[isis] branch master updated: ISIS-2033: dn-integration: simplify query param processing

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 67167d3  ISIS-2033: dn-integration: simplify query param processing
67167d3 is described below

commit 67167d3b9ae04e2b9e457bf695f60b4d06a627af
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 24 17:25:28 2020 +0100

    ISIS-2033: dn-integration: simplify query param processing
---
 ...sistenceQueryFindUsingApplibQueryProcessor.java | 66 +++++++---------------
 .../persistence/query/PersistenceQueryFactory.java | 16 +++---
 ...ersistenceQueryFindUsingApplibQueryDefault.java | 23 ++------
 3 files changed, 36 insertions(+), 69 deletions(-)

diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index 5bce084..9d43a7f 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -20,17 +20,13 @@ package org.apache.isis.persistence.jdo.integration.persistence.queries;
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
 import javax.jdo.Query;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.persistence.jdo.integration.metamodel.JdoPropertyUtils;
 import org.apache.isis.persistence.jdo.integration.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
@@ -48,17 +44,15 @@ extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDe
     public Can<ManagedObject> process(
             final PersistenceQueryContext queryContext,
             final PersistenceQueryFindUsingApplibQueryDefault persistenceQuery) {
-        final String queryName = persistenceQuery.getQueryName();
-        final ObjectSpecification objectSpec = persistenceQuery.getSpecification();
-
-        final List<?> results;
-        if((objectSpec.getFullIdentifier() + "#pk").equals(queryName)) {
-            results = getResultsPk(queryContext, persistenceQuery);
-        } else {
-            results = getResults(queryContext, persistenceQuery);
-        }
+        
+        val queryName = persistenceQuery.getQueryName();
+        val objectSpec = persistenceQuery.getSpecification();
 
-        return loadAdapters(queryContext, results);
+        val resultList = (objectSpec.getFullIdentifier() + "#pk").equals(queryName)
+                ? getResultsPk(queryContext, persistenceQuery)
+                : getResults(queryContext, persistenceQuery);
+
+        return loadAdapters(queryContext, resultList);
     }
 
     // -- HELPER
@@ -69,11 +63,10 @@ extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDe
             final PersistenceQueryFindUsingApplibQueryDefault persistenceQuery) {
 
         val queryName = persistenceQuery.getQueryName();
-        final Map<String, Object> map = unwrap(persistenceQuery.getArgumentsAdaptersByParameterName());
+        val queryParametersByName = persistenceQuery.getQueryParametersByName();
         val spec = persistenceQuery.getSpecification();
         
-        val serviceRegistry = spec.getMetaModelContext().getServiceRegistry();
-        val isisJdoSupport = isisJdoSupport(serviceRegistry);
+        val isisJdoSupport = isisJdoSupport(spec.getMetaModelContext().getServiceRegistry());
 
         val cls = spec.getCorrespondingClass();
         if(!JdoPropertyUtils.hasPrimaryKeyProperty(spec)) {
@@ -81,7 +74,7 @@ extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDe
         }
         final OneToOneAssociation pkOtoa = JdoPropertyUtils.getPrimaryKeyPropertyFor(spec);
         final String pkOtoaId = pkOtoa.getId();
-        final String filter = pkOtoaId + "==" + map.get(pkOtoaId);
+        final String filter = pkOtoaId + "==" + queryParametersByName.get(pkOtoaId);
 
         /* XXX[ISIS-2020] as of Oct. 2018: likely not working on FederatedDataStore
          * see PersistenceQueryFindAllInstancesProcessor for workaround using type-safe query instead
@@ -106,9 +99,8 @@ extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDe
             final PersistenceQueryFindUsingApplibQueryDefault persistenceQuery) {
 
         val queryName = persistenceQuery.getQueryName();
-        final Map<String, Object> argumentsByParameterName = unwrap(
-                persistenceQuery.getArgumentsAdaptersByParameterName());
-        final QueryCardinality cardinality = persistenceQuery.getCardinality();
+        val queryParametersByName = persistenceQuery.getQueryParametersByName();
+        val cardinality = persistenceQuery.getCardinality();
         val spec = persistenceQuery.getSpecification();
         val cls = spec.getCorrespondingClass();
         
@@ -126,39 +118,23 @@ extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDe
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("{} # {} ( {} )", cls.getName(), queryName, argumentsByParameterName);
+            log.debug("{} # {} ( {} )", cls.getName(), queryName, queryParametersByName);
         }
 
         try {
-            final List<?> results = (List<?>) jdoQuery.executeWithMap(argumentsByParameterName);
-            if(results == null) {
+            val resultList = (List<?>) jdoQuery.executeWithMap(queryParametersByName);
+            if(resultList == null
+                    || resultList.isEmpty()) {
                 return Collections.emptyList();
             }
-            final List<?> resultsToReturn =
-                    cardinality == QueryCardinality.MULTIPLE
-                    ? results
-                            : firstIfAnyOf(results);
-            return _Lists.newArrayList(resultsToReturn);
+            // at this point we know the resultList is of size >= 1
+            return cardinality == QueryCardinality.SINGLE
+                    ? resultList.subList(0, 1)
+                    : resultList;
         } finally {
             jdoQuery.closeAll();
         }
     }
 
-    private List<?> firstIfAnyOf(final List<?> results) {
-        return results.isEmpty()
-                ? Collections.emptyList()
-                        : results.subList(0, 1);
-    }
-
-    private static Map<String, Object> unwrap(final Map<String, ManagedObject> argumentAdaptersByParameterName) {
-        final Map<String, Object> argumentsByParameterName = _Maps.newHashMap();
-        for (final String parameterName : argumentAdaptersByParameterName.keySet()) {
-            final ManagedObject argumentAdapter = argumentAdaptersByParameterName.get(parameterName);
-            final Object argument = ManagedObjects.UnwrapUtil.single(argumentAdapter);
-            argumentsByParameterName.put(parameterName, argument);
-        }
-        return argumentsByParameterName;
-    }
-
 }
 
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java
index 46e9f37..1b0938d 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java
@@ -18,9 +18,12 @@
  */
 package org.apache.isis.persistence.jdo.integration.persistence.query;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.query.AllInstancesQuery;
 import org.apache.isis.applib.query.NamedQuery;
 import org.apache.isis.applib.query.Query;
@@ -29,7 +32,6 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
@@ -67,12 +69,12 @@ public class PersistenceQueryFactory implements HasMetaModelContext {
         } if (query instanceof NamedQuery) {
             val namedQuery = (NamedQuery<?>) query;
             val queryName = namedQuery.getName();
-            val parametersByName = wrap(namedQuery.getParametersByName());
+            val parametersByName = injectServicesInto(namedQuery.getParametersByName());
             
             return new PersistenceQueryFindUsingApplibQueryDefault(
                     queryResultTypeSpec, 
                     queryName, 
-                    parametersByName, 
+                    Collections.unmodifiableMap(parametersByName), 
                     cardinality,
                     getSpecificationLoader(), 
                     namedQuery.getStart(), 
@@ -87,14 +89,14 @@ public class PersistenceQueryFactory implements HasMetaModelContext {
      * same param-name. 
      * @implNote we do this to ensure queryParameters have injection points resolved (might be redundant) 
      */
-    private Map<String, ManagedObject> wrap(
-            final Map<String, Object> queryParametersByName) {
+    private Map<String, Object> injectServicesInto(
+            final @Nullable Map<String, Object> queryParametersByName) {
         
-        val objMan = getObjectManager();
         val injector = getServiceInjector();
         
+        // not strictly necessary: creates a copy
         return _Maps.mapValues(queryParametersByName, HashMap::new, paramPojo->
-            objMan.adapt(injector.injectServicesInto(paramPojo))
+            injector.injectServicesInto(paramPojo)
         );
     }
 
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java
index bb399c0..beefdbe 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.persistence.jdo.integration.persistence.query;
 
-import java.util.Collections;
 import java.util.Map;
 
 import org.apache.isis.applib.query.Query;
@@ -32,19 +31,21 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.persistence.jdo.integration.persistence.queries.PersistenceQueryContext;
 import org.apache.isis.persistence.jdo.integration.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
 
+import lombok.Getter;
+
 /**
  * Corresponds to an object-store specific implementation of {@link Query}.
  */
 public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQueryAbstract {
 
-    private final String queryName;
-    private final QueryCardinality cardinality;
-    private final Map<String, ManagedObject> queryParametersByName;
+    @Getter private final String queryName;
+    @Getter private final QueryCardinality cardinality;
+    @Getter private final Map<String, Object> queryParametersByName;
 
     public PersistenceQueryFindUsingApplibQueryDefault(
             final ObjectSpecification specification,
             final String queryName,
-            final Map<String, ManagedObject> queryParametersByName,
+            final Map<String, Object> queryParametersByName,
             final QueryCardinality cardinality,
             final SpecificationLoader specificationLoader,
             final long... range) {
@@ -54,18 +55,6 @@ public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQuer
         this.queryParametersByName = queryParametersByName;
     }
 
-    public String getQueryName() {
-        return queryName;
-    }
-
-    public Map<String, ManagedObject> getArgumentsAdaptersByParameterName() {
-        return Collections.unmodifiableMap(queryParametersByName);
-    }
-
-    public QueryCardinality getCardinality() {
-        return cardinality;
-    }
-
     @Override
     public String toString() {
         final ToString str = ToString.createAnonymous(this);