package com.github.obourgain.elasticsearch.http.handler.search;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.assertj.core.api.Assertions;
import org.elasticsearch.action.explain.ExplainRequest;
import org.elasticsearch.action.support.QuerySourceBuilder;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.lookup.SourceLookup;
import org.junit.Test;
import com.github.obourgain.elasticsearch.http.AbstractTest;
import com.github.obourgain.elasticsearch.http.handler.search.explain.ExplainResponse;
import com.github.obourgain.elasticsearch.http.response.ElasticsearchHttpException;
import com.github.obourgain.elasticsearch.http.response.entity.Explanation;
public class ExplainActionHandlerTest extends AbstractTest {
@Test
public void should_search() throws IOException, ExecutionException, InterruptedException {
BytesReference source = source().bytes();
Map<String, Object> expected = SourceLookup.sourceAsMap(source);
index(THE_INDEX, THE_TYPE, THE_ID, expected);
ensureSearchable(THE_INDEX);
refresh();
ExplainRequest request = new ExplainRequest(THE_INDEX, THE_TYPE, THE_ID);
request.source(new QuerySourceBuilder().setQuery(QueryBuilders.matchAllQuery()));
ExplainResponse response = httpClient.explain(request).get();
Assertions.assertThat(response.getIndex()).isEqualTo(THE_INDEX);
Assertions.assertThat(response.getType()).isEqualTo(THE_TYPE);
Assertions.assertThat(response.getId()).isEqualTo(THE_ID);
Assertions.assertThat(response.isMatched()).isTrue();
Explanation explanation = response.getExplanation();
Assertions.assertThat(explanation.getValue()).isEqualTo(1);
Assertions.assertThat(explanation.getDescription()).contains("ConstantScore");
}
@Test
public void should_not_match_on_invalid_query() throws IOException, ExecutionException, InterruptedException {
BytesReference source = source().bytes();
Map<String, Object> expected = SourceLookup.sourceAsMap(source);
index(THE_INDEX, THE_TYPE, THE_ID, expected);
refresh();
ExplainRequest request = new ExplainRequest(THE_INDEX, THE_TYPE, THE_ID);
setSource(request, new BytesArray("{\"invalid_query\":\"bar\"}"));
try {
httpClient.explain(request).get();
}catch (ExecutionException e) {
Assertions.assertThat(e.getCause()).isInstanceOf(ElasticsearchHttpException.class);
Assertions.assertThat(e.getCause().getMessage()).contains("request does not support");
}
}
private void setSource(ExplainRequest request, BytesArray source) {
// workaround as the method to set the source has changed between 1.5.x and 1.6 (the boolean param was removed)
try {
Field field = ExplainRequest.class.getDeclaredField("source");
field.setAccessible(true);
field.set(request, source);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}