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.IndexSearcher; | ||||
| import org.apache.lucene.search.NumericRangeQuery; | ||||
| import org.apache.lucene.search.PrefixQuery; | ||||
| import org.apache.lucene.search.Query; | ||||
| import org.apache.lucene.search.RegexpQuery; | ||||
| import org.apache.lucene.search.ScoreDoc; | ||||
| @@ -258,6 +259,8 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener { | ||||
|       return timestampQuery(p); | ||||
|     } else if (p.getType() == FieldType.EXACT) { | ||||
|       return exactQuery(p); | ||||
|     } else if (p.getType() == FieldType.PREFIX) { | ||||
|       return prefixQuery(p); | ||||
|     } else { | ||||
|       throw badFieldType(p.getType()); | ||||
|     } | ||||
| @@ -328,6 +331,10 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener { | ||||
|     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 { | ||||
|     // TODO(dborowitz): Push limit down from predicate tree. | ||||
|     private static final int LIMIT = 1000; | ||||
| @@ -439,7 +446,8 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener { | ||||
|       for (Object v : values) { | ||||
|         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) { | ||||
|         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.Sets; | ||||
| 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.ChangeQueryBuilder; | ||||
| import com.google.gerrit.server.query.change.ChangeStatusPredicate; | ||||
| @@ -42,7 +43,7 @@ import java.util.Set; | ||||
|  */ | ||||
| public class ChangeField { | ||||
|   /** Increment whenever making schema changes. */ | ||||
|   public static final int SCHEMA_VERSION = 4; | ||||
|   public static final int SCHEMA_VERSION = 5; | ||||
|  | ||||
|   /** Legacy 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; | ||||
|  | ||||
|   static { | ||||
|   | ||||
| @@ -31,6 +31,10 @@ public class FieldType<T> { | ||||
|   public static final 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 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.RevId; | ||||
| 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.ResultSet; | ||||
| 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.ObjectId; | ||||
|  | ||||
| class CommitPredicate extends ObjectIdPredicate<ChangeData> implements | ||||
| class CommitPredicate extends IndexPredicate<ChangeData> implements | ||||
|     ChangeDataSource { | ||||
|   private final Provider<ReviewDb> dbProvider; | ||||
|   private final AbbreviatedObjectId abbrevId; | ||||
|  | ||||
|   CommitPredicate(Provider<ReviewDb> dbProvider, AbbreviatedObjectId id) { | ||||
|     super(ChangeQueryBuilder.FIELD_COMMIT, id); | ||||
|     super(ChangeField.COMMIT, id.name()); | ||||
|     this.dbProvider = dbProvider; | ||||
|     this.abbrevId = id; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
| @@ -39,7 +42,7 @@ class CommitPredicate extends ObjectIdPredicate<ChangeData> implements | ||||
|     for (PatchSet p : object.patches(dbProvider)) { | ||||
|       if (p.getRevision() != null && p.getRevision().get() != null) { | ||||
|         final ObjectId id = ObjectId.fromString(p.getRevision().get()); | ||||
|         if (abbreviated().prefixCompare(id) == 0) { | ||||
|         if (abbrevId.prefixCompare(id) == 0) { | ||||
|           return true; | ||||
|         } | ||||
|       } | ||||
| @@ -49,7 +52,7 @@ class CommitPredicate extends ObjectIdPredicate<ChangeData> implements | ||||
|  | ||||
|   @Override | ||||
|   public ResultSet<ChangeData> read() throws OrmException { | ||||
|     final RevId id = new RevId(abbreviated().name()); | ||||
|     final RevId id = new RevId(abbrevId.name()); | ||||
|     if (id.isComplete()) { | ||||
|       return ChangeDataResultSet.patchSet(// | ||||
|           dbProvider.get().patchSets().byRevision(id)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Nasser Grainawi
					Nasser Grainawi