/**
* 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.web.internal.facet.display.builder;
import com.liferay.portal.kernel.search.facet.Facet;
import com.liferay.portal.kernel.search.facet.collector.FacetCollector;
import com.liferay.portal.kernel.search.facet.collector.TermCollector;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.search.web.internal.facet.display.context.FolderSearchFacetDisplayContext;
import com.liferay.portal.search.web.internal.facet.display.context.FolderSearchFacetTermDisplayContext;
import com.liferay.portal.search.web.internal.facet.display.context.FolderTitleLookup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Lino Alves
*/
public class FolderSearchFacetDisplayBuilder {
public FolderSearchFacetDisplayContext build() {
boolean nothingSelected = isNothingSelected();
List<TermCollector> termCollectors = getTermsCollectors();
boolean renderNothing = false;
if (nothingSelected && termCollectors.isEmpty()) {
renderNothing = true;
}
FolderSearchFacetDisplayContext folderSearchFacetDisplayContext =
new FolderSearchFacetDisplayContext();
folderSearchFacetDisplayContext.setNothingSelected(nothingSelected);
folderSearchFacetDisplayContext.setParameterName(_parameterName);
folderSearchFacetDisplayContext.setParameterValue(
getFirstParameterValueString());
folderSearchFacetDisplayContext.setParameterValues(
getParameterValueStrings());
folderSearchFacetDisplayContext.setRenderNothing(renderNothing);
folderSearchFacetDisplayContext.setTermDisplayContexts(
buildTermDisplayContexts());
return folderSearchFacetDisplayContext;
}
public void setFacet(Facet facet) {
_facet = facet;
}
public void setFolderTitleLookup(FolderTitleLookup folderTitleLookup) {
_folderTitleLookup = folderTitleLookup;
}
public void setFrequenciesVisible(boolean frequenciesVisible) {
_frequenciesVisible = frequenciesVisible;
}
public void setFrequencyThreshold(int frequencyThreshold) {
_frequencyThreshold = frequencyThreshold;
}
public void setMaxTerms(int maxTerms) {
_maxTerms = maxTerms;
}
public void setParameterName(String parameterName) {
_parameterName = parameterName;
}
public void setParameterValue(String parameterValue) {
setParameterValues(GetterUtil.getString(parameterValue));
}
public void setParameterValues(String... parameterValues) {
Objects.requireNonNull(parameterValues);
Stream<String> parameterValuesStream = Stream.of(parameterValues);
Stream<Long> folderIdsStream = parameterValuesStream.map(
GetterUtil::getLong);
folderIdsStream = folderIdsStream.filter(folderId -> folderId > 0);
_selectedFolderIds = folderIdsStream.collect(Collectors.toList());
}
protected FolderSearchFacetTermDisplayContext buildTermDisplayContext(
long folderId, String displayName, int frequency, boolean selected) {
FolderSearchFacetTermDisplayContext
folderSearchFacetTermDisplayContext =
new FolderSearchFacetTermDisplayContext();
folderSearchFacetTermDisplayContext.setDisplayName(displayName);
folderSearchFacetTermDisplayContext.setFolderId(folderId);
folderSearchFacetTermDisplayContext.setFrequency(frequency);
folderSearchFacetTermDisplayContext.setFrequencyVisible(
_frequenciesVisible);
folderSearchFacetTermDisplayContext.setSelected(selected);
return folderSearchFacetTermDisplayContext;
}
protected FolderSearchFacetTermDisplayContext buildTermDisplayContext(
TermCollector termCollector) {
long folderId = GetterUtil.getLong(termCollector.getTerm());
if (folderId == 0) {
return null;
}
return buildTermDisplayContext(
folderId, getDisplayName(folderId), termCollector.getFrequency(),
isSelected(folderId));
}
protected List<FolderSearchFacetTermDisplayContext>
buildTermDisplayContexts() {
List<TermCollector> termCollectors = getTermsCollectors();
if (termCollectors.isEmpty()) {
return getEmptyTermDisplayContexts();
}
List<FolderSearchFacetTermDisplayContext>
folderSearchFacetTermDisplayContexts = new ArrayList<>(
termCollectors.size());
for (int i = 0; i < termCollectors.size(); i++) {
if ((_maxTerms > 0) && (i >= _maxTerms)) {
break;
}
TermCollector termCollector = termCollectors.get(i);
if ((_frequencyThreshold > 0) &&
(_frequencyThreshold > termCollector.getFrequency())) {
break;
}
FolderSearchFacetTermDisplayContext
folderSearchFacetTermDisplayContext = buildTermDisplayContext(
termCollector);
if (folderSearchFacetTermDisplayContext != null) {
folderSearchFacetTermDisplayContexts.add(
folderSearchFacetTermDisplayContext);
}
}
return folderSearchFacetTermDisplayContexts;
}
protected String getDisplayName(long folderId) {
String title = _folderTitleLookup.getFolderTitle(folderId);
if (title != null) {
return title;
}
return StringPool.OPEN_BRACKET + folderId + StringPool.CLOSE_BRACKET;
}
protected FolderSearchFacetTermDisplayContext getEmptyTermDisplayContext(
long folderId) {
return buildTermDisplayContext(
folderId, getDisplayName(folderId), 0, true);
}
protected List<FolderSearchFacetTermDisplayContext>
getEmptyTermDisplayContexts() {
Stream<Long> folderIdsStream = _selectedFolderIds.stream();
Stream<FolderSearchFacetTermDisplayContext>
folderSearchFacetTermDisplayContextsStream = folderIdsStream.map(
this::getEmptyTermDisplayContext);
return folderSearchFacetTermDisplayContextsStream.collect(
Collectors.toList());
}
protected String getFirstParameterValueString() {
if (_selectedFolderIds.isEmpty()) {
return StringPool.BLANK;
}
return String.valueOf(_selectedFolderIds.get(0));
}
protected Long getFolderId(String fieldParam) {
long folderId = GetterUtil.getLong(fieldParam);
if (folderId == 0) {
return null;
}
return folderId;
}
protected List<String> getParameterValueStrings() {
Stream<Long> groupIdsStream = _selectedFolderIds.stream();
Stream<String> parameterValuesStream = groupIdsStream.map(
String::valueOf);
return parameterValuesStream.collect(Collectors.toList());
}
protected List<TermCollector> getTermsCollectors() {
FacetCollector facetCollector = _facet.getFacetCollector();
if (facetCollector == null) {
return Collections.emptyList();
}
return facetCollector.getTermCollectors();
}
protected boolean isNothingSelected() {
if (_selectedFolderIds.isEmpty()) {
return true;
}
return false;
}
protected boolean isSelected(long folderId) {
if (_selectedFolderIds.contains(folderId)) {
return true;
}
return false;
}
private Facet _facet;
private FolderTitleLookup _folderTitleLookup;
private boolean _frequenciesVisible;
private int _frequencyThreshold;
private int _maxTerms;
private String _parameterName;
private List<Long> _selectedFolderIds = Collections.emptyList();
}