Skip to content

Commit

Permalink
Merge pull request #2909 from atmire/w2p-71899_Support-multiple-dsoTy…
Browse files Browse the repository at this point in the history
…pe-values

Support multiple dsoType values in discovery
  • Loading branch information
tdonohue committed Aug 5, 2020
2 parents 5eacfc0 + 94394d8 commit 2027b03
Show file tree
Hide file tree
Showing 13 changed files with 310 additions and 85 deletions.
34 changes: 25 additions & 9 deletions dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java
Expand Up @@ -7,6 +7,9 @@
*/
package org.dspace.discovery;

import static java.util.Collections.singletonList;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand All @@ -31,7 +34,7 @@ public class DiscoverQuery {
**/
private String query;
private List<String> filterQueries;
private String DSpaceObjectFilter = null;
private List<String> dspaceObjectFilters = new ArrayList<>();
private List<String> fieldPresentQueries;
private boolean spellCheck;

Expand Down Expand Up @@ -118,20 +121,33 @@ public SORT_ORDER getSortOrder() {
* Sets the DSpace object filter, must be an DSpace Object type integer
* can be used to only return objects from a certain DSpace Object type
*
* @param DSpaceObjectFilter the DSpace object filer
* @param dspaceObjectFilter the DSpace object filter
*/
public void setDSpaceObjectFilter(String DSpaceObjectFilter) {
this.DSpaceObjectFilter = DSpaceObjectFilter;
public void setDSpaceObjectFilter(String dspaceObjectFilter) {
this.dspaceObjectFilters = singletonList(dspaceObjectFilter);
}

/**
* Gets the DSpace object filter
* can be used to only return objects from a certain DSpace Object type
* Adds a DSpace object filter, must be an DSpace Object type integer.
* Can be used to also return objects from a certain DSpace Object type.
*
* @param dspaceObjectFilter the DSpace object filer
*/
public void addDSpaceObjectFilter(String dspaceObjectFilter) {

if (isNotBlank(dspaceObjectFilter)) {
this.dspaceObjectFilters.add(dspaceObjectFilter);
}
}

/**
* Gets the DSpace object filters
* can be used to only return objects from certain DSpace Object types
*
* @return the DSpace object filer
* @return the DSpace object filters
*/
public String getDSpaceObjectFilter() {
return DSpaceObjectFilter;
public List<String> getDSpaceObjectFilters() {
return dspaceObjectFilters;
}

/**
Expand Down
Expand Up @@ -7,6 +7,8 @@
*/
package org.dspace.discovery;

import static java.util.stream.Collectors.joining;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
Expand Down Expand Up @@ -751,8 +753,13 @@ protected SolrQuery resolveToSolrQuery(Context context, DiscoverQuery discoveryQ
String filterQuery = discoveryQuery.getFilterQueries().get(i);
solrQuery.addFilterQuery(filterQuery);
}
if (discoveryQuery.getDSpaceObjectFilter() != null) {
solrQuery.addFilterQuery(SearchUtils.RESOURCE_TYPE_FIELD + ":" + discoveryQuery.getDSpaceObjectFilter());
if (discoveryQuery.getDSpaceObjectFilters() != null) {
solrQuery.addFilterQuery(
discoveryQuery.getDSpaceObjectFilters()
.stream()
.map(filter -> SearchUtils.RESOURCE_TYPE_FIELD + ":" + filter)
.collect(joining(" OR "))
);
}

for (int i = 0; i < discoveryQuery.getFieldPresentQueries().size(); i++) {
Expand Down
Expand Up @@ -7,6 +7,8 @@
*/
package org.dspace.app.rest;

import static org.apache.commons.collections4.ListUtils.emptyIfNull;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
Expand Down Expand Up @@ -100,51 +102,55 @@ public SearchConfigurationResource getSearchConfiguration(

@RequestMapping(method = RequestMethod.GET, value = "/search/facets")
public FacetsResource getFacets(@RequestParam(name = "query", required = false) String query,
@RequestParam(name = "dsoType", required = false) String dsoType,
@RequestParam(name = "dsoType", required = false) List<String> dsoTypes,
@RequestParam(name = "scope", required = false) String dsoScope,
@RequestParam(name = "configuration", required = false) String configuration,
List<SearchFilter> searchFilters,
Pageable page) throws Exception {

dsoTypes = emptyIfNull(dsoTypes);

if (log.isTraceEnabled()) {
log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope)
+ ", configuration name: " + StringUtils.trimToEmpty(configuration)
+ ", dsoType: " + StringUtils.trimToEmpty(dsoType)
+ ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters));
+ ", configuration name: " + StringUtils.trimToEmpty(configuration)
+ ", dsoTypes: " + String.join(", ", dsoTypes)
+ ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters));
}

SearchResultsRest searchResultsRest = discoveryRestRepository
.getAllFacets(query, dsoType, dsoScope, configuration, searchFilters);
.getAllFacets(query, dsoTypes, dsoScope, configuration, searchFilters);

FacetsResource facetsResource = new FacetsResource(searchResultsRest, page);
halLinkService.addLinks(facetsResource, page);

return facetsResource;


}

@RequestMapping(method = RequestMethod.GET, value = "/search/objects")
public SearchResultsResource getSearchObjects(@RequestParam(name = "query", required = false) String query,
@RequestParam(name = "dsoType", required = false) String dsoType,
@RequestParam(name = "dsoType", required = false)
List<String> dsoTypes,
@RequestParam(name = "scope", required = false) String dsoScope,
@RequestParam(name = "configuration", required = false) String
configuration,
List<SearchFilter> searchFilters,
Pageable page) throws Exception {

dsoTypes = emptyIfNull(dsoTypes);

if (log.isTraceEnabled()) {
log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope)
+ ", configuration name: " + StringUtils.trimToEmpty(configuration)
+ ", dsoType: " + StringUtils.trimToEmpty(dsoType)
+ ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters)
+ ", page: " + Objects.toString(page));
+ ", configuration name: " + StringUtils.trimToEmpty(configuration)
+ ", dsoTypes: " + String.join(", ", dsoTypes)
+ ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters)
+ ", page: " + Objects.toString(page));
}

//Get the Search results in JSON format
SearchResultsRest searchResultsRest = discoveryRestRepository
.getSearchObjects(query, dsoType, dsoScope, configuration, searchFilters, page, utils.obtainProjection());
.getSearchObjects(query, dsoTypes, dsoScope, configuration, searchFilters, page, utils.obtainProjection());

//Convert the Search JSON results to paginated HAL resources
SearchResultsResource searchResultsResource = new SearchResultsResource(searchResultsRest, utils, page);
Expand Down Expand Up @@ -174,23 +180,26 @@ public FacetConfigurationResource getFacetsConfiguration(
public RepresentationModel getFacetValues(@PathVariable("name") String facetName,
@RequestParam(name = "prefix", required = false) String prefix,
@RequestParam(name = "query", required = false) String query,
@RequestParam(name = "dsoType", required = false) String dsoType,
@RequestParam(name = "dsoType", required = false) List<String> dsoTypes,
@RequestParam(name = "scope", required = false) String dsoScope,
@RequestParam(name = "configuration", required = false) String
configuration,
List<SearchFilter> searchFilters,
Pageable page) throws Exception {

dsoTypes = emptyIfNull(dsoTypes);

if (log.isTraceEnabled()) {
log.trace("Facetting on facet " + facetName + " with scope: " + StringUtils.trimToEmpty(dsoScope)
+ ", dsoType: " + StringUtils.trimToEmpty(dsoType)
+ ", dsoTypes: " + String.join(", ", dsoTypes)
+ ", prefix: " + StringUtils.trimToEmpty(prefix)
+ ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters)
+ ", page: " + Objects.toString(page));
}

FacetResultsRest facetResultsRest = discoveryRestRepository
.getFacetObjects(facetName, prefix, query, dsoType, dsoScope, configuration, searchFilters, page);
.getFacetObjects(facetName, prefix, query, dsoTypes, dsoScope, configuration, searchFilters, page);

FacetResultsResource facetResultsResource = converter.toResource(facetResultsRest);

Expand Down
Expand Up @@ -35,13 +35,14 @@ public class DiscoverFacetResultsConverter {
@Autowired
private SearchFilterToAppliedFilterConverter searchFilterToAppliedFilterConverter;

public FacetResultsRest convert(Context context, String facetName, String prefix, String query, String dsoType,
String dsoScope, List<SearchFilter> searchFilters, DiscoverResult searchResult,
DiscoveryConfiguration configuration, Pageable page, Projection projection) {
public FacetResultsRest convert(Context context, String facetName, String prefix, String query,
List<String> dsoTypes, String dsoScope, List<SearchFilter> searchFilters,
DiscoverResult searchResult, DiscoveryConfiguration configuration, Pageable page,
Projection projection) {
FacetResultsRest facetResultsRest = new FacetResultsRest();
facetResultsRest.setProjection(projection);

setRequestInformation(context, facetName, prefix, query, dsoType, dsoScope, searchFilters, searchResult,
setRequestInformation(context, facetName, prefix, query, dsoTypes, dsoScope, searchFilters, searchResult,
configuration, facetResultsRest, page, projection);

addToFacetResultList(facetName, searchResult, facetResultsRest, configuration, page, projection);
Expand Down Expand Up @@ -72,14 +73,14 @@ private SearchFacetValueRest buildSearchFacetValueRestFromFacetResult(DiscoverRe
return facetValueConverter.convert(value, projection);
}

private void setRequestInformation(Context context, String facetName, String prefix, String query, String dsoType,
String dsoScope, List<SearchFilter> searchFilters, DiscoverResult searchResult,
DiscoveryConfiguration configuration, FacetResultsRest facetResultsRest,
Pageable page, Projection projection) {
private void setRequestInformation(Context context, String facetName, String prefix, String query,
List<String> dsoTypes, String dsoScope, List<SearchFilter> searchFilters,
DiscoverResult searchResult, DiscoveryConfiguration configuration,
FacetResultsRest facetResultsRest, Pageable page, Projection projection) {
facetResultsRest.setQuery(query);
facetResultsRest.setPrefix(prefix);
facetResultsRest.setScope(dsoScope);
facetResultsRest.setDsoType(dsoType);
facetResultsRest.setDsoTypes(dsoTypes);

facetResultsRest.setFacetEntry(convertFacetEntry(facetName, searchResult, configuration, page, projection));

Expand Down
Expand Up @@ -38,15 +38,15 @@ public class DiscoverFacetsConverter {
@Autowired
private SearchService searchService;

public SearchResultsRest convert(Context context, String query, String dsoType, String configurationName,
public SearchResultsRest convert(Context context, String query, List<String> dsoTypes, String configurationName,
String dsoScope, List<SearchFilter> searchFilters, final Pageable page,
DiscoveryConfiguration configuration, DiscoverResult searchResult,
Projection projection) {

SearchResultsRest searchResultsRest = new SearchResultsRest();
searchResultsRest.setProjection(projection);

setRequestInformation(context, query, dsoType, configurationName, dsoScope, searchFilters, page,
setRequestInformation(context, query, dsoTypes, configurationName, dsoScope, searchFilters, page,
searchResultsRest);
addFacetValues(context, searchResult, searchResultsRest, configuration, projection);

Expand Down Expand Up @@ -129,13 +129,13 @@ private void handleExposeMinMaxValues(Context context, DiscoverySearchFilterFace
}
}

private void setRequestInformation(final Context context, final String query, final String dsoType,
private void setRequestInformation(final Context context, final String query, final List<String> dsoTypes,
final String configurationName, final String scope,
final List<SearchFilter> searchFilters, final Pageable page,
final SearchResultsRest resultsRest) {
resultsRest.setQuery(query);
resultsRest.setConfiguration(configurationName);
resultsRest.setDsoType(dsoType);
resultsRest.setDsoTypes(dsoTypes);
resultsRest.setSort(SearchResultsRest.Sorting.fromPage(page));

resultsRest.setScope(scope);
Expand Down
Expand Up @@ -43,7 +43,7 @@ public class DiscoverResultConverter {
@Autowired
private SearchFilterToAppliedFilterConverter searchFilterToAppliedFilterConverter;

public SearchResultsRest convert(final Context context, final String query, final String dsoType,
public SearchResultsRest convert(final Context context, final String query, final List<String> dsoTypes,
final String configurationName, final String scope,
final List<SearchFilter> searchFilters, final Pageable page,
final DiscoverResult searchResult, final DiscoveryConfiguration configuration,
Expand All @@ -52,7 +52,7 @@ public SearchResultsRest convert(final Context context, final String query, fina
SearchResultsRest resultsRest = new SearchResultsRest();
resultsRest.setProjection(projection);

setRequestInformation(context, query, dsoType, configurationName, scope, searchFilters, page, resultsRest);
setRequestInformation(context, query, dsoTypes, configurationName, scope, searchFilters, page, resultsRest);

addSearchResults(searchResult, resultsRest, projection);

Expand Down Expand Up @@ -101,13 +101,13 @@ private RestAddressableModel convertDSpaceObject(final IndexableObject indexable
return null;
}

private void setRequestInformation(final Context context, final String query, final String dsoType,
private void setRequestInformation(final Context context, final String query, final List<String> dsoTypes,
final String configurationName, final String scope,
final List<SearchFilter> searchFilters, final Pageable page,
final SearchResultsRest resultsRest) {
resultsRest.setQuery(query);
resultsRest.setConfiguration(configurationName);
resultsRest.setDsoType(dsoType);
resultsRest.setDsoTypes(dsoTypes);

resultsRest.setScope(scope);

Expand Down
Expand Up @@ -28,7 +28,7 @@ public abstract class DiscoveryRestHalLinkFactory<T> extends HalLinkFactory<T, D
public UriComponentsBuilder buildSearchBaseLink(final DiscoveryResultsRest data) {
try {
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn()
.getSearchObjects(data.getQuery(), data.getDsoType(),
.getSearchObjects(data.getQuery(), data.getDsoTypes(),
data.getScope(), data.getConfiguration(),
null, null));

Expand All @@ -43,7 +43,7 @@ protected UriComponentsBuilder buildFacetBaseLink(final FacetResultsRest data) {
try {
UriComponentsBuilder uriBuilder = uriBuilder(
getMethodOn().getFacetValues(data.getFacetEntry().getName(), data.getPrefix(), data.getQuery(),
data.getDsoType(), data.getScope(), data.getConfiguration(), null, null));
data.getDsoTypes(), data.getScope(), data.getConfiguration(), null, null));

return addFilterParams(uriBuilder, data);
} catch (Exception ex) {
Expand All @@ -54,7 +54,7 @@ protected UriComponentsBuilder buildFacetBaseLink(final FacetResultsRest data) {

protected UriComponentsBuilder buildSearchFacetsBaseLink(final SearchResultsRest data) {
try {
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn().getFacets(data.getQuery(), data.getDsoType(),
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn().getFacets(data.getQuery(), data.getDsoTypes(),
data.getScope(), data.getConfiguration(), null, null));

uriBuilder = addSortingParms(uriBuilder, data);
Expand Down
Expand Up @@ -8,6 +8,7 @@
package org.dspace.app.rest.link.search;

import java.util.LinkedList;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
Expand Down Expand Up @@ -39,7 +40,7 @@ protected void addLinks(SearchFacetEntryResource halResource, Pageable pageable,
DiscoveryResultsRest searchData = halResource.getSearchData();

String query = searchData == null ? null : searchData.getQuery();
String dsoType = searchData == null ? null : searchData.getDsoType();
List<String> dsoType = searchData == null ? null : searchData.getDsoTypes();
String scope = searchData == null ? null : searchData.getScope();
String configuration = searchData == null ? null : searchData.getConfiguration();

Expand Down
Expand Up @@ -27,7 +27,7 @@ public abstract class DiscoveryResultsRest extends BaseObjectRest<String> {
private List<SearchResultsRest.AppliedFilter> appliedFilters;
private SearchResultsRest.Sorting sort;
@JsonIgnore
private String dsoType;
private List<String> dsoTypes;
@JsonIgnore
private List<SearchFilter> searchFilters;
private String configuration;
Expand All @@ -52,12 +52,12 @@ public void setQuery(final String query) {
this.query = query;
}

public String getDsoType() {
return dsoType;
public List<String> getDsoTypes() {
return dsoTypes;
}

public void setDsoType(final String dsoType) {
this.dsoType = dsoType;
public void setDsoTypes(final List<String> dsoTypes) {
this.dsoTypes = dsoTypes;
}

public String getScope() {
Expand Down

0 comments on commit 2027b03

Please sign in to comment.