@Test public void testUpsert() throws Exception { createIndex(); ClusterHealthResponse clusterHealth = client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet(); assertThat(clusterHealth.timedOut(), equalTo(false)); assertThat(clusterHealth.status(), equalTo(ClusterHealthStatus.GREEN)); client .prepareUpdate("test", "type1", "1") .setUpsert(XContentFactory.jsonBuilder().startObject().field("field", 1).endObject()) .setScript("ctx._source.field += 1") .execute() .actionGet(); for (int i = 0; i < 5; i++) { GetResponse getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("1")); } client .prepareUpdate("test", "type1", "1") .setUpsert(XContentFactory.jsonBuilder().startObject().field("field", 1).endObject()) .setScript("ctx._source.field += 1") .execute() .actionGet(); for (int i = 0; i < 5; i++) { GetResponse getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("2")); } }
@Test public void testUpdate() throws Exception { createIndex(); ClusterHealthResponse clusterHealth = client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet(); assertThat(clusterHealth.timedOut(), equalTo(false)); assertThat(clusterHealth.status(), equalTo(ClusterHealthStatus.GREEN)); try { client .prepareUpdate("test", "type1", "1") .setScript("ctx._source.field++") .execute() .actionGet(); assert false; } catch (DocumentMissingException e) { // all is well } client.prepareIndex("test", "type1", "1").setSource("field", 1).execute().actionGet(); UpdateResponse updateResponse = client .prepareUpdate("test", "type1", "1") .setScript("ctx._source.field += 1") .execute() .actionGet(); assertThat(updateResponse.version(), equalTo(2L)); for (int i = 0; i < 5; i++) { GetResponse getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("2")); } updateResponse = client .prepareUpdate("test", "type1", "1") .setScript("ctx._source.field += count") .addScriptParam("count", 3) .execute() .actionGet(); assertThat(updateResponse.version(), equalTo(3L)); for (int i = 0; i < 5; i++) { GetResponse getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("5")); } // check noop updateResponse = client .prepareUpdate("test", "type1", "1") .setScript("ctx.op = 'none'") .execute() .actionGet(); assertThat(updateResponse.version(), equalTo(3L)); for (int i = 0; i < 5; i++) { GetResponse getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("5")); } // check delete updateResponse = client .prepareUpdate("test", "type1", "1") .setScript("ctx.op = 'delete'") .execute() .actionGet(); assertThat(updateResponse.version(), equalTo(4L)); for (int i = 0; i < 5; i++) { GetResponse getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.exists(), equalTo(false)); } // check percolation client.prepareIndex("test", "type1", "1").setSource("field", 1).execute().actionGet(); logger.info("--> register a query"); client .prepareIndex("_percolator", "test", "1") .setSource(jsonBuilder().startObject().field("query", termQuery("field", 2)).endObject()) .setRefresh(true) .execute() .actionGet(); updateResponse = client .prepareUpdate("test", "type1", "1") .setScript("ctx._source.field += 1") .setPercolate("*") .execute() .actionGet(); assertThat(updateResponse.matches().size(), equalTo(1)); // check TTL is kept after an update without TTL client .prepareIndex("test", "type1", "2") .setSource("field", 1) .setTTL(86400000L) .setRefresh(true) .execute() .actionGet(); GetResponse getResponse = client.prepareGet("test", "type1", "2").setFields("_ttl").execute().actionGet(); long ttl = ((Number) getResponse.field("_ttl").value()).longValue(); assertThat(ttl, greaterThan(0L)); client .prepareUpdate("test", "type1", "2") .setScript("ctx._source.field += 1") .execute() .actionGet(); getResponse = client.prepareGet("test", "type1", "2").setFields("_ttl").execute().actionGet(); ttl = ((Number) getResponse.field("_ttl").value()).longValue(); assertThat(ttl, greaterThan(0L)); // check TTL update client .prepareUpdate("test", "type1", "2") .setScript("ctx._ttl = 3600000") .execute() .actionGet(); getResponse = client.prepareGet("test", "type1", "2").setFields("_ttl").execute().actionGet(); ttl = ((Number) getResponse.field("_ttl").value()).longValue(); assertThat(ttl, greaterThan(0L)); assertThat(ttl, lessThanOrEqualTo(3600000L)); // check timestamp update client .prepareIndex("test", "type1", "3") .setSource("field", 1) .setRefresh(true) .execute() .actionGet(); client .prepareUpdate("test", "type1", "3") .setScript("ctx._timestamp = \"2009-11-15T14:12:12\"") .execute() .actionGet(); getResponse = client.prepareGet("test", "type1", "3").setFields("_timestamp").execute().actionGet(); long timestamp = ((Number) getResponse.field("_timestamp").value()).longValue(); assertThat(timestamp, equalTo(1258294332000L)); // check fields parameter client.prepareIndex("test", "type1", "1").setSource("field", 1).execute().actionGet(); updateResponse = client .prepareUpdate("test", "type1", "1") .setScript("ctx._source.field += 1") .setFields("_source", "field") .execute() .actionGet(); assertThat(updateResponse.getResult(), notNullValue()); assertThat(updateResponse.getResult().sourceRef(), notNullValue()); assertThat(updateResponse.getResult().field("field").value(), notNullValue()); // check updates without script // add new field client.prepareIndex("test", "type1", "1").setSource("field", 1).execute().actionGet(); updateResponse = client .prepareUpdate("test", "type1", "1") .setDoc(XContentFactory.jsonBuilder().startObject().field("field2", 2).endObject()) .execute() .actionGet(); for (int i = 0; i < 5; i++) { getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("1")); assertThat(getResponse.sourceAsMap().get("field2").toString(), equalTo("2")); } // change existing field updateResponse = client .prepareUpdate("test", "type1", "1") .setDoc(XContentFactory.jsonBuilder().startObject().field("field", 3).endObject()) .execute() .actionGet(); for (int i = 0; i < 5; i++) { getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); assertThat(getResponse.sourceAsMap().get("field").toString(), equalTo("3")); assertThat(getResponse.sourceAsMap().get("field2").toString(), equalTo("2")); } // recursive map Map<String, Object> testMap = new HashMap<String, Object>(); Map<String, Object> testMap2 = new HashMap<String, Object>(); Map<String, Object> testMap3 = new HashMap<String, Object>(); testMap3.put("commonkey", testMap); testMap3.put("map3", 5); testMap2.put("map2", 6); testMap.put("commonkey", testMap2); testMap.put("map1", 8); client.prepareIndex("test", "type1", "1").setSource("map", testMap).execute().actionGet(); updateResponse = client .prepareUpdate("test", "type1", "1") .setDoc(XContentFactory.jsonBuilder().startObject().field("map", testMap3).endObject()) .execute() .actionGet(); for (int i = 0; i < 5; i++) { getResponse = client.prepareGet("test", "type1", "1").execute().actionGet(); Map map1 = (Map) getResponse.sourceAsMap().get("map"); assertThat(map1.size(), equalTo(3)); assertThat(map1.containsKey("map1"), equalTo(true)); assertThat(map1.containsKey("map3"), equalTo(true)); assertThat(map1.containsKey("commonkey"), equalTo(true)); Map map2 = (Map) map1.get("commonkey"); assertThat(map2.size(), equalTo(3)); assertThat(map2.containsKey("map1"), equalTo(true)); assertThat(map2.containsKey("map2"), equalTo(true)); assertThat(map2.containsKey("commonkey"), equalTo(true)); } }