diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java index 857d61d52f..56d26e58cb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java @@ -27,6 +27,7 @@ import com.google.gerrit.common.Nullable; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.index.ChangeField; import com.google.gerrit.server.index.ChangeIndex; import com.google.gerrit.server.index.IndexCollection; import com.google.gerrit.server.index.IndexConfig; @@ -126,27 +127,25 @@ public class InternalChangeQuery { public Iterable byCommitsOnBranchNotMerged(Branch.NameKey branch, List hashes) throws OrmException { - return byCommitsOnBranchNotMerged( - branch, hashes, indexConfig.maxPrefixTerms()); + Schema schema = schema(indexes); + if (schema.hasField(ChangeField.EXACT_COMMIT)) { + return query(commitsOnBranchNotMerged(branch, commits(schema, hashes))); + } else { + return byCommitsOnBranchNotMerged( + schema, branch, hashes, indexConfig.maxPrefixTerms()); + } } @VisibleForTesting - Iterable byCommitsOnBranchNotMerged(Branch.NameKey branch, - List hashes, int batchSize) throws OrmException { - Schema schema = schema(indexes); - List> commits = new ArrayList<>(hashes.size()); - for (String s : hashes) { - commits.add(commit(schema, s)); - } + Iterable byCommitsOnBranchNotMerged(Schema schema, + Branch.NameKey branch, List hashes, int batchSize) + throws OrmException { + List> commits = commits(schema, hashes); int numBatches = (hashes.size() / batchSize) + 1; List> queries = new ArrayList<>(numBatches); for (List> batch : Iterables.partition(commits, batchSize)) { - queries.add(and( - ref(branch), - project(branch.getParentKey()), - not(status(Change.Status.MERGED)), - or(batch))); + queries.add(commitsOnBranchNotMerged(branch, batch)); } try { return FluentIterable.from(qp.queryChanges(queries)) @@ -161,6 +160,24 @@ public class InternalChangeQuery { } } + private static List> commits(Schema schema, + List hashes) { + List> commits = new ArrayList<>(hashes.size()); + for (String s : hashes) { + commits.add(commit(schema, s)); + } + return commits; + } + + private static Predicate commitsOnBranchNotMerged( + Branch.NameKey branch, List> commits) { + return and( + ref(branch), + project(branch.getParentKey()), + not(status(Change.Status.MERGED)), + or(commits)); + } + public List byProjectOpen(Project.NameKey project) throws OrmException { return query(and(project(project), open())); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java index 1b993dfb47..cd10028914 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java @@ -54,6 +54,7 @@ import com.google.gerrit.server.change.ChangeInserter; import com.google.gerrit.server.change.ChangeTriplet; import com.google.gerrit.server.change.PatchSetInserter; import com.google.gerrit.server.change.PatchSetInserter.ValidatePolicy; +import com.google.gerrit.server.index.IndexCollection; import com.google.gerrit.server.notedb.NotesMigration; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ProjectControl; @@ -116,6 +117,7 @@ public abstract class AbstractQueryChangesTest { @Inject protected ChangeControl.GenericFactory changeControlFactory; @Inject protected GerritApi gApi; @Inject protected IdentifiedUser.GenericFactory userFactory; + @Inject protected IndexCollection indexes; @Inject protected InMemoryDatabase schemaFactory; @Inject protected InMemoryRepositoryManager repoManager; @Inject protected InternalChangeQuery internalChangeQuery; @@ -1156,8 +1158,8 @@ public abstract class AbstractQueryChangesTest { } for (int i = 1; i <= 11; i++) { - Iterable cds = - internalChangeQuery.byCommitsOnBranchNotMerged(dest, shas, i); + Iterable cds = internalChangeQuery.byCommitsOnBranchNotMerged( + indexes.getSearchIndex().getSchema(), dest, shas, i); Iterable ids = FluentIterable.from(cds).transform( new Function() { @Override