DATAES-238 - Fix ElasticsearchTemplate.prepareUpdate(): preserve routing

* need to specify Locale.ENGLISH in String.format()
  to make tests succeed on non-english locales

* that's because the String.format involves floating
  point numbers which are formatted differently in
  some locales

* ElasticsearchTemplate.prepareUpdate() properly copies routing
  from given UpdateRequest

* add unit tests to ElasticsearchTemplateParentChildTests
  for update of a child document
This commit is contained in:
Markus Ackermann 2016-03-04 14:00:18 +01:00 committed by Mohsin Husen
parent 907571e550
commit 8bb4ac3653
4 changed files with 72 additions and 4 deletions

View File

@ -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

View File

@ -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());
}
}

View File

@ -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);
}
}

View File

@ -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) {