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 <[email protected]>
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];
- }
}