diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 1a8b41ef6..e342f5912 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -538,6 +538,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati Assert.notNull(query.getId(), "No Id define for Query"); Assert.notNull(query.getUpdateRequest(), "No IndexRequest define for Query"); UpdateRequestBuilder updateRequestBuilder = client.prepareUpdate(indexName, type, query.getId()); + updateRequestBuilder.setRouting(query.getUpdateRequest().routing()); if (query.getUpdateRequest().script() == null) { // doc diff --git a/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java b/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java index 5d702e302..0f1ad3abf 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java @@ -19,6 +19,7 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.io.IOException; +import java.util.Locale; import org.junit.Before; import org.junit.Test; @@ -82,11 +83,11 @@ public class DefaultEntityMapperTests { //then assertThat(jsonResult, containsString(pointTemplate("pointA", point))); assertThat(jsonResult, containsString(pointTemplate("pointB", point))); - assertThat(jsonResult, containsString(String.format("\"%s\":\"%s\"", "pointC", pointAsString))); - assertThat(jsonResult, containsString(String.format("\"%s\":[%.1f,%.1f]", "pointD", pointAsArray[0], pointAsArray[1]))); + assertThat(jsonResult, containsString(String.format(Locale.ENGLISH, "\"%s\":\"%s\"", "pointC", pointAsString))); + assertThat(jsonResult, containsString(String.format(Locale.ENGLISH, "\"%s\":[%.1f,%.1f]", "pointD", pointAsArray[0], pointAsArray[1]))); } private String pointTemplate(String name, Point point) { - return String.format("\"%s\":{\"lat\":%.1f,\"lon\":%.1f}", name, point.getX(), point.getY()); + return String.format(Locale.ENGLISH, "\"%s\":{\"lat\":%.1f,\"lon\":%.1f}", name, point.getX(), point.getY()); } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java index a1f1ac5bd..46dcbee23 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java @@ -15,12 +15,17 @@ */ package org.springframework.data.elasticsearch.core; +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.QueryBuilders.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.util.List; +import org.elasticsearch.action.RoutingMissingException; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.junit.After; @@ -30,6 +35,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; +import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.entities.ParentEntity; import org.springframework.data.elasticsearch.entities.ParentEntity.ChildEntity; import org.springframework.test.context.ContextConfiguration; @@ -81,6 +87,55 @@ public class ElasticsearchTemplateParentChildTests { assertThat("parents", parents, contains(hasProperty("id", is(parent1.getId())))); } + @Test + public void shouldUpdateChild() throws Exception { + // index parent and child + ParentEntity parent = index("parent", "Parent"); + ChildEntity child = index("child", parent.getId(), "Child"); + String newChildName = "New Child Name"; + + // update the child, not forgetting to set the parent id as routing parameter + UpdateRequest updateRequest = new UpdateRequest(ParentEntity.INDEX, ParentEntity.CHILD_TYPE, child.getId()); + updateRequest.routing(parent.getId()); + XContentBuilder builder; + builder = jsonBuilder().startObject().field("name", newChildName).endObject(); + updateRequest.doc(builder); + final UpdateResponse response = update(updateRequest); + + assertThat(response.getShardInfo().getSuccessful(), is(1)); + } + + @Test(expected = RoutingMissingException.class) + public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfNotRoutingSetOnUpdateRequest() throws Exception { + // index parent and child + ParentEntity parent = index("parent", "Parent"); + ChildEntity child = index("child", parent.getId(), "Child"); + String newChildName = "New Child Name"; + + // update the child, forget routing parameter + UpdateRequest updateRequest = new UpdateRequest(ParentEntity.INDEX, ParentEntity.CHILD_TYPE, child.getId()); + XContentBuilder builder; + builder = jsonBuilder().startObject().field("name", newChildName).endObject(); + updateRequest.doc(builder); + update(updateRequest); + } + + @Test(expected = RoutingMissingException.class) + public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfRoutingOnlySetOnRequestDoc() throws Exception { + // index parent and child + ParentEntity parent = index("parent", "Parent"); + ChildEntity child = index("child", parent.getId(), "Child"); + String newChildName = "New Child Name"; + + // update the child + UpdateRequest updateRequest = new UpdateRequest(ParentEntity.INDEX, ParentEntity.CHILD_TYPE, child.getId()); + XContentBuilder builder; + builder = jsonBuilder().startObject().field("name", newChildName).endObject(); + updateRequest.doc(builder); + updateRequest.doc().routing(parent.getId()); + update(updateRequest); + } + private ParentEntity index(String parentId, String name) { ParentEntity parent = new ParentEntity(parentId, name); IndexQuery index = new IndexQuery(); @@ -101,4 +156,13 @@ public class ElasticsearchTemplateParentChildTests { return child; } + + private UpdateResponse update(UpdateRequest updateRequest) { + final UpdateQuery update = new UpdateQuery(); + update.setId(updateRequest.id()); + update.setType(updateRequest.type()); + update.setIndexName(updateRequest.index()); + update.setUpdateRequest(updateRequest); + return elasticsearchTemplate.update(update); + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTests.java index 1332a93b3..9e6b13bf7 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTests.java @@ -29,6 +29,8 @@ import org.springframework.data.geo.Point; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import java.util.Locale; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:/repository-spring-data-geo-support.xml") @@ -72,7 +74,7 @@ public class SpringDataGeoRepositoryTests { } private String toGeoString(Point point) { - return String.format("%.1f,%.1f", point.getX(), point.getY()); + return String.format(Locale.ENGLISH, "%.1f,%.1f", point.getX(), point.getY()); } private double[] toGeoArray(Point point) {