Add AccountIndexRewriter

The AccountIndexRewriter only translates Predicate<AccountState> to
IndexedAccountQuery.

It is much simpler than the ChangeIndexRewriter because for the
account index there are no subindices and all predicates are served by
the index. If a predicates requires a field that is not contained in
the current index schema we would just fail those queries at the
QueryBuilder.

Change-Id: Ib0e8bcba9b475d861b102a8a7c51fcf13a3418ae
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin
2016-06-21 11:58:06 +02:00
parent bec9ef3a7c
commit c770781892
8 changed files with 91 additions and 20 deletions

View File

@@ -21,8 +21,8 @@ import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE;
import static com.google.gerrit.server.index.change.ChangeField.CHANGE; import static com.google.gerrit.server.index.change.ChangeField.CHANGE;
import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID; import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID;
import static com.google.gerrit.server.index.change.ChangeField.PROJECT; import static com.google.gerrit.server.index.change.ChangeField.PROJECT;
import static com.google.gerrit.server.index.change.IndexRewriter.CLOSED_STATUSES; import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES;
import static com.google.gerrit.server.index.change.IndexRewriter.OPEN_STATUSES; import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
@@ -51,7 +51,7 @@ import com.google.gerrit.server.index.change.ChangeField.ChangeProtoField;
import com.google.gerrit.server.index.change.ChangeField.PatchSetApprovalProtoField; import com.google.gerrit.server.index.change.ChangeField.PatchSetApprovalProtoField;
import com.google.gerrit.server.index.change.ChangeField.PatchSetProtoField; import com.google.gerrit.server.index.change.ChangeField.PatchSetProtoField;
import com.google.gerrit.server.index.change.ChangeIndex; import com.google.gerrit.server.index.change.ChangeIndex;
import com.google.gerrit.server.index.change.IndexRewriter; import com.google.gerrit.server.index.change.ChangeIndexRewriter;
import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeData;
@@ -239,7 +239,7 @@ public class LuceneChangeIndex implements ChangeIndex {
@Override @Override
public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts) public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts)
throws QueryParseException { throws QueryParseException {
Set<Change.Status> statuses = IndexRewriter.getPossibleStatus(p); Set<Change.Status> statuses = ChangeIndexRewriter.getPossibleStatus(p);
List<ChangeSubIndex> indexes = Lists.newArrayListWithCapacity(2); List<ChangeSubIndex> indexes = Lists.newArrayListWithCapacity(2);
if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) { if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) {
indexes.add(openIndex); indexes.add(openIndex);

View File

@@ -28,12 +28,13 @@ import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.WorkQueue; import com.google.gerrit.server.git.WorkQueue;
import com.google.gerrit.server.index.account.AccountIndexCollection; import com.google.gerrit.server.index.account.AccountIndexCollection;
import com.google.gerrit.server.index.account.AccountIndexDefinition; import com.google.gerrit.server.index.account.AccountIndexDefinition;
import com.google.gerrit.server.index.account.AccountIndexRewriter;
import com.google.gerrit.server.index.account.AccountSchemaDefinitions; import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
import com.google.gerrit.server.index.change.ChangeIndexCollection; import com.google.gerrit.server.index.change.ChangeIndexCollection;
import com.google.gerrit.server.index.change.ChangeIndexDefinition; import com.google.gerrit.server.index.change.ChangeIndexDefinition;
import com.google.gerrit.server.index.change.ChangeIndexRewriter;
import com.google.gerrit.server.index.change.ChangeIndexer; import com.google.gerrit.server.index.change.ChangeIndexer;
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions; import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
import com.google.gerrit.server.index.change.IndexRewriter;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Key; import com.google.inject.Key;
import com.google.inject.Provides; import com.google.inject.Provides;
@@ -87,11 +88,11 @@ public class IndexModule extends LifecycleModule {
@Override @Override
protected void configure() { protected void configure() {
bind(IndexRewriter.class); bind(AccountIndexRewriter.class);
bind(AccountIndexCollection.class); bind(AccountIndexCollection.class);
listener().to(AccountIndexCollection.class); listener().to(AccountIndexCollection.class);
bind(ChangeIndexRewriter.class);
bind(ChangeIndexCollection.class); bind(ChangeIndexCollection.class);
listener().to(ChangeIndexCollection.class); listener().to(ChangeIndexCollection.class);
factory(ChangeIndexer.Factory.class); factory(ChangeIndexer.Factory.class);

View File

@@ -0,0 +1,24 @@
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.server.index;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
public interface IndexRewriter<T> {
Predicate<T> rewrite(Predicate<T> in, QueryOptions opts)
throws QueryParseException;
}

View File

@@ -0,0 +1,44 @@
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.server.index.account;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.gerrit.server.account.AccountState;
import com.google.gerrit.server.index.IndexRewriter;
import com.google.gerrit.server.index.QueryOptions;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class AccountIndexRewriter implements IndexRewriter<AccountState> {
private final AccountIndexCollection indexes;
@Inject
AccountIndexRewriter(AccountIndexCollection indexes) {
this.indexes = indexes;
}
@Override
public Predicate<AccountState> rewrite(Predicate<AccountState> in,
QueryOptions opts) throws QueryParseException {
AccountIndex index = indexes.getSearchIndex();
checkNotNull(index, "no active search index configured for accounts");
return new IndexedAccountQuery(index, in, opts);
}
}

View File

@@ -20,6 +20,7 @@ import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Change.Status; import com.google.gerrit.reviewdb.client.Change.Status;
import com.google.gerrit.server.index.IndexConfig; import com.google.gerrit.server.index.IndexConfig;
import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.index.IndexRewriter;
import com.google.gerrit.server.index.QueryOptions; import com.google.gerrit.server.index.QueryOptions;
import com.google.gerrit.server.query.AndPredicate; import com.google.gerrit.server.query.AndPredicate;
import com.google.gerrit.server.query.NotPredicate; import com.google.gerrit.server.query.NotPredicate;
@@ -43,7 +44,7 @@ import java.util.Set;
/** Rewriter that pushes boolean logic into the secondary index. */ /** Rewriter that pushes boolean logic into the secondary index. */
@Singleton @Singleton
public class IndexRewriter { public class ChangeIndexRewriter implements IndexRewriter<ChangeData> {
/** Set of all open change statuses. */ /** Set of all open change statuses. */
public static final Set<Change.Status> OPEN_STATUSES; public static final Set<Change.Status> OPEN_STATUSES;
@@ -124,12 +125,13 @@ public class IndexRewriter {
private final IndexConfig config; private final IndexConfig config;
@Inject @Inject
IndexRewriter(ChangeIndexCollection indexes, ChangeIndexRewriter(ChangeIndexCollection indexes,
IndexConfig config) { IndexConfig config) {
this.indexes = indexes; this.indexes = indexes;
this.config = config; this.config = config;
} }
@Override
public Predicate<ChangeData> rewrite(Predicate<ChangeData> in, public Predicate<ChangeData> rewrite(Predicate<ChangeData> in,
QueryOptions opts) throws QueryParseException { QueryOptions opts) throws QueryParseException {
ChangeIndex index = indexes.getSearchIndex(); ChangeIndex index = indexes.getSearchIndex();

View File

@@ -57,7 +57,7 @@ import com.google.gerrit.server.index.Schema;
import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.index.change.ChangeField;
import com.google.gerrit.server.index.change.ChangeIndex; import com.google.gerrit.server.index.change.ChangeIndex;
import com.google.gerrit.server.index.change.ChangeIndexCollection; import com.google.gerrit.server.index.change.ChangeIndexCollection;
import com.google.gerrit.server.index.change.IndexRewriter; import com.google.gerrit.server.index.change.ChangeIndexRewriter;
import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.patch.PatchListCache; import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
@@ -158,7 +158,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
public static class Arguments { public static class Arguments {
final Provider<ReviewDb> db; final Provider<ReviewDb> db;
final Provider<InternalChangeQuery> queryProvider; final Provider<InternalChangeQuery> queryProvider;
final IndexRewriter rewriter; final ChangeIndexRewriter rewriter;
final DynamicMap<ChangeOperatorFactory> opFactories; final DynamicMap<ChangeOperatorFactory> opFactories;
final IdentifiedUser.GenericFactory userFactory; final IdentifiedUser.GenericFactory userFactory;
final CapabilityControl.Factory capabilityControlFactory; final CapabilityControl.Factory capabilityControlFactory;
@@ -190,7 +190,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@VisibleForTesting @VisibleForTesting
public Arguments(Provider<ReviewDb> db, public Arguments(Provider<ReviewDb> db,
Provider<InternalChangeQuery> queryProvider, Provider<InternalChangeQuery> queryProvider,
IndexRewriter rewriter, ChangeIndexRewriter rewriter,
DynamicMap<ChangeOperatorFactory> opFactories, DynamicMap<ChangeOperatorFactory> opFactories,
IdentifiedUser.GenericFactory userFactory, IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self, Provider<CurrentUser> self,
@@ -229,7 +229,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
private Arguments( private Arguments(
Provider<ReviewDb> db, Provider<ReviewDb> db,
Provider<InternalChangeQuery> queryProvider, Provider<InternalChangeQuery> queryProvider,
IndexRewriter rewriter, ChangeIndexRewriter rewriter,
DynamicMap<ChangeOperatorFactory> opFactories, DynamicMap<ChangeOperatorFactory> opFactories,
IdentifiedUser.GenericFactory userFactory, IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self, Provider<CurrentUser> self,

View File

@@ -32,7 +32,7 @@ import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.index.QueryOptions; import com.google.gerrit.server.index.QueryOptions;
import com.google.gerrit.server.index.change.ChangeIndex; import com.google.gerrit.server.index.change.ChangeIndex;
import com.google.gerrit.server.index.change.ChangeIndexCollection; import com.google.gerrit.server.index.change.ChangeIndexCollection;
import com.google.gerrit.server.index.change.IndexRewriter; import com.google.gerrit.server.index.change.ChangeIndexRewriter;
import com.google.gerrit.server.index.change.IndexedChangeQuery; import com.google.gerrit.server.index.change.IndexedChangeQuery;
import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
@@ -54,7 +54,7 @@ public class QueryProcessor {
private final ChangeControl.GenericFactory changeControlFactory; private final ChangeControl.GenericFactory changeControlFactory;
private final ChangeNotes.Factory notesFactory; private final ChangeNotes.Factory notesFactory;
private final ChangeIndexCollection indexes; private final ChangeIndexCollection indexes;
private final IndexRewriter rewriter; private final ChangeIndexRewriter rewriter;
private final IndexConfig indexConfig; private final IndexConfig indexConfig;
private final Metrics metrics; private final Metrics metrics;
@@ -69,7 +69,7 @@ public class QueryProcessor {
ChangeControl.GenericFactory changeControlFactory, ChangeControl.GenericFactory changeControlFactory,
ChangeNotes.Factory notesFactory, ChangeNotes.Factory notesFactory,
ChangeIndexCollection indexes, ChangeIndexCollection indexes,
IndexRewriter rewriter, ChangeIndexRewriter rewriter,
IndexConfig indexConfig, IndexConfig indexConfig,
Metrics metrics) { Metrics metrics) {
this.db = db; this.db = db;

View File

@@ -45,13 +45,13 @@ import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Set; import java.util.Set;
public class IndexRewriterTest extends GerritBaseTests { public class ChangeIndexRewriterTest extends GerritBaseTests {
private static final IndexConfig CONFIG = IndexConfig.createDefault(); private static final IndexConfig CONFIG = IndexConfig.createDefault();
private FakeChangeIndex index; private FakeChangeIndex index;
private ChangeIndexCollection indexes; private ChangeIndexCollection indexes;
private ChangeQueryBuilder queryBuilder; private ChangeQueryBuilder queryBuilder;
private IndexRewriter rewrite; private ChangeIndexRewriter rewrite;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@@ -59,7 +59,7 @@ public class IndexRewriterTest extends GerritBaseTests {
indexes = new ChangeIndexCollection(); indexes = new ChangeIndexCollection();
indexes.setSearchIndex(index); indexes.setSearchIndex(index);
queryBuilder = new FakeQueryBuilder(indexes); queryBuilder = new FakeQueryBuilder(indexes);
rewrite = new IndexRewriter(indexes, rewrite = new ChangeIndexRewriter(indexes,
IndexConfig.create(0, 0, 3)); IndexConfig.create(0, 0, 3));
} }
@@ -292,6 +292,6 @@ public class IndexRewriterTest extends GerritBaseTests {
} }
private Set<Change.Status> status(String query) throws QueryParseException { private Set<Change.Status> status(String query) throws QueryParseException {
return IndexRewriter.getPossibleStatus(parse(query)); return ChangeIndexRewriter.getPossibleStatus(parse(query));
} }
} }