Skip to content

Commit

Permalink
Fix getCount for queries with subqueries
Browse files Browse the repository at this point in the history
The `getCount` methods were refactored to not modify the original `Query` object in stevespringett#552. Neither JDO nor DataNucleus offer a mechanism to copy a `Query` object 1:1, hence a new object was created instead.

This however broke `getCount` for queries that make use of subqueries (and potentially other advanced features).

This change reverts it back to temporarily modify the query object again.

Signed-off-by: nscuro <[email protected]>
  • Loading branch information
nscuro committed May 7, 2024
1 parent f21baef commit 15ad672
Showing 1 changed file with 20 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import alpine.common.validation.RegexSequence;
import alpine.resources.AlpineRequest;
import io.jsonwebtoken.lang.Collections;
import org.apache.commons.collections4.CollectionUtils;
import org.datanucleus.api.jdo.JDOQuery;

Expand Down Expand Up @@ -257,11 +256,16 @@ public <T> Query<T> decorate(final Query<T> query) {
*/
public long getCount(final Query<?> query, final Object... parameters) {
final org.datanucleus.store.query.Query<?> internalQuery = ((JDOQuery<?>) query).getInternalQuery();
final Query<?> countQuery = pm.newQuery(internalQuery.getCandidateClass());
countQuery.setFilter(internalQuery.getFilter());
countQuery.setParameters(parameters);
countQuery.setResult("count(this)");
return executeAndCloseResultUnique(countQuery, Long.class);
final String originalOrdering = internalQuery.getOrdering();
query.setOrdering(null);
query.setResult("count(this)");
try {
// NB: Don't close the query as it is to be reused.
return (Long) query.executeWithArray(parameters);
} finally {
query.setOrdering(originalOrdering);
query.setResult(null);
}
}

/**
Expand All @@ -275,11 +279,16 @@ public long getCount(final Query<?> query, final Object... parameters) {
*/
public long getCount(final Query<?> query, final Map<String, Object> parameters) {
final org.datanucleus.store.query.Query<?> internalQuery = ((JDOQuery<?>) query).getInternalQuery();
final Query<?> countQuery = pm.newQuery(internalQuery.getCandidateClass());
countQuery.setFilter(internalQuery.getFilter());
countQuery.setNamedParameters(parameters);
countQuery.setResult("count(this)");
return executeAndCloseResultUnique(countQuery, Long.class);
final String originalOrdering = internalQuery.getOrdering();
query.setOrdering(null);
query.setResult("count(this)");
try {
// NB: Don't close the query as it is to be reused.
return (Long) query.executeWithMap(parameters);
} finally {
query.setOrdering(originalOrdering);
query.setResult(null);
}
}

/**
Expand Down

0 comments on commit 15ad672

Please sign in to comment.