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 17:21:02 UTC

[isis] branch master updated: ISIS-2033: encapsulate query range logic within QueryRangeModel

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 5a2f174  ISIS-2033: encapsulate query range logic within QueryRangeModel
5a2f174 is described below

commit 5a2f1745d1cd94b7a84a879e67f81b20e9821e56
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 24 18:20:46 2020 +0100

    ISIS-2033: encapsulate query range logic within QueryRangeModel
---
 .../PersistenceQueryProcessorForAllInstances.java  |   2 +-
 .../PersistenceQueryProcessorForApplibQuery.java   |   8 +-
 ...ava => _PersistenceQueryProcessorAbstract.java} |   2 +-
 .../persistence/query/PersistenceQuery.java        |  11 +--
 .../query/PersistenceQueryAbstract.java            | 101 ---------------------
 .../persistence/query/PersistenceQueryFactory.java |   8 +-
 .../query/PersistenceQueryFindAllInstances.java    |  24 +----
 ...ersistenceQueryFindUsingApplibQueryDefault.java |  13 +--
 .../persistence/query/QueryRangeModel.java         |  63 +++++++++++++
 ...ceQuery.java => _PersistenceQueryAbstract.java} |  35 +++----
 10 files changed, 89 insertions(+), 178 deletions(-)

diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForAllInstances.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForAllInstances.java
index 5b935fa..8d5cb05 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForAllInstances.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForAllInstances.java
@@ -27,7 +27,7 @@ import lombok.extern.log4j.Log4j2;
 
 @Log4j2
 public class PersistenceQueryProcessorForAllInstances 
-extends PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
+extends _PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
 
     @Override
     public Can<ManagedObject> process(
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForApplibQuery.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForApplibQuery.java
index c1189ac..9e3ef3e 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForApplibQuery.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorForApplibQuery.java
@@ -37,7 +37,7 @@ import lombok.extern.log4j.Log4j2;
 @RequiredArgsConstructor
 @Log4j2
 public class PersistenceQueryProcessorForApplibQuery 
-extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDefault> {
+extends _PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDefault> {
 
     @Override
     public Can<ManagedObject> process(
@@ -111,8 +111,10 @@ extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDe
         final Query<?> jdoQuery = queryContext.newJdoNamedQuery(cls, queryName); 
         isisJdoSupport.disableMultivaluedFetch(jdoQuery);
 
-        if(persistenceQuery.hasRange()) {
-            jdoQuery.setRange(persistenceQuery.getStart(), persistenceQuery.getEnd());
+        val queryRangeModel = persistenceQuery.getQueryRangeModel();
+        
+        if(queryRangeModel.hasRange()) {
+            jdoQuery.setRange(queryRangeModel.getStart(), queryRangeModel.getEnd());
         }
 
         if (log.isDebugEnabled()) {
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/_PersistenceQueryProcessorAbstract.java
similarity index 97%
rename from persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java
rename to persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/_PersistenceQueryProcessorAbstract.java
index 554b439..43d34d1 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/_PersistenceQueryProcessorAbstract.java
@@ -35,7 +35,7 @@ import org.apache.isis.persistence.jdo.integration.persistence.query.Persistence
 
 import lombok.val;
 
-public abstract class PersistenceQueryProcessorAbstract<T extends PersistenceQuery>
+abstract class _PersistenceQueryProcessorAbstract<T extends PersistenceQuery>
 implements PersistenceQueryProcessor<T> {
 
 
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java
index b8b300e..55651b5 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java
@@ -36,16 +36,7 @@ public interface PersistenceQuery {
      */
     ObjectSpecification getSpecification();
 
-    /**
-     * The index of the first record to return, 0 means the first.
-     * @return
-     */
-    public long getStart() ;
-    /**
-     * The number of records to return, 0 means all.
-     * @return
-     */
-    public long getCount() ;
+    QueryRangeModel getQueryRangeModel() ;
 
     Can<ManagedObject> execute(PersistenceQueryContext queryContext);
 }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryAbstract.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryAbstract.java
deleted file mode 100644
index 8138ac3..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryAbstract.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.persistence.jdo.integration.persistence.query;
-
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-public abstract class PersistenceQueryAbstract implements PersistenceQuery {
-
-    // -- constructor, fields
-
-    protected final long start;
-    protected final long count;
-
-    private final ObjectSpecification specification;
-
-    public PersistenceQueryAbstract(
-            final ObjectSpecification specification,
-            final long... range) {
-        this.start = range.length > 0 ? range[0]:0;
-        this.count = range.length > 1 ? range[1]:0;
-
-        this.specification = specification;
-        // nothing to do
-    }
-
-    /**
-     * The start index into the set table
-     * @return
-     */
-    @Override
-    public long getStart() {
-        return start;
-    }
-
-
-    /**
-     * The number of items to return, starting at {@link #getStart()}
-     */
-    @Override
-    public long getCount() {
-        return count;
-    }
-
-
-    @Override
-    public ObjectSpecification getSpecification() {
-        return specification;
-    }
-
-    // -- equals, hashCode
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final PersistenceQueryAbstract other = (PersistenceQueryAbstract) obj;
-        if (specification == null) {
-            if (other.specification != null) {
-                return false;
-            }
-        } else if (!specification.equals(other.specification)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + 1231;
-        result = PRIME * result + ((specification == null) ? 0 : specification.hashCode());
-        return result;
-    }
-
-
-
-}
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 ad487d9..406d0d7 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
@@ -56,13 +56,12 @@ public class PersistenceQueryFactory implements HasMetaModelContext {
         }
         
         val queryResultTypeSpec = specFor(query);
+        val range = QueryRangeModel.of(query.getStart(), query.getCount());
         
         if (query instanceof AllInstancesQuery) {
-            val allInstancesQuery = (AllInstancesQuery<?>) query;
             return new PersistenceQueryFindAllInstances(
                     queryResultTypeSpec, 
-                    allInstancesQuery.getStart(), 
-                    allInstancesQuery.getCount());
+                    range);
 
         } if (query instanceof NamedQuery) {
             val namedQuery = (NamedQuery<?>) query;
@@ -74,8 +73,7 @@ public class PersistenceQueryFactory implements HasMetaModelContext {
                     queryName, 
                     Collections.unmodifiableMap(parametersByName), 
                     getSpecificationLoader(), 
-                    namedQuery.getStart(), 
-                    namedQuery.getCount());
+                    range);
         }
         
         throw _Exceptions.unsupportedOperation("query type %s (%s) not supported by this persistence implementation",
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindAllInstances.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindAllInstances.java
index b4cf62d..12aaa87 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindAllInstances.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindAllInstances.java
@@ -30,34 +30,14 @@ import org.apache.isis.persistence.jdo.integration.persistence.queries.Persisten
 /**
  * Corresponds to {@link AllInstancesQuery}
  */
-public class PersistenceQueryFindAllInstances extends PersistenceQueryAbstract  {
-
-//    protected long index;
-//    protected long countedSoFar;
+public class PersistenceQueryFindAllInstances extends _PersistenceQueryAbstract  {
 
     public PersistenceQueryFindAllInstances(
             final ObjectSpecification specification,
-            final long... range) {
+            final QueryRangeModel range) {
         super(specification, range);
-//        index=0;
-//        countedSoFar=0;
     }
 
-//TODO not used, remove?
-//    public boolean matches(final ManagedObject object) {
-//
-//        if (getCount() == 0 && getStart() == 0){
-//            return true;
-//        }
-//        if (index++ < start){
-//            return false;
-//        }
-//        if (countedSoFar++ < count){
-//            return true;
-//        }
-//        return false;
-//    }
-
     @Override
     public String toString() {
         final ToString str = ToString.createAnonymous(this);
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 0b9f211..be8276e 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
@@ -35,7 +35,7 @@ import lombok.Getter;
 /**
  * Corresponds to an object-store specific implementation of {@link Query}.
  */
-public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQueryAbstract {
+public class PersistenceQueryFindUsingApplibQueryDefault extends _PersistenceQueryAbstract {
 
     @Getter private final String queryName;
     @Getter private final Map<String, Object> queryParametersByName;
@@ -45,7 +45,7 @@ public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQuer
             final String queryName,
             final Map<String, Object> queryParametersByName,
             final SpecificationLoader specificationLoader,
-            final long... range) {
+            final QueryRangeModel range) {
         super(specification, range);
         this.queryName = queryName;
         this.queryParametersByName = queryParametersByName;
@@ -58,16 +58,7 @@ public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQuer
         return str.toString();
     }
 
-    public long getEnd() {
-        // we default to Integer.MAX_VALUE because HSQLDB blows up
-        // (with a ClassCastException from Long to Integer)
-        // if we return Long.MAX_VALUE
-        return getCount() != 0? getStart() + getCount(): Integer.MAX_VALUE;
-    }
 
-    public boolean hasRange() {
-        return getStart() != 0 || getCount() != 0;
-    }
 
     @Override
     public Can<ManagedObject> execute(PersistenceQueryContext queryContext) {
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/QueryRangeModel.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/QueryRangeModel.java
new file mode 100644
index 0000000..106427f
--- /dev/null
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/QueryRangeModel.java
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.persistence.jdo.integration.persistence.query;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+
+@EqualsAndHashCode
+public final class QueryRangeModel {
+
+    // -- FACTORY
+    
+    public static QueryRangeModel of(long... range) {
+        return new QueryRangeModel(range);
+    }
+    
+    /**
+     * The start index into the set table
+     */
+    @Getter private final long start;
+    
+    /**
+     * The number of items to return, starting at {@link #getStart()}
+     */
+    @Getter private final long count;
+
+    private QueryRangeModel(
+            final long[] range) {
+        this.start = range.length > 0 ? range[0]:0;
+        this.count = range.length > 1 ? range[1]:0;
+    }
+
+    public long getEnd() {
+        // we default to Integer.MAX_VALUE because HSQLDB blows up
+        // (with a ClassCastException from Long to Integer)
+        // if we return Long.MAX_VALUE
+        return getCount() != 0
+                ? getStart() + getCount()
+                : Integer.MAX_VALUE;
+    }
+
+    public boolean hasRange() {
+        return getStart() != 0 
+                || getCount() != 0;
+    }
+    
+}
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/_PersistenceQueryAbstract.java
similarity index 54%
copy from persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java
copy to persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/_PersistenceQueryAbstract.java
index b8b300e..f8eaffa 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQuery.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/_PersistenceQueryAbstract.java
@@ -19,33 +19,20 @@
 
 package org.apache.isis.persistence.jdo.integration.persistence.query;
 
-import org.apache.isis.applib.query.Query;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.persistence.jdo.integration.persistence.queries.PersistenceQueryContext;
 
-/**
- * Defines a criteria for including instances in set, corresponds to
- * {@link Query} in the applib.
- */
-public interface PersistenceQuery {
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor 
+@Getter @EqualsAndHashCode
+abstract class _PersistenceQueryAbstract implements PersistenceQuery {
 
-    /**
-     * The type of instances in the resulting set.
-     */
-    ObjectSpecification getSpecification();
+    // -- constructor, fields
 
-    /**
-     * The index of the first record to return, 0 means the first.
-     * @return
-     */
-    public long getStart() ;
-    /**
-     * The number of records to return, 0 means all.
-     * @return
-     */
-    public long getCount() ;
+    protected final @NonNull ObjectSpecification specification;
+    protected final @NonNull QueryRangeModel queryRangeModel;
 
-    Can<ManagedObject> execute(PersistenceQueryContext queryContext);
 }