예제 #1
0
  @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"));
    }
  }
예제 #2
0
  @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));
    }
  }