/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.solr.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FieldStatsInfo;
import org.apache.solr.client.solrj.response.Group;
import org.apache.solr.client.solrj.response.GroupCommand;
import org.apache.solr.client.solrj.response.GroupResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.RangeFacet;
import org.apache.solr.client.solrj.response.TermsResponse;
import org.apache.solr.client.solrj.response.TermsResponse.Term;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.util.NamedList;
import org.hamcrest.collection.IsEmptyIterable;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.hamcrest.core.IsEqual;
import org.hamcrest.core.IsNull;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.FacetOptions;
import org.springframework.data.solr.core.query.FacetQuery;
import org.springframework.data.solr.core.query.Field;
import org.springframework.data.solr.core.query.GroupOptions;
import org.springframework.data.solr.core.query.PivotField;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleFacetQuery;
import org.springframework.data.solr.core.query.SimpleField;
import org.springframework.data.solr.core.query.SimplePivotField;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.SimpleStringCriteria;
import org.springframework.data.solr.core.query.SolrDataQuery;
import org.springframework.data.solr.core.query.result.FacetFieldEntry;
import org.springframework.data.solr.core.query.result.FacetPivotFieldEntry;
import org.springframework.data.solr.core.query.result.FacetQueryEntry;
import org.springframework.data.solr.core.query.result.FieldStatsResult;
import org.springframework.data.solr.core.query.result.GroupEntry;
import org.springframework.data.solr.core.query.result.GroupResult;
import org.springframework.data.solr.core.query.result.HighlightEntry;
import org.springframework.data.solr.core.query.result.HighlightEntry.Highlight;
import org.springframework.data.solr.core.query.result.SolrResultPage;
import org.springframework.data.solr.core.query.result.StatsResult;
import org.springframework.data.solr.core.query.result.TermsFieldEntry;
/**
* @author Christoph Strobl
* @author Francisco Spaeth
*/
@RunWith(MockitoJUnitRunner.Silent.class)
public class ResultHelperTests {
@Mock private QueryResponse response;
@Test
public void testConvertFacetQueryResponseForNullQueryResponse() {
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPageMap(createFacetQuery("field_1"), null);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test(expected = IllegalArgumentException.class)
public void testConvertFacetQueryResponseForNullQuery() {
ResultHelper.convertFacetQueryResponseToFacetPageMap(null, null);
}
@Test
public void testConvertFacetQueryResponseForQueryWithoutFacetOptions() {
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPageMap(new SimpleFacetQuery(new Criteria("field_1")), null);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithNullFacetFields() {
Mockito.when(response.getFacetFields()).thenReturn(null);
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPageMap(createFacetQuery("field_1"), response);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithEmptyFacetFields() {
Mockito.when(response.getFacetFields()).thenReturn(Collections.<FacetField> emptyList());
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPageMap(createFacetQuery("field_1"), response);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithSingleFacetFieldWithoutValues() {
List<FacetField> fieldList = new ArrayList<>(1);
FacetField ffield = new FacetField("field_1");
fieldList.add(ffield);
Mockito.when(response.getFacetFields()).thenReturn(fieldList);
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPageMap(createFacetQuery("field_1"), response);
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Entry<Field, Page<FacetFieldEntry>> resultEntry = result.entrySet().iterator().next();
Assert.assertEquals(ffield.getName(), resultEntry.getKey().getName());
Assert.assertTrue(resultEntry.getValue().getContent().isEmpty());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithSingeFacetField() {
List<FacetField> fieldList = new ArrayList<>(1);
FacetField ffield = createFacetField("field_1", 1, 2);
fieldList.add(ffield);
Mockito.when(response.getFacetFields()).thenReturn(fieldList);
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPageMap(createFacetQuery("field_1"), response);
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Entry<Field, Page<FacetFieldEntry>> resultEntry = result.entrySet().iterator().next();
Assert.assertEquals(ffield.getName(), resultEntry.getKey().getName());
Assert.assertEquals(2, resultEntry.getValue().getContent().size());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithNullFacetQueries() {
Mockito.when(response.getFacetQuery()).thenReturn(null);
List<FacetQueryEntry> result = ResultHelper.convertFacetQueryResponseToFacetQueryResult(
createFacetQuery(new SimpleQuery(new SimpleStringCriteria("field_1:[* TO 5]"))), response);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithEmptyFacetQueries() {
Mockito.when(response.getFacetQuery()).thenReturn(Collections.<String, Integer> emptyMap());
List<FacetQueryEntry> result = ResultHelper.convertFacetQueryResponseToFacetQueryResult(
createFacetQuery(new SimpleQuery(new SimpleStringCriteria("field_1:[* TO 5]"))), response);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetQueryResponseForQueryResultWithFacetQueries() {
Map<String, Integer> resultMap = new LinkedHashMap<>(2);
resultMap.put("field_1:[* TO 5]", 5);
resultMap.put("field_1:[6 TO *]", 10);
Mockito.when(response.getFacetQuery()).thenReturn(resultMap);
List<FacetQueryEntry> result = ResultHelper.convertFacetQueryResponseToFacetQueryResult(
createFacetQuery(new SimpleQuery(new SimpleStringCriteria("field_1:[* TO 5]")),
new SimpleQuery(new SimpleStringCriteria("field_1:[6 TO *]"))),
response);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.size());
Assert.assertEquals(5, result.get(0).getValueCount());
Assert.assertEquals("field_1:[* TO 5]", result.get(0).getValue());
Assert.assertEquals("field_1:[* TO 5]", result.get(0).getKey());
Assert.assertEquals("field_1:[* TO 5]", result.get(0).getQuery().getCriteria().toString());
Assert.assertEquals(10, result.get(1).getValueCount());
Assert.assertEquals("field_1:[6 TO *]", result.get(1).getValue());
Assert.assertEquals("field_1:[6 TO *]", result.get(1).getKey());
Assert.assertEquals("field_1:[6 TO *]", result.get(1).getQuery().getCriteria().toString());
}
@Test
public void testParseAndAddHighlightQueryResponseToResultPageWithEmptyHighlighting() {
Mockito.when(response.getHighlighting()).thenReturn(Collections.<String, Map<String, List<String>>> emptyMap());
Assert.assertTrue(ResultHelper.convertAndAddHighlightQueryResponseToResultPage(response,
new SolrResultPage<>(Collections.singletonList(new Object()))).isEmpty());
}
@Test
public void testParseAndAddHighlightQueryResponseToResultPageWithNullHighlighting() {
Mockito.when(response.getHighlighting()).thenReturn(null);
Assert.assertTrue(ResultHelper.convertAndAddHighlightQueryResponseToResultPage(response,
new SolrResultPage<>(Collections.singletonList(new Object()))).isEmpty());
}
@Test
public void testParseAndAddHighlightQueryResponseToResultPageWithNullResponse() {
Assert.assertTrue(ResultHelper.convertAndAddHighlightQueryResponseToResultPage(null,
new SolrResultPage<>(Collections.singletonList(new Object()))).isEmpty());
}
@Test
public void testParseAndAddHighlightQueryResponseToResultPage() {
Map<String, Map<String, List<String>>> highlightingData = new LinkedHashMap<>();
Map<String, List<String>> fieldHighlights = new LinkedHashMap<>();
fieldHighlights.put("field_1", Arrays.asList("highlight 1", "highlight 2"));
fieldHighlights.put("field_2", Collections.singletonList("highlight 3"));
highlightingData.put("entity-id-1", fieldHighlights);
Mockito.when(response.getHighlighting()).thenReturn(highlightingData);
SolrBeanWithIdNamedField resultBean = new SolrBeanWithIdNamedField("entity-id-1");
List<HighlightEntry<SolrBeanWithIdNamedField>> result = ResultHelper
.convertAndAddHighlightQueryResponseToResultPage(response,
new SolrResultPage<>(Collections.singletonList(resultBean)));
Assert.assertEquals(1, result.size());
Assert.assertEquals(resultBean, result.get(0).getEntity());
Assert.assertEquals(2, result.get(0).getHighlights().size());
for (HighlightEntry<SolrBeanWithIdNamedField> entry : result) {
Assert.assertEquals(resultBean, entry.getEntity());
for (Highlight highlight : entry.getHighlights()) {
Assert.assertTrue(fieldHighlights.containsKey(highlight.getField().getName()));
Assert.assertEquals(fieldHighlights.get(highlight.getField().getName()), highlight.getSnipplets());
}
}
}
@Test
public void testParseAndAddHighlightQueryResponseWithMultipleEntriesToResultPage() {
Map<String, Map<String, List<String>>> highlightingData = new LinkedHashMap<>();
Map<String, List<String>> fieldHighlightsEntity1 = new LinkedHashMap<>();
fieldHighlightsEntity1.put("field_1", Arrays.asList("highlight 1", "highlight 2"));
fieldHighlightsEntity1.put("field_2", Collections.singletonList("highlight 3"));
highlightingData.put("entity-id-1", fieldHighlightsEntity1);
Map<String, List<String>> fieldHighlightsEntity2 = new LinkedHashMap<>();
fieldHighlightsEntity2.put("field_3", Collections.singletonList("highlight 3"));
highlightingData.put("entity-id-2", fieldHighlightsEntity2);
Mockito.when(response.getHighlighting()).thenReturn(highlightingData);
SolrBeanWithIdNamedField resultBean1 = new SolrBeanWithIdNamedField("entity-id-1");
SolrBeanWithIdNamedField resultBean2 = new SolrBeanWithIdNamedField("entity-id-2");
List<HighlightEntry<SolrBeanWithIdNamedField>> result = ResultHelper
.convertAndAddHighlightQueryResponseToResultPage(response,
new SolrResultPage<>(Arrays.asList(resultBean1, resultBean2)));
Assert.assertEquals(2, result.size());
Assert.assertEquals(resultBean1, result.get(0).getEntity());
Assert.assertEquals(resultBean2, result.get(1).getEntity());
Assert.assertEquals(2, result.get(0).getHighlights().size());
Assert.assertEquals(1, result.get(1).getHighlights().size());
}
@Test
public void testParseAndAddHighlightQueryResponseForBeanWithAnnotatedId() {
Map<String, Map<String, List<String>>> highlightingData = new LinkedHashMap<>();
Map<String, List<String>> fieldHighlights = new LinkedHashMap<>();
fieldHighlights.put("field_1", Arrays.asList("highlight 1", "highlight 2"));
fieldHighlights.put("field_2", Collections.singletonList("highlight 3"));
highlightingData.put("entity-id-1", fieldHighlights);
Mockito.when(response.getHighlighting()).thenReturn(highlightingData);
SolrBeanWithAnnoteatedIdNamedField resultBean = new SolrBeanWithAnnoteatedIdNamedField("entity-id-1");
List<HighlightEntry<SolrBeanWithAnnoteatedIdNamedField>> result = ResultHelper
.convertAndAddHighlightQueryResponseToResultPage(response,
new SolrResultPage<>(Collections.singletonList(resultBean)));
Assert.assertEquals(1, result.size());
Assert.assertEquals(resultBean, result.get(0).getEntity());
Assert.assertEquals(2, result.get(0).getHighlights().size());
for (HighlightEntry<SolrBeanWithAnnoteatedIdNamedField> entry : result) {
Assert.assertEquals(resultBean, entry.getEntity());
for (Highlight highlight : entry.getHighlights()) {
Assert.assertTrue(fieldHighlights.containsKey(highlight.getField().getName()));
Assert.assertEquals(fieldHighlights.get(highlight.getField().getName()), highlight.getSnipplets());
}
}
}
@Test
public void testConvertFacetRangeQueryResponseToFacetPageMapForNullQueryResponse() {
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToRangeFacetPageMap(this.createFacetQuery("field_1"), null);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test(expected = IllegalArgumentException.class)
public void testConvertFacetRangeQueryResponseForNullQuery() {
ResultHelper.convertFacetQueryResponseToRangeFacetPageMap(null, null);
}
@Test
public void testConvertFacetRangeQueryResponseForQueryWithoutFacetOptions() {
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToRangeFacetPageMap(new SimpleFacetQuery(new SimpleStringCriteria("*:*")), null);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetRangeQueryResponseForQueryResultWithNullFacetFields() {
Mockito.when(response.getFacetFields()).thenReturn(null);
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToRangeFacetPageMap(createFacetQuery("field_1"), response);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetRangeQueryResponseForQueryResultWithEmptyFacetFields() {
Mockito.when(response.getFacetFields()).thenReturn(Collections.<FacetField> emptyList());
Map<Field, Page<FacetFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToRangeFacetPageMap(createFacetQuery("field_1"), response);
Assert.assertNotNull(result);
Assert.assertTrue(result.isEmpty());
}
@Test
public void testConvertFacetQueryResponseToFacetPivotMap() {
NamedList<List<org.apache.solr.client.solrj.response.PivotField>> pivotData = new NamedList<>();
List<org.apache.solr.client.solrj.response.PivotField> vals = new ArrayList<>();
{
List<org.apache.solr.client.solrj.response.PivotField> pivotValues = new ArrayList<>();
pivotValues
.add(new org.apache.solr.client.solrj.response.PivotField("field_2", "value_1_1", 7, null, null, null, null));
pivotValues
.add(new org.apache.solr.client.solrj.response.PivotField("field_2", "value_1_2", 3, null, null, null, null));
vals.add(new org.apache.solr.client.solrj.response.PivotField("field_1", "value_1", 10, pivotValues, null, null,
null));
}
{
List<org.apache.solr.client.solrj.response.PivotField> pivotValues = new ArrayList<>();
pivotValues
.add(new org.apache.solr.client.solrj.response.PivotField("field_2", "value_2_1", 2, null, null, null, null));
vals.add(
new org.apache.solr.client.solrj.response.PivotField("field_1", "value_2", 2, pivotValues, null, null, null));
}
pivotData.add("field_1,field_2", vals);
Mockito.when(response.getFacetPivot()).thenReturn(pivotData);
Map<PivotField, List<FacetPivotFieldEntry>> result = ResultHelper
.convertFacetQueryResponseToFacetPivotMap(createFacetPivotQuery("field_1", "field_2"), response);
List<FacetPivotFieldEntry> resultPivot = result.get(new SimplePivotField("field_1", "field_2"));
Assert.assertNotNull(result);
Assert.assertEquals(2, resultPivot.size());
Assert.assertNotNull(resultPivot.get(0));
Assert.assertEquals("value_1", resultPivot.get(0).getValue());
Assert.assertNotNull(resultPivot.get(0).getField());
Assert.assertEquals("field_1", resultPivot.get(0).getField().getName());
Assert.assertEquals(10, resultPivot.get(0).getValueCount());
Assert.assertNotNull(resultPivot.get(0).getPivot());
Assert.assertEquals(2, resultPivot.get(0).getPivot().size());
{
List<FacetPivotFieldEntry> pivot = resultPivot.get(0).getPivot();
Assert.assertEquals("value_1_1", pivot.get(0).getValue());
Assert.assertNotNull(pivot.get(0).getField());
Assert.assertEquals("field_2", pivot.get(0).getField().getName());
Assert.assertEquals(7, pivot.get(0).getValueCount());
Assert.assertNull(pivot.get(0).getPivot());
Assert.assertEquals("value_1_2", pivot.get(1).getValue());
Assert.assertNotNull(pivot.get(1).getField());
Assert.assertEquals("field_2", pivot.get(1).getField().getName());
Assert.assertEquals(3, pivot.get(1).getValueCount());
Assert.assertNull(pivot.get(1).getPivot());
}
{
List<FacetPivotFieldEntry> pivot = resultPivot.get(1).getPivot();
Assert.assertEquals("value_2_1", pivot.get(0).getValue());
Assert.assertNotNull(pivot.get(0).getField());
Assert.assertEquals("field_2", pivot.get(0).getField().getName());
Assert.assertEquals(2, pivot.get(0).getValueCount());
Assert.assertNull(pivot.get(0).getPivot());
}
Assert.assertNotNull(resultPivot.get(0).getPivot().get(0));
}
@Test
public void testConvertTermsQueryResponseReturnsTermsMapCorrectlyWhenOneFieldReturned() {
TermsResponse termsResponse = new TermsResponse(new NamedList<>());
termsResponse.getTermMap().put("field_1", Arrays.asList(new Term("term_1", 10), new Term("term_2", 5)));
Mockito.when(response.getTermsResponse()).thenReturn(termsResponse);
Map<String, List<TermsFieldEntry>> result = ResultHelper.convertTermsQueryResponseToTermsMap(response);
Assert.assertEquals(1, result.size());
Assert.assertEquals("term_1", result.get("field_1").get(0).getValue());
Assert.assertEquals(10L, result.get("field_1").get(0).getValueCount());
Assert.assertEquals("field_1", result.get("field_1").get(0).getField().getName());
Assert.assertEquals("term_2", result.get("field_1").get(1).getValue());
Assert.assertEquals(5L, result.get("field_1").get(1).getValueCount());
Assert.assertEquals("field_1", result.get("field_1").get(1).getField().getName());
}
@Test
public void testConvertTermsQueryResponseReturnsTermsMapCorrectlyWhenMultipleFieldsReturned() {
TermsResponse termsResponse = new TermsResponse(new NamedList<>());
termsResponse.getTermMap().put("field_1", Arrays.asList(new Term("term_1", 10), new Term("term_2", 5)));
termsResponse.getTermMap().put("field_2", Arrays.asList(new Term("term_2", 2), new Term("term_3", 1)));
Mockito.when(response.getTermsResponse()).thenReturn(termsResponse);
Map<String, List<TermsFieldEntry>> result = ResultHelper.convertTermsQueryResponseToTermsMap(response);
Assert.assertEquals(2, result.size());
Assert.assertEquals("field_1", result.get("field_1").get(0).getField().getName());
Assert.assertEquals("field_2", result.get("field_2").get(0).getField().getName());
}
@Test
public void testConvertTermsQueryResponseReturnsEmtpyMapWhenResponseIsNull() {
Assert.assertThat(ResultHelper.convertTermsQueryResponseToTermsMap(null),
IsEqual.equalTo(Collections.<String, List<TermsFieldEntry>> emptyMap()));
}
@Test
public void testConvertTermsQueryResponseReturnsEmtpyMapWhenTermsResponseIsNull() {
Mockito.when(response.getTermsResponse()).thenReturn(null);
Assert.assertThat(ResultHelper.convertTermsQueryResponseToTermsMap(response),
IsEqual.equalTo(Collections.<String, List<TermsFieldEntry>> emptyMap()));
}
@Test
public void testConvertTermsQueryResponseReturnsEmtpyMapWhenTermsMapIsEmpty() {
TermsResponse termsResponse = new TermsResponse(new NamedList<>());
Mockito.when(response.getTermsResponse()).thenReturn(termsResponse);
Assert.assertThat(ResultHelper.convertTermsQueryResponseToTermsMap(response),
IsEqual.equalTo(Collections.<String, List<TermsFieldEntry>> emptyMap()));
}
@Test // DATASOLR-121
public void testConvertGroupQueryResponseToGroupResultList() {
GroupResponse groupResponse = Mockito.mock(GroupResponse.class);
Query query = Mockito.mock(Query.class);
SolrTemplate solrTemplate = Mockito.mock(SolrTemplate.class);
GroupCommand groupCommand1 = Mockito.mock(GroupCommand.class);
Group group1_1 = Mockito.mock(Group.class);
SolrDocumentList group1_1DocumentList = Mockito.mock(SolrDocumentList.class);
List<Object> documents1_1 = Collections.singletonList(new Object());
Mockito.when(response.getGroupResponse()).thenReturn(groupResponse);
Mockito.when(groupResponse.getValues()).thenReturn(Collections.singletonList(groupCommand1));
Mockito.when(groupCommand1.getValues()).thenReturn(Collections.singletonList(group1_1));
Mockito.when(group1_1.getResult()).thenReturn(group1_1DocumentList);
Mockito.when(group1_1.getGroupValue()).thenReturn("group1_1_value");
Mockito.when(group1_1DocumentList.getNumFound()).thenReturn(3L);
Mockito.when(solrTemplate.convertSolrDocumentListToBeans(group1_1DocumentList, Object.class))
.thenReturn(documents1_1);
Mockito.when(groupCommand1.getMatches()).thenReturn(1);
Mockito.when(groupCommand1.getName()).thenReturn("group1_name");
Mockito.when(groupCommand1.getNGroups()).thenReturn(2);
GroupOptions groupOptions = new GroupOptions();
groupOptions.setLimit(1);
Mockito.when(query.getPageRequest()).thenReturn(new PageRequest(0, 1));
Mockito.when(query.getGroupOptions()).thenReturn(groupOptions);
Object group1Key = new Object();
Map<String, Object> objectNames = new HashMap<>();
objectNames.put("group1_name", group1Key);
Map<Object, GroupResult<Object>> result = ResultHelper.convertGroupQueryResponseToGroupResultMap(query, objectNames,
response, solrTemplate, Object.class);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.size());
GroupResult<Object> groupResult = result.get("group1_name");
Assert.assertEquals(groupResult, result.get(group1Key));
Assert.assertEquals("group1_name", groupResult.getName());
Assert.assertEquals(1, groupResult.getMatches());
Assert.assertEquals(Integer.valueOf(2), groupResult.getGroupsCount());
Page<GroupEntry<Object>> groupEntries = groupResult.getGroupEntries();
Assert.assertEquals(2, groupEntries.getTotalElements());
Assert.assertEquals(2, groupEntries.getTotalPages());
Assert.assertEquals(true, groupEntries.hasNext());
List<GroupEntry<Object>> groupEntriesContent = groupEntries.getContent();
Assert.assertNotNull(groupEntriesContent);
Assert.assertEquals(1, groupEntriesContent.size());
GroupEntry<Object> groupEntriesContentElement = groupEntriesContent.get(0);
Assert.assertEquals("group1_1_value", groupEntriesContentElement.getGroupValue());
Page<Object> group1result = groupEntriesContentElement.getResult();
Assert.assertEquals(3, group1result.getTotalElements());
Assert.assertEquals(3, group1result.getTotalPages());
Assert.assertEquals(true, group1result.hasNext());
}
@Test // DATASOLR-121
public void testConvertGroupQueryResponseToGroupResultListWhenNoCountOfGroups() {
GroupResponse groupResponse = Mockito.mock(GroupResponse.class);
Query query = Mockito.mock(Query.class);
SolrTemplate solrTemplate = Mockito.mock(SolrTemplate.class);
GroupCommand groupCommand1 = Mockito.mock(GroupCommand.class);
Group group1_1 = Mockito.mock(Group.class);
SolrDocumentList group1_1DocumentList = Mockito.mock(SolrDocumentList.class);
List<Object> documents1_1 = Collections.singletonList(new Object());
Mockito.when(response.getGroupResponse()).thenReturn(groupResponse);
Mockito.when(groupResponse.getValues()).thenReturn(Collections.singletonList(groupCommand1));
Mockito.when(groupCommand1.getValues()).thenReturn(Collections.singletonList(group1_1));
Mockito.when(group1_1.getResult()).thenReturn(group1_1DocumentList);
Mockito.when(group1_1.getGroupValue()).thenReturn("group1_1_value");
Mockito.when(group1_1DocumentList.getNumFound()).thenReturn(3L);
Mockito.when(solrTemplate.convertSolrDocumentListToBeans(group1_1DocumentList, Object.class))
.thenReturn(documents1_1);
Mockito.when(groupCommand1.getMatches()).thenReturn(1);
Mockito.when(groupCommand1.getName()).thenReturn("group1_name");
Mockito.when(groupCommand1.getNGroups()).thenReturn(null);
GroupOptions groupOptions = new GroupOptions();
groupOptions.setLimit(1);
Mockito.when(query.getPageRequest()).thenReturn(new PageRequest(0, 1));
Mockito.when(query.getGroupOptions()).thenReturn(groupOptions);
Object group1Key = new Object();
Map<String, Object> objectNames = new HashMap<>();
objectNames.put("group1_name", group1Key);
Map<Object, GroupResult<Object>> result = ResultHelper.convertGroupQueryResponseToGroupResultMap(query, objectNames,
response, solrTemplate, Object.class);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.size());
GroupResult<Object> groupResult = result.get("group1_name");
Assert.assertEquals(result.get(group1Key), groupResult);
Assert.assertEquals("group1_name", groupResult.getName());
Assert.assertEquals(1, groupResult.getMatches());
Assert.assertEquals(null, groupResult.getGroupsCount());
Page<GroupEntry<Object>> groupEntries = groupResult.getGroupEntries();
Assert.assertEquals(1, groupEntries.getTotalElements());
Assert.assertEquals(1, groupEntries.getTotalPages());
Assert.assertEquals(false, groupEntries.hasNext());
List<GroupEntry<Object>> groupEntriesContent = groupEntries.getContent();
Assert.assertNotNull(groupEntriesContent);
Assert.assertEquals(1, groupEntriesContent.size());
GroupEntry<Object> groupEntriesContentElement = groupEntriesContent.get(0);
Assert.assertEquals("group1_1_value", groupEntriesContentElement.getGroupValue());
Page<Object> group1result = groupEntriesContentElement.getResult();
Assert.assertEquals(3, group1result.getTotalElements());
Assert.assertEquals(3, group1result.getTotalPages());
Assert.assertEquals(true, group1result.hasNext());
}
@Test // DATASOLR-160
public void testConvertSingleFieldStatsInfoToStatsResultMap() {
Map<String, FieldStatsInfo> fieldStatsInfos = new HashMap<>();
NamedList<Object> nl = createFieldStatNameList("min", "max", 20D, 10L, 5L, 22.5D, 15.5D, 1D);
fieldStatsInfos.put("field", new FieldStatsInfo(nl, "field"));
Map<String, FieldStatsResult> converted = ResultHelper.convertFieldStatsInfoToFieldStatsResultMap(fieldStatsInfos);
FieldStatsResult fieldStatsResult = converted.get("field");
Assert.assertEquals("min", fieldStatsResult.getMin());
Assert.assertEquals("max", fieldStatsResult.getMax());
Assert.assertEquals(20d, fieldStatsResult.getSum());
Assert.assertEquals(22.5, fieldStatsResult.getMean());
Assert.assertEquals(Long.valueOf(10), fieldStatsResult.getCount());
Assert.assertEquals(Long.valueOf(5), fieldStatsResult.getMissing());
Assert.assertEquals(Double.valueOf(15.5), fieldStatsResult.getStddev());
Assert.assertEquals(Double.valueOf(1D), fieldStatsResult.getSumOfSquares());
}
@Test // DATASOLR-160
public void testConvertNullFieldStatsInfoToStatsResultMap() {
Map<String, FieldStatsResult> converted = ResultHelper.convertFieldStatsInfoToFieldStatsResultMap(null);
Assert.assertThat(converted, IsNull.notNullValue());
Assert.assertThat(converted.entrySet(), IsEmptyIterable.emptyIterable());
}
@Test // DATASOLR-160
public void testConvertEmptyFieldStatsInfoMapToStatsResultMap() {
Map<String, FieldStatsResult> converted = ResultHelper.convertFieldStatsInfoToFieldStatsResultMap(new HashMap<>());
Assert.assertThat(converted, IsNull.notNullValue());
Assert.assertThat(converted.entrySet(), IsEmptyIterable.emptyIterable());
}
@Test // DATASOLR-160
public void testConvertFieldStatsInfoMapWithNullToStatsResultMap() {
Map<String, FieldStatsResult> converted = ResultHelper
.convertFieldStatsInfoToFieldStatsResultMap(Collections.<String, FieldStatsInfo> singletonMap("field", null));
Assert.assertThat(converted, IsNull.notNullValue());
Assert.assertThat(converted.keySet(), IsIterableContainingInOrder.contains("field"));
}
@Test // DATASOLR-160
public void testConvertFieldStatsInfoMapWithEmptyNamedListToStatsResultMap() {
Map<String, FieldStatsResult> converted = ResultHelper.convertFieldStatsInfoToFieldStatsResultMap(
Collections.<String, FieldStatsInfo> singletonMap("field", new FieldStatsInfo(new NamedList<>(), "field")));
Assert.assertThat(converted, IsNull.notNullValue());
Assert.assertThat(converted.keySet(), IsIterableContainingInOrder.contains("field"));
}
@Test // DATASOLR-160
public void testConvertFieldStatsInfoToStatsResultMap() {
Map<String, FieldStatsInfo> fieldStatsInfos = new HashMap<>();
NamedList<Object> values = new NamedList<>();
NamedList<Object> facets = new NamedList<>();
NamedList<Object> nl = createFieldStatNameList("min", "max", 20D, 10L, 5L, 22.5D, 15.5D, 1D);
nl.add("facets", facets);
facets.add("facetField", values);
values.add("value1", createFieldStatNameList("f1v1min", "f1v1max", 110D, 111L, 112L, 113D, 11.3D, 1D));
values.add("value2", createFieldStatNameList("f1v2min", "f1v2max", 120D, 121L, 122L, 123D, 12.3D, 1D));
fieldStatsInfos.put("field", new FieldStatsInfo(nl, "field"));
// convert
Map<String, FieldStatsResult> converted = ResultHelper.convertFieldStatsInfoToFieldStatsResultMap(fieldStatsInfos);
// field
FieldStatsResult fieldStatsResult = converted.get("field");
Assert.assertEquals("min", fieldStatsResult.getMin());
Assert.assertEquals("max", fieldStatsResult.getMax());
Assert.assertEquals(20d, fieldStatsResult.getSum());
Assert.assertEquals(22.5, fieldStatsResult.getMean());
Assert.assertEquals(Long.valueOf(10), fieldStatsResult.getCount());
Assert.assertEquals(Long.valueOf(5), fieldStatsResult.getMissing());
Assert.assertEquals(Double.valueOf(15.5), fieldStatsResult.getStddev());
// facets
Map<String, Map<String, StatsResult>> facetStatsResults = fieldStatsResult.getFacetStatsResults();
Assert.assertEquals(1, facetStatsResults.size());
// facet field
Map<String, StatsResult> facetStatsResult = facetStatsResults.get("facetField");
Assert.assertNotNull(facetStatsResult);
// facet values
StatsResult facetValue1StatsResult = facetStatsResult.get("value1");
Assert.assertEquals("f1v1min", facetValue1StatsResult.getMin());
Assert.assertEquals("f1v1max", facetValue1StatsResult.getMax());
Assert.assertEquals(110d, facetValue1StatsResult.getSum());
Assert.assertEquals(113d, facetValue1StatsResult.getMean());
Assert.assertEquals(Long.valueOf(111), facetValue1StatsResult.getCount());
Assert.assertEquals(Long.valueOf(112), facetValue1StatsResult.getMissing());
Assert.assertEquals(Double.valueOf(11.3), facetValue1StatsResult.getStddev());
StatsResult facetValue2StatsResult = facetStatsResult.get("value2");
Assert.assertEquals("f1v2min", facetValue2StatsResult.getMin());
Assert.assertEquals("f1v2max", facetValue2StatsResult.getMax());
Assert.assertEquals(120d, facetValue2StatsResult.getSum());
Assert.assertEquals(123d, facetValue2StatsResult.getMean());
Assert.assertEquals(Long.valueOf(121), facetValue2StatsResult.getCount());
Assert.assertEquals(Long.valueOf(122), facetValue2StatsResult.getMissing());
Assert.assertEquals(Double.valueOf(12.3), facetValue2StatsResult.getStddev());
}
@Test // DATSOLR-86
public void testConvertEmptyFacetRangeQueryResponseToFacetPageMap() {
SimpleFacetQuery facetQuery = new SimpleFacetQuery(new SimpleStringCriteria("*:*"))
.setFacetOptions(new FacetOptions("field1"));
SimpleFacetQuery emptyQuery = new SimpleFacetQuery();
Assert.assertTrue(ResultHelper.convertFacetQueryResponseToRangeFacetPageMap(facetQuery, null).isEmpty());
Assert.assertTrue(ResultHelper.convertFacetQueryResponseToRangeFacetPageMap(emptyQuery, response).isEmpty());
}
@Test // DATSOLR-86
public void testConvertFacetRangeQueryResponseToFacetPageMap() {
SimpleFacetQuery facetQuery = new SimpleFacetQuery(new SimpleStringCriteria("*:*"))
.setFacetOptions(new FacetOptions("field1"));
RangeFacet.Numeric rangeFacet1 = new RangeFacet.Numeric("name", 10, 20, 2, 4, 6, 8);
rangeFacet1.addCount("count1", 1);
rangeFacet1.addCount("count2", 2);
RangeFacet.Numeric rangeFacet2 = new RangeFacet.Numeric("", 10, 20, 2, 4, 6, 8);
@SuppressWarnings("rawtypes")
List<RangeFacet> value = new ArrayList<>();
value.add(rangeFacet1);
value.add(rangeFacet2);
Mockito.when(response.getFacetRanges()).thenReturn(value);
Map<Field, Page<FacetFieldEntry>> converted = ResultHelper.convertFacetQueryResponseToRangeFacetPageMap(facetQuery,
response);
Page<FacetFieldEntry> page = converted.get(new SimpleField("name"));
Assert.assertEquals(1, converted.size());
Assert.assertEquals(2, page.getTotalElements());
List<FacetFieldEntry> content = page.getContent();
Assert.assertEquals(2, content.size());
Assert.assertEquals(1, content.get(0).getValueCount());
Assert.assertEquals("count1", content.get(0).getValue());
Assert.assertEquals(2, content.get(1).getValueCount());
Assert.assertEquals("count2", content.get(1).getValue());
}
@Test // DATASOLR-305
public void testConvertFacetQueryResponseForNegativeFacetLimit() {
List<FacetField> fieldList = new ArrayList<>(1);
FacetField ffield = createFacetField("field_1", 1, 2);
fieldList.add(ffield);
Mockito.when(response.getFacetFields()).thenReturn(fieldList);
FacetQuery query = createFacetQuery("field_1");
query.getFacetOptions().setFacetLimit(-1);
Map<Field, Page<FacetFieldEntry>> result = ResultHelper.convertFacetQueryResponseToFacetPageMap(query, response);
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
}
private NamedList<Object> createFieldStatNameList(Object min, Object max, Double sum, Long count, Long missing,
Object mean, Double stddev, Double sumOfSquares) {
NamedList<Object> nl = new NamedList<>();
nl.add("min", min);
nl.add("max", max);
nl.add("sum", sum);
nl.add("count", count);
nl.add("missing", missing);
nl.add("mean", mean);
nl.add("stddev", stddev);
nl.add("sumOfSquares", sumOfSquares);
return nl;
}
private FacetQuery createFacetQuery(SolrDataQuery... facetQueries) {
FacetQuery fq = new SimpleFacetQuery(new SimpleStringCriteria("*:*"));
fq.setFacetOptions(new FacetOptions(facetQueries));
return fq;
}
private FacetQuery createFacetQuery(String... facetFields) {
FacetQuery fq = new SimpleFacetQuery(new Criteria(facetFields[0]));
fq.setFacetOptions(new FacetOptions(facetFields));
return fq;
}
private FacetQuery createFacetPivotQuery(String... pivotFieldNames) {
FacetQuery fq = new SimpleFacetQuery(new Criteria("field_1"));
fq.setFacetOptions(new FacetOptions().addFacetOnPivot(pivotFieldNames));
return fq;
}
private FacetField createFacetField(String fieldName, long... values) {
FacetField ffield = new FacetField(fieldName);
for (int i = 1; i <= values.length; i++) {
ffield.add("value_" + i, values[i - 1]);
}
return ffield;
}
private static class SolrBeanWithIdNamedField {
@SuppressWarnings("unused") //
private String id;
public SolrBeanWithIdNamedField(String id) {
this.id = id;
}
}
private static class SolrBeanWithAnnoteatedIdNamedField {
private @Id String idField;
public SolrBeanWithAnnoteatedIdNamedField(String idField) {
this.idField = idField;
}
}
}