package io.searchbox.core;
import com.google.gson.JsonArray;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.test.ESIntegTestCase;
import org.json.JSONException;
import org.junit.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import java.io.IOException;
import io.searchbox.client.JestResult;
import io.searchbox.common.AbstractIntegrationTest;
import io.searchbox.core.search.sort.Sort;
import io.searchbox.params.Parameters;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
/**
* @author ferhat
*/
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE, numDataNodes = 2)
public class SearchScrollIntegrationTest extends AbstractIntegrationTest {
private static final String INDEX = "scroll_index";
private static final String TYPE = "user";
@Test
public void searchWithValidQuery() throws IOException, JSONException {
assertAcked(prepareCreate(INDEX).addMapping(TYPE, "{\"properties\":{\"code\":{\"type\":\"keyword\"}}}"));
assertTrue(index(INDEX, TYPE, "swvq1", "{\"code\":\"0\"}").getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(index(INDEX, TYPE, "swvq2", "{\"code\":\"1\"}").getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(index(INDEX, TYPE, "swvq3", "{\"code\":\"2\"}").getResult().equals(DocWriteResponse.Result.CREATED));
refresh();
ensureSearchable(INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(1);
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(INDEX)
.addType(TYPE)
.addSort(new Sort("code"))
.setParameter(Parameters.SCROLL, "5m")
.build();
JestResult result = client.execute(search);
assertTrue(result.getErrorMessage(), result.isSucceeded());
JsonArray hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
assertEquals(
"only 1 document should be returned",
1,
hits.size()
);
String scrollId = result.getJsonObject().get("_scroll_id").getAsString();
for (int i = 1; i < 3; i++) {
SearchScroll scroll = new SearchScroll.Builder(scrollId, "5m").build();
result = client.execute(scroll);
assertTrue(result.getErrorMessage(), result.isSucceeded());
JSONAssert.assertEquals("{\"code\":\"" + i + "\"}", result.getSourceAsString(), false);
hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
assertEquals(
"only 1 document should be returned",
1,
hits.size()
);
scrollId = result.getJsonObject().getAsJsonPrimitive("_scroll_id").getAsString();
}
SearchScroll scroll = new SearchScroll.Builder(scrollId, "5m").build();
result = client.execute(scroll);
assertTrue(result.getErrorMessage(), result.isSucceeded());
assertEquals(
"no results should be left to scroll at this point",
0,
result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits").size()
);
// clear a single scroll id
ClearScroll clearScroll = new ClearScroll.Builder().addScrollId(scrollId).build();
result = client.execute(clearScroll);
assertTrue(result.getErrorMessage(), result.isSucceeded());
}
@Test
public void clearScrollAll() throws IOException, JSONException {
assertAcked(prepareCreate(INDEX).addMapping(TYPE, "{\"properties\":{\"code\":{\"type\":\"keyword\"}}}"));
assertTrue(index(INDEX, TYPE, "swvq1", "{\"code\":\"0\"}").getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(index(INDEX, TYPE, "swvq2", "{\"code\":\"1\"}").getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(index(INDEX, TYPE, "swvq3", "{\"code\":\"2\"}").getResult().equals(DocWriteResponse.Result.CREATED));
refresh();
ensureSearchable(INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(1);
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(INDEX)
.addType(TYPE)
.addSort(new Sort("code"))
.setParameter(Parameters.SCROLL, "5m")
.build();
JestResult result = client.execute(search);
assertTrue(result.getErrorMessage(), result.isSucceeded());
JsonArray hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
assertEquals(
"only 1 document should be returned",
1,
hits.size()
);
String scrollId = result.getJsonObject().get("_scroll_id").getAsString();
for (int i = 1; i < 3; i++) {
SearchScroll scroll = new SearchScroll.Builder(scrollId, "5m").build();
result = client.execute(scroll);
assertTrue(result.getErrorMessage(), result.isSucceeded());
JSONAssert.assertEquals("{\"code\":\"" + i + "\"}", result.getSourceAsString(), false);
hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
assertEquals(
"only 1 document should be returned",
1,
hits.size()
);
scrollId = result.getJsonObject().getAsJsonPrimitive("_scroll_id").getAsString();
}
SearchScroll scroll = new SearchScroll.Builder(scrollId, "5m").build();
result = client.execute(scroll);
assertTrue(result.getErrorMessage(), result.isSucceeded());
assertEquals(
"no results should be left to scroll at this point",
0,
result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits").size()
);
// clear all scroll ids
ClearScroll clearScroll = new ClearScroll.Builder().build();
result = client.execute(clearScroll);
assertTrue(result.getErrorMessage(), result.isSucceeded());
}
}