diff options
Diffstat (limited to 'gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java')
-rw-r--r-- | gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java | 204 |
1 files changed, 0 insertions, 204 deletions
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java deleted file mode 100644 index 32870cbecb..0000000000 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (C) 2017 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.lucene; - -import static com.google.gerrit.server.index.group.GroupField.UUID; - -import com.google.gerrit.index.QueryOptions; -import com.google.gerrit.index.Schema; -import com.google.gerrit.index.query.DataSource; -import com.google.gerrit.index.query.Predicate; -import com.google.gerrit.index.query.QueryParseException; -import com.google.gerrit.reviewdb.client.AccountGroup; -import com.google.gerrit.server.account.GroupCache; -import com.google.gerrit.server.config.GerritServerConfig; -import com.google.gerrit.server.config.SitePaths; -import com.google.gerrit.server.group.InternalGroup; -import com.google.gerrit.server.index.IndexUtils; -import com.google.gerrit.server.index.group.GroupIndex; -import com.google.gwtorm.server.OrmException; -import com.google.gwtorm.server.ResultSet; -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.google.inject.assistedinject.Assisted; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import org.apache.lucene.document.Document; -import org.apache.lucene.index.Term; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.ScoreDoc; -import org.apache.lucene.search.SearcherFactory; -import org.apache.lucene.search.Sort; -import org.apache.lucene.search.SortField; -import org.apache.lucene.search.TopFieldDocs; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.FSDirectory; -import org.apache.lucene.store.RAMDirectory; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class LuceneGroupIndex extends AbstractLuceneIndex<AccountGroup.UUID, InternalGroup> - implements GroupIndex { - private static final Logger log = LoggerFactory.getLogger(LuceneGroupIndex.class); - - private static final String GROUPS = "groups"; - - private static final String UUID_SORT_FIELD = sortFieldName(UUID); - - private static Term idTerm(InternalGroup group) { - return idTerm(group.getGroupUUID()); - } - - private static Term idTerm(AccountGroup.UUID uuid) { - return QueryBuilder.stringTerm(UUID.getName(), uuid.get()); - } - - private final GerritIndexWriterConfig indexWriterConfig; - private final QueryBuilder<InternalGroup> queryBuilder; - private final Provider<GroupCache> groupCache; - - private static Directory dir(Schema<?> schema, Config cfg, SitePaths sitePaths) - throws IOException { - if (LuceneIndexModule.isInMemoryTest(cfg)) { - return new RAMDirectory(); - } - Path indexDir = LuceneVersionManager.getDir(sitePaths, GROUPS, schema); - return FSDirectory.open(indexDir); - } - - @Inject - LuceneGroupIndex( - @GerritServerConfig Config cfg, - SitePaths sitePaths, - Provider<GroupCache> groupCache, - @Assisted Schema<InternalGroup> schema) - throws IOException { - super( - schema, - sitePaths, - dir(schema, cfg, sitePaths), - GROUPS, - null, - new GerritIndexWriterConfig(cfg, GROUPS), - new SearcherFactory()); - this.groupCache = groupCache; - - indexWriterConfig = new GerritIndexWriterConfig(cfg, GROUPS); - queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer()); - } - - @Override - public void replace(InternalGroup group) throws IOException { - try { - replace(idTerm(group), toDocument(group)).get(); - } catch (ExecutionException | InterruptedException e) { - throw new IOException(e); - } - } - - @Override - public void delete(AccountGroup.UUID key) throws IOException { - try { - delete(idTerm(key)).get(); - } catch (ExecutionException | InterruptedException e) { - throw new IOException(e); - } - } - - @Override - public DataSource<InternalGroup> getSource(Predicate<InternalGroup> p, QueryOptions opts) - throws QueryParseException { - return new QuerySource( - opts, - queryBuilder.toQuery(p), - new Sort(new SortField(UUID_SORT_FIELD, SortField.Type.STRING, false))); - } - - private class QuerySource implements DataSource<InternalGroup> { - private final QueryOptions opts; - private final Query query; - private final Sort sort; - - private QuerySource(QueryOptions opts, Query query, Sort sort) { - this.opts = opts; - this.query = query; - this.sort = sort; - } - - @Override - public int getCardinality() { - return 10; - } - - @Override - public ResultSet<InternalGroup> read() throws OrmException { - IndexSearcher searcher = null; - try { - searcher = acquire(); - int realLimit = opts.start() + opts.limit(); - TopFieldDocs docs = searcher.search(query, realLimit, sort); - List<InternalGroup> result = new ArrayList<>(docs.scoreDocs.length); - for (int i = opts.start(); i < docs.scoreDocs.length; i++) { - ScoreDoc sd = docs.scoreDocs[i]; - Document doc = searcher.doc(sd.doc, IndexUtils.groupFields(opts)); - Optional<InternalGroup> internalGroup = toInternalGroup(doc); - internalGroup.ifPresent(result::add); - } - final List<InternalGroup> r = Collections.unmodifiableList(result); - return new ResultSet<InternalGroup>() { - @Override - public Iterator<InternalGroup> iterator() { - return r.iterator(); - } - - @Override - public List<InternalGroup> toList() { - return r; - } - - @Override - public void close() { - // Do nothing. - } - }; - } catch (IOException e) { - throw new OrmException(e); - } finally { - if (searcher != null) { - try { - release(searcher); - } catch (IOException e) { - log.warn("cannot release Lucene searcher", e); - } - } - } - } - } - - private Optional<InternalGroup> toInternalGroup(Document doc) { - AccountGroup.UUID uuid = new AccountGroup.UUID(doc.getField(UUID.getName()).stringValue()); - // Use the GroupCache rather than depending on any stored fields in the - // document (of which there shouldn't be any). - return groupCache.get().get(uuid); - } -} |