package io.searchbox.core; import io.searchbox.common.AbstractIntegrationTest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.test.ESIntegTestCase; import org.junit.Test; /** * @author Dogukan Sonmez */ @ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE, numDataNodes = 1) public class UpdateIntegrationTest extends AbstractIntegrationTest { private static final String INDEX = "twitter"; private static final String TYPE = "tweet"; @Test public void scriptedUpdateWithValidParameters() throws Exception { String id = "1"; String script = "{\n" + " \"script\": {\n" + " \"lang\": \"painless\",\n" + " \"inline\": \"ctx._source.tags += params.tag\",\n" + " \"params\": {\n" + " \"tag\": \"blue\"\n" + " }\n" + " }\n" + "}"; client().index( new IndexRequest(INDEX, TYPE, id) .source("{\"user\":\"kimchy\", \"tags\":\"That is test\"}") .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) ).actionGet(); DocumentResult result = client.execute(new Update.Builder(script).index(INDEX).type(TYPE).id(id).build()); assertTrue(result.getErrorMessage(), result.isSucceeded()); assertEquals(INDEX, result.getIndex()); assertEquals(TYPE, result.getType()); assertEquals(id, result.getId()); GetResponse getResult = get(INDEX, TYPE, id); assertTrue(getResult.isExists()); assertFalse(getResult.isSourceEmpty()); assertEquals("That is testblue", getResult.getSource().get("tags")); } @Test public void partialDocUpdateWithValidParameters() throws Exception { String id = "2"; String partialDoc = "{\n" + " \"doc\" : {\n" + " \"tags\" : \"blue\"\n" + " }\n" + "}"; client().index( new IndexRequest(INDEX, TYPE, id) .source("{\"user\":\"kimchy\", \"tags\":\"That is test\"}") .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) ).actionGet(); DocumentResult result = client.execute(new Update.Builder(partialDoc).index(INDEX).type(TYPE).id(id).build()); assertTrue(result.getErrorMessage(), result.isSucceeded()); assertEquals(INDEX, result.getIndex()); assertEquals(TYPE, result.getType()); assertEquals(id, result.getId()); GetResponse getResult = get(INDEX, TYPE, id); assertTrue(getResult.isExists()); assertFalse(getResult.isSourceEmpty()); assertEquals("blue", getResult.getSource().get("tags")); } @Test public void partialDocUpdateWithValidVersion() throws Exception { String id = "2"; String partialDoc = "{\n" + " \"doc\" : {\n" + " \"tags\" : \"blue\"\n" + " }\n" + "}"; IndexResponse response = client().index( new IndexRequest(INDEX, TYPE, id) .source("{\"user\":\"kimchy\", \"tags\":\"That is test\"}") .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) ).actionGet(); long version = response.getVersion(); DocumentResult result = client.execute(new Update.VersionBuilder(partialDoc, version) .index(INDEX) .type(TYPE) .id(id) .build()); assertTrue(result.getErrorMessage(), result.isSucceeded()); assertEquals(INDEX, result.getIndex()); assertEquals(TYPE, result.getType()); assertEquals(id, result.getId()); assertEquals(version + 1, result.getVersion().longValue()); GetResponse getResult = get(INDEX, TYPE, id); assertTrue(getResult.isExists()); assertFalse(getResult.isSourceEmpty()); assertEquals("blue", getResult.getSource().get("tags")); } @Test public void partialDocUpdateWithInvalidVersion() throws Exception { String id = "2"; String partialDoc = "{\n" + " \"doc\" : {\n" + " \"tags\" : \"blue\"\n" + " }\n" + "}"; String partialDoc2 = "{\n" + " \"doc\" : {\n" + " \"tags\" : \"red\"\n" + " }\n" + "}"; IndexResponse response = client().index( new IndexRequest(INDEX, TYPE, id) .source("{\"user\":\"kimchy\", \"tags\":\"That is test\"}") .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) ).actionGet(); long version = response.getVersion(); DocumentResult result = client.execute(new Update.VersionBuilder(partialDoc, version) .index(INDEX) .type(TYPE) .id(id) .build()); assertTrue(result.getErrorMessage(), result.isSucceeded()); // and again ... result = client.execute(new Update.VersionBuilder(partialDoc2, version) .index(INDEX) .type(TYPE) .id(id) .build()); assertFalse(result.getErrorMessage(), result.isSucceeded()); assertEquals("Invalid response code", RestStatus.CONFLICT.getStatus(), result.getResponseCode()); GetResponse getResult = get(INDEX, TYPE, id); assertTrue(getResult.isExists()); assertEquals(version + 1, getResult.getVersion()); assertEquals("blue", getResult.getSource().get("tags")); } }