Convert project index to use ProjectData instead of ProjectState

With this change, the project index does not depend on the Gerrit
server, so that projects under non-Gerrit enabled hosts can be
indexed without dependencies on the server.

Change-Id: I07beec95d1586432bd078d492111b0f6e57c5dcb
This commit is contained in:
Dave Borowitz
2017-08-04 12:01:18 -04:00
parent 428e70e7b3
commit bca8232d83
20 changed files with 133 additions and 94 deletions

View File

@@ -30,7 +30,7 @@ import com.google.gerrit.server.index.IndexUtils;
import com.google.gerrit.server.index.project.ProjectField;
import com.google.gerrit.server.index.project.ProjectIndex;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.project.ProjectData;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -56,12 +56,12 @@ import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, ProjectState>
public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, ProjectData>
implements ProjectIndex {
static class ProjectMapping {
MappingProperties projects;
ProjectMapping(Schema<ProjectState> schema) {
ProjectMapping(Schema<ProjectData> schema) {
this.projects = ElasticMapping.createMapping(schema);
}
}
@@ -80,14 +80,14 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
SitePaths sitePaths,
Provider<ProjectCache> projectCache,
JestClientBuilder clientBuilder,
@Assisted Schema<ProjectState> schema) {
@Assisted Schema<ProjectData> schema) {
super(cfg, sitePaths, schema, clientBuilder, PROJECTS_PREFIX);
this.projectCache = projectCache;
this.mapping = new ProjectMapping(schema);
}
@Override
public void replace(ProjectState projectState) throws IOException {
public void replace(ProjectData projectState) throws IOException {
Bulk bulk =
new Bulk.Builder()
.defaultIndex(indexName)
@@ -105,7 +105,7 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
}
@Override
public DataSource<ProjectState> getSource(Predicate<ProjectState> p, QueryOptions opts)
public DataSource<ProjectData> getSource(Predicate<ProjectData> p, QueryOptions opts)
throws QueryParseException {
return new QuerySource(p, opts);
}
@@ -122,15 +122,15 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
}
@Override
protected String getId(ProjectState projectState) {
protected String getId(ProjectData projectState) {
return projectState.getProject().getName();
}
private class QuerySource implements DataSource<ProjectState> {
private class QuerySource implements DataSource<ProjectData> {
private final Search search;
private final Set<String> fields;
QuerySource(Predicate<ProjectState> p, QueryOptions opts) throws QueryParseException {
QuerySource(Predicate<ProjectData> p, QueryOptions opts) throws QueryParseException {
QueryBuilder qb = queryBuilder.toQueryBuilder(p);
fields = IndexUtils.projectFields(opts);
SearchSourceBuilder searchSource =
@@ -157,9 +157,9 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
}
@Override
public ResultSet<ProjectState> read() throws OrmException {
public ResultSet<ProjectData> read() throws OrmException {
try {
List<ProjectState> results = Collections.emptyList();
List<ProjectData> results = Collections.emptyList();
JestResult result = client.execute(search);
if (result.isSucceeded()) {
JsonObject obj = result.getJsonObject().getAsJsonObject("hits");
@@ -167,21 +167,21 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
JsonArray json = obj.getAsJsonArray("hits");
results = Lists.newArrayListWithCapacity(json.size());
for (int i = 0; i < json.size(); i++) {
results.add(toProjectState(json.get(i)));
results.add(toProjectData(json.get(i)));
}
}
} else {
log.error(result.getErrorMessage());
}
final List<ProjectState> r = Collections.unmodifiableList(results);
return new ResultSet<ProjectState>() {
final List<ProjectData> r = Collections.unmodifiableList(results);
return new ResultSet<ProjectData>() {
@Override
public Iterator<ProjectState> iterator() {
public Iterator<ProjectData> iterator() {
return r.iterator();
}
@Override
public List<ProjectState> toList() {
public List<ProjectData> toList() {
return r;
}
@@ -200,7 +200,7 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
return search.toString();
}
private ProjectState toProjectState(JsonElement json) {
private ProjectData toProjectData(JsonElement json) {
JsonElement source = json.getAsJsonObject().get("_source");
if (source == null) {
source = json.getAsJsonObject().get("fields");
@@ -209,7 +209,7 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P
Project.NameKey nameKey =
new Project.NameKey(
source.getAsJsonObject().get(ProjectField.NAME.getName()).getAsString());
return projectCache.get().get(nameKey);
return projectCache.get().get(nameKey).toProjectData();
}
}
}

View File

@@ -36,7 +36,7 @@ import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
import com.google.gerrit.server.index.project.ProjectSchemaDefinitions;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.project.ProjectData;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
@@ -162,7 +162,7 @@ final class ElasticTestUtils {
.execute()
.actionGet();
Schema<ProjectState> projectSchema = ProjectSchemaDefinitions.INSTANCE.getLatest();
Schema<ProjectData> projectSchema = ProjectSchemaDefinitions.INSTANCE.getLatest();
ProjectMapping projectMapping = new ProjectMapping(projectSchema);
nodeInfo
.node