summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/query
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/query')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/query/RewritePredicate.java18
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java35
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryRewriter.java43
3 files changed, 82 insertions, 14 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/RewritePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/RewritePredicate.java
index c0a00ca991..35fbc1c203 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/RewritePredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/RewritePredicate.java
@@ -20,10 +20,12 @@ import java.util.Collections;
import java.util.List;
public abstract class RewritePredicate<T> extends Predicate<T> {
- private String name = getClass().getName();
+ private boolean init;
+ private String name = getClass().getSimpleName();
private List<Predicate<T>> children = Collections.emptyList();
- void init(String name, Predicate<T>[] args) {
+ protected void init(String name, Predicate<T>... args) {
+ this.init = true;
this.name = name;
this.children = Arrays.asList(args);
}
@@ -33,10 +35,18 @@ public abstract class RewritePredicate<T> extends Predicate<T> {
return this;
}
+ @SuppressWarnings("unchecked")
@Override
public boolean equals(Object other) {
- return getClass() == other.getClass()
- && children.equals(((RewritePredicate) other).children);
+ if (other instanceof RewritePredicate) {
+ RewritePredicate that = (RewritePredicate<T>) other;
+ if (this.init && that.init) {
+ return this.getClass() == that.getClass()
+ && this.name.equals(that.name)
+ && this.children.equals(that.children);
+ }
+ }
+ return this == other;
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index 828a12658f..eccb2e8239 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -40,8 +40,11 @@ import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import java.util.regex.Pattern;
/**
@@ -346,21 +349,37 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> owner(String who) throws QueryParseException,
OrmException {
- Account account = args.accountResolver.find(who);
- if (account == null) {
+ Set<Account.Id> m = args.accountResolver.findAll(who);
+ if (m.isEmpty()) {
throw error("User " + who + " not found");
+ } else if (m.size() == 1) {
+ Account.Id id = m.iterator().next();
+ return new OwnerPredicate(args.dbProvider, id);
+ } else {
+ List<OwnerPredicate> p = new ArrayList<OwnerPredicate>(m.size());
+ for (Account.Id id : m) {
+ p.add(new OwnerPredicate(args.dbProvider, id));
+ }
+ return Predicate.or(p);
}
- return new OwnerPredicate(args.dbProvider, account.getId());
}
@Operator
- public Predicate<ChangeData> reviewer(String nameOrEmail)
+ public Predicate<ChangeData> reviewer(String who)
throws QueryParseException, OrmException {
- Account account = args.accountResolver.find(nameOrEmail);
- if (account == null) {
- throw error("Reviewer " + nameOrEmail + " not found");
+ Set<Account.Id> m = args.accountResolver.findAll(who);
+ if (m.isEmpty()) {
+ throw error("User " + who + " not found");
+ } else if (m.size() == 1) {
+ Account.Id id = m.iterator().next();
+ return new ReviewerPredicate(args.dbProvider, id);
+ } else {
+ List<ReviewerPredicate> p = new ArrayList<ReviewerPredicate>(m.size());
+ for (Account.Id id : m) {
+ p.add(new ReviewerPredicate(args.dbProvider, id));
+ }
+ return Predicate.or(p);
}
- return new ReviewerPredicate(args.dbProvider, account.getId());
}
@Operator
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryRewriter.java
index 98b12f75d7..904bc3cb70 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryRewriter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryRewriter.java
@@ -38,8 +38,7 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
new ChangeQueryBuilder.Arguments( //
new InvalidProvider<ReviewDb>(), //
new InvalidProvider<ChangeQueryRewriter>(), //
- null, null, null, null, null, null, null, null, null),
- null));
+ null, null, null, null, null, null, null, null, null), null));
private final Provider<ReviewDb> dbProvider;
@@ -287,11 +286,16 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
};
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:merged S=(sortkey_after:*) L=(limit:*)")
public Predicate<ChangeData> r20_byMergedPrev(
@Named("S") final SortKeyPredicate.After s,
@Named("L") final IntPredicate<ChangeData> l) {
return new PaginatedSource(50000, s.getValue(), l.intValue()) {
+ {
+ init("r20_byMergedPrev", s, l);
+ }
+
@Override
ResultSet<Change> scan(ChangeAccess a, String key, int limit)
throws OrmException {
@@ -306,11 +310,16 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
};
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:merged S=(sortkey_before:*) L=(limit:*)")
public Predicate<ChangeData> r20_byMergedNext(
@Named("S") final SortKeyPredicate.Before s,
@Named("L") final IntPredicate<ChangeData> l) {
return new PaginatedSource(50000, s.getValue(), l.intValue()) {
+ {
+ init("r20_byMergedNext", s, l);
+ }
+
@Override
ResultSet<Change> scan(ChangeAccess a, String key, int limit)
throws OrmException {
@@ -325,11 +334,16 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
};
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:abandoned S=(sortkey_after:*) L=(limit:*)")
public Predicate<ChangeData> r20_byAbandonedPrev(
@Named("S") final SortKeyPredicate.After s,
@Named("L") final IntPredicate<ChangeData> l) {
return new PaginatedSource(50000, s.getValue(), l.intValue()) {
+ {
+ init("r20_byAbandonedPrev", s, l);
+ }
+
@Override
ResultSet<Change> scan(ChangeAccess a, String key, int limit)
throws OrmException {
@@ -344,11 +358,16 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
};
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:abandoned S=(sortkey_before:*) L=(limit:*)")
public Predicate<ChangeData> r20_byAbandonedNext(
@Named("S") final SortKeyPredicate.Before s,
@Named("L") final IntPredicate<ChangeData> l) {
return new PaginatedSource(50000, s.getValue(), l.intValue()) {
+ {
+ init("r20_byAbandonedNext", s, l);
+ }
+
@Override
ResultSet<Change> scan(ChangeAccess a, String key, int limit)
throws OrmException {
@@ -379,10 +398,15 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
return or(r20_byMergedNext(s, l), r20_byAbandonedNext(s, l));
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:open O=(owner:*)")
public Predicate<ChangeData> r25_byOwnerOpen(
@Named("O") final OwnerPredicate o) {
return new ChangeSource(50) {
+ {
+ init("r25_byOwnerOpen", o);
+ }
+
@Override
ResultSet<Change> scan(ChangeAccess a) throws OrmException {
return a.byOwnerOpen(o.getAccountId());
@@ -395,10 +419,15 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
};
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:closed O=(owner:*)")
public Predicate<ChangeData> r25_byOwnerClosed(
@Named("O") final OwnerPredicate o) {
return new ChangeSource(5000) {
+ {
+ init("r25_byOwnerClosed", o);
+ }
+
@Override
ResultSet<Change> scan(ChangeAccess a) throws OrmException {
return a.byOwnerClosedAll(o.getAccountId());
@@ -417,10 +446,15 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
return or(r25_byOwnerOpen(o), r25_byOwnerClosed(o));
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:open R=(reviewer:*)")
public Predicate<ChangeData> r30_byReviewerOpen(
@Named("R") final ReviewerPredicate r) {
return new Source() {
+ {
+ init("r30_byReviewerOpen", r);
+ }
+
@Override
public ResultSet<ChangeData> read() throws OrmException {
return ChangeDataResultSet.patchSetApproval(dbProvider.get()
@@ -445,10 +479,15 @@ public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
};
}
+ @SuppressWarnings("unchecked")
@Rewrite("status:closed R=(reviewer:*)")
public Predicate<ChangeData> r30_byReviewerClosed(
@Named("R") final ReviewerPredicate r) {
return new Source() {
+ {
+ init("r30_byReviewerClosed", r);
+ }
+
@Override
public ResultSet<ChangeData> read() throws OrmException {
return ChangeDataResultSet.patchSetApproval(dbProvider.get()