public void testWithDocsOnly() throws Exception {
    createIndex("test");
    ensureGreen();

    NumShards test = getNumShards("test");

    int numQueries = randomIntBetween(50, 100);
    logger.info("--> register a queries");
    for (int i = 0; i < numQueries; i++) {
      client()
          .prepareIndex("test", PercolatorService.TYPE_NAME, Integer.toString(i))
          .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject())
          .execute()
          .actionGet();
    }

    MultiPercolateRequestBuilder builder = client().prepareMultiPercolate();
    int numPercolateRequest = randomIntBetween(50, 100);
    for (int i = 0; i < numPercolateRequest; i++) {
      builder.add(
          client()
              .preparePercolate()
              .setIndices("test")
              .setDocumentType("type")
              .setPercolateDoc(
                  docBuilder()
                      .setDoc(jsonBuilder().startObject().field("field", "a").endObject())));
    }

    MultiPercolateResponse response = builder.execute().actionGet();
    assertThat(response.items().length, equalTo(numPercolateRequest));
    for (MultiPercolateResponse.Item item : response) {
      assertThat(item.isFailure(), equalTo(false));
      assertMatchCount(item.getResponse(), numQueries);
      assertThat(item.getResponse().getMatches().length, equalTo(numQueries));
    }

    // All illegal json
    builder = client().prepareMultiPercolate();
    for (int i = 0; i < numPercolateRequest; i++) {
      builder.add(
          client()
              .preparePercolate()
              .setIndices("test")
              .setDocumentType("type")
              .setSource("illegal json"));
    }

    response = builder.execute().actionGet();
    assertThat(response.items().length, equalTo(numPercolateRequest));
    for (MultiPercolateResponse.Item item : response) {
      assertThat(item.isFailure(), equalTo(false));
      assertThat(item.getResponse().getSuccessfulShards(), equalTo(0));
      assertThat(item.getResponse().getShardFailures().length, equalTo(test.numPrimaries));
      for (ShardOperationFailedException shardFailure : item.getResponse().getShardFailures()) {
        assertThat(shardFailure.reason(), containsString("Failed to derive xcontent"));
        assertThat(shardFailure.status().getStatus(), equalTo(400));
      }
    }

    // one valid request
    builder = client().prepareMultiPercolate();
    for (int i = 0; i < numPercolateRequest; i++) {
      builder.add(
          client()
              .preparePercolate()
              .setIndices("test")
              .setDocumentType("type")
              .setSource("illegal json"));
    }
    builder.add(
        client()
            .preparePercolate()
            .setIndices("test")
            .setDocumentType("type")
            .setPercolateDoc(
                docBuilder().setDoc(jsonBuilder().startObject().field("field", "a").endObject())));

    response = builder.execute().actionGet();
    assertThat(response.items().length, equalTo(numPercolateRequest + 1));
    assertThat(response.items()[numPercolateRequest].isFailure(), equalTo(false));
    assertMatchCount(response.items()[numPercolateRequest].getResponse(), numQueries);
    assertThat(
        response.items()[numPercolateRequest].getResponse().getMatches().length,
        equalTo(numQueries));
  }
  public void testBasics() throws Exception {
    assertAcked(prepareCreate("test").addMapping("type", "field1", "type=string"));
    ensureGreen();

    logger.info("--> register a queries");
    client()
        .prepareIndex("test", PercolatorService.TYPE_NAME, "1")
        .setSource(
            jsonBuilder()
                .startObject()
                .field("query", matchQuery("field1", "b"))
                .field("a", "b")
                .endObject())
        .execute()
        .actionGet();
    client()
        .prepareIndex("test", PercolatorService.TYPE_NAME, "2")
        .setSource(
            jsonBuilder().startObject().field("query", matchQuery("field1", "c")).endObject())
        .execute()
        .actionGet();
    client()
        .prepareIndex("test", PercolatorService.TYPE_NAME, "3")
        .setSource(
            jsonBuilder()
                .startObject()
                .field(
                    "query",
                    boolQuery().must(matchQuery("field1", "b")).must(matchQuery("field1", "c")))
                .endObject())
        .execute()
        .actionGet();
    client()
        .prepareIndex("test", PercolatorService.TYPE_NAME, "4")
        .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject())
        .execute()
        .actionGet();

    MultiPercolateResponse response =
        client()
            .prepareMultiPercolate()
            .add(
                client()
                    .preparePercolate()
                    .setIndices("test")
                    .setDocumentType("type")
                    .setPercolateDoc(
                        docBuilder()
                            .setDoc(jsonBuilder().startObject().field("field1", "b").endObject())))
            .add(
                client()
                    .preparePercolate()
                    .setIndices("test")
                    .setDocumentType("type")
                    .setPercolateDoc(
                        docBuilder()
                            .setDoc(yamlBuilder().startObject().field("field1", "c").endObject())))
            .add(
                client()
                    .preparePercolate()
                    .setIndices("test")
                    .setDocumentType("type")
                    .setPercolateDoc(
                        docBuilder()
                            .setDoc(
                                smileBuilder().startObject().field("field1", "b c").endObject())))
            .add(
                client()
                    .preparePercolate()
                    .setIndices("test")
                    .setDocumentType("type")
                    .setPercolateDoc(
                        docBuilder()
                            .setDoc(jsonBuilder().startObject().field("field1", "d").endObject())))
            .add(
                client()
                    .preparePercolate() // non existing doc, so error element
                    .setIndices("test")
                    .setDocumentType("type")
                    .setGetRequest(Requests.getRequest("test").type("type").id("5")))
            .execute()
            .actionGet();

    MultiPercolateResponse.Item item = response.getItems()[0];
    assertMatchCount(item.getResponse(), 2l);
    assertThat(item.getResponse().getMatches(), arrayWithSize(2));
    assertThat(item.getErrorMessage(), nullValue());
    assertThat(
        convertFromTextArray(item.getResponse().getMatches(), "test"),
        arrayContainingInAnyOrder("1", "4"));

    item = response.getItems()[1];
    assertThat(item.getErrorMessage(), nullValue());

    assertMatchCount(item.getResponse(), 2l);
    assertThat(item.getResponse().getMatches(), arrayWithSize(2));
    assertThat(
        convertFromTextArray(item.getResponse().getMatches(), "test"),
        arrayContainingInAnyOrder("2", "4"));

    item = response.getItems()[2];
    assertThat(item.getErrorMessage(), nullValue());
    assertMatchCount(item.getResponse(), 4l);
    assertThat(
        convertFromTextArray(item.getResponse().getMatches(), "test"),
        arrayContainingInAnyOrder("1", "2", "3", "4"));

    item = response.getItems()[3];
    assertThat(item.getErrorMessage(), nullValue());
    assertMatchCount(item.getResponse(), 1l);
    assertThat(item.getResponse().getMatches(), arrayWithSize(1));
    assertThat(convertFromTextArray(item.getResponse().getMatches(), "test"), arrayContaining("4"));

    item = response.getItems()[4];
    assertThat(item.getResponse(), nullValue());
    assertThat(item.getErrorMessage(), notNullValue());
    assertThat(item.getErrorMessage(), containsString("document missing"));
  }
  public void testExistingDocsOnly() throws Exception {
    createIndex("test");

    int numQueries = randomIntBetween(50, 100);
    logger.info("--> register a queries");
    for (int i = 0; i < numQueries; i++) {
      client()
          .prepareIndex("test", PercolatorService.TYPE_NAME, Integer.toString(i))
          .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject())
          .execute()
          .actionGet();
    }

    client()
        .prepareIndex("test", "type", "1")
        .setSource(jsonBuilder().startObject().field("field", "a"))
        .execute()
        .actionGet();

    MultiPercolateRequestBuilder builder = client().prepareMultiPercolate();
    int numPercolateRequest = randomIntBetween(50, 100);
    for (int i = 0; i < numPercolateRequest; i++) {
      builder.add(
          client()
              .preparePercolate()
              .setGetRequest(Requests.getRequest("test").type("type").id("1"))
              .setIndices("test")
              .setDocumentType("type"));
    }

    MultiPercolateResponse response = builder.execute().actionGet();
    assertThat(response.items().length, equalTo(numPercolateRequest));
    for (MultiPercolateResponse.Item item : response) {
      assertThat(item.isFailure(), equalTo(false));
      assertMatchCount(item.getResponse(), numQueries);
      assertThat(item.getResponse().getMatches().length, equalTo(numQueries));
    }

    // Non existing doc
    builder = client().prepareMultiPercolate();
    for (int i = 0; i < numPercolateRequest; i++) {
      builder.add(
          client()
              .preparePercolate()
              .setGetRequest(Requests.getRequest("test").type("type").id("2"))
              .setIndices("test")
              .setDocumentType("type"));
    }

    response = builder.execute().actionGet();
    assertThat(response.items().length, equalTo(numPercolateRequest));
    for (MultiPercolateResponse.Item item : response) {
      assertThat(item.isFailure(), equalTo(true));
      assertThat(item.getErrorMessage(), containsString("document missing"));
      assertThat(item.getResponse(), nullValue());
    }

    // One existing doc
    builder = client().prepareMultiPercolate();
    for (int i = 0; i < numPercolateRequest; i++) {
      builder.add(
          client()
              .preparePercolate()
              .setGetRequest(Requests.getRequest("test").type("type").id("2"))
              .setIndices("test")
              .setDocumentType("type"));
    }
    builder.add(
        client()
            .preparePercolate()
            .setGetRequest(Requests.getRequest("test").type("type").id("1"))
            .setIndices("test")
            .setDocumentType("type"));

    response = builder.execute().actionGet();
    assertThat(response.items().length, equalTo(numPercolateRequest + 1));
    assertThat(response.items()[numPercolateRequest].isFailure(), equalTo(false));
    assertMatchCount(response.items()[numPercolateRequest].getResponse(), numQueries);
    assertThat(
        response.items()[numPercolateRequest].getResponse().getMatches().length,
        equalTo(numQueries));
  }