From 6ef53023df21c44e86c0c015c79ee1ed475b8343 Mon Sep 17 00:00:00 2001 From: Nasser Grainawi Date: Tue, 25 Jun 2013 15:06:44 -0600 Subject: [PATCH] Use Lucene to index and search on commit-id Use a PrefixQuery to match partial or full commit-ids. Change-Id: I0a82873c3b802a5abbd96467dff44007609248ba --- .../gerrit/lucene/LuceneChangeIndex.java | 10 +++++++++- .../gerrit/server/index/ChangeField.java | 18 +++++++++++++++++- .../google/gerrit/server/index/FieldType.java | 4 ++++ .../server/query/change/CommitPredicate.java | 13 ++++++++----- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java index 1abb8a6c48..7304e189a0 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java @@ -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 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)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java index 5c167bb57f..8180b3bb66 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java @@ -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 CHANGE_ID = @@ -136,6 +137,21 @@ public class ChangeField { } }; + /** Commit id of any PatchSet on the change */ + public static final FieldDef> COMMIT = + new FieldDef.Repeatable( + ChangeQueryBuilder.FIELD_COMMIT, FieldType.PREFIX, false) { + @Override + public Iterable get(ChangeData input, FillArgs args) + throws OrmException { + Set revisions = Sets.newHashSet(); + for (PatchSet ps : input.patches(args.db)) { + revisions.add(ps.getRevision().get()); + } + return revisions; + } + }; + public static final ImmutableMap> ALL; static { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java index 0d57fdea84..ecc960b590 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java @@ -31,6 +31,10 @@ public class FieldType { public static final FieldType EXACT = new FieldType("EXACT"); + /** A string field searched using prefix. */ + public static final FieldType PREFIX = + new FieldType("PREFIX"); + private final String name; private FieldType(String name) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java index 274b40c605..082dc83877 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java @@ -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 implements +class CommitPredicate extends IndexPredicate implements ChangeDataSource { private final Provider dbProvider; + private final AbbreviatedObjectId abbrevId; CommitPredicate(Provider 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 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 implements @Override public ResultSet 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));