Change QueryBuilder.find() and callers to be static
The only thing gained by this method being non-static was access to the instance's type parameter. In most cases this was not even providing any additional safety, e.g. the ChangeQueryBuilder methods already specify Predicate<ChangeData> in their signature so the type can get picked up from there. This was problematic for callers that might not have access to a ChangeQueryBuilder instance, since that requires a CurrentUser. Change-Id: I6b930e9aa4cce66203c7a2352b82bfd0b1cc26cd
This commit is contained in:
@@ -109,6 +109,56 @@ public abstract class QueryBuilder<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locate a predicate in the predicate tree.
|
||||||
|
*
|
||||||
|
* @param p the predicate to find.
|
||||||
|
* @param clazz type of the predicate instance.
|
||||||
|
* @return the predicate, null if not found.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T, P extends Predicate<T>> P find(Predicate<T> p, Class<P> clazz) {
|
||||||
|
if (clazz.isAssignableFrom(p.getClass())) {
|
||||||
|
return (P) p;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Predicate<T> c : p.getChildren()) {
|
||||||
|
P r = find(c, clazz);
|
||||||
|
if (r != null) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locate a predicate in the predicate tree.
|
||||||
|
*
|
||||||
|
* @param p the predicate to find.
|
||||||
|
* @param clazz type of the predicate instance.
|
||||||
|
* @param name name of the operator.
|
||||||
|
* @return the predicate, null if not found.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T, P extends OperatorPredicate<T>> P find(Predicate<T> p,
|
||||||
|
Class<P> clazz, String name) {
|
||||||
|
if (p instanceof OperatorPredicate
|
||||||
|
&& ((OperatorPredicate<?>) p).getOperator().equals(name)
|
||||||
|
&& clazz.isAssignableFrom(p.getClass())) {
|
||||||
|
return (P) p;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Predicate<T> c : p.getChildren()) {
|
||||||
|
P r = find(c, clazz, name);
|
||||||
|
if (r != null) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
private final Map<String, OperatorFactory> opFactories;
|
private final Map<String, OperatorFactory> opFactories;
|
||||||
|
|
||||||
@@ -238,56 +288,6 @@ public abstract class QueryBuilder<T> {
|
|||||||
throw error("Unsupported query:" + value);
|
throw error("Unsupported query:" + value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Locate a predicate in the predicate tree.
|
|
||||||
*
|
|
||||||
* @param p the predicate to find.
|
|
||||||
* @param clazz type of the predicate instance.
|
|
||||||
* @return the predicate, null if not found.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <P extends Predicate<T>> P find(Predicate<T> p, Class<P> clazz) {
|
|
||||||
if (clazz.isAssignableFrom(p.getClass())) {
|
|
||||||
return (P) p;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Predicate<T> c : p.getChildren()) {
|
|
||||||
P r = find(c, clazz);
|
|
||||||
if (r != null) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Locate a predicate in the predicate tree.
|
|
||||||
*
|
|
||||||
* @param p the predicate to find.
|
|
||||||
* @param clazz type of the predicate instance.
|
|
||||||
* @param name name of the operator.
|
|
||||||
* @return the predicate, null if not found.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <P extends OperatorPredicate<T>> P find(Predicate<T> p,
|
|
||||||
Class<P> clazz, String name) {
|
|
||||||
if (p instanceof OperatorPredicate
|
|
||||||
&& ((OperatorPredicate<?>) p).getOperator().equals(name)
|
|
||||||
&& clazz.isAssignableFrom(p.getClass())) {
|
|
||||||
return (P) p;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Predicate<T> c : p.getChildren()) {
|
|
||||||
P r = find(c, clazz, name);
|
|
||||||
if (r != null) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Predicate<T>[] children(final Tree r) throws QueryParseException,
|
private Predicate<T>[] children(final Tree r) throws QueryParseException,
|
||||||
IllegalArgumentException {
|
IllegalArgumentException {
|
||||||
|
|||||||
@@ -111,6 +111,21 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
|
|||||||
new QueryBuilder.Definition<ChangeData, ChangeQueryBuilder>(
|
new QueryBuilder.Definition<ChangeData, ChangeQueryBuilder>(
|
||||||
ChangeQueryBuilder.class);
|
ChangeQueryBuilder.class);
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static boolean hasLimit(Predicate<ChangeData> p) {
|
||||||
|
return find(p, IntPredicate.class, FIELD_LIMIT) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static int getLimit(Predicate<ChangeData> p) {
|
||||||
|
return ((IntPredicate<?>) find(p, IntPredicate.class, FIELD_LIMIT)).intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasSortKey(Predicate<ChangeData> p) {
|
||||||
|
return find(p, SortKeyPredicate.class, "sortkey_after") != null
|
||||||
|
|| find(p, SortKeyPredicate.class, "sortkey_before") != null;
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public static class Arguments {
|
public static class Arguments {
|
||||||
final Provider<ReviewDb> dbProvider;
|
final Provider<ReviewDb> dbProvider;
|
||||||
@@ -569,21 +584,6 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
|
|||||||
return sortkey_before(sortKey);
|
return sortkey_before(sortKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public boolean hasLimit(Predicate<ChangeData> p) {
|
|
||||||
return find(p, IntPredicate.class, FIELD_LIMIT) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public int getLimit(Predicate<ChangeData> p) {
|
|
||||||
return ((IntPredicate<?>) find(p, IntPredicate.class, FIELD_LIMIT)).intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasSortKey(Predicate<ChangeData> p) {
|
|
||||||
return find(p, SortKeyPredicate.class, "sortkey_after") != null
|
|
||||||
|| find(p, SortKeyPredicate.class, "sortkey_before") != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
protected Predicate<ChangeData> defaultField(String query)
|
protected Predicate<ChangeData> defaultField(String query)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.google.gerrit.server.CurrentUser;
|
|||||||
import com.google.gerrit.server.IdentifiedUser;
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
import com.google.gerrit.server.query.AndPredicate;
|
import com.google.gerrit.server.query.AndPredicate;
|
||||||
import com.google.gerrit.server.query.Predicate;
|
import com.google.gerrit.server.query.Predicate;
|
||||||
|
import com.google.gerrit.server.query.QueryBuilder;
|
||||||
import com.google.gerrit.server.query.QueryParseException;
|
import com.google.gerrit.server.query.QueryParseException;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -53,7 +54,7 @@ class IsWatchedByPredicate extends AndPredicate<ChangeData> {
|
|||||||
if (w.getFilter() != null) {
|
if (w.getFilter() != null) {
|
||||||
try {
|
try {
|
||||||
f = builder.parse(w.getFilter());
|
f = builder.parse(w.getFilter());
|
||||||
if (builder.find(f, IsWatchedByPredicate.class) != null) {
|
if (QueryBuilder.find(f, IsWatchedByPredicate.class) != null) {
|
||||||
// If the query is going to infinite loop, assume it
|
// If the query is going to infinite loop, assume it
|
||||||
// will never match and return null. Yes this test
|
// will never match and return null. Yes this test
|
||||||
// prevents you from having a filter that matches what
|
// prevents you from having a filter that matches what
|
||||||
|
|||||||
@@ -371,7 +371,9 @@ public class QueryProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int limit(Predicate<ChangeData> s) {
|
private int limit(Predicate<ChangeData> s) {
|
||||||
int n = queryBuilder.hasLimit(s) ? queryBuilder.getLimit(s) : maxLimit;
|
int n = ChangeQueryBuilder.hasLimit(s)
|
||||||
|
? ChangeQueryBuilder.getLimit(s)
|
||||||
|
: maxLimit;
|
||||||
return limit > 0 ? Math.min(n, limit) + 1 : n + 1;
|
return limit > 0 ? Math.min(n, limit) + 1 : n + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,7 +382,7 @@ public class QueryProcessor {
|
|||||||
final Predicate<ChangeData> visibleToMe) throws QueryParseException {
|
final Predicate<ChangeData> visibleToMe) throws QueryParseException {
|
||||||
|
|
||||||
Predicate<ChangeData> q = queryBuilder.parse(queryString);
|
Predicate<ChangeData> q = queryBuilder.parse(queryString);
|
||||||
if (!queryBuilder.hasSortKey(q)) {
|
if (!ChangeQueryBuilder.hasSortKey(q)) {
|
||||||
if (sortkeyBefore != null) {
|
if (sortkeyBefore != null) {
|
||||||
q = Predicate.and(q, queryBuilder.sortkey_before(sortkeyBefore));
|
q = Predicate.and(q, queryBuilder.sortkey_before(sortkeyBefore));
|
||||||
} else if (sortkeyAfter != null) {
|
} else if (sortkeyAfter != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user