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);