Return last N results by sortkey when using sortkey_after

In the SQL index implementation, sortkey_after queries are always
rewritten to use one of the ChangeAccess.*Prev() methods, which order
results by sort key ascending. Update the Lucene implementations to
match this sort order. Specify in the ChangeIndex javadoc that this
sort order is required in such cases, since other code in
QueryProcessor depends on this assumption.

Change-Id: Ie35d2c6bd07963db6d33145a83493d12c6a4289d
This commit is contained in:
Dave Borowitz
2013-09-23 15:57:43 -07:00
parent 2dd0fc86a5
commit 8830bb53a4
4 changed files with 32 additions and 10 deletions

View File

@@ -42,6 +42,7 @@ import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.ChangeDataSource;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.assistedinject.Assisted;
@@ -249,7 +250,8 @@ public class LuceneChangeIndex implements ChangeIndex {
if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
indexes.add(closedIndex);
}
return new QuerySource(indexes, QueryBuilder.toQuery(p), limit);
return new QuerySource(indexes, QueryBuilder.toQuery(p), limit,
ChangeQueryBuilder.hasNonTrivialSortKeyAfter(p));
}
@Override
@@ -270,11 +272,14 @@ public class LuceneChangeIndex implements ChangeIndex {
private final List<SubIndex> indexes;
private final Query query;
private final int limit;
private final boolean reverse;
public QuerySource(List<SubIndex> indexes, Query query, int limit) {
private QuerySource(List<SubIndex> indexes, Query query, int limit,
boolean reverse) {
this.indexes = indexes;
this.query = query;
this.limit = limit;
this.reverse = reverse;
}
@Override
@@ -295,11 +300,14 @@ public class LuceneChangeIndex implements ChangeIndex {
@Override
public ResultSet<ChangeData> read() throws OrmException {
IndexSearcher[] searchers = new IndexSearcher[indexes.size()];
@SuppressWarnings("deprecation")
Sort sort = new Sort(
new SortField(
ChangeField.UPDATED.getName(),
SortField.Type.INT,
true /* descending */));
ChangeField.SORTKEY.getName(),
SortField.Type.LONG,
// Standard order is descending by sort key, unless reversed due
// to a sortkey_before predicate.
!reverse));
try {
TopDocs[] hits = new TopDocs[indexes.size()];
for (int i = 0; i < indexes.size(); i++) {