/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.search.internal.facet;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.facet.Facet;
import com.liferay.portal.kernel.search.facet.MultiValueFacet;
import com.liferay.portal.kernel.search.facet.RangeFacet;
import com.liferay.portal.kernel.search.facet.SimpleFacet;
import com.liferay.portal.kernel.search.facet.collector.DefaultTermCollector;
import com.liferay.portal.kernel.search.facet.collector.FacetCollector;
import com.liferay.portal.kernel.search.facet.collector.TermCollector;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.search.internal.test.util.AssertUtils;
import com.liferay.portal.search.internal.test.util.SearchMapUtil;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Test;
import org.mockito.Mockito;
/**
* @author André de Oliveira
*/
public class FacetDiscounterTest {
@Test
public void testMultiValueFacet() {
Facet facet = new MultiValueFacet(null);
_populate(facet, _toTerm("a", 10), _toTerm("b", 5), _toTerm("c", 2));
FacetDiscounter facetDiscounter = new FacetDiscounter(facet);
_discount(facetDiscounter, _createDocument(new String[] {"a", "c"}));
_assertTermCollectors(
facet,
SearchMapUtil.join(_toMap("a", 9), _toMap("b", 5), _toMap("c", 1)));
}
@Test
public void testRangeFacet() {
Facet facet = new RangeFacet(null);
_populate(facet, _toTerm("[0 TO 5]", 3), _toTerm("[0 TO 9]", 3));
FacetDiscounter facetDiscounter = new FacetDiscounter(facet);
_discount(facetDiscounter, "2", "7");
_assertTermCollectors(
facet,
SearchMapUtil.join(_toMap("[0 TO 5]", 2), _toMap("[0 TO 9]", 1)));
}
@Test
public void testSimpleFacet() {
Facet facet = new SimpleFacet(null);
_populate(facet, _toTerm("a", 10), _toTerm("b", 5), _toTerm("c", 2));
FacetDiscounter facetDiscounter = new FacetDiscounter(facet);
_discount(facetDiscounter, "a", "b", "c");
_assertTermCollectors(
facet,
SearchMapUtil.join(_toMap("a", 9), _toMap("b", 4), _toMap("c", 1)));
}
@Test
public void testZeroedTermIsRemoved() {
SimpleFacet facet = new SimpleFacet(null);
_populate(facet, _toTerm("public", 1000), _toTerm("secret", 1));
FacetDiscounter facetDiscounter = new FacetDiscounter(facet);
_discount(facetDiscounter, "secret");
_assertTermCollectors(facet, _toMap("public", 1000));
}
private static Map<String, Integer> _toMap(
List<TermCollector> termCollectors) {
Map<String, Integer> map = new HashMap<>();
for (TermCollector termCollector : termCollectors) {
map.put(termCollector.getTerm(), termCollector.getFrequency());
}
return map;
}
private static Map<String, Integer> _toMap(String key, int value) {
return Collections.singletonMap(key, value);
}
private static TermCollector _toTerm(String term, int frequency) {
return new DefaultTermCollector(term, frequency);
}
private void _assertTermCollectors(
Facet facet, Map<String, Integer> frequencies) {
FacetCollector facetCollector = facet.getFacetCollector();
AssertUtils.assertEquals(
_fieldName, frequencies,
_toMap(facetCollector.getTermCollectors()));
}
private Document _createDocument(String term) {
Document document = Mockito.mock(Document.class);
Mockito.doReturn(
new Field(_fieldName, term)
).when(
document
).getField(
_fieldName
);
return document;
}
private Document _createDocument(String[] terms) {
Document document = Mockito.mock(Document.class);
Mockito.doReturn(
new Field(_fieldName, terms)
).when(
document
).getField(
_fieldName
);
return document;
}
private SimpleFacetCollector _createFacetCollector(
TermCollector... termCollectors) {
return new SimpleFacetCollector(
_fieldName, Arrays.asList(termCollectors));
}
private void _discount(
FacetDiscounter facetDiscounter, Document... documents) {
_discount(facetDiscounter, Stream.of(documents));
}
private void _discount(
FacetDiscounter facetDiscounter, Stream<Document> documentsStream) {
facetDiscounter.discount(documentsStream.collect(Collectors.toList()));
}
private void _discount(FacetDiscounter facetDiscounter, String... terms) {
Stream<String> termsStream = Stream.of(terms);
Stream<Document> documentsStream = termsStream.map(
this::_createDocument);
_discount(facetDiscounter, documentsStream);
}
private void _populate(Facet facet, TermCollector... termCollectors) {
facet.setFieldName(_fieldName);
facet.setFacetCollector(_createFacetCollector(termCollectors));
}
private static final String _fieldName = RandomTestUtil.randomString();
}