/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.discovery; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.ListUtils; import org.dspace.discovery.configuration.DiscoveryConfigurationParameters; import org.dspace.discovery.configuration.DiscoverySearchFilterFacet; /** * This class represents the result that the discovery search impl returns * * @author Kevin Van de Velde (kevin at atmire dot com) */ public class DiscoverResult { private long totalSearchResults; private int start; private List indexableObjects; private Map> facetResults; /** * A map that contains all the documents sougth after, the key is a string representation of the Indexable Object */ private Map> searchDocuments; private int maxResults = -1; private int searchTime; private Map highlightedResults; private String spellCheckQuery; public DiscoverResult() { indexableObjects = new ArrayList(); facetResults = new LinkedHashMap>(); searchDocuments = new LinkedHashMap>(); highlightedResults = new HashMap(); } public void addIndexableObject(IndexableObject idxObj) { this.indexableObjects.add(idxObj); } public List getIndexableObjects() { return indexableObjects; } public long getTotalSearchResults() { return totalSearchResults; } public void setTotalSearchResults(long totalSearchResults) { this.totalSearchResults = totalSearchResults; } public int getStart() { return start; } public void setStart(int start) { this.start = start; } public int getMaxResults() { return maxResults; } public void setMaxResults(int maxResults) { this.maxResults = maxResults; } public int getSearchTime() { return searchTime; } public void setSearchTime(int searchTime) { this.searchTime = searchTime; } public void addFacetResult(String facetField, FacetResult... facetResults) { List facetValues = this.facetResults.get(facetField); if (facetValues == null) { facetValues = new ArrayList(); } facetValues.addAll(Arrays.asList(facetResults)); this.facetResults.put(facetField, facetValues); } public Map> getFacetResults() { return facetResults; } public List getFacetResult(String facet) { return ListUtils.emptyIfNull(facetResults.get(facet)); } public List getFacetResult(DiscoverySearchFilterFacet field) { List facetValues = getFacetResult(field.getIndexFieldName()); // Check if we are dealing with a date, sometimes the facet values arrive as dates ! if (facetValues.size() == 0 && field.getType().equals(DiscoveryConfigurationParameters.TYPE_DATE)) { facetValues = getFacetResult(field.getIndexFieldName() + ".year"); } return ListUtils.emptyIfNull(facetValues); } public IndexableObjectHighlightResult getHighlightedResults(IndexableObject dso) { return highlightedResults.get(dso.getUniqueIndexID()); } public void addHighlightedResult(IndexableObject dso, IndexableObjectHighlightResult highlightedResult) { this.highlightedResults.put(dso.getUniqueIndexID(), highlightedResult); } public static final class FacetResult { private String asFilterQuery; private String displayedValue; private String authorityKey; private String sortValue; private long count; private String fieldType; public FacetResult(String asFilterQuery, String displayedValue, String authorityKey, String sortValue, long count, String fieldType) { this.asFilterQuery = asFilterQuery; this.displayedValue = displayedValue; this.authorityKey = authorityKey; this.sortValue = sortValue; this.count = count; this.fieldType = fieldType; } public String getAsFilterQuery() { if (asFilterQuery == null) { // missing facet filter query return "[* TO *]"; } return asFilterQuery; } public String getDisplayedValue() { return displayedValue; } public String getSortValue() { return sortValue; } public long getCount() { return count; } public String getAuthorityKey() { return authorityKey; } public String getFilterType() { return authorityKey != null ? "authority" : asFilterQuery != null ? "equals" : "notequals"; } public String getFieldType() { return fieldType; } } public String getSpellCheckQuery() { return spellCheckQuery; } public void setSpellCheckQuery(String spellCheckQuery) { this.spellCheckQuery = spellCheckQuery; } /** * An utility class to represent the highlighting section of a Discovery Search * */ public static final class IndexableObjectHighlightResult { private IndexableObject indexableObject; private Map> highlightResults; public IndexableObjectHighlightResult(IndexableObject idxObj, Map> highlightResults) { this.indexableObject = idxObj; this.highlightResults = highlightResults; } /** * Return the indexable object that the highlighting snippets refer to * * @return the indexable object */ public IndexableObject getIndexableObject() { return indexableObject; } /** * The matching snippets for a specific metadata ignoring any authority value * * @param metadataKey * the metadata where the snippets have been found * @return the matching snippets */ public List getHighlightResults(String metadataKey) { return highlightResults.get(metadataKey); } /** * All the matching snippets in whatever metadata ignoring any authority value * * @return All the matching snippets */ public Map> getHighlightResults() { return highlightResults; } } public void addSearchDocument(IndexableObject dso, SearchDocument searchDocument) { String dsoString = SearchDocument.getIndexableObjectStringRepresentation(dso); List docs = searchDocuments.get(dsoString); if (docs == null) { docs = new ArrayList(); } docs.add(searchDocument); searchDocuments.put(dsoString, docs); } /** * Returns all the sought after search document values * * @param idxObj * the indexable object we want our search documents for * @return the search documents list */ public List getSearchDocument(IndexableObject idxObj) { String dsoString = SearchDocument.getIndexableObjectStringRepresentation(idxObj); List result = searchDocuments.get(dsoString); if (result == null) { return new ArrayList<>(); } else { return result; } } /** * This class contains values from the fields searched for in DiscoveryQuery.java */ public static final class SearchDocument { private Map> searchFields; public SearchDocument() { this.searchFields = new LinkedHashMap>(); } public void addSearchField(String field, String... values) { List searchFieldValues = searchFields.get(field); if (searchFieldValues == null) { searchFieldValues = new ArrayList(); } searchFieldValues.addAll(Arrays.asList(values)); searchFields.put(field, searchFieldValues); } public Map> getSearchFields() { return searchFields; } public List getSearchFieldValues(String field) { if (searchFields.get(field) == null) { return new ArrayList(); } else { return searchFields.get(field); } } public static String getIndexableObjectStringRepresentation(IndexableObject idxObj) { return idxObj.getType() + ":" + idxObj.getID(); } } }