/*
* JBoss, Home of Professional Open Source
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.searchisko.api.service;
import org.junit.Assert;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;
import org.json.JSONException;
import org.junit.Test;
import org.mockito.Mockito;
import org.searchisko.api.cache.RegisteredQueryCache;
import org.searchisko.api.model.QuerySettings;
import org.searchisko.api.testtools.ESRealClientTestBase;
import org.searchisko.api.testtools.TestUtils;
import org.searchisko.persistence.service.EntityService;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
/**
* Unit test of {@link SearchService}'s registered query.
*
* @author Lukas Vlcek
*/
public class SearchServiceTest_registeredQuery extends SearchServiceTestBase {
class InnerESRealClient extends ESRealClientTestBase {}
private void prepareData(InnerESRealClient testHelper) {
testHelper.indexCreate("idx_provider3_issue");
testHelper.indexCreate("idx_provider3_mailing");
testHelper.indexMappingCreate("idx_provider3_issue", "t_provider3_issue", "{ \"t_provider3_issue\": {}}");
testHelper.indexMappingCreate("idx_provider3_mailing", "t_provider3_mailing", "{ \"t_provider3_mailing\": {}}");
// index data
testHelper.indexInsertDocument("idx_provider3_issue", "t_provider3_issue", "1", "{\"field1\": \"value1\"}");
testHelper.indexInsertDocument("idx_provider3_issue", "t_provider3_issue", "2", "{\"field1\": \"value2\"}");
testHelper.indexInsertDocument("idx_provider3_issue", "t_provider3_issue", "3", "{\"field1\": \"value3\"}");
testHelper.indexInsertDocument("idx_provider3_mailing", "t_provider3_mailing", "1", "{\"field1\": \"value1\"}");
testHelper.indexInsertDocument("idx_provider3_mailing", "t_provider3_mailing", "2", "{\"field1\": \"value2\"}");
testHelper.indexFlushAndRefresh();
}
private void deleteDataAndIndices(InnerESRealClient testHelper) {
testHelper.indexDelete("idx_provider3_issue");
testHelper.indexDelete("idx_provider3_mailing");
}
@Test
public void testRegisteredQueryMatchAllWithOptions() throws ReflectiveOperationException, IOException, JSONException {
InnerESRealClient testHelper = new InnerESRealClient();
try {
SearchClientService searchClientService = testHelper.prepareSearchClientServiceMock("SearchServiceTest_registeredQuery[1]");
prepareData(testHelper);
ConfigService configService = mockConfigurationService();
SearchService searchService = getTested(configService);
mockProviderConfiguration(searchService, "/search/provider_3.json");
RegisteredQueryService registeredQueryService = getRegisteredQueryService(searchClientService);
searchService.registeredQueryService = registeredQueryService;
// create registered query
Map<String, Object> template = TestUtils.loadJSONFromClasspathFile("/registered_query/default_all_content.json");
registeredQueryService.create("default_all_content", template);
RegisteredQueryCache queryCache = Mockito.mock(RegisteredQueryCache.class);
Mockito.when(queryCache.get("default_all_content")).thenReturn(template);
registeredQueryService.registeredQueryCache = queryCache;
// Basic match_all query test (including internal ES behaviour test)
// also test the `default` level for `sys_content_type`.
{
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("query_type", "match_all");
QuerySettings.Filters filters = new QuerySettings.Filters();
filters.acknowledgeUrlFilterCandidate("query_type", "match_all");
searchService.parsedFilterConfigService.prepareFiltersForRequest(filters);
SearchRequestBuilder srb = new SearchRequestBuilder(searchClientService.getClient());
searchService.performSearchTemplateInternal("default_all_content", templateParams, filters, srb);
// This is to test Elasticsearch internal behaviour. It might be important to learn if it changes.
// If SearchRequestBuilder (SRB) setTemplateName(), setTemplateType() and setTemplateParams()
// are called it is not reflected in any way in .toString() method. Worse is that call to any other
// methods on SRB after that is reflected in toString() but ignored during query execution.
// For example if you pass SRB to some method then setting anything on SRB inside this method
// may not have any effect if template has been already set on it.
TestUtils.assertJsonContent("{}", srb.toString());
// We set fields on the SRB but we will see later that this was not reflected in results.
srb.addFields("field1"); // [1]
TestUtils.assertJsonContent("{ \"fields\": \"field1\" }", srb.toString());
SearchResponse response = srb.get();
Assert.assertEquals(5, response.getHits().getTotalHits());
for (SearchHit hit : response.getHits().getHits()) {
// if setting fields (see [1]) were reflected then fields map could not have been empty
Assert.assertTrue(hit.fields().isEmpty());
}
}
// Test using sys_type URL parameter
{
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("query_type", "match_all");
templateParams.put("sys_type", "mailing");
QuerySettings.Filters filters = new QuerySettings.Filters();
filters.acknowledgeUrlFilterCandidate("query_type", "match_all");
filters.acknowledgeUrlFilterCandidate("sys_type", "mailing");
searchService.parsedFilterConfigService.prepareFiltersForRequest(filters);
SearchRequestBuilder srb = new SearchRequestBuilder(searchClientService.getClient());
searchService.performSearchTemplateInternal("default_all_content", templateParams, filters, srb);
SearchResponse response = srb.get();
Assert.assertEquals(2, response.getHits().getTotalHits());
}
// Test using type URL parameter
{
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("query_type", "match_all");
templateParams.put("type", "provider3_mailing");
QuerySettings.Filters filters = new QuerySettings.Filters();
filters.acknowledgeUrlFilterCandidate("query_type", "match_all");
filters.acknowledgeUrlFilterCandidate("type", "provider3_mailing");
searchService.parsedFilterConfigService.prepareFiltersForRequest(filters);
SearchRequestBuilder srb = new SearchRequestBuilder(searchClientService.getClient());
searchService.performSearchTemplateInternal("default_all_content", templateParams, filters, srb);
SearchResponse response = srb.get();
Assert.assertEquals(2, response.getHits().getTotalHits());
}
// Test using type and sys_type URL parameter
{
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("query_type", "match_all");
templateParams.put("sys_type", "mailing");
templateParams.put("type", Arrays.asList("provider3_issue", "provider3_mailing"));
QuerySettings.Filters filters = new QuerySettings.Filters();
filters.acknowledgeUrlFilterCandidate("query_type", "match_all");
filters.acknowledgeUrlFilterCandidate("sys_type", "mailing");
filters.acknowledgeUrlFilterCandidate("type", "provider3_issue", "provider3_mailing");
searchService.parsedFilterConfigService.prepareFiltersForRequest(filters);
SearchRequestBuilder srb = new SearchRequestBuilder(searchClientService.getClient());
searchService.performSearchTemplateInternal("default_all_content", templateParams, filters, srb);
SearchResponse response = srb.get();
Assert.assertEquals(5, response.getHits().getTotalHits());
}
} finally {
deleteDataAndIndices(testHelper);
testHelper.finalizeESClientForUnitTest();
}
}
@Test
public void testRegisteredQuery_Default_SysContentType() throws ReflectiveOperationException, IOException, JSONException {
InnerESRealClient testHelper = new InnerESRealClient();
try {
SearchClientService searchClientService = testHelper.prepareSearchClientServiceMock("SearchServiceTest_registeredQuery[2]");
prepareData(testHelper);
ConfigService configService = mockConfigurationService();
SearchService searchService = getTested(configService);
mockProviderConfiguration(searchService, "/search/provider_3.json");
RegisteredQueryService registeredQueryService = getRegisteredQueryService(searchClientService);
searchService.registeredQueryService = registeredQueryService;
// create registered query
Map<String, Object> template = TestUtils.loadJSONFromClasspathFile("/registered_query/default_sys_content_type.json");
registeredQueryService.create("default_sys_content_type", template);
RegisteredQueryCache queryCache = Mockito.mock(RegisteredQueryCache.class);
Mockito.when(queryCache.get("default_sys_content_type")).thenReturn(template);
registeredQueryService.registeredQueryCache = queryCache;
{
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("query_type", "match_all");
QuerySettings.Filters filters = new QuerySettings.Filters();
filters.acknowledgeUrlFilterCandidate("query_type", "match_all");
searchService.parsedFilterConfigService.prepareFiltersForRequest(filters);
SearchRequestBuilder srb = new SearchRequestBuilder(searchClientService.getClient());
searchService.performSearchTemplateInternal("default_sys_content_type", templateParams, filters, srb);
SearchResponse response = srb.get();
Assert.assertEquals(3, response.getHits().getTotalHits());
}
} finally {
deleteDataAndIndices(testHelper);
testHelper.finalizeESClientForUnitTest();
}
}
protected RegisteredQueryService getRegisteredQueryService(SearchClientService searchClientService) {
RegisteredQueryService rqs = new RegisteredQueryService();
rqs.searchClientService = searchClientService;
rqs.searchClientService.log = Logger.getLogger("testlogger");
rqs.entityService = Mockito.mock(EntityService.class);
return rqs;
}
@Test
public void testRegisteredQuery_Default_SysType() throws ReflectiveOperationException, IOException, JSONException {
InnerESRealClient testHelper = new InnerESRealClient();
try {
SearchClientService searchClientService = testHelper.prepareSearchClientServiceMock("SearchServiceTest_registeredQuery[3]");
prepareData(testHelper);
ConfigService configService = mockConfigurationService();
SearchService searchService = getTested(configService);
mockProviderConfiguration(searchService, "/search/provider_3.json");
RegisteredQueryService registeredQueryService = getRegisteredQueryService(searchClientService);
searchService.registeredQueryService = registeredQueryService;
// create registered query
Map<String, Object> template = TestUtils.loadJSONFromClasspathFile("/registered_query/default_sys_type.json");
registeredQueryService.create("default_sys_type", template);
RegisteredQueryCache queryCache = Mockito.mock(RegisteredQueryCache.class);
Mockito.when(queryCache.get("default_sys_type")).thenReturn(template);
registeredQueryService.registeredQueryCache = queryCache;
{
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("query_type", "match_all");
QuerySettings.Filters filters = new QuerySettings.Filters();
filters.acknowledgeUrlFilterCandidate("query_type", "match_all");
searchService.parsedFilterConfigService.prepareFiltersForRequest(filters);
SearchRequestBuilder srb = new SearchRequestBuilder(searchClientService.getClient());
searchService.performSearchTemplateInternal("default_sys_type", templateParams, filters, srb);
SearchResponse response = srb.get();
Assert.assertEquals(3, response.getHits().getTotalHits());
}
} finally {
deleteDataAndIndices(testHelper);
testHelper.finalizeESClientForUnitTest();
}
}
}