From 24a037431a13b5d2addcf0cc4ec994249e6da218 Mon Sep 17 00:00:00 2001 From: Areek Zillur Date: Tue, 14 Apr 2015 21:24:56 -0400 Subject: [PATCH] [FIX] Make GeoContext mapping idempotent closes #10581 closes #8937 --- .../context/GeolocationContextMapping.java | 4 +- .../suggest/ContextSuggestSearchTests.java | 40 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/elasticsearch/search/suggest/context/GeolocationContextMapping.java b/src/main/java/org/elasticsearch/search/suggest/context/GeolocationContextMapping.java index d63053b9e3389..b85cfbc709fdb 100644 --- a/src/main/java/org/elasticsearch/search/suggest/context/GeolocationContextMapping.java +++ b/src/main/java/org/elasticsearch/search/suggest/context/GeolocationContextMapping.java @@ -591,7 +591,9 @@ public GeolocationContextMapping build() { if(precisions.isEmpty()) { precisions.add(GeoHashUtils.PRECISION); } - return new GeolocationContextMapping(name, precisions.toArray(), neighbors, defaultLocations, fieldName); + int[] precisionArray = precisions.toArray(); + Arrays.sort(precisionArray); + return new GeolocationContextMapping(name, precisionArray, neighbors, defaultLocations, fieldName); } } diff --git a/src/test/java/org/elasticsearch/search/suggest/ContextSuggestSearchTests.java b/src/test/java/org/elasticsearch/search/suggest/ContextSuggestSearchTests.java index 370b9e21c51b9..12492a1923b4f 100644 --- a/src/test/java/org/elasticsearch/search/suggest/ContextSuggestSearchTests.java +++ b/src/test/java/org/elasticsearch/search/suggest/ContextSuggestSearchTests.java @@ -24,8 +24,10 @@ import org.elasticsearch.action.suggest.SuggestRequest; import org.elasticsearch.action.suggest.SuggestRequestBuilder; import org.elasticsearch.action.suggest.SuggestResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.mapper.MapperParsingException; @@ -153,7 +155,43 @@ public void testMultiLevelGeo() throws Exception { assertEquals("Hotel Amsterdam in Berlin", suggestResponse.getSuggest().getSuggestion(suggestionName).iterator().next() .getOptions().iterator().next().getText().string()); } - } + } + + @Test + public void testMappingIdempotency() throws Exception { + List precisions = new ArrayList<>(); + for (int i = 0; i < randomIntBetween(4, 12); i++) { + precisions.add(i+1); + } + Collections.shuffle(precisions, getRandom()); + XContentBuilder mapping = jsonBuilder().startObject().startObject(TYPE) + .startObject("properties").startObject("completion") + .field("type", "completion") + .startObject("context") + .startObject("location") + .field("type", "geo") + .array("precision", precisions.toArray(new Integer[precisions.size()])) + .endObject() + .endObject().endObject() + .endObject().endObject(); + + assertAcked(prepareCreate(INDEX).addMapping(TYPE, mapping.string())); + ensureYellow(); + + Collections.shuffle(precisions, getRandom()); + mapping = jsonBuilder().startObject().startObject(TYPE) + .startObject("properties").startObject("completion") + .field("type", "completion") + .startObject("context") + .startObject("location") + .field("type", "geo") + .array("precision", precisions.toArray(new Integer[precisions.size()])) + .endObject() + .endObject().endObject() + .endObject().endObject(); + assertAcked(client().admin().indices().preparePutMapping(INDEX).setType(TYPE).setSource(mapping.string()).get()); + } + @Test public void testGeoField() throws Exception {