diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java index c4cf3d8878..7642bc7d07 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -11,6 +11,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.net.URI; +import java.net.URISyntaxException; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -64,7 +66,12 @@ import org.apache.solr.handler.extraction.ExtractingParams; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.content.Collection; -import org.dspace.content.*; +import org.dspace.content.Community; +import org.dspace.content.DSpaceObject; +import org.dspace.content.Item; +import org.dspace.content.MetadataField; +import org.dspace.content.MetadataSchema; +import org.dspace.content.MetadataValue; import org.dspace.content.authority.Choices; import org.dspace.content.authority.service.ChoiceAuthorityService; import org.dspace.content.authority.service.MetadataAuthorityService; @@ -72,8 +79,23 @@ import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; import org.dspace.content.service.CommunityService; import org.dspace.content.service.ItemService; -import org.dspace.core.*; -import org.dspace.discovery.configuration.*; +import org.dspace.core.ConfigurationManager; +import org.dspace.core.Constants; +import org.dspace.core.Context; +import org.dspace.core.Email; +import org.dspace.core.I18nUtil; +import org.dspace.core.LogManager; +import org.dspace.discovery.configuration.DiscoveryConfiguration; +import org.dspace.discovery.configuration.DiscoveryConfigurationParameters; +import org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration; +import org.dspace.discovery.configuration.DiscoveryHitHighlightingConfiguration; +import org.dspace.discovery.configuration.DiscoveryMoreLikeThisConfiguration; +import org.dspace.discovery.configuration.DiscoveryRecentSubmissionsConfiguration; +import org.dspace.discovery.configuration.DiscoverySearchFilter; +import org.dspace.discovery.configuration.DiscoverySearchFilterFacet; +import org.dspace.discovery.configuration.DiscoverySortConfiguration; +import org.dspace.discovery.configuration.DiscoverySortFieldConfiguration; +import org.dspace.discovery.configuration.HierarchicalSidebarFacetConfiguration; import org.dspace.eperson.Group; import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.handle.service.HandleService; @@ -83,17 +105,6 @@ import org.dspace.util.MultiFormatDateParser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.net.URI; -import java.net.URISyntaxException; -import java.sql.SQLException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - /** * SolrIndexer contains the methods that index Items and their metadata, * collections, communities, etc. It is meant to either be invoked from the @@ -1767,18 +1778,21 @@ public class SolrServiceImpl implements SearchService, IndexingService { solrQuery.setFacetPrefix(field, facetFieldConfig.getPrefix()); } } + } - List facetQueries = discoveryQuery.getFacetQueries(); - for (String facetQuery : facetQueries) - { - solrQuery.addFacetQuery(facetQuery); - } + List facetQueries = discoveryQuery.getFacetQueries(); + for (String facetQuery : facetQueries) + { + solrQuery.addFacetQuery(facetQuery); + } - if (discoveryQuery.getFacetMinCount() != -1) - { - solrQuery.setFacetMinCount(discoveryQuery.getFacetMinCount()); - } + if (discoveryQuery.getFacetMinCount() != -1) + { + solrQuery.setFacetMinCount(discoveryQuery.getFacetMinCount()); + } + if(CollectionUtils.isNotEmpty(facetFields) || CollectionUtils.isNotEmpty(facetQueries)) + { solrQuery.setParam(FacetParams.FACET_OFFSET, String.valueOf(discoveryQuery.getFacetOffset())); } diff --git a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfiguration.java b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfiguration.java index 5cc8032ecc..3a14b391a5 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfiguration.java +++ b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfiguration.java @@ -7,14 +7,15 @@ */ package org.dspace.discovery.configuration; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Required; - import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Required; + /** * @author Kevin Van de Velde (kevin at atmire dot com) */ @@ -180,5 +181,14 @@ public class DiscoveryConfiguration implements InitializingBean{ throw new DiscoveryConfigurationException(error.toString()); } - } + } + + public DiscoverySearchFilterFacet getSidebarFacet(final String facetName) { + for (DiscoverySearchFilterFacet sidebarFacet : sidebarFacets) { + if(StringUtils.equals(sidebarFacet.getIndexFieldName(), facetName)) { + return sidebarFacet; + } + } + return null; + } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java index 647bb21c5f..a8ad3f7cab 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java @@ -18,6 +18,7 @@ import org.dspace.app.rest.parameter.SearchFilter; import org.dspace.core.Context; import org.dspace.discovery.DiscoverResult; import org.dspace.discovery.configuration.DiscoveryConfiguration; +import org.dspace.discovery.configuration.DiscoverySearchFilterFacet; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; @@ -29,28 +30,32 @@ public class DiscoverFacetResultsConverter { private DiscoverFacetValueConverter facetValueConverter = new DiscoverFacetValueConverter(); - public FacetResultsRest convert(Context context, String facetName, String query, String dsoType, String dsoScope, List searchFilters, DiscoverResult searchResult, DiscoveryConfiguration configuration, Pageable page){ + public FacetResultsRest convert(Context context, String facetName, String query, String dsoType, String dsoScope, List searchFilters, DiscoverResult searchResult, DiscoveryConfiguration configuration, Pageable page) { FacetResultsRest facetResultsRest = new FacetResultsRest(); - addToFacetResultList(facetName, searchResult, facetResultsRest, page); + addToFacetResultList(facetName, searchResult, facetResultsRest, configuration, page); setRequestInformation(context, facetName, query, dsoType, dsoScope, searchFilters, searchResult, configuration, facetResultsRest, page); return facetResultsRest; } - private void addToFacetResultList(String facetName, DiscoverResult searchResult, FacetResultsRest facetResultsRest, Pageable page) { - List facetValues = searchResult.getFacetResult(facetName); - int valueCount = 0; - for (DiscoverResult.FacetResult value : CollectionUtils.emptyIfNull(facetValues)) { - if(valueCount >= page.getPageSize()){ - //We requested one facet value more as the page size. We must make sure to not return the extra value. - break; - } - SearchFacetValueRest searchFacetValueRest = buildSearchFacetValueRestFromFacetResult(value); - facetResultsRest.addToFacetResultList(searchFacetValueRest); - valueCount++; + private void addToFacetResultList(String facetName, DiscoverResult searchResult, FacetResultsRest facetResultsRest, + DiscoveryConfiguration configuration, Pageable page) { + + DiscoverySearchFilterFacet field = configuration.getSidebarFacet(facetName); + List facetValues = searchResult.getFacetResult(field); + int valueCount = 0; + + for (DiscoverResult.FacetResult value : CollectionUtils.emptyIfNull(facetValues)) { + if (valueCount >= page.getPageSize()) { + //We requested one facet value more as the page size. We must make sure to not return the extra value. + break; } + SearchFacetValueRest searchFacetValueRest = buildSearchFacetValueRestFromFacetResult(value); + facetResultsRest.addToFacetResultList(searchFacetValueRest); + valueCount++; + } } private SearchFacetValueRest buildSearchFacetValueRestFromFacetResult(DiscoverResult.FacetResult value) { @@ -63,7 +68,7 @@ public class DiscoverFacetResultsConverter { facetResultsRest.setDsoType(dsoType); facetResultsRest.setPage(page); - facetResultsRest.setFacetEntry(convertFacetEntry(facetName, searchResult, page)); + facetResultsRest.setFacetEntry(convertFacetEntry(facetName, searchResult, configuration, page)); facetResultsRest.setSort(SearchResultsRest.Sorting.fromPage(page)); @@ -75,14 +80,18 @@ public class DiscoverFacetResultsConverter { } } - private SearchFacetEntryRest convertFacetEntry(final String facetName, final DiscoverResult searchResult, final Pageable page) { + private SearchFacetEntryRest convertFacetEntry(final String facetName, final DiscoverResult searchResult, final DiscoveryConfiguration configuration, final Pageable page) { + DiscoverySearchFilterFacet field = configuration.getSidebarFacet(facetName); + SearchFacetEntryRest facetEntryRest = new SearchFacetEntryRest(facetName); - if(!searchResult.getFacetResult(facetName).isEmpty()){ - facetEntryRest.setFacetType(searchResult.getFacetResult(facetName).get(0).getFieldType()); + List facetResults = searchResult.getFacetResult(field); + + if (!facetResults.isEmpty()) { + facetEntryRest.setFacetType(facetResults.get(0).getFieldType()); } //We requested one extra facet value. Check if that value is present to indicate that there are more results - facetEntryRest.setHasMore( searchResult.getFacetResult(facetName).size() > page.getPageSize() ); + facetEntryRest.setHasMore(facetResults.size() > page.getPageSize()); return facetEntryRest; }