Use Lucene to index and search on commit-id
Use a PrefixQuery to match partial or full commit-ids. Change-Id: I0a82873c3b802a5abbd96467dff44007609248ba
This commit is contained in:
@@ -61,6 +61,7 @@ import org.apache.lucene.search.BooleanClause;
|
|||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
import org.apache.lucene.search.IndexSearcher;
|
import org.apache.lucene.search.IndexSearcher;
|
||||||
import org.apache.lucene.search.NumericRangeQuery;
|
import org.apache.lucene.search.NumericRangeQuery;
|
||||||
|
import org.apache.lucene.search.PrefixQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.RegexpQuery;
|
import org.apache.lucene.search.RegexpQuery;
|
||||||
import org.apache.lucene.search.ScoreDoc;
|
import org.apache.lucene.search.ScoreDoc;
|
||||||
@@ -258,6 +259,8 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener {
|
|||||||
return timestampQuery(p);
|
return timestampQuery(p);
|
||||||
} else if (p.getType() == FieldType.EXACT) {
|
} else if (p.getType() == FieldType.EXACT) {
|
||||||
return exactQuery(p);
|
return exactQuery(p);
|
||||||
|
} else if (p.getType() == FieldType.PREFIX) {
|
||||||
|
return prefixQuery(p);
|
||||||
} else {
|
} else {
|
||||||
throw badFieldType(p.getType());
|
throw badFieldType(p.getType());
|
||||||
}
|
}
|
||||||
@@ -328,6 +331,10 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener {
|
|||||||
return new RegexpQuery(new Term(p.getOperator(), re));
|
return new RegexpQuery(new Term(p.getOperator(), re));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Query prefixQuery(IndexPredicate<ChangeData> p) {
|
||||||
|
return new PrefixQuery(new Term(p.getOperator(), p.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
private class QuerySource implements ChangeDataSource {
|
private class QuerySource implements ChangeDataSource {
|
||||||
// TODO(dborowitz): Push limit down from predicate tree.
|
// TODO(dborowitz): Push limit down from predicate tree.
|
||||||
private static final int LIMIT = 1000;
|
private static final int LIMIT = 1000;
|
||||||
@@ -439,7 +446,8 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener {
|
|||||||
for (Object v : values) {
|
for (Object v : values) {
|
||||||
doc.add(new IntField(name, toIndexTime((Timestamp) v), store));
|
doc.add(new IntField(name, toIndexTime((Timestamp) v), store));
|
||||||
}
|
}
|
||||||
} else if (f.getType() == FieldType.EXACT) {
|
} else if (f.getType() == FieldType.EXACT
|
||||||
|
|| f.getType() == FieldType.PREFIX) {
|
||||||
for (Object value : values) {
|
for (Object value : values) {
|
||||||
doc.add(new StringField(name, (String) value, store));
|
doc.add(new StringField(name, (String) value, store));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableMap;
|
|||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
||||||
|
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||||
import com.google.gerrit.server.query.change.ChangeData;
|
import com.google.gerrit.server.query.change.ChangeData;
|
||||||
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
|
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
|
||||||
import com.google.gerrit.server.query.change.ChangeStatusPredicate;
|
import com.google.gerrit.server.query.change.ChangeStatusPredicate;
|
||||||
@@ -42,7 +43,7 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
public class ChangeField {
|
public class ChangeField {
|
||||||
/** Increment whenever making schema changes. */
|
/** Increment whenever making schema changes. */
|
||||||
public static final int SCHEMA_VERSION = 4;
|
public static final int SCHEMA_VERSION = 5;
|
||||||
|
|
||||||
/** Legacy change ID. */
|
/** Legacy change ID. */
|
||||||
public static final FieldDef<ChangeData, Integer> CHANGE_ID =
|
public static final FieldDef<ChangeData, Integer> CHANGE_ID =
|
||||||
@@ -136,6 +137,21 @@ public class ChangeField {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Commit id of any PatchSet on the change */
|
||||||
|
public static final FieldDef<ChangeData, Iterable<String>> COMMIT =
|
||||||
|
new FieldDef.Repeatable<ChangeData, String>(
|
||||||
|
ChangeQueryBuilder.FIELD_COMMIT, FieldType.PREFIX, false) {
|
||||||
|
@Override
|
||||||
|
public Iterable<String> get(ChangeData input, FillArgs args)
|
||||||
|
throws OrmException {
|
||||||
|
Set<String> revisions = Sets.newHashSet();
|
||||||
|
for (PatchSet ps : input.patches(args.db)) {
|
||||||
|
revisions.add(ps.getRevision().get());
|
||||||
|
}
|
||||||
|
return revisions;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public static final ImmutableMap<String, FieldDef<ChangeData, ?>> ALL;
|
public static final ImmutableMap<String, FieldDef<ChangeData, ?>> ALL;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ public class FieldType<T> {
|
|||||||
public static final FieldType<String> EXACT =
|
public static final FieldType<String> EXACT =
|
||||||
new FieldType<String>("EXACT");
|
new FieldType<String>("EXACT");
|
||||||
|
|
||||||
|
/** A string field searched using prefix. */
|
||||||
|
public static final FieldType<String> PREFIX =
|
||||||
|
new FieldType<String>("PREFIX");
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
private FieldType(String name) {
|
private FieldType(String name) {
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ package com.google.gerrit.server.query.change;
|
|||||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||||
import com.google.gerrit.reviewdb.client.RevId;
|
import com.google.gerrit.reviewdb.client.RevId;
|
||||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
import com.google.gerrit.server.query.ObjectIdPredicate;
|
import com.google.gerrit.server.index.ChangeField;
|
||||||
|
import com.google.gerrit.server.index.IndexPredicate;
|
||||||
import com.google.gwtorm.server.OrmException;
|
import com.google.gwtorm.server.OrmException;
|
||||||
import com.google.gwtorm.server.ResultSet;
|
import com.google.gwtorm.server.ResultSet;
|
||||||
import com.google.inject.Provider;
|
import com.google.inject.Provider;
|
||||||
@@ -25,13 +26,15 @@ import com.google.inject.Provider;
|
|||||||
import org.eclipse.jgit.lib.AbbreviatedObjectId;
|
import org.eclipse.jgit.lib.AbbreviatedObjectId;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
|
|
||||||
class CommitPredicate extends ObjectIdPredicate<ChangeData> implements
|
class CommitPredicate extends IndexPredicate<ChangeData> implements
|
||||||
ChangeDataSource {
|
ChangeDataSource {
|
||||||
private final Provider<ReviewDb> dbProvider;
|
private final Provider<ReviewDb> dbProvider;
|
||||||
|
private final AbbreviatedObjectId abbrevId;
|
||||||
|
|
||||||
CommitPredicate(Provider<ReviewDb> dbProvider, AbbreviatedObjectId id) {
|
CommitPredicate(Provider<ReviewDb> dbProvider, AbbreviatedObjectId id) {
|
||||||
super(ChangeQueryBuilder.FIELD_COMMIT, id);
|
super(ChangeField.COMMIT, id.name());
|
||||||
this.dbProvider = dbProvider;
|
this.dbProvider = dbProvider;
|
||||||
|
this.abbrevId = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -39,7 +42,7 @@ class CommitPredicate extends ObjectIdPredicate<ChangeData> implements
|
|||||||
for (PatchSet p : object.patches(dbProvider)) {
|
for (PatchSet p : object.patches(dbProvider)) {
|
||||||
if (p.getRevision() != null && p.getRevision().get() != null) {
|
if (p.getRevision() != null && p.getRevision().get() != null) {
|
||||||
final ObjectId id = ObjectId.fromString(p.getRevision().get());
|
final ObjectId id = ObjectId.fromString(p.getRevision().get());
|
||||||
if (abbreviated().prefixCompare(id) == 0) {
|
if (abbrevId.prefixCompare(id) == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,7 +52,7 @@ class CommitPredicate extends ObjectIdPredicate<ChangeData> implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultSet<ChangeData> read() throws OrmException {
|
public ResultSet<ChangeData> read() throws OrmException {
|
||||||
final RevId id = new RevId(abbreviated().name());
|
final RevId id = new RevId(abbrevId.name());
|
||||||
if (id.isComplete()) {
|
if (id.isComplete()) {
|
||||||
return ChangeDataResultSet.patchSet(//
|
return ChangeDataResultSet.patchSet(//
|
||||||
dbProvider.get().patchSets().byRevision(id));
|
dbProvider.get().patchSets().byRevision(id));
|
||||||
|
|||||||
Reference in New Issue
Block a user