/**
* 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 org.dspace.content.DSpaceObject;
import java.util.*;
/**
* 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<DSpaceObject> dspaceObjects;
private Map<String, List<FacetResult>> facetResults;
/** A map that contains all the documents sougth after, the key is a string representation of the DSpace object */
private Map<String, List<SearchDocument>> searchDocuments;
private int maxResults = -1;
private int searchTime;
private Map<String, DSpaceObjectHighlightResult> highlightedResults;
private String spellCheckQuery;
public DiscoverResult() {
dspaceObjects = new ArrayList<DSpaceObject>();
facetResults = new LinkedHashMap<String, List<FacetResult>>();
searchDocuments = new LinkedHashMap<String, List<SearchDocument>>();
highlightedResults = new HashMap<String, DSpaceObjectHighlightResult>();
}
public void addDSpaceObject(DSpaceObject dso){
this.dspaceObjects.add(dso);
}
public List<DSpaceObject> getDspaceObjects() {
return dspaceObjects;
}
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<FacetResult> facetValues = this.facetResults.get(facetField);
if(facetValues == null)
{
facetValues = new ArrayList<FacetResult>();
}
facetValues.addAll(Arrays.asList(facetResults));
this.facetResults.put(facetField, facetValues);
}
public Map<String, List<FacetResult>> getFacetResults() {
return facetResults;
}
public List<FacetResult> getFacetResult(String facet){
return facetResults.get(facet) == null ? new ArrayList<FacetResult>() : facetResults.get(facet);
}
public DSpaceObjectHighlightResult getHighlightedResults(DSpaceObject dso)
{
return highlightedResults.get(dso.getHandle());
}
public void addHighlightedResult(DSpaceObject dso, DSpaceObjectHighlightResult highlightedResult)
{
this.highlightedResults.put(dso.getHandle(), highlightedResult);
}
public static final class FacetResult{
private String asFilterQuery;
private String displayedValue;
private String authorityKey;
private String sortValue;
private long count;
public FacetResult(String asFilterQuery, String displayedValue, String authorityKey, String sortValue, long count) {
this.asFilterQuery = asFilterQuery;
this.displayedValue = displayedValue;
this.authorityKey = authorityKey;
this.sortValue = sortValue;
this.count = count;
}
public String getAsFilterQuery() {
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":"equals";
}
}
public String getSpellCheckQuery() {
return spellCheckQuery;
}
public void setSpellCheckQuery(String spellCheckQuery) {
this.spellCheckQuery = spellCheckQuery;
}
public static final class DSpaceObjectHighlightResult
{
private DSpaceObject dso;
private Map<String, List<String>> highlightResults;
public DSpaceObjectHighlightResult(DSpaceObject dso, Map<String, List<String>> highlightResults)
{
this.dso = dso;
this.highlightResults = highlightResults;
}
public DSpaceObject getDso()
{
return dso;
}
public List<String> getHighlightResults(String metadataKey)
{
return highlightResults.get(metadataKey);
}
}
public void addSearchDocument(DSpaceObject dso, SearchDocument searchDocument){
String dsoString = SearchDocument.getDspaceObjectStringRepresentation(dso);
List<SearchDocument> docs = searchDocuments.get(dsoString);
if(docs == null){
docs = new ArrayList<SearchDocument>();
}
docs.add(searchDocument);
searchDocuments.put(dsoString, docs);
}
/**
* Returns all the sought after search document values
* @param dso the dspace object we want our search documents for
* @return the search documents list
*/
public List<SearchDocument> getSearchDocument(DSpaceObject dso){
String dsoString = SearchDocument.getDspaceObjectStringRepresentation(dso);
List<SearchDocument> result = searchDocuments.get(dsoString);
if(result == null){
return new ArrayList<SearchDocument>();
}else{
return result;
}
}
/**
* This class contains values from the fields searched for in DiscoveryQuery.java
*/
public static final class SearchDocument{
private Map<String, List<String>> searchFields;
public SearchDocument() {
this.searchFields = new LinkedHashMap<String, List<String>>();
}
public void addSearchField(String field, String ...values){
List<String>searchFieldValues = searchFields.get(field);
if(searchFieldValues == null){
searchFieldValues = new ArrayList<String>();
}
searchFieldValues.addAll(Arrays.asList(values));
searchFields.put(field, searchFieldValues);
}
public Map<String, List<String>> getSearchFields() {
return searchFields;
}
public List<String> getSearchFieldValues(String field){
if(searchFields.get(field) == null)
return new ArrayList<String>();
else
return searchFields.get(field);
}
public static String getDspaceObjectStringRepresentation(DSpaceObject dso){
return dso.getType() + ":" + dso.getID();
}
}
}