package io.searchbox.core;
import io.searchbox.client.JestResult;
import io.searchbox.common.AbstractIntegrationTest;
import io.searchbox.core.SearchResult.Hit;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.test.ESIntegTestCase;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
/**
* @author Bobby Hubbard
*/
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE, numDataNodes = 1)
public class SearchTemplateIntegrationTest extends AbstractIntegrationTest {
private static final String INDEX = "twitter";
private static final String TYPE = "tweet";
private static final String QUERY =
"{" +
" \"id\": \"templateId\"," +
" \"params\": {" +
" \"user\" : \"kimchy1\"" +
" }" +
"}";
private static final String INLINE =
"{" +
" \"inline\": {" +
" \"query\": {" +
" \"term\": {" +
" \"user\" : \"{{user}}\"" +
" }" +
" }," +
" \"sort\": \"num\"" +
" }," +
" \"params\": {" +
" \"user\" : \"kimchy1\"" +
" }" +
"}";
private static final String TEMPLATE =
"{" +
" \"template\": {" +
" \"query\": {" +
" \"term\": {" +
" \"user\" : \"{{user}}\"" +
" }" +
" }," +
" \"sort\": \"num\"" +
" }" +
"}";
@Test
public void searchWithValidQuery() throws IOException {
JestResult result = client.execute(new Search.TemplateBuilder(INLINE).build());
assertTrue(result.getErrorMessage(), result.isSucceeded());
}
@Test
public void searchTemplateInlineScript() throws Exception {
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"kimchy1\",\"num\":1}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"abcdef\",\"num\":2}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"abcdef\",\"num\":3}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
//template includes sort
SearchResult result = client.execute(new Search.TemplateBuilder(INLINE).build());
assertTrue(result.getErrorMessage(), result.isSucceeded());
List<SearchResult.Hit<Object, Void>> hits = result.getHits(Object.class);
assertEquals(1, hits.size());
Hit<Object, Void> hit0 = hits.get(0);
//check user
assertEquals("kimchy1", ((Map)hit0.source).get("user"));
}
@Test
public void searchTemplateInlineScriptWithSort() throws Exception {
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"kimchy1\",\"num\":1}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"kimchy1\",\"num\":0}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"\"}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
//template includes sort
SearchResult result = client.execute(new Search.TemplateBuilder(INLINE).build());
assertTrue(result.getErrorMessage(), result.isSucceeded());
List<SearchResult.Hit<Object, Void>> hits = result.getHits(Object.class);
assertEquals(2, hits.size());
Hit<Object, Void> hit0 = hits.get(0);
Hit<Object, Void> hit1 = hits.get(1);
//check sort
assertEquals(1, hit0.sort.size());
assertEquals("0", hit0.sort.get(0));
assertEquals(1, hit1.sort.size());
assertEquals("1", hit1.sort.get(0));
//check user
assertEquals("kimchy1", ((Map)hit0.source).get("user"));
assertEquals("kimchy1", ((Map)hit1.source).get("user"));
}
@Test
public void searchTemplateIdScriptWithSort() throws Exception {
assertAcked(client().admin().cluster().preparePutStoredScript()
.setLang("mustache")
.setId("templateId")
.setContent(new BytesArray(TEMPLATE), XContentType.JSON)
.get());
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"kimchy1\",\"num\":1}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"kimchy1\",\"num\":0}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
assertTrue(client().index(new IndexRequest(INDEX, TYPE).source("{\"user\":\"\"}").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)).actionGet().getResult().equals(DocWriteResponse.Result.CREATED));
//template includes sort
SearchResult result = client.execute(new Search.TemplateBuilder(QUERY).build());
assertTrue(result.getErrorMessage(), result.isSucceeded());
List<SearchResult.Hit<Object, Void>> hits = result.getHits(Object.class);
assertEquals(2, hits.size());
Hit<Object, Void> hit0 = hits.get(0);
Hit<Object, Void> hit1 = hits.get(1);
//check sort
assertEquals(1, hit0.sort.size());
assertEquals("0", hit0.sort.get(0));
assertEquals(1, hit1.sort.size());
assertEquals("1", hit1.sort.get(0));
//check user
assertEquals("kimchy1", ((Map)hit0.source).get("user"));
assertEquals("kimchy1", ((Map)hit1.source).get("user"));
}
//TODO: Test file-based templates $ES_CONFIG/scripts/test.mustache
}