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 43434a94e CAY-2814 Select query iterator() and batchIterator() methods return incorrect results - cleanup code for QueryResponse 43434a94e is described below commit 43434a94e8ea076641955c6b46172e50bb2b3fd9 Author: stariy95 <stari...@gmail.com> AuthorDate: Tue Nov 7 13:40:05 2023 +0400 CAY-2814 Select query iterator() and batchIterator() methods return incorrect results - cleanup code for QueryResponse --- .../cayenne/commitlog/DeletedDiffProcessor.java | 2 +- .../java/org/apache/cayenne/QueryResponse.java | 34 +++++++---- .../org/apache/cayenne/util/GenericResponse.java | 68 ++++++++++++++-------- .../apache/cayenne/util/IteratedQueryResponse.java | 35 ++--------- .../java/org/apache/cayenne/util/ListResponse.java | 29 ++------- 5 files changed, 79 insertions(+), 89 deletions(-) diff --git a/cayenne-commitlog/src/main/java/org/apache/cayenne/commitlog/DeletedDiffProcessor.java b/cayenne-commitlog/src/main/java/org/apache/cayenne/commitlog/DeletedDiffProcessor.java index deafacf86..e55d21c31 100644 --- a/cayenne-commitlog/src/main/java/org/apache/cayenne/commitlog/DeletedDiffProcessor.java +++ b/cayenne-commitlog/src/main/java/org/apache/cayenne/commitlog/DeletedDiffProcessor.java @@ -62,7 +62,7 @@ class DeletedDiffProcessor implements GraphChangeHandler { QueryResponse result = channel.onQuery(null, query); @SuppressWarnings("unchecked") - List<DataRow> rows = result.firstList(); + List<DataRow> rows = (List<DataRow>)result.firstList(); if (rows.isEmpty()) { LOGGER.warn("No DB snapshot for object to be deleted, no changes will be recorded. ID: " + id); diff --git a/cayenne-server/src/main/java/org/apache/cayenne/QueryResponse.java b/cayenne-server/src/main/java/org/apache/cayenne/QueryResponse.java index 4c4c282ee..c8fb01bee 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/QueryResponse.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/QueryResponse.java @@ -66,27 +66,35 @@ public interface QueryResponse { /** * Returns whether current iteration result is a list or an update count. */ - boolean isList(); + default boolean isList() { + return false; + } /** * Returns whether current response is an iterator * * @since 5.0 */ - boolean isIterator(); + default boolean isIterator() { + return false; + } /** * Returns a List under the current iterator position. Use {@link #isList()} to check * the result type before calling this method. */ - List<?> currentList(); + default List<?> currentList() { + return null; + } /** * Returns a current iterator. * * @since 5.0 */ - ResultIterator<?> currentIterator(); + default ResultIterator<?> currentIterator() { + return null; + } /** * Returns an update count under the current iterator position. Returned value is an @@ -94,7 +102,9 @@ public interface QueryResponse { * an int[1]. Use {@link #isList()} to check the result type before calling this * method. */ - int[] currentUpdateCount(); + default int[] currentUpdateCount() { + return null; + } /** * Rewinds response iterator to the next result, returning true if it is available. @@ -111,8 +121,9 @@ public interface QueryResponse { * null if the query has no lists. Note that this method resets current iterator to an * undefined state. */ - @SuppressWarnings("rawtypes") - List firstList(); + default List<?> firstList() { + return null; + } /** * A utility method for quickly retrieving the Iterator in the response. Returns @@ -120,12 +131,15 @@ public interface QueryResponse { * * @since 5.0 */ - @SuppressWarnings("rawtypes") - ResultIterator firstIterator(); + default ResultIterator<?> firstIterator() { + return null; + } /** * A utility method for quickly retrieving the first update count from the response. * Note that this method resets current iterator to an undefined state. */ - int[] firstUpdateCount(); + default int[] firstUpdateCount() { + return null; + } } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/GenericResponse.java b/cayenne-server/src/main/java/org/apache/cayenne/util/GenericResponse.java index 018233357..d1b42c18b 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/util/GenericResponse.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/util/GenericResponse.java @@ -28,12 +28,12 @@ import org.apache.cayenne.ResultIterator; /** * A simple serializable implementation of QueryResponse. - * + * * @since 1.2 */ public class GenericResponse implements QueryResponse, Serializable { - protected List results; + protected List<Object> results; protected transient int currentIndex; @@ -41,37 +41,39 @@ public class GenericResponse implements QueryResponse, Serializable { * Creates an empty BaseResponse. */ public GenericResponse() { - results = new ArrayList(); + results = new ArrayList<>(); } /** * Creates a BaseResponse with a single result list. */ - public GenericResponse(List list) { - results = new ArrayList(1); + public GenericResponse(List<?> list) { + results = new ArrayList<>(1); addResultList(list); } /** * Creates a response that it a shallow copy of another response. */ + @SuppressWarnings("unused") public GenericResponse(QueryResponse response) { - - results = new ArrayList(response.size()); + results = new ArrayList<>(response.size()); response.reset(); while (response.next()) { if (response.isList()) { addResultList(response.currentList()); - } - else { + } else if (response.isIterator()) { + addResultIterator(response.currentIterator()); + } else { addBatchUpdateCount(response.currentUpdateCount()); } } } - public List firstList() { - for (reset(); next();) { + @Override + public List<?> firstList() { + for (reset(); next(); ) { if (isList()) { return currentList(); } @@ -81,12 +83,19 @@ public class GenericResponse implements QueryResponse, Serializable { } @Override - public ResultIterator firstIterator() { + public ResultIterator<?> firstIterator() { + for (reset(); next(); ) { + if (isIterator()) { + return currentIterator(); + } + } + return null; } + @Override public int[] firstUpdateCount() { - for (reset(); next();) { + for (reset(); next(); ) { if (!isList()) { return currentUpdateCount(); } @@ -95,37 +104,43 @@ public class GenericResponse implements QueryResponse, Serializable { return null; } - public List currentList() { - return (List) results.get(currentIndex - 1); + @Override + public List<?> currentList() { + return (List<?>) results.get(currentIndex - 1); } @Override - public ResultIterator currentIterator() { - return null; + public ResultIterator<?> currentIterator() { + return (ResultIterator<?>) results.get(currentIndex - 1); } + @Override public int[] currentUpdateCount() { return (int[]) results.get(currentIndex - 1); } + @Override public boolean isList() { return results.get(currentIndex - 1) instanceof List; } @Override public boolean isIterator() { - return false; + return results.get(currentIndex - 1) instanceof ResultIterator; } + @Override public boolean next() { return ++currentIndex <= results.size(); } + @Override public void reset() { // use a zero-based index, not -1, as this will simplify serialization handling currentIndex = 0; } + @Override public int size() { return results.size(); } @@ -138,20 +153,25 @@ public class GenericResponse implements QueryResponse, Serializable { } public void addBatchUpdateCount(int[] resultCount) { - if (resultCount != null) { results.add(resultCount); } } public void addUpdateCount(int resultCount) { - results.add(new int[] { - resultCount - }); + results.add(new int[]{resultCount}); + } + + public void addResultList(List<?> list) { + results.add(list); } - public void addResultList(List list) { - this.results.add(list); + /** + * @param iterator to add as a result + * @since 5.0 + */ + public void addResultIterator(ResultIterator<?> iterator) { + results.add(iterator); } /** diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/IteratedQueryResponse.java b/cayenne-server/src/main/java/org/apache/cayenne/util/IteratedQueryResponse.java index 961af918e..72e9913b2 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/util/IteratedQueryResponse.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/util/IteratedQueryResponse.java @@ -21,20 +21,19 @@ package org.apache.cayenne.util; import org.apache.cayenne.ResultIterator; -import java.util.List; - /** * Implementation of QueryResponse for iterated query. * * @since 5.0 */ public class IteratedQueryResponse extends GenericResponse { - private ResultIterator iterator; - public IteratedQueryResponse(ResultIterator iterator) { + private ResultIterator<?> iterator; + + public IteratedQueryResponse(ResultIterator<?> iterator) { this.iterator = iterator; } - public void setIterator(ResultIterator iterator) { + public void setIterator(ResultIterator<?> iterator) { this.iterator = iterator; } @@ -43,48 +42,24 @@ public class IteratedQueryResponse extends GenericResponse { return -1; } - @Override - public boolean isList() { - return false; - } - @Override public boolean isIterator() { return true; } @Override - public List<?> currentList() { - return null; - } - - @Override - public ResultIterator currentIterator() { + public ResultIterator<?> currentIterator() { return iterator; } - @Override - public int[] currentUpdateCount() { - return new int[0]; - } - @Override public boolean next() { return false; } - @Override - public List firstList() { - return null; - } - @Override public ResultIterator<?> firstIterator() { return iterator; } - @Override - public int[] firstUpdateCount() { - return new int[0]; - } } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/ListResponse.java b/cayenne-server/src/main/java/org/apache/cayenne/util/ListResponse.java index 30f878375..13f2f7ad9 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/util/ListResponse.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/util/ListResponse.java @@ -25,7 +25,6 @@ import java.util.Collections; import java.util.List; import org.apache.cayenne.QueryResponse; -import org.apache.cayenne.ResultIterator; /** * A QueryResponse optimized to hold a single object or data row list. @@ -34,7 +33,7 @@ import org.apache.cayenne.ResultIterator; */ public class ListResponse implements QueryResponse, Serializable { - protected List objectList; + protected List<?> objectList; protected transient int currentIndex; @@ -42,14 +41,14 @@ public class ListResponse implements QueryResponse, Serializable { * Creates an empty response. */ public ListResponse() { - this.objectList = new ArrayList(1); + this.objectList = new ArrayList<>(1); } public ListResponse(Object object) { this.objectList = Collections.singletonList(object); } - public ListResponse(List objectList) { + public ListResponse(List<?> objectList) { this.objectList = objectList; } @@ -65,12 +64,7 @@ public class ListResponse implements QueryResponse, Serializable { return true; } - @Override - public boolean isIterator() { - return false; - } - - public List currentList() { + public List<?> currentList() { if (currentIndex != 1) { throw new IndexOutOfBoundsException("Past iteration end: " + currentIndex); } @@ -78,11 +72,6 @@ public class ListResponse implements QueryResponse, Serializable { return objectList; } - @Override - public ResultIterator<?> currentIterator() { - return null; - } - public int[] currentUpdateCount() { throw new IllegalStateException("Current object is not an update count"); } @@ -96,16 +85,8 @@ public class ListResponse implements QueryResponse, Serializable { currentIndex = 0; } - public List firstList() { + public List<?> firstList() { return objectList; } - @Override - public ResultIterator firstIterator() { - return null; - } - - public int[] firstUpdateCount() { - return new int[0]; - } }