diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java index 4f811b9ee6..2e30e596bb 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java @@ -188,10 +188,15 @@ abstract class AbstractElasticIndex implements Index { } protected String getMappingsFor(String type, MappingProperties properties) { - JsonObject mappingType = new JsonObject(); - mappingType.add(type, gson.toJsonTree(properties)); JsonObject mappings = new JsonObject(); - mappings.add(MAPPINGS, gson.toJsonTree(mappingType)); + + if (client.adapter().omitType()) { + mappings.add(MAPPINGS, gson.toJsonTree(properties)); + } else { + JsonObject mappingType = new JsonObject(); + mappingType.add(type, gson.toJsonTree(properties)); + mappings.add(MAPPINGS, gson.toJsonTree(mappingType)); + } return gson.toJson(mappings); } @@ -229,11 +234,12 @@ abstract class AbstractElasticIndex implements Index { protected String getURI(String type, String request) throws UnsupportedEncodingException { String encodedIndexName = URLEncoder.encode(indexName, UTF_8.toString()); - if (SEARCH.equals(request) && client.adapter().omitTypeFromSearch()) { + if (SEARCH.equals(request) && client.adapter().omitType()) { return encodedIndexName + "/" + request; } - String encodedType = URLEncoder.encode(type, UTF_8.toString()); - return encodedIndexName + "/" + encodedType + "/" + request; + String encodedTypeIfAny = + client.adapter().omitType() ? "" : "/" + URLEncoder.encode(type, UTF_8.toString()); + return encodedIndexName + encodedTypeIfAny + "/" + request; } protected Response postRequest(String uri, Object payload) throws IOException { diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java index 264822e415..81a237bb77 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java @@ -141,7 +141,7 @@ class ElasticChangeIndex extends AbstractElasticIndex BulkRequest bulk = new IndexRequest(getId(cd), indexName, adapter.getType(insertIndex), adapter) .add(new UpdateRequest<>(schema, cd)); - if (!adapter.usePostV5Type()) { + if (adapter.deleteToReplace()) { bulk.add(new DeleteRequest(cd.getId().toString(), indexName, deleteIndex, adapter)); } @@ -160,17 +160,19 @@ class ElasticChangeIndex extends AbstractElasticIndex throws QueryParseException { Set statuses = ChangeIndexRewriter.getPossibleStatus(p); List indexes = Lists.newArrayListWithCapacity(2); - if (client.adapter().usePostV5Type()) { - if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty() - || !Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) { - indexes.add(ElasticQueryAdapter.POST_V5_TYPE); - } - } else { - if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) { - indexes.add(OPEN_CHANGES); - } - if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) { - indexes.add(CLOSED_CHANGES); + if (!client.adapter().omitType()) { + if (client.adapter().useV6Type()) { + if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty() + || !Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) { + indexes.add(ElasticQueryAdapter.V6_TYPE); + } + } else { + if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) { + indexes.add(OPEN_CHANGES); + } + if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) { + indexes.add(CLOSED_CHANGES); + } } } return new QuerySource(indexes, p, opts); @@ -178,16 +180,16 @@ class ElasticChangeIndex extends AbstractElasticIndex @Override protected String getDeleteActions(Id c) { - if (client.adapter().usePostV5Type()) { - return delete(ElasticQueryAdapter.POST_V5_TYPE, c); + if (!client.adapter().useV5Type()) { + return delete(client.adapter().getType(), c); } return delete(OPEN_CHANGES, c) + delete(CLOSED_CHANGES, c); } @Override protected String getMappings() { - if (client.adapter().usePostV5Type()) { - return getMappingsFor(ElasticQueryAdapter.POST_V5_TYPE, mapping.changes); + if (!client.adapter().useV5Type()) { + return getMappingsFor(client.adapter().getType(), mapping.changes); } return gson.toJson(ImmutableMap.of(MAPPINGS, mapping)); } diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java index 85fbee8556..329913bede 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java @@ -17,11 +17,12 @@ package com.google.gerrit.elasticsearch; import com.google.gson.JsonObject; public class ElasticQueryAdapter { - static final String POST_V5_TYPE = "_doc"; + static final String V6_TYPE = "_doc"; private final boolean ignoreUnmapped; - private final boolean usePostV5Type; - private final boolean omitTypeFromSearch; + private final boolean useV5Type; + private final boolean useV6Type; + private final boolean omitType; private final String searchFilteringName; private final String indicesExistParam; @@ -33,15 +34,16 @@ public class ElasticQueryAdapter { ElasticQueryAdapter(ElasticVersion version) { this.ignoreUnmapped = false; - this.usePostV5Type = version.isV6OrLater(); - this.omitTypeFromSearch = version.isV7OrLater(); + this.useV5Type = !version.isV6OrLater(); + this.useV6Type = version.isV6(); + this.omitType = version.isV7OrLater(); this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases"; this.searchFilteringName = "_source"; this.indicesExistParam = "?allow_no_indices=false"; this.exactFieldType = "keyword"; this.stringFieldType = "text"; this.indexProperty = "true"; - this.includeTypeNameParam = version.isV7OrLater() ? "?include_type_name=true" : ""; + this.includeTypeNameParam = version.isV6() ? "?include_type_name=true" : ""; } void setIgnoreUnmapped(JsonObject properties) { @@ -51,7 +53,7 @@ public class ElasticQueryAdapter { } public void setType(JsonObject properties, String type) { - if (!usePostV5Type) { + if (useV5Type) { properties.addProperty("_type", type); } } @@ -76,16 +78,31 @@ public class ElasticQueryAdapter { return indexProperty; } - boolean usePostV5Type() { - return usePostV5Type; + boolean deleteToReplace() { + return useV5Type; } - boolean omitTypeFromSearch() { - return omitTypeFromSearch; + boolean useV5Type() { + return useV5Type; + } + + boolean useV6Type() { + return useV6Type; + } + + boolean omitType() { + return omitType; + } + + String getType() { + return getType(""); } String getType(String type) { - return usePostV5Type() ? POST_V5_TYPE : type; + if (useV6Type()) { + return V6_TYPE; + } + return useV5Type() ? type : ""; } String getVersionDiscoveryUrl(String name) { diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java index 6de4d972ba..2cd8dd60f2 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java @@ -58,6 +58,10 @@ public enum ElasticVersion { return Joiner.on(", ").join(ElasticVersion.values()); } + public boolean isV6() { + return getMajor() == 6; + } + public boolean isV6OrLater() { return isAtLeastVersion(6); } @@ -67,7 +71,11 @@ public enum ElasticVersion { } private boolean isAtLeastVersion(int v) { - return Integer.valueOf(version.split("\\.")[0]) >= v; + return getMajor() >= v; + } + + private Integer getMajor() { + return Integer.valueOf(version.split("\\.")[0]); } @Override