diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/query')
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() |