DS-4166 Index workspace, workflow and tasks in SOLR

This commit is contained in:
Andrea Bollini
2019-02-14 14:54:42 +01:00
parent 1e3e37d11e
commit c56e41aec2
54 changed files with 1465 additions and 650 deletions

View File

@@ -22,6 +22,7 @@ import com.sun.syndication.feed.module.opensearch.impl.OpenSearchModuleImpl;
import com.sun.syndication.io.FeedException;
import org.apache.logging.log4j.Logger;
import org.dspace.app.util.service.OpenSearchService;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Constants;
import org.dspace.core.Context;
@@ -118,7 +119,7 @@ public class OpenSearchServiceImpl implements OpenSearchService {
@Override
public String getResultsString(Context context, String format, String query, int totalResults, int start,
int pageSize,
DSpaceObject scope, List<DSpaceObject> results,
DSpaceObject scope, List<BrowsableDSpaceObject> results,
Map<String, String> labels) throws IOException {
try {
return getResults(context, format, query, totalResults, start, pageSize, scope, results, labels)
@@ -132,7 +133,7 @@ public class OpenSearchServiceImpl implements OpenSearchService {
@Override
public Document getResultsDoc(Context context, String format, String query, int totalResults, int start,
int pageSize,
DSpaceObject scope, List<DSpaceObject> results, Map<String, String> labels)
DSpaceObject scope, List<BrowsableDSpaceObject> results, Map<String, String> labels)
throws IOException {
try {
return getResults(context, format, query, totalResults, start, pageSize, scope, results, labels)
@@ -144,8 +145,8 @@ public class OpenSearchServiceImpl implements OpenSearchService {
}
protected SyndicationFeed getResults(Context context, String format, String query, int totalResults, int start,
int pageSize,
DSpaceObject scope, List<DSpaceObject> results, Map<String, String> labels) {
int pageSize, DSpaceObject scope,
List<BrowsableDSpaceObject> results, Map<String, String> labels) {
// Encode results in requested format
if ("rss".equals(format)) {
format = "rss_2.0";

View File

@@ -37,6 +37,7 @@ import com.sun.syndication.io.SyndFeedOutput;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Collection;
@@ -184,7 +185,7 @@ public class SyndicationFeed {
* @param labels label map
*/
public void populate(HttpServletRequest request, Context context, DSpaceObject dso,
List<? extends DSpaceObject> items, Map<String, String> labels) {
List<BrowsableDSpaceObject> items, Map<String, String> labels) {
String logoURL = null;
String objectURL = null;
String defaultTitle = null;
@@ -247,7 +248,7 @@ public class SyndicationFeed {
// add entries for items
if (items != null) {
List<SyndEntry> entries = new ArrayList<SyndEntry>();
for (DSpaceObject itemDSO : items) {
for (BrowsableDSpaceObject itemDSO : items) {
if (itemDSO.getType() != Constants.ITEM) {
continue;
}

View File

@@ -473,6 +473,26 @@ public class Util {
return toReturn;
}
/**
* Split a list in an array of i sub-lists uniformly sized
*
* @param idsList the list to split
* @param i the number of sublists to return
*
* @return an array of sub-lists of fixed size
*/
public static <T> List<T>[] splitList(List<T> idsList, int i) {
int setmin = idsList.size() / i;
List<T>[] result = new List[i];
int offset = 0;
for (int idx = 0; idx < i - 1; idx++) {
result[idx] = idsList.subList(offset, offset + setmin);
offset += setmin;
}
result[i - 1] = idsList.subList(offset, idsList.size());
return result;
}
public static List<String> differenceInSubmissionFields(Collection fromCollection, Collection toCollection)
throws DCInputsReaderException {
DCInputsReader reader = new DCInputsReader();

View File

@@ -12,6 +12,7 @@ import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.w3c.dom.Document;
@@ -91,7 +92,7 @@ public interface OpenSearchService {
*/
public String getResultsString(Context context, String format, String query, int totalResults, int start,
int pageSize,
DSpaceObject scope, List<DSpaceObject> results,
DSpaceObject scope, List<BrowsableDSpaceObject> results,
Map<String, String> labels) throws IOException;
/**
@@ -111,7 +112,7 @@ public interface OpenSearchService {
*/
public Document getResultsDoc(Context context, String format, String query, int totalResults, int start,
int pageSize,
DSpaceObject scope, List<DSpaceObject> results, Map<String, String> labels)
DSpaceObject scope, List<BrowsableDSpaceObject> results, Map<String, String> labels)
throws IOException;
public DSpaceObject resolveScope(Context context, String scope) throws SQLException;

View File

@@ -767,4 +767,10 @@ public class AuthorizeServiceImpl implements AuthorizeService {
return policy;
}
@Override
public List<ResourcePolicy> getPoliciesActionFilterExceptRpType(Context c, DSpaceObject o, int actionID,
String rpType) throws SQLException {
return resourcePolicyService.findExceptRpType(c, o, actionID, rpType);
}
}

View File

@@ -307,4 +307,10 @@ public class ResourcePolicyServiceImpl implements ResourcePolicyService {
context.restoreAuthSystemState();
}
}
@Override
public List<ResourcePolicy> findExceptRpType(Context c, DSpaceObject o, int actionID, String rpType)
throws SQLException {
return resourcePolicyDAO.findByDSoAndActionExceptRpType(c, o, actionID, rpType);
}
}

View File

@@ -66,4 +66,17 @@ public interface ResourcePolicyDAO extends GenericDAO<ResourcePolicy> {
public void deleteByDsoEPersonPolicies(Context context, DSpaceObject dso, EPerson ePerson) throws SQLException;
public void deleteByDsoAndTypeNotEqualsTo(Context c, DSpaceObject o, String type) throws SQLException;
/**
* Return a list of policies for an object that match the action except the record labeled with the rpType
*
* @param c context
* @param o DSpaceObject policies relate to
* @param actionID action (defined in class Constants)
* @param rpType the resource policy type
* @return list of resource policies
* @throws SQLException if there's a database problem
*/
public List<ResourcePolicy> findByDSoAndActionExceptRpType(Context c, DSpaceObject o, int actionID,
String rpType) throws SQLException;
}

View File

@@ -201,4 +201,21 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO<ResourcePolicy>
query.setParameter("rptype", type);
query.executeUpdate();
}
@Override
public List<ResourcePolicy> findByDSoAndActionExceptRpType(Context context, DSpaceObject dso, int action,
String rpType) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class);
Root<ResourcePolicy> resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class);
criteriaQuery.select(resourcePolicyRoot);
criteriaQuery.where(
criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso),
criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action),
criteriaBuilder.notEqual(resourcePolicyRoot.get(ResourcePolicy_.rptype), rpType)
)
);
return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1);
}
}

View File

@@ -312,6 +312,18 @@ public interface AuthorizeService {
*/
public List<ResourcePolicy> getPoliciesActionFilter(Context c, DSpaceObject o, int actionID) throws SQLException;
/**
* Return a list of policies for an object that match the action except the record labeled with the rpType
*
* @param c context
* @param o DSpaceObject policies relate to
* @param actionID action (defined in class Constants)
* @param rpType the resource policy type
* @return list of resource policies
* @throws SQLException if there's a database problem
*/
public List<ResourcePolicy> getPoliciesActionFilterExceptRpType(Context c, DSpaceObject o, int actionID,
String rpType) throws SQLException;
/**
* Add policies to an object to match those from a previous object
*

View File

@@ -76,4 +76,16 @@ public interface ResourcePolicyService extends DSpaceCRUDService<ResourcePolicy>
public void removeDsoAndTypeNotEqualsToPolicies(Context c, DSpaceObject o, String type)
throws SQLException, AuthorizeException;
/**
* Return a list of policies for an object that match the action except the record labeled with the rpType
*
* @param c context
* @param o DSpaceObject policies relate to
* @param actionID action (defined in class Constants)
* @param rpType the resource policy type
* @return list of resource policies
* @throws SQLException if there's a database problem
*/
public List<ResourcePolicy> findExceptRpType(Context c, DSpaceObject o, int actionID, String rpType)
throws SQLException;
}

View File

@@ -114,6 +114,8 @@ public class BrowserScope {
private String authority = null;
private String userLocale = null;
/**
* Construct a new BrowserScope using the given Context
*
@@ -131,7 +133,7 @@ public class BrowserScope {
* @param dso the container object; a Community or Collection
* @throws BrowseException if browse error
*/
public void setBrowseContainer(DSpaceObject dso)
public void setBrowseContainer(BrowsableDSpaceObject dso)
throws BrowseException {
if (dso instanceof Collection) {
this.collection = (Collection) dso;
@@ -582,4 +584,12 @@ public class BrowserScope {
public void setAuthorityValue(String value) {
authority = value;
}
public void setUserLocale(String userLocale) {
this.userLocale = userLocale;
}
public String getUserLocale() {
return userLocale;
}
}

View File

@@ -19,7 +19,6 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Constants;
import org.dspace.core.Context;
@@ -308,7 +307,7 @@ public class SolrBrowseDAO implements BrowseDAO {
DiscoverResult resp = getSolrResponse();
List<Item> bitems = new ArrayList<>();
for (DSpaceObject solrDoc : resp.getDspaceObjects()) {
for (BrowsableDSpaceObject<UUID> solrDoc : resp.getDspaceObjects()) {
// FIXME introduce project, don't retrieve Item immediately when
// processing the query...
Item item = (Item) solrDoc;

View File

@@ -69,6 +69,8 @@ public class DiscoverQuery {
**/
private Map<String, List<String>> properties;
private String discoveryConfigurationName;
public DiscoverQuery() {
//Initialize all our lists
this.filterQueries = new ArrayList<String>();
@@ -331,6 +333,7 @@ public class DiscoverQuery {
// Example: 2001 and a gap from 10 we need the following result: 2010 - 2000 ; 2000 - 1990 hence the top
// year
int topYear = getTopYear(newestYear, gap);
if (gap == 1) {
//We need a list of our years
//We have a date range add faceting for our field
@@ -376,4 +379,11 @@ public class DiscoverQuery {
return (int) (Math.ceil((float) (newestYear) / gap) * gap);
}
public String getDiscoveryConfigurationName() {
return discoveryConfigurationName;
}
public void setDiscoveryConfigurationName(String discoveryConfigurationName) {
this.discoveryConfigurationName = discoveryConfigurationName;
}
}

View File

@@ -15,7 +15,7 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.ListUtils;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.discovery.configuration.DiscoveryConfigurationParameters;
import org.dspace.discovery.configuration.DiscoverySearchFilterFacet;
@@ -28,8 +28,11 @@ public class DiscoverResult {
private long totalSearchResults;
private int start;
private List<DSpaceObject> dspaceObjects;
private List<BrowsableDSpaceObject> dspaceObjects;
private Map<String, List<FacetResult>> facetResults;
private Map<String, List<FacetResult>> facetQueryResults;
private Map<String, List<FacetResult>> facetFieldResults;
/**
* A map that contains all the documents sougth after, the key is a string representation of the DSpace object
*/
@@ -39,20 +42,20 @@ public class DiscoverResult {
private Map<String, DSpaceObjectHighlightResult> highlightedResults;
private String spellCheckQuery;
public DiscoverResult() {
dspaceObjects = new ArrayList<DSpaceObject>();
dspaceObjects = new ArrayList<BrowsableDSpaceObject>();
facetResults = new LinkedHashMap<String, List<FacetResult>>();
facetQueryResults = new LinkedHashMap<String, List<FacetResult>>();
facetFieldResults = new LinkedHashMap<String, List<FacetResult>>();
searchDocuments = new LinkedHashMap<String, List<SearchDocument>>();
highlightedResults = new HashMap<String, DSpaceObjectHighlightResult>();
}
public void addDSpaceObject(DSpaceObject dso) {
public void addDSpaceObject(BrowsableDSpaceObject dso) {
this.dspaceObjects.add(dso);
}
public List<DSpaceObject> getDspaceObjects() {
public List<BrowsableDSpaceObject> getDspaceObjects() {
return dspaceObjects;
}
@@ -101,25 +104,59 @@ public class DiscoverResult {
return facetResults;
}
public List<FacetResult> getFacetQueryResult(String facet) {
return facetQueryResults.get(facet) == null ? new ArrayList<FacetResult>() : facetQueryResults.get(facet);
}
public void addFacetQueryResult(String facetField, FacetResult... facetResults) {
List<FacetResult> facetValues = this.facetQueryResults.get(facetField);
if (facetValues == null) {
facetValues = new ArrayList<FacetResult>();
}
facetValues.addAll(Arrays.asList(facetResults));
this.facetQueryResults.put(facetField, facetValues);
}
public Map<String, List<FacetResult>> getFacetQueryResults() {
return facetQueryResults;
}
public List<FacetResult> getFacetFieldResult(String facet) {
return facetFieldResults.get(facet) == null ? new ArrayList<FacetResult>() : facetFieldResults.get(facet);
}
public void addFacetFieldResult(String facetField, FacetResult... facetResults) {
List<FacetResult> facetValues = this.facetFieldResults.get(facetField);
if (facetValues == null) {
facetValues = new ArrayList<FacetResult>();
}
facetValues.addAll(Arrays.asList(facetResults));
this.facetFieldResults.put(facetField, facetValues);
}
public Map<String, List<FacetResult>> getFacetFieldResults() {
return facetFieldResults;
}
public List<FacetResult> getFacetResult(String facet) {
return ListUtils.emptyIfNull(facetResults.get(facet));
}
public List<FacetResult> getFacetResult(DiscoverySearchFilterFacet field) {
List<DiscoverResult.FacetResult> facetValues = getFacetResult(field.getIndexFieldName());
//Check if we are dealing with a date, sometimes the facet values arrive as dates !
// 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 DSpaceObjectHighlightResult getHighlightedResults(DSpaceObject dso) {
return highlightedResults.get(dso.getHandle());
public DSpaceObjectHighlightResult getHighlightedResults(BrowsableDSpaceObject dso) {
return highlightedResults.get(dso.getUniqueIndexID());
}
public void addHighlightedResult(DSpaceObject dso, DSpaceObjectHighlightResult highlightedResult) {
this.highlightedResults.put(dso.getHandle(), highlightedResult);
public void addHighlightedResult(BrowsableDSpaceObject dso, DSpaceObjectHighlightResult highlightedResult) {
this.highlightedResults.put(dso.getUniqueIndexID(), highlightedResult);
}
public static final class FacetResult {
@@ -131,7 +168,7 @@ public class DiscoverResult {
private String fieldType;
public FacetResult(String asFilterQuery, String displayedValue, String authorityKey, String sortValue,
long count, String fieldType) {
long count, String fieldType) {
this.asFilterQuery = asFilterQuery;
this.displayedValue = displayedValue;
this.authorityKey = authorityKey;
@@ -141,6 +178,10 @@ public class DiscoverResult {
}
public String getAsFilterQuery() {
if (asFilterQuery == null) {
// missing facet filter query
return "[* TO *]";
}
return asFilterQuery;
}
@@ -161,7 +202,7 @@ public class DiscoverResult {
}
public String getFilterType() {
return authorityKey != null ? "authority" : "equals";
return authorityKey != null ? "authority" : asFilterQuery != null ? "equals" : "notequals";
}
public String getFieldType() {
@@ -178,15 +219,18 @@ public class DiscoverResult {
}
public static final class DSpaceObjectHighlightResult {
private DSpaceObject dso;
private BrowsableDSpaceObject dso;
private Map<String, List<String>> highlightResults;
private Map<String, List<String[]>> highlightResultsWithAuthority;
public DSpaceObjectHighlightResult(DSpaceObject dso, Map<String, List<String>> highlightResults) {
public DSpaceObjectHighlightResult(BrowsableDSpaceObject dso, Map<String, List<String>> highlightResults,
Map<String, List<String[]>> highlightResultsWithAuthority) {
this.dso = dso;
this.highlightResults = highlightResults;
this.highlightResultsWithAuthority = highlightResultsWithAuthority;
}
public DSpaceObject getDso() {
public BrowsableDSpaceObject getDso() {
return dso;
}
@@ -194,12 +238,16 @@ public class DiscoverResult {
return highlightResults.get(metadataKey);
}
public List<String[]> getHighlightResultsWithAuthority(String metadataKey) {
return highlightResultsWithAuthority.get(metadataKey);
}
public Map<String, List<String>> getHighlightResults() {
return highlightResults;
}
}
public void addSearchDocument(DSpaceObject dso, SearchDocument searchDocument) {
public void addSearchDocument(BrowsableDSpaceObject dso, SearchDocument searchDocument) {
String dsoString = SearchDocument.getDspaceObjectStringRepresentation(dso);
List<SearchDocument> docs = searchDocuments.get(dsoString);
if (docs == null) {
@@ -212,10 +260,11 @@ public class DiscoverResult {
/**
* Returns all the sought after search document values
*
* @param dso the dspace object we want our search documents for
* @param dso
* the dspace object we want our search documents for
* @return the search documents list
*/
public List<SearchDocument> getSearchDocument(DSpaceObject dso) {
public List<SearchDocument> getSearchDocument(BrowsableDSpaceObject dso) {
String dsoString = SearchDocument.getDspaceObjectStringRepresentation(dso);
List<SearchDocument> result = searchDocuments.get(dsoString);
if (result == null) {
@@ -256,7 +305,7 @@ public class DiscoverResult {
}
}
public static String getDspaceObjectStringRepresentation(DSpaceObject dso) {
public static String getDspaceObjectStringRepresentation(BrowsableDSpaceObject dso) {
return dso.getType() + ":" + dso.getID();
}
}

View File

@@ -11,7 +11,7 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Context;
import org.dspace.discovery.configuration.DiscoverySearchFilterFacet;
@@ -46,8 +46,8 @@ public class FacetYearRange {
return oldestYear != -1 && newestYear != -1;
}
public void calculateRange(Context context, List<String> filterQueries, DSpaceObject scope,
SearchService searchService) throws SearchServiceException {
public void calculateRange(Context context, List<String> filterQueries, BrowsableDSpaceObject scope,
SearchService searchService, DiscoverQuery parentQuery) throws SearchServiceException {
dateFacet = facet.getIndexFieldName() + ".year";
//Get a range query so we can create facet queries ranging from our first to our last date
//Attempt to determine our oldest & newest year by checking for previously selected filters
@@ -55,7 +55,7 @@ public class FacetYearRange {
//Check if we have found a range, if not then retrieve our first & last year using Solr
if (oldestYear == -1 && newestYear == -1) {
calculateNewRangeBasedOnSearchIndex(context, filterQueries, scope, searchService);
calculateNewRangeBasedOnSearchIndex(context, filterQueries, scope, searchService, parentQuery);
}
}
@@ -93,9 +93,11 @@ public class FacetYearRange {
}
}
private void calculateNewRangeBasedOnSearchIndex(Context context, List<String> filterQueries, DSpaceObject scope,
SearchService searchService) throws SearchServiceException {
private void calculateNewRangeBasedOnSearchIndex(Context context, List<String> filterQueries,
BrowsableDSpaceObject scope, SearchService searchService,
DiscoverQuery parentQuery) throws SearchServiceException {
DiscoverQuery yearRangeQuery = new DiscoverQuery();
yearRangeQuery.setDiscoveryConfigurationName(parentQuery.getDiscoveryConfigurationName());
yearRangeQuery.setMaxResults(1);
//Set our query to anything that has this value
yearRangeQuery.addFieldPresentQueries(dateFacet);

View File

@@ -7,9 +7,16 @@
*/
package org.dspace.discovery;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
@@ -17,12 +24,13 @@ import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
import org.apache.logging.log4j.Logger;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.handle.factory.HandleServiceFactory;
@@ -58,8 +66,8 @@ public class IndexClient {
Context context = new Context(Context.Mode.READ_ONLY);
context.turnOffAuthorisationSystem();
String usage = "org.dspace.discovery.IndexClient [-cbhf] | [-r <handle>] | [-i <handle>] or nothing to " +
"update/clean an existing index.";
String usage = "org.dspace.discovery.IndexClient [-cbhf] | [-r <handle>] | [-i <handle>] | [-item_uuid " +
"<uuid>] or nothing to update/clean an existing index.";
Options options = new Options();
HelpFormatter formatter = new HelpFormatter();
CommandLine line = null;
@@ -71,6 +79,9 @@ public class IndexClient {
"remove an Item, Collection or Community from index based on its handle")
.create("r"));
options.addOption(OptionBuilder.withArgName("item uuid to index").hasArg(true)
.withDescription("add an Item based on its uuid").create("item_uuid"));
options.addOption(OptionBuilder
.withArgName("handle to add or update")
.hasArg(true)
@@ -78,6 +89,11 @@ public class IndexClient {
"add or update an Item, Collection or Community based on its handle")
.create("i"));
options.addOption(OptionBuilder.isRequired(false).hasArg(true)
.withDescription("update an Item, Collection or Community from index based on its handle, use with -f "
+ "to force clean")
.create("u"));
options.addOption(OptionBuilder
.isRequired(false)
.withDescription(
@@ -111,6 +127,8 @@ public class IndexClient {
options.addOption(OptionBuilder.isRequired(false).withDescription(
"optimize search core").create("o"));
options.addOption("e", "readfile", true, "Read the identifier from a file");
try {
line = new PosixParser().parse(options, args);
} catch (Exception e) {
@@ -150,10 +168,55 @@ public class IndexClient {
indexer.optimize();
} else if (line.hasOption('s')) {
checkRebuildSpellCheck(line, indexer);
} else if (line.hasOption("item_uuid")) {
String itemUUID = line.getOptionValue("item_uuid");
Item item = ContentServiceFactory.getInstance().getItemService().find(context, UUID.fromString(itemUUID));
indexer.indexContent(context, item, line.hasOption("f"));
} else if (line.hasOption("u")) {
String optionValue = line.getOptionValue("u");
String[] identifiers = optionValue.split("\\s*,\\s*");
for (String id : identifiers) {
if (id.startsWith(ConfigurationManager.getProperty("handle.prefix")) || id.startsWith("123456789/")) {
BrowsableDSpaceObject dso = (BrowsableDSpaceObject) HandleServiceFactory.getInstance()
.getHandleService().resolveToObject(context, id);
indexer.indexContent(context, dso, line.hasOption("f"));
}
}
} else if (line.hasOption('e')) {
try {
String filename = line.getOptionValue('e');
FileInputStream fstream = new FileInputStream(filename);
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
// Read File Line By Line
UUID item_id = null;
List<UUID> ids = new ArrayList<UUID>();
while ((strLine = br.readLine()) != null) {
item_id = UUID.fromString(strLine.trim());
ids.add(item_id);
}
in.close();
int type = -1;
if (line.hasOption('t')) {
type = Integer.parseInt(line.getOptionValue("t"));
} else {
// force to item
type = Constants.ITEM;
}
indexer.updateIndex(context, ids, line.hasOption("f"), type);
} catch (Exception e) {
log.error("Error: " + e.getMessage());
}
} else if (line.hasOption('i')) {
final String handle = line.getOptionValue('i');
final DSpaceObject dso = HandleServiceFactory.getInstance().getHandleService()
.resolveToObject(context, handle);
final BrowsableDSpaceObject dso = (BrowsableDSpaceObject) HandleServiceFactory.getInstance()
.getHandleService().resolveToObject(context, handle);
if (dso == null) {
throw new IllegalArgumentException("Cannot resolve " + handle + " to a DSpace object");
}
@@ -186,7 +249,7 @@ public class IndexClient {
private static long indexAll(final IndexingService indexingService,
final ItemService itemService,
final Context context,
final DSpaceObject dso)
final BrowsableDSpaceObject dso)
throws IOException, SearchServiceException, SQLException {
long count = 0;

View File

@@ -11,6 +11,7 @@ import java.util.HashSet;
import java.util.Set;
import org.apache.logging.log4j.Logger;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Bundle;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Constants;
@@ -33,10 +34,10 @@ public class IndexEventConsumer implements Consumer {
private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IndexEventConsumer.class);
// collect Items, Collections, Communities that need indexing
private Set<DSpaceObject> objectsToUpdate = null;
private Set<BrowsableDSpaceObject> objectsToUpdate = null;
// handles to delete since IDs are not useful by now.
private Set<String> handlesToDelete = null;
// unique search IDs to delete
private Set<String> uniqueIdsToDelete = null;
IndexingService indexer = DSpaceServicesFactory.getInstance().getServiceManager()
.getServiceByName(IndexingService.class.getName(),
@@ -58,8 +59,8 @@ public class IndexEventConsumer implements Consumer {
public void consume(Context ctx, Event event) throws Exception {
if (objectsToUpdate == null) {
objectsToUpdate = new HashSet<DSpaceObject>();
handlesToDelete = new HashSet<String>();
objectsToUpdate = new HashSet<BrowsableDSpaceObject>();
uniqueIdsToDelete = new HashSet<String>();
}
int st = event.getSubjectType();
@@ -107,7 +108,7 @@ public class IndexEventConsumer implements Consumer {
+ ", perhaps it has been deleted.");
} else {
log.debug("consume() adding event to update queue: " + event.toString());
objectsToUpdate.add(subject);
objectsToUpdate.add((BrowsableDSpaceObject)subject);
}
break;
@@ -120,17 +121,17 @@ public class IndexEventConsumer implements Consumer {
+ ", perhaps it has been deleted.");
} else {
log.debug("consume() adding event to update queue: " + event.toString());
objectsToUpdate.add(object);
objectsToUpdate.add((BrowsableDSpaceObject)object);
}
break;
case Event.DELETE:
String detail = event.getDetail();
if (detail == null) {
log.warn("got null detail on DELETE event, skipping it.");
if (event.getSubjectType() == -1 || event.getSubjectID() == null) {
log.warn("got null subject type and/or ID on DELETE event, skipping it.");
} else {
String detail = event.getSubjectType() + "-" + event.getSubjectID().toString();
log.debug("consume() adding event to delete queue: " + event.toString());
handlesToDelete.add(detail);
uniqueIdsToDelete.add(detail);
}
break;
default:
@@ -151,37 +152,37 @@ public class IndexEventConsumer implements Consumer {
@Override
public void end(Context ctx) throws Exception {
if (objectsToUpdate != null && handlesToDelete != null) {
if (objectsToUpdate != null && uniqueIdsToDelete != null) {
// update the changed Items not deleted because they were on create list
for (DSpaceObject o : objectsToUpdate) {
for (BrowsableDSpaceObject iu : objectsToUpdate) {
/* we let all types through here and
* allow the search indexer to make
* decisions on indexing and/or removal
*/
DSpaceObject iu = ctx.reloadEntity(o);
String hdl = iu.getHandle();
if (hdl != null && !handlesToDelete.contains(hdl)) {
// iu = ctx.reloadEntity(o);
String uniqueIndexID = iu.getUniqueIndexID();
if (uniqueIndexID != null && !uniqueIdsToDelete.contains(uniqueIndexID)) {
try {
indexer.indexContent(ctx, iu, true);
indexer.indexContent(ctx, iu, true, true);
log.debug("Indexed "
+ Constants.typeText[iu.getType()]
+ ", id=" + String.valueOf(iu.getID())
+ ", handle=" + hdl);
+ ", unique_id=" + uniqueIndexID);
} catch (Exception e) {
log.error("Failed while indexing object: ", e);
}
}
}
for (String hdl : handlesToDelete) {
for (String uid : uniqueIdsToDelete) {
try {
indexer.unIndexContent(ctx, hdl, true);
indexer.unIndexContent(ctx, uid, true);
if (log.isDebugEnabled()) {
log.debug("UN-Indexed Item, handle=" + hdl);
log.debug("UN-Indexed Item, handle=" + uid);
}
} catch (Exception e) {
log.error("Failed while UN-indexing object: " + hdl, e);
log.error("Failed while UN-indexing object: " + uid, e);
}
}
@@ -190,7 +191,7 @@ public class IndexEventConsumer implements Consumer {
// "free" the resources
objectsToUpdate = null;
handlesToDelete = null;
uniqueIdsToDelete = null;
}
@Override

View File

@@ -9,12 +9,14 @@ package org.dspace.discovery;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Context;
/**
* Interface used for indexing dspaceobject into discovery
* Interface used for indexing BrowsableDSpaceObject into discovery
*
* @author Kevin Van de Velde (kevin at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
@@ -22,28 +24,28 @@ import org.dspace.core.Context;
*/
public interface IndexingService {
void indexContent(Context context, DSpaceObject dso)
void indexContent(Context context, BrowsableDSpaceObject dso)
throws SQLException;
void indexContent(Context context, DSpaceObject dso,
void indexContent(Context context, BrowsableDSpaceObject dso,
boolean force) throws SQLException;
void indexContent(Context context, DSpaceObject dso,
void indexContent(Context context, BrowsableDSpaceObject dso,
boolean force, boolean commit) throws SQLException, SearchServiceException;
void unIndexContent(Context context, DSpaceObject dso)
void unIndexContent(Context context, BrowsableDSpaceObject dso)
throws SQLException, IOException;
void unIndexContent(Context context, DSpaceObject dso, boolean commit)
void unIndexContent(Context context, BrowsableDSpaceObject dso, boolean commit)
throws SQLException, IOException;
void unIndexContent(Context context, String handle)
throws SQLException, IOException;
void unIndexContent(Context context, String uniqueSearchID)
throws IOException;
void unIndexContent(Context context, String handle, boolean commit)
throws SQLException, IOException;
void unIndexContent(Context context, String uniqueSearchID, boolean commit)
throws IOException;
void reIndexContent(Context context, DSpaceObject dso)
void reIndexContent(Context context, BrowsableDSpaceObject dso)
throws SQLException, IOException;
void createIndex(Context context) throws SQLException, IOException;
@@ -52,9 +54,16 @@ public interface IndexingService {
void updateIndex(Context context, boolean force);
void updateIndex(Context context, boolean force, int type);
void updateIndex(Context context, List<UUID> ids, boolean force, int type);
void cleanIndex(boolean force) throws IOException,
SQLException, SearchServiceException;
void cleanIndex(boolean force, int type) throws IOException,
SQLException, SearchServiceException;
void commit() throws SearchServiceException;
void optimize() throws SearchServiceException;

View File

@@ -7,11 +7,10 @@
*/
package org.dspace.discovery;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.dspace.discovery.configuration.DiscoveryMoreLikeThisConfiguration;
@@ -50,7 +49,7 @@ public interface SearchService {
* @return discovery search result object
* @throws SearchServiceException if search error
*/
DiscoverResult search(Context context, DSpaceObject dso, DiscoverQuery query)
DiscoverResult search(Context context, BrowsableDSpaceObject dso, DiscoverQuery query)
throws SearchServiceException;
/**
@@ -74,19 +73,11 @@ public interface SearchService {
* @return discovery search result object
* @throws SearchServiceException if search error
*/
DiscoverResult search(Context context, DSpaceObject dso, DiscoverQuery query, boolean includeWithdrawn)
DiscoverResult search(Context context, BrowsableDSpaceObject dso, DiscoverQuery query, boolean includeWithdrawn)
throws SearchServiceException;
InputStream searchJSON(Context context, DiscoverQuery query, String jsonIdentifier) throws SearchServiceException;
InputStream searchJSON(Context context, DiscoverQuery query, DSpaceObject dso, String jsonIdentifier)
throws SearchServiceException;
List<DSpaceObject> search(Context context, String query, String orderfield, boolean ascending, int offset, int max,
String... filterquery);
List<BrowsableDSpaceObject> search(Context context, String query, String orderfield, boolean ascending, int offset,
int max, String... filterquery);
/**
* Transforms the given string field and value into a filter query
@@ -138,8 +129,9 @@ public interface SearchService {
*/
String escapeQueryChars(String query);
FacetYearRange getFacetYearRange(Context context, DSpaceObject scope, DiscoverySearchFilterFacet facet,
List<String> filterQueries) throws SearchServiceException;
FacetYearRange getFacetYearRange(Context context, BrowsableDSpaceObject scope, DiscoverySearchFilterFacet facet,
List<String> filterQueries, DiscoverQuery parentQuery)
throws SearchServiceException;
/**
* This method returns us either the highest or lowest value for the field that we give to it

View File

@@ -8,6 +8,7 @@
package org.dspace.discovery;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -16,10 +17,12 @@ import java.util.Map;
import org.dspace.content.Collection;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.content.WorkspaceItem;
import org.dspace.discovery.configuration.DiscoveryConfiguration;
import org.dspace.discovery.configuration.DiscoveryConfigurationService;
import org.dspace.kernel.ServiceManager;
import org.dspace.services.factory.DSpaceServicesFactory;
import org.dspace.workflow.WorkflowItem;
/**
* Util methods used by discovery
@@ -48,13 +51,26 @@ public class SearchUtils {
}
public static DiscoveryConfiguration getDiscoveryConfiguration() {
return getDiscoveryConfiguration(null);
return getDiscoveryConfiguration(null, null);
}
public static DiscoveryConfiguration getDiscoveryConfiguration(DSpaceObject dso) {
return getDiscoveryConfiguration(null, dso);
}
public static DiscoveryConfiguration getDiscoveryConfiguration(String prefix, DSpaceObject dso) {
if (prefix != null) {
return getDiscoveryConfigurationByName(dso != null ? prefix + "." + dso.getHandle() : prefix);
} else {
return getDiscoveryConfigurationByName(dso != null ? dso.getHandle() : null);
}
}
public static DiscoveryConfiguration getDiscoveryConfigurationByName(
String configurationName) {
DiscoveryConfigurationService configurationService = getConfigurationService();
return configurationService.getDiscoveryConfiguration(dso);
return configurationService.getDiscoveryConfiguration(configurationName);
}
public static DiscoveryConfigurationService getConfigurationService() {
@@ -76,23 +92,45 @@ public class SearchUtils {
* @throws SQLException An exception that provides information on a database access error or other errors.
*/
public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(Item item) throws SQLException {
List<Collection> collections = item.getCollections();
return getAllDiscoveryConfigurations(null, collections, item);
}
public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(WorkspaceItem witem) throws SQLException {
List<Collection> collections = new ArrayList<Collection>();
collections.add(witem.getCollection());
return getAllDiscoveryConfigurations("workspace", collections, witem.getItem());
}
public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(WorkflowItem witem) throws SQLException {
List<Collection> collections = new ArrayList<Collection>();
collections.add(witem.getCollection());
return getAllDiscoveryConfigurations("workflow", collections, witem.getItem());
}
private static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(String prefix,
List<Collection> collections, Item item)
throws SQLException {
Map<String, DiscoveryConfiguration> result = new HashMap<String, DiscoveryConfiguration>();
List<Collection> collections = item.getCollections();
for (Collection collection : collections) {
DiscoveryConfiguration configuration = getDiscoveryConfiguration(collection);
DiscoveryConfiguration configuration = getDiscoveryConfiguration(prefix, collection);
if (!result.containsKey(configuration.getId())) {
result.put(configuration.getId(), configuration);
}
}
//Also add one for the default
DiscoveryConfiguration configuration = getDiscoveryConfiguration(null);
if (!result.containsKey(configuration.getId())) {
result.put(configuration.getId(), configuration);
}
addConfigurationIfExists(result, prefix);
return Arrays.asList(result.values().toArray(new DiscoveryConfiguration[result.size()]));
}
private static void addConfigurationIfExists(Map<String, DiscoveryConfiguration> result, String confName) {
DiscoveryConfiguration configurationExtra = getDiscoveryConfigurationByName(confName);
if (!result.containsKey(configurationExtra.getId())) {
result.put(configurationExtra.getId(), configurationExtra);
}
}
}

View File

@@ -10,9 +10,9 @@ package org.dspace.discovery;
import java.util.List;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
@@ -30,7 +30,7 @@ import org.dspace.core.Context;
public class SolrServiceContentInOriginalBundleFilterPlugin implements SolrServiceIndexPlugin {
@Override
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) {
public void additionalIndex(Context context, BrowsableDSpaceObject dso, SolrInputDocument document) {
if (dso instanceof Item) {
Item item = (Item) dso;
boolean hasOriginalBundleWithContent = hasOriginalBundleWithContent(item);

View File

@@ -10,9 +10,9 @@ package org.dspace.discovery;
import java.util.List;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
@@ -41,7 +41,7 @@ public class SolrServiceFileInfoPlugin implements SolrServiceIndexPlugin {
private static final String SOLR_FIELD_NAME_FOR_DESCRIPTIONS = "original_bundle_descriptions";
@Override
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) {
public void additionalIndex(Context context, BrowsableDSpaceObject dso, SolrInputDocument document) {
if (dso instanceof Item) {
Item item = (Item) dso;
List<Bundle> bundles = item.getBundles();

View File

@@ -8,7 +8,7 @@
package org.dspace.discovery;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Context;
@@ -20,7 +20,7 @@ import org.dspace.core.Context;
public class SolrServiceIndexOutputPlugin implements SolrServiceIndexPlugin {
@Override
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) {
System.out.println("Currently indexing: " + dso.getHandle());
public void additionalIndex(Context context, BrowsableDSpaceObject dso, SolrInputDocument document) {
System.out.println("Currently indexing: " + dso.getUniqueIndexID());
}
}

View File

@@ -8,7 +8,7 @@
package org.dspace.discovery;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Context;
/**
@@ -20,5 +20,5 @@ import org.dspace.core.Context;
*/
public interface SolrServiceIndexPlugin {
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document);
public void additionalIndex(Context context, BrowsableDSpaceObject dso, SolrInputDocument document);
}

View File

@@ -15,9 +15,9 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.browse.BrowseException;
import org.dspace.browse.BrowseIndex;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.content.MetadataValue;
import org.dspace.content.authority.service.ChoiceAuthorityService;
@@ -57,7 +57,7 @@ public class SolrServiceMetadataBrowseIndexingPlugin implements SolrServiceIndex
protected ChoiceAuthorityService choiceAuthorityService;
@Override
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) {
public void additionalIndex(Context context, BrowsableDSpaceObject dso, SolrInputDocument document) {
// Only works for Items
if (!(dso instanceof Item)) {
return;

View File

@@ -11,12 +11,14 @@ import java.sql.SQLException;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.authorize.service.ResourcePolicyService;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.DSpaceObject;
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.CommunityService;
@@ -54,9 +56,14 @@ public class SolrServiceResourceRestrictionPlugin implements SolrServiceIndexPlu
protected ResourcePolicyService resourcePolicyService;
@Override
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) {
public void additionalIndex(Context context, BrowsableDSpaceObject bdso, SolrInputDocument document) {
if (!(bdso instanceof DSpaceObject)) {
return;
}
DSpaceObject dso = (DSpaceObject) bdso;
try {
List<ResourcePolicy> policies = authorizeService.getPoliciesActionFilter(context, dso, Constants.READ);
List<ResourcePolicy> policies = authorizeService
.getPoliciesActionFilterExceptRpType(context, dso, Constants.READ, ResourcePolicy.TYPE_WORKFLOW);
for (ResourcePolicy resourcePolicy : policies) {
String fieldValue;
if (resourcePolicy.getGroup() != null) {
@@ -82,39 +89,67 @@ public class SolrServiceResourceRestrictionPlugin implements SolrServiceIndexPlu
@Override
public void additionalSearchParameters(Context context, DiscoverQuery discoveryQuery, SolrQuery solrQuery) {
try {
if (!authorizeService.isAdmin(context)) {
StringBuilder resourceQuery = new StringBuilder();
//Always add the anonymous group id to the query
Group anonymousGroup = groupService.findByName(context, Group.ANONYMOUS);
String anonGroupId = "";
if (anonymousGroup != null) {
anonGroupId = anonymousGroup.getID().toString();
}
resourceQuery.append("read:(g" + anonGroupId);
if (context != null && !authorizeService.isAdmin(context)) {
boolean isInProgessSubmission = false;
EPerson currentUser = context.getCurrentUser();
if (currentUser != null) {
resourceQuery.append(" OR e").append(currentUser.getID());
}
//Retrieve all the groups the current user is a member of !
// Retrieve all the groups the current user is a member of !
Set<Group> groups = groupService.allMemberGroupsSet(context, currentUser);
for (Group group : groups) {
resourceQuery.append(" OR g").append(group.getID());
if (currentUser != null) {
if (StringUtils.isNotBlank(discoveryQuery.getDiscoveryConfigurationName())) {
if (discoveryQuery.getDiscoveryConfigurationName().startsWith("workspace")) {
// insert filter by submitter
solrQuery
.addFilterQuery("read:(e" + currentUser.getID() + " OR ws" + currentUser.getID() + ")");
isInProgessSubmission = true;
} else if (discoveryQuery.getDiscoveryConfigurationName().startsWith("workflow")) {
// insert filter by controllers
StringBuilder controllerQuery = new StringBuilder();
controllerQuery.append("read:(we" + currentUser.getID());
for (Group group : groups) {
controllerQuery.append(" OR wg").append(group.getID());
}
controllerQuery.append(")");
solrQuery.addFilterQuery(controllerQuery.toString());
isInProgessSubmission = true;
}
}
}
resourceQuery.append(")");
if (!isInProgessSubmission) {
StringBuilder resourceQuery = new StringBuilder();
//Always add the anonymous group id to the query
Group anonymousGroup = groupService.findByName(context, Group.ANONYMOUS);
String anonGroupId = "";
if (anonymousGroup != null) {
anonGroupId = anonymousGroup.getID().toString();
}
resourceQuery.append("read:(g" + anonGroupId);
if (authorizeService.isCommunityAdmin(context)
|| authorizeService.isCollectionAdmin(context)) {
resourceQuery.append(" OR ");
resourceQuery.append(DSpaceServicesFactory.getInstance()
.getServiceManager()
.getServiceByName(SearchService.class.getName(),
SearchService.class)
.createLocationQueryForAdministrableItems(context));
if (currentUser != null) {
resourceQuery.append(" OR e").append(currentUser.getID());
}
//Retrieve all the groups the current user is a member of !
for (Group group : groups) {
resourceQuery.append(" OR g").append(group.getID());
}
resourceQuery.append(")");
if (authorizeService.isCommunityAdmin(context)
|| authorizeService.isCollectionAdmin(context)) {
resourceQuery.append(" OR ");
resourceQuery.append(DSpaceServicesFactory.getInstance()
.getServiceManager()
.getServiceByName(SearchService.class.getName(),
SearchService.class)
.createLocationQueryForAdministrableItems(context));
}
solrQuery.addFilterQuery(resourceQuery.toString());
}
solrQuery.addFilterQuery(resourceQuery.toString());
}
} catch (SQLException e) {
log.error(LogManager.getHeader(context, "Error while adding resource policy information to query", ""), e);

View File

@@ -10,7 +10,7 @@ package org.dspace.discovery;
import java.util.List;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Item;
import org.dspace.content.MetadataValue;
import org.dspace.content.service.ItemService;
@@ -30,7 +30,7 @@ public class SolrServiceSpellIndexingPlugin implements SolrServiceIndexPlugin {
protected ItemService itemService;
@Override
public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) {
public void additionalIndex(Context context, BrowsableDSpaceObject dso, SolrInputDocument document) {
if (dso instanceof Item) {
Item item = (Item) dso;
List<MetadataValue> dcValues = itemService.getMetadata(item, Item.ANY, Item.ANY, Item.ANY, Item.ANY);

View File

@@ -12,7 +12,7 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.services.factory.DSpaceServicesFactory;
/**
@@ -20,9 +20,18 @@ import org.dspace.services.factory.DSpaceServicesFactory;
*/
public class DiscoveryConfigurationService {
private Map<String, List<String>> extraConfigurationMapping = new HashMap<String, List<String>>();
private Map<String, DiscoveryConfiguration> map;
private Map<Integer, List<String>> toIgnoreMetadataFields = new HashMap<>();
public void setExtraConfigurationMapping(Map<String, List<String>> extraConfigurationMapping) {
this.extraConfigurationMapping = extraConfigurationMapping;
}
public Map<String, List<String>> getExtraConfigurationMapping() {
return extraConfigurationMapping;
}
public Map<String, DiscoveryConfiguration> getMap() {
return map;
}
@@ -39,7 +48,7 @@ public class DiscoveryConfigurationService {
this.toIgnoreMetadataFields = toIgnoreMetadataFields;
}
public DiscoveryConfiguration getDiscoveryConfiguration(DSpaceObject dso) {
public DiscoveryConfiguration getDiscoveryConfiguration(BrowsableDSpaceObject dso) {
String name;
if (dso == null) {
name = "site";
@@ -64,7 +73,7 @@ public class DiscoveryConfigurationService {
}
public DiscoveryConfiguration getDiscoveryConfigurationByNameOrDso(final String configurationName,
final DSpaceObject dso) {
final BrowsableDSpaceObject dso) {
if (StringUtils.isNotBlank(configurationName) && getMap().containsKey(configurationName)) {
return getMap().get(configurationName);
} else {

View File

@@ -17,6 +17,7 @@ import java.util.List;
import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DCDate;
@@ -139,9 +140,10 @@ public class Harvest {
DiscoverResult discoverResult = SearchUtils.getSearchService().search(context, discoverQuery);
// Process results of query into HarvestedItemInfo objects
Iterator<DSpaceObject> dsoIterator = discoverResult.getDspaceObjects().iterator();
Iterator<BrowsableDSpaceObject> dsoIterator = discoverResult.getDspaceObjects().iterator();
while (dsoIterator.hasNext() && ((limit == 0) || (itemCounter < limit))) {
DSpaceObject dso = dsoIterator.next();
// the query is limited to ITEM
DSpaceObject dso = (DSpaceObject) dsoIterator.next();
HarvestedItemInfo itemInfo = new HarvestedItemInfo();
itemInfo.context = context;
itemInfo.handle = dso.getHandle();

View File

@@ -70,7 +70,7 @@ public class DiscoveryRestController implements InitializingBean {
@RequestMapping(method = RequestMethod.GET)
public SearchSupportResource getSearchSupport(@RequestParam(name = "scope", required = false) String dsoScope,
@RequestParam(name = "configuration", required = false) String
configurationName)
configuration)
throws Exception {
SearchSupportRest searchSupportRest = discoveryRestRepository.getSearchSupport();
@@ -82,14 +82,14 @@ public class DiscoveryRestController implements InitializingBean {
@RequestMapping(method = RequestMethod.GET, value = "/search")
public SearchConfigurationResource getSearchConfiguration(
@RequestParam(name = "scope", required = false) String dsoScope,
@RequestParam(name = "configuration", required = false) String configurationName) throws Exception {
@RequestParam(name = "configuration", required = false) String configuration) throws Exception {
if (log.isTraceEnabled()) {
log.trace("Retrieving search configuration for scope " + StringUtils.trimToEmpty(dsoScope)
+ " and configuration name " + StringUtils.trimToEmpty(configurationName));
+ " and configuration name " + StringUtils.trimToEmpty(configuration));
}
SearchConfigurationRest searchConfigurationRest = discoveryRestRepository
.getSearchConfiguration(dsoScope, configurationName);
.getSearchConfiguration(dsoScope, configuration);
SearchConfigurationResource searchConfigurationResource = new SearchConfigurationResource(
searchConfigurationRest);
@@ -176,6 +176,8 @@ public class DiscoveryRestController implements InitializingBean {
@RequestParam(name = "query", required = false) String query,
@RequestParam(name = "dsoType", required = false) String dsoType,
@RequestParam(name = "scope", required = false) String dsoScope,
@RequestParam(name = "configuration", required = false) String
configurationName,
List<SearchFilter> searchFilters,
Pageable page) throws Exception {
if (log.isTraceEnabled()) {
@@ -188,7 +190,7 @@ public class DiscoveryRestController implements InitializingBean {
}
FacetResultsRest facetResultsRest = discoveryRestRepository
.getFacetObjects(facetName, prefix, query, dsoType, dsoScope, searchFilters, page);
.getFacetObjects(facetName, prefix, query, dsoType, dsoScope, configurationName, searchFilters, page);
FacetResultsResource facetResultsResource = new FacetResultsResource(facetResultsRest);

View File

@@ -30,6 +30,7 @@ import org.dspace.app.util.factory.UtilServiceFactory;
import org.dspace.app.util.service.OpenSearchService;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.DSpaceObject;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
@@ -140,7 +141,7 @@ public class OpenSearchController {
// format and return results
Map<String, String> labelMap = getLabels(request);
List<DSpaceObject> dsoResults = qResults.getDspaceObjects();
List<BrowsableDSpaceObject> dsoResults = qResults.getDspaceObjects();
Document resultsDoc = openSearchService.getResultsDoc(context, format, query,
(int) qResults.getTotalSearchResults(), qResults.getStart(),
qResults.getMaxResults(), container, dsoResults, labelMap);

View File

@@ -431,47 +431,6 @@ public class RestResourceController implements InitializingBean {
return ControllerUtils.toResponseEntity(HttpStatus.CREATED, null, result);
}
/**
* Called in POST, with a x-www-form-urlencoded, execute an action on a resource
*
* Note that the regular expression in the request mapping accept a number as identifier;
*
* @param request
* @param apiCategory
* @param model
* @param id
* @return
* @throws HttpRequestMethodNotSupportedException
*/
@RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT, headers =
"content-type=application/x-www-form-urlencoded")
public ResponseEntity<ResourceSupport> action(HttpServletRequest request, @PathVariable String apiCategory,
@PathVariable String model, @PathVariable Integer id)
throws HttpRequestMethodNotSupportedException {
checkModelPluralForm(apiCategory, model);
DSpaceRestRepository<RestAddressableModel, Integer> repository =
utils.getResourceRepository(apiCategory, model);
RestAddressableModel modelObject = null;
try {
modelObject = repository.action(request, id);
} catch (UnprocessableEntityException e) {
log.error(e.getMessage(), e);
return ControllerUtils.toEmptyResponse(HttpStatus.UNPROCESSABLE_ENTITY);
} catch (Exception e) {
log.error(e.getMessage(), e);
return ControllerUtils.toEmptyResponse(HttpStatus.INTERNAL_SERVER_ERROR);
}
if (modelObject != null) {
DSpaceResource result = repository.wrapResource(modelObject);
linkService.addLinks(result);
return ControllerUtils.toResponseEntity(HttpStatus.CREATED, null, result);
} else {
return ControllerUtils.toEmptyResponse(HttpStatus.NO_CONTENT);
}
}
/**
* Called in POST, multipart, upload to a specific rest resource the file passed as "file" request parameter
*

View File

@@ -50,28 +50,28 @@ public class DiscoverFacetsConverter {
return searchResultsRest;
}
private void addFacetValues(Context context, final DiscoverResult searchResult,
final SearchResultsRest searchResultsRest,
final DiscoveryConfiguration configuration) {
public void addFacetValues(Context context, final DiscoverResult searchResult, final SearchResultsRest resultsRest,
final DiscoveryConfiguration configuration) {
List<DiscoverySearchFilterFacet> facets = configuration.getSidebarFacets();
for (DiscoverySearchFilterFacet field : CollectionUtils.emptyIfNull(facets)) {
List<DiscoverResult.FacetResult> facetValues = searchResult.getFacetResult(field);
SearchFacetEntryRest facetEntry = new SearchFacetEntryRest(field.getIndexFieldName());
int valueCount = 0;
facetEntry.setHasMore(false);
facetEntry.setFacetLimit(field.getFacetLimit());
facetEntry.setExposeMinMax(field.exposeMinAndMaxValue());
if (field.exposeMinAndMaxValue()) {
handleExposeMinMaxValues(context,field,facetEntry);
handleExposeMinMaxValues(context, field, facetEntry);
}
facetEntry.setExposeMinMax(field.exposeMinAndMaxValue());
for (DiscoverResult.FacetResult value : CollectionUtils.emptyIfNull(facetValues)) {
//The discover results contains max facetLimit + 1 values. If we reach the "+1", indicate that there are
//more results available.
// The discover results contains max facetLimit + 1 values. If we reach the "+1", indicate that there
// are
// more results available.
if (valueCount < field.getFacetLimit()) {
SearchFacetValueRest valueRest = facetValueConverter.convert(value);
facetEntry.addValue(valueRest);
} else {
facetEntry.setHasMore(true);
@@ -84,27 +84,27 @@ public class DiscoverFacetsConverter {
valueCount++;
}
searchResultsRest.addFacetEntry(facetEntry);
resultsRest.addFacetEntry(facetEntry);
}
}
/**
* This method will fill the facetEntry with the appropriate min and max values if they're not empty
* @param context The relevant DSpace context
* @param field The DiscoverySearchFilterFacet field to search for this value in solr
* @param facetEntry The SearchFacetEntryRest facetEntry for which this needs to be filled in
*/
private void handleExposeMinMaxValues(Context context,DiscoverySearchFilterFacet field,
SearchFacetEntryRest facetEntry) {
* This method will fill the facetEntry with the appropriate min and max values if they're not empty
*
* @param context
* The relevant DSpace context
* @param field
* The DiscoverySearchFilterFacet field to search for this value in solr
* @param facetEntry
* The SearchFacetEntryRest facetEntry for which this needs to be filled in
*/
private void handleExposeMinMaxValues(Context context, DiscoverySearchFilterFacet field,
SearchFacetEntryRest facetEntry) {
try {
String minValue = searchService.calculateExtremeValue(context,
field.getIndexFieldName() + "_min",
field.getIndexFieldName() + "_min_sort",
DiscoverQuery.SORT_ORDER.asc);
String maxValue = searchService.calculateExtremeValue(context,
field.getIndexFieldName() + "_max",
field.getIndexFieldName() + "_max_sort",
DiscoverQuery.SORT_ORDER.desc);
String minValue = searchService.calculateExtremeValue(context, field.getIndexFieldName() + "_min",
field.getIndexFieldName() + "_min_sort", DiscoverQuery.SORT_ORDER.asc);
String maxValue = searchService.calculateExtremeValue(context, field.getIndexFieldName() + "_max",
field.getIndexFieldName() + "_max_sort", DiscoverQuery.SORT_ORDER.desc);
if (StringUtils.isNotBlank(minValue) && StringUtils.isNotBlank(maxValue)) {
facetEntry.setMinValue(minValue);
@@ -115,7 +115,6 @@ public class DiscoverFacetsConverter {
}
}
private void setRequestInformation(final Context context, final String query, final String dsoType,
final String configurationName, final String scope,
final List<SearchFilter> searchFilters, final Pageable page,

View File

@@ -12,23 +12,16 @@ import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.rest.converter.query.SearchQueryConverter;
import org.dspace.app.rest.model.DSpaceObjectRest;
import org.dspace.app.rest.model.SearchFacetEntryRest;
import org.dspace.app.rest.model.SearchFacetValueRest;
import org.dspace.app.rest.model.RestAddressableModel;
import org.dspace.app.rest.model.SearchResultEntryRest;
import org.dspace.app.rest.model.SearchResultsRest;
import org.dspace.app.rest.parameter.SearchFilter;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Context;
import org.dspace.discovery.DiscoverQuery;
import org.dspace.discovery.DiscoverResult;
import org.dspace.discovery.SearchService;
import org.dspace.discovery.SearchServiceException;
import org.dspace.discovery.configuration.DiscoveryConfiguration;
import org.dspace.discovery.configuration.DiscoverySearchFilterFacet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@@ -43,12 +36,11 @@ public class DiscoverResultConverter {
private static final Logger log = Logger.getLogger(DiscoverResultConverter.class);
@Autowired
private List<DSpaceObjectConverter> converters;
private List<BrowsableDSpaceObjectConverter> converters;
@Autowired
private SearchService searchService;
private DiscoverFacetValueConverter facetValueConverter = new DiscoverFacetValueConverter();
private DiscoverFacetsConverter facetConverter;
@Autowired
private SearchFilterToAppliedFilterConverter searchFilterToAppliedFilterConverter;
public SearchResultsRest convert(final Context context, final String query, final String dsoType,
final String configurationName, final String scope,
@@ -69,74 +61,16 @@ public class DiscoverResultConverter {
}
private void addFacetValues(Context context, final DiscoverResult searchResult, final SearchResultsRest resultsRest,
final DiscoveryConfiguration configuration) {
List<DiscoverySearchFilterFacet> facets = configuration.getSidebarFacets();
for (DiscoverySearchFilterFacet field : CollectionUtils.emptyIfNull(facets)) {
List<DiscoverResult.FacetResult> facetValues = searchResult.getFacetResult(field);
SearchFacetEntryRest facetEntry = new SearchFacetEntryRest(field.getIndexFieldName());
int valueCount = 0;
facetEntry.setHasMore(false);
facetEntry.setFacetLimit(field.getFacetLimit());
if (field.exposeMinAndMaxValue()) {
handleExposeMinMaxValues(context,field,facetEntry);
}
facetEntry.setExposeMinMax(field.exposeMinAndMaxValue());
for (DiscoverResult.FacetResult value : CollectionUtils.emptyIfNull(facetValues)) {
//The discover results contains max facetLimit + 1 values. If we reach the "+1", indicate that there are
//more results available.
if (valueCount < field.getFacetLimit()) {
SearchFacetValueRest valueRest = facetValueConverter.convert(value);
facetEntry.addValue(valueRest);
} else {
facetEntry.setHasMore(true);
}
if (StringUtils.isBlank(facetEntry.getFacetType())) {
facetEntry.setFacetType(value.getFieldType());
}
valueCount++;
}
resultsRest.addFacetEntry(facetEntry);
}
final DiscoveryConfiguration configuration) {
facetConverter.addFacetValues(context, searchResult, resultsRest, configuration);
}
/**
* This method will fill the facetEntry with the appropriate min and max values if they're not empty
* @param context The relevant DSpace context
* @param field The DiscoverySearchFilterFacet field to search for this value in solr
* @param facetEntry The SearchFacetEntryRest facetEntry for which this needs to be filled in
*/
private void handleExposeMinMaxValues(Context context,DiscoverySearchFilterFacet field,
SearchFacetEntryRest facetEntry) {
try {
String minValue = searchService.calculateExtremeValue(context,
field.getIndexFieldName() + "_min",
field.getIndexFieldName() + "_min_sort",
DiscoverQuery.SORT_ORDER.asc);
String maxValue = searchService.calculateExtremeValue(context,
field.getIndexFieldName() + "_max",
field.getIndexFieldName() + "_max_sort",
DiscoverQuery.SORT_ORDER.desc);
if (StringUtils.isNotBlank(minValue) && StringUtils.isNotBlank(maxValue)) {
facetEntry.setMinValue(minValue);
facetEntry.setMaxValue(maxValue);
}
} catch (SearchServiceException e) {
log.error(e.getMessage(), e);
}
}
private void addSearchResults(final DiscoverResult searchResult, final SearchResultsRest resultsRest) {
for (DSpaceObject dspaceObject : CollectionUtils.emptyIfNull(searchResult.getDspaceObjects())) {
for (BrowsableDSpaceObject dspaceObject : CollectionUtils.emptyIfNull(searchResult.getDspaceObjects())) {
SearchResultEntryRest resultEntry = new SearchResultEntryRest();
//Convert the DSpace Object to its REST model
resultEntry.setDspaceObject(convertDSpaceObject(dspaceObject));
resultEntry.setRObject(convertDSpaceObject(dspaceObject));
//Add hit highlighting for this DSO if present
DiscoverResult.DSpaceObjectHighlightResult highlightedResults = searchResult
@@ -152,10 +86,10 @@ public class DiscoverResultConverter {
}
}
private DSpaceObjectRest convertDSpaceObject(final DSpaceObject dspaceObject) {
for (DSpaceObjectConverter converter : converters) {
private RestAddressableModel convertDSpaceObject(final BrowsableDSpaceObject dspaceObject) {
for (BrowsableDSpaceObjectConverter<BrowsableDSpaceObject, RestAddressableModel> converter : converters) {
if (converter.supportsModel(dspaceObject)) {
return converter.fromModel(dspaceObject);
return converter.convert(dspaceObject);
}
}
return null;
@@ -179,11 +113,10 @@ public class DiscoverResultConverter {
List<SearchFilter> transformedFilters = searchQueryConverter.convert(searchFilters);
SearchFilterToAppliedFilterConverter searchFilterToAppliedFilterConverter =
new SearchFilterToAppliedFilterConverter();
new SearchFilterToAppliedFilterConverter();
for (SearchFilter searchFilter : CollectionUtils.emptyIfNull(transformedFilters)) {
resultsRest
.addAppliedFilter(searchFilterToAppliedFilterConverter.convertSearchFilter(context, searchFilter));
.addAppliedFilter(searchFilterToAppliedFilterConverter.convertSearchFilter(context, searchFilter));
}
}
}

View File

@@ -13,10 +13,12 @@ import org.dspace.authority.AuthorityValue;
import org.dspace.authority.service.AuthorityValueService;
import org.dspace.core.Context;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* This class' purpose is to convert the SearchFilter object into a SearchResultsRest.AppliedFilter object
*/
@Component
public class SearchFilterToAppliedFilterConverter {
@Autowired

View File

@@ -39,13 +39,11 @@ public abstract class DiscoveryRestHalLinkFactory<T> extends HalLinkFactory<T, D
}
}
protected UriComponentsBuilder buildFacetBaseLink(final FacetResultsRest data) throws Exception {
protected UriComponentsBuilder buildFacetBaseLink(final FacetResultsRest data) {
try {
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn()
.getFacetValues(data.getFacetEntry().getName(),
data.getPrefix(), data.getQuery(),
data.getDsoType(), data.getScope(),
null, null));
UriComponentsBuilder uriBuilder = uriBuilder(
getMethodOn().getFacetValues(data.getFacetEntry().getName(), data.getPrefix(), data.getQuery(),
data.getDsoType(), data.getScope(), data.getConfigurationName(), null, null));
return addFilterParams(uriBuilder, data);
} catch (Exception ex) {
@@ -56,9 +54,8 @@ public abstract class DiscoveryRestHalLinkFactory<T> extends HalLinkFactory<T, D
protected UriComponentsBuilder buildSearchFacetsBaseLink(final SearchResultsRest data) {
try {
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn()
.getFacets(data.getQuery(), data.getDsoType(), data.getScope(),
data.getConfigurationName(), null, null));
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn().getFacets(data.getQuery(), data.getDsoType(),
data.getScope(), data.getConfigurationName(), null, null));
uriBuilder = addSortingParms(uriBuilder, data);
@@ -75,7 +72,7 @@ public abstract class DiscoveryRestHalLinkFactory<T> extends HalLinkFactory<T, D
for (SearchResultsRest.AppliedFilter filter : data.getAppliedFilters()) {
//TODO Make sure the filter format is defined in only one place
uriComponentsBuilder
.queryParam("f." + filter.getFilter(), filter.getValue() + "," + filter.getOperator());
.queryParam("f." + filter.getFilter(), filter.getValue() + "," + filter.getOperator());
}
}

View File

@@ -40,10 +40,10 @@ public class SearchFacetEntryHalLinkFactory extends DiscoveryRestHalLinkFactory<
String query = searchData == null ? null : searchData.getQuery();
String dsoType = searchData == null ? null : searchData.getDsoType();
String scope = searchData == null ? null : searchData.getScope();
String configuration = searchData == null ? null : searchData.getConfigurationName();
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn()
.getFacetValues(facetData.getName(), null, query, dsoType,
scope, null, null));
UriComponentsBuilder uriBuilder = uriBuilder(getMethodOn().getFacetValues(facetData.getName(), null, query,
dsoType, scope, configuration, null, null));
addFilterParams(uriBuilder, searchData);

View File

@@ -33,8 +33,8 @@ public class SearchResultEntryHalLinkFactory extends DiscoveryRestHalLinkFactory
throws Exception {
SearchResultEntryRest data = halResource.getContent();
if (data != null && data.getDspaceObject() != null) {
list.add(utils.linkToSingleResource(data.getDspaceObject(), SearchResultEntryResource.DSPACE_OBJECT_LINK));
if (data != null && data.getRObject() != null) {
list.add(utils.linkToSingleResource(data.getRObject(), SearchResultEntryResource.R_OBJECT_LINK));
}
}

View File

@@ -11,6 +11,7 @@ import java.util.LinkedList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.dspace.app.rest.DiscoveryRestController;
import org.dspace.app.rest.parameter.SearchFilter;
@@ -28,6 +29,9 @@ public abstract class DiscoveryResultsRest extends BaseObjectRest<String> {
private SearchResultsRest.Sorting sort;
@JsonIgnore
private String dsoType;
@JsonIgnore
private List<SearchFilter> searchFilters;
private String configurationName;
public String getCategory() {
return CATEGORY;
@@ -98,12 +102,10 @@ public abstract class DiscoveryResultsRest extends BaseObjectRest<String> {
return configurationName;
}
public void setConfigurationName(final String configurationName) {
this.configurationName = configurationName;
public void setConfigurationName(final String configuration) {
this.configurationName = configuration;
}
private String configurationName;
public void setSearchFilters(final List<SearchFilter> searchFilters) {
this.searchFilters = searchFilters;
}
@@ -112,6 +114,5 @@ public abstract class DiscoveryResultsRest extends BaseObjectRest<String> {
return searchFilters;
}
@JsonIgnore
private List<SearchFilter> searchFilters;
}

View File

@@ -7,7 +7,7 @@
*/
package org.dspace.app.rest.model;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
@@ -43,7 +43,7 @@ public class ErrorRest {
*/
public List<String> getPaths() {
if (this.paths == null) {
this.paths = new ArrayList<String>();
this.paths = new LinkedList<String>();
}
return paths;
}

View File

@@ -12,6 +12,7 @@ import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.dspace.app.rest.DiscoveryRestController;
/**
@@ -24,10 +25,9 @@ public class SearchResultEntryRest implements RestAddressableModel {
private Map<String, List<String>> hitHighlights;
private RestAddressableModel rObject;
@JsonIgnore
private DSpaceObjectRest dspaceObject;
public String getCategory() {
return CATEGORY;
}
@@ -36,6 +36,7 @@ public class SearchResultEntryRest implements RestAddressableModel {
return NAME;
}
@JsonIgnore
public Class getController() {
return DiscoveryRestController.class;
}
@@ -55,11 +56,12 @@ public class SearchResultEntryRest implements RestAddressableModel {
this.hitHighlights = hitHighlights;
}
public DSpaceObjectRest getDspaceObject() {
return dspaceObject;
@JsonIgnore
public RestAddressableModel getRObject() {
return rObject;
}
public void setDspaceObject(final DSpaceObjectRest dspaceObject) {
this.dspaceObject = dspaceObject;
public void setRObject(final RestAddressableModel dspaceObject) {
this.rObject = dspaceObject;
}
}

View File

@@ -11,6 +11,7 @@ import java.util.LinkedList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

View File

@@ -7,7 +7,7 @@
*/
package org.dspace.app.rest.model.hateoas;
import org.dspace.app.rest.model.DSpaceObjectRest;
import org.dspace.app.rest.model.RestAddressableModel;
import org.dspace.app.rest.model.SearchResultEntryRest;
import org.dspace.app.rest.repository.DSpaceRestRepository;
import org.dspace.app.rest.utils.Utils;
@@ -17,7 +17,7 @@ import org.dspace.app.rest.utils.Utils;
*/
public class SearchResultEntryResource extends HALResource<SearchResultEntryRest> {
public static final String DSPACE_OBJECT_LINK = "dspaceObject";
public static final String R_OBJECT_LINK = "rObject";
public SearchResultEntryResource(final SearchResultEntryRest data, final Utils utils) {
super(data);
@@ -27,12 +27,12 @@ public class SearchResultEntryResource extends HALResource<SearchResultEntryRest
private void addEmbeds(final SearchResultEntryRest data, final Utils utils) {
DSpaceObjectRest dspaceObject = data.getDspaceObject();
RestAddressableModel dspaceObject = data.getRObject();
if (dspaceObject != null) {
DSpaceRestRepository resourceRepository = utils
.getResourceRepository(dspaceObject.getCategory(), dspaceObject.getType());
embedResource(DSPACE_OBJECT_LINK, resourceRepository.wrapResource(dspaceObject));
embedResource(R_OBJECT_LINK, resourceRepository.wrapResource(dspaceObject));
}
}

View File

@@ -20,12 +20,12 @@ import org.dspace.app.rest.model.BrowseEntryRest;
import org.dspace.app.rest.model.BrowseIndexRest;
import org.dspace.app.rest.model.hateoas.BrowseEntryResource;
import org.dspace.app.rest.utils.ScopeResolver;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.browse.BrowseEngine;
import org.dspace.browse.BrowseException;
import org.dspace.browse.BrowseIndex;
import org.dspace.browse.BrowseInfo;
import org.dspace.browse.BrowserScope;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
@@ -73,7 +73,7 @@ public class BrowseEntryLinkRepository extends AbstractDSpaceRestRepository
BrowseEngine be = new BrowseEngine(context);
BrowserScope bs = new BrowserScope(context);
DSpaceObject scopeObj = scopeResolver.resolveScope(context, scope);
BrowsableDSpaceObject scopeObj = scopeResolver.resolveScope(context, scope);
// process the input, performing some inline validation
final BrowseIndex bi;

View File

@@ -8,7 +8,9 @@
package org.dspace.app.rest.repository;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
@@ -17,12 +19,12 @@ import org.dspace.app.rest.model.BrowseIndexRest;
import org.dspace.app.rest.model.ItemRest;
import org.dspace.app.rest.model.hateoas.ItemResource;
import org.dspace.app.rest.utils.ScopeResolver;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.browse.BrowseEngine;
import org.dspace.browse.BrowseException;
import org.dspace.browse.BrowseIndex;
import org.dspace.browse.BrowseInfo;
import org.dspace.browse.BrowserScope;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.dspace.sort.SortException;
@@ -73,7 +75,7 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository
BrowseEngine be = new BrowseEngine(context);
BrowserScope bs = new BrowserScope(context);
DSpaceObject scopeObj = scopeResolver.resolveScope(context, scope);
BrowsableDSpaceObject scopeObj = scopeResolver.resolveScope(context, scope);
// process the input, performing some inline validation
BrowseIndex bi = null;
@@ -147,10 +149,13 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository
BrowseInfo binfo = be.browse(bs);
Pageable pageResultInfo = new PageRequest((binfo.getStart() - 1) / binfo.getResultsPerPage(),
binfo.getResultsPerPage());
Page<ItemRest> page = new PageImpl<Item>(binfo.getBrowseItemResults(), pageResultInfo, binfo.getTotal())
.map(converter);
Pageable pageResultInfo =
new PageRequest((binfo.getStart() - 1) / binfo.getResultsPerPage(), binfo.getResultsPerPage());
List<Item> tmpResult = new ArrayList<Item>();
for (BrowsableDSpaceObject bb : binfo.getBrowseItemResults()) {
tmpResult.add((Item) bb);
}
Page<ItemRest> page = new PageImpl<Item>(tmpResult, pageResultInfo, binfo.getTotal()).map(converter);
return page;
}

View File

@@ -16,7 +16,6 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.rest.Parameter;
import org.dspace.app.rest.SearchRestMethod;
import org.dspace.app.rest.converter.ClaimedTaskConverter;
import org.dspace.app.rest.exception.RESTAuthorizationException;
@@ -47,6 +46,7 @@ import org.dspace.xmlworkflow.storedcomponents.service.ClaimedTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Component;
/**
@@ -93,7 +93,7 @@ public class ClaimedTaskRestRepository extends DSpaceRestRepository<ClaimedTaskR
}
@SearchRestMethod(name = "findByUser")
public Page<ClaimedTaskRest> findByUser(@Parameter(value = "uuid") UUID userID, Pageable pageable) {
public Page<ClaimedTaskRest> findByUser(@Param(value = "uuid") UUID userID, Pageable pageable) {
List<ClaimedTask> tasks = null;
try {
Context context = obtainContext();

View File

@@ -9,8 +9,6 @@ package org.dspace.app.rest.repository;
import java.util.List;
import javax.ws.rs.BadRequestException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.converter.DiscoverConfigurationConverter;
@@ -28,7 +26,7 @@ import org.dspace.app.rest.model.SearchSupportRest;
import org.dspace.app.rest.parameter.SearchFilter;
import org.dspace.app.rest.utils.DiscoverQueryBuilder;
import org.dspace.app.rest.utils.ScopeResolver;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Context;
import org.dspace.discovery.DiscoverQuery;
import org.dspace.discovery.DiscoverResult;
@@ -81,32 +79,32 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
@Autowired
private DiscoverFacetsConverter discoverFacetsConverter;
public SearchConfigurationRest getSearchConfiguration(final String dsoScope, final String configurationName) {
public SearchConfigurationRest getSearchConfiguration(final String dsoScope, final String configuration) {
Context context = obtainContext();
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration configuration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configurationName, scopeObject);
BrowsableDSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject);
return discoverConfigurationConverter.convert(configuration);
return discoverConfigurationConverter.convert(discoveryConfiguration);
}
public SearchResultsRest getSearchObjects(final String query, final String dsoType, final String dsoScope,
final String configurationName,
final String configuration,
final List<SearchFilter> searchFilters, final Pageable page)
throws InvalidRequestException, BadRequestException {
throws InvalidRequestException {
Context context = obtainContext();
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration configuration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configurationName, scopeObject);
BrowsableDSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject);
DiscoverResult searchResult = null;
DiscoverQuery discoverQuery = null;
try {
discoverQuery = queryBuilder
.buildQuery(context, scopeObject, configuration, query, searchFilters, dsoType, page);
.buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoType, page);
searchResult = searchService.search(context, scopeObject, discoverQuery);
} catch (SearchServiceException e) {
@@ -115,18 +113,18 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
}
return discoverResultConverter
.convert(context, query, dsoType, configurationName, dsoScope, searchFilters, page, searchResult,
configuration);
.convert(context, query, dsoType, configuration, dsoScope, searchFilters, page, searchResult,
discoveryConfiguration);
}
public FacetConfigurationRest getFacetsConfiguration(final String dsoScope, final String configurationName) {
public FacetConfigurationRest getFacetsConfiguration(final String dsoScope, final String configuration) {
Context context = obtainContext();
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration configuration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configurationName, scopeObject);
BrowsableDSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject);
return discoverFacetConfigurationConverter.convert(configurationName, dsoScope, configuration);
return discoverFacetConfigurationConverter.convert(configuration, dsoScope, discoveryConfiguration);
}
public SearchSupportRest getSearchSupport() {
@@ -134,21 +132,20 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
}
public FacetResultsRest getFacetObjects(String facetName, String prefix, String query, String dsoType,
String dsoScope, List<SearchFilter> searchFilters, Pageable page)
String dsoScope, final String configuration, List<SearchFilter> searchFilters, Pageable page)
throws InvalidRequestException {
Context context = obtainContext();
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration configuration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(facetName, scopeObject);
BrowsableDSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject);
DiscoverResult searchResult = null;
DiscoverQuery discoverQuery = null;
try {
discoverQuery = queryBuilder
.buildFacetQuery(context, scopeObject, configuration, prefix, query,
searchFilters, dsoType, page, facetName);
discoverQuery = queryBuilder.buildFacetQuery(context, scopeObject, discoveryConfiguration, prefix, query,
searchFilters, dsoType, page, facetName);
searchResult = searchService.search(context, scopeObject, discoverQuery);
} catch (SearchServiceException e) {
@@ -156,36 +153,34 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
//TODO TOM handle search exception
}
FacetResultsRest facetResultsRest = discoverFacetResultsConverter
.convert(context, facetName, prefix, query, dsoType, dsoScope, searchFilters,
searchResult, configuration, page);
FacetResultsRest facetResultsRest = discoverFacetResultsConverter.convert(context, facetName, prefix, query,
dsoType, dsoScope, searchFilters, searchResult, discoveryConfiguration, page);
return facetResultsRest;
}
public SearchResultsRest getAllFacets(String query, String dsoType, String dsoScope, String configurationName,
public SearchResultsRest getAllFacets(String query, String dsoType, String dsoScope, String configuration,
List<SearchFilter> searchFilters) throws InvalidRequestException {
Context context = obtainContext();
Pageable page = new PageRequest(1, 1);
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration configuration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configurationName, scopeObject);
BrowsableDSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject);
DiscoverResult searchResult = null;
DiscoverQuery discoverQuery = null;
try {
discoverQuery = queryBuilder
.buildQuery(context, scopeObject, configuration, query, searchFilters, dsoType, page);
.buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoType, page);
searchResult = searchService.search(context, scopeObject, discoverQuery);
} catch (SearchServiceException e) {
log.error("Error while searching with Discovery", e);
}
SearchResultsRest searchResultsRest = discoverFacetsConverter
.convert(context, query, dsoType, configurationName, dsoScope, searchFilters, page, configuration,
searchResult);
SearchResultsRest searchResultsRest = discoverFacetsConverter.convert(context, query, dsoType,
configuration, dsoScope, searchFilters, page, discoveryConfiguration, searchResult);
return searchResultsRest;

View File

@@ -7,7 +7,8 @@
*/
package org.dspace.app.rest.repository;
import org.dspace.app.rest.model.RestModel;
import java.io.Serializable;
import org.dspace.app.rest.model.hateoas.HALResource;
/**
@@ -15,7 +16,7 @@ import org.dspace.app.rest.model.hateoas.HALResource;
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
public interface LinkRestRepository<L extends RestModel> {
public interface LinkRestRepository<L extends Serializable> {
public abstract HALResource wrapResource(L model, String... rels);
public default boolean isEmbeddableRelation(Object data, String name) {

View File

@@ -15,7 +15,6 @@ import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.dspace.app.rest.Parameter;
import org.dspace.app.rest.SearchRestMethod;
import org.dspace.app.rest.converter.PoolTaskConverter;
import org.dspace.app.rest.exception.RESTAuthorizationException;
@@ -41,6 +40,7 @@ import org.dspace.xmlworkflow.storedcomponents.service.PoolTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Component;
/**
@@ -87,7 +87,7 @@ public class PoolTaskRestRepository extends DSpaceRestRepository<PoolTaskRest, I
}
@SearchRestMethod(name = "findByUser")
public Page<PoolTaskRest> findByUser(@Parameter(value = "uuid") UUID userID, Pageable pageable) {
public Page<PoolTaskRest> findByUser(@Param(value = "uuid") UUID userID, Pageable pageable) {
List<PoolTask> tasks = null;
try {
Context context = obtainContext();

View File

@@ -22,7 +22,7 @@ import org.dspace.app.rest.exception.InvalidSearchFacetException;
import org.dspace.app.rest.exception.InvalidSearchFilterException;
import org.dspace.app.rest.exception.InvalidSortingException;
import org.dspace.app.rest.parameter.SearchFilter;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
@@ -67,7 +67,7 @@ public class DiscoverQueryBuilder implements InitializingBean {
pageSizeLimit = configurationService.getIntProperty("rest.search.max.results", 100);
}
public DiscoverQuery buildQuery(Context context, DSpaceObject scope,
public DiscoverQuery buildQuery(Context context, BrowsableDSpaceObject scope,
DiscoveryConfiguration discoveryConfiguration,
String query, List<SearchFilter> searchFilters,
String dsoType, Pageable page)
@@ -100,7 +100,7 @@ public class DiscoverQueryBuilder implements InitializingBean {
}
}
public DiscoverQuery buildFacetQuery(Context context, DSpaceObject scope,
public DiscoverQuery buildFacetQuery(Context context, BrowsableDSpaceObject scope,
DiscoveryConfiguration discoveryConfiguration,
String prefix, String query, List<SearchFilter> searchFilters,
String dsoType, Pageable page, String facetName)
@@ -127,9 +127,9 @@ public class DiscoverQueryBuilder implements InitializingBean {
}
}
private DiscoverQuery addFacetingForFacets(Context context, DSpaceObject scope, String prefix,
DiscoverQuery queryArgs, DiscoveryConfiguration discoveryConfiguration,
String facetName, Pageable page) throws InvalidSearchFacetException {
private DiscoverQuery addFacetingForFacets(Context context, BrowsableDSpaceObject scope, String prefix,
DiscoverQuery queryArgs, DiscoveryConfiguration discoveryConfiguration, String facetName, Pageable page)
throws InvalidSearchFacetException {
DiscoverySearchFilterFacet facet = discoveryConfiguration.getSidebarFacet(facetName);
if (facet != null) {
@@ -145,12 +145,12 @@ public class DiscoverQueryBuilder implements InitializingBean {
return queryArgs;
}
private void fillFacetIntoQueryArgs(Context context, DSpaceObject scope, String prefix, DiscoverQuery queryArgs,
DiscoverySearchFilterFacet facet, final int pageSize) {
private void fillFacetIntoQueryArgs(Context context, BrowsableDSpaceObject scope, String prefix,
DiscoverQuery queryArgs, DiscoverySearchFilterFacet facet, final int pageSize) {
if (facet.getType().equals(DiscoveryConfigurationParameters.TYPE_DATE)) {
try {
FacetYearRange facetYearRange = searchService
.getFacetYearRange(context, scope, facet, queryArgs.getFilterQueries());
FacetYearRange facetYearRange =
searchService.getFacetYearRange(context, scope, facet, queryArgs.getFilterQueries(), queryArgs);
queryArgs.addYearRangeFacet(facet, facetYearRange);
@@ -193,6 +193,7 @@ public class DiscoverQueryBuilder implements InitializingBean {
private DiscoverQuery buildBaseQueryForConfiguration(DiscoveryConfiguration discoveryConfiguration) {
DiscoverQuery queryArgs = new DiscoverQuery();
queryArgs.setDiscoveryConfigurationName(discoveryConfiguration.getId());
queryArgs.addFilterQueries(discoveryConfiguration.getDefaultFilterQueries()
.toArray(
new String[discoveryConfiguration.getDefaultFilterQueries()
@@ -309,7 +310,7 @@ public class DiscoverQueryBuilder implements InitializingBean {
return filterQueries.toArray(new String[filterQueries.size()]);
}
private DiscoverQuery addFaceting(Context context, DSpaceObject scope, DiscoverQuery queryArgs,
private DiscoverQuery addFaceting(Context context, BrowsableDSpaceObject scope, DiscoverQuery queryArgs,
DiscoveryConfiguration discoveryConfiguration) {
List<DiscoverySearchFilterFacet> facets = discoveryConfiguration.getSidebarFacets();

View File

@@ -28,7 +28,7 @@ import org.dspace.app.rest.exception.InvalidSearchFacetException;
import org.dspace.app.rest.exception.InvalidSearchFilterException;
import org.dspace.app.rest.exception.InvalidSortingException;
import org.dspace.app.rest.parameter.SearchFilter;
import org.dspace.content.DSpaceObject;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.discovery.DiscoverFacetField;
@@ -75,7 +75,7 @@ public class DiscoverQueryBuilderTest {
private Context context;
@Mock
private DSpaceObject scope;
private BrowsableDSpaceObject scope;
private DiscoveryConfiguration discoveryConfiguration;
private String query;
@@ -92,30 +92,29 @@ public class DiscoverQueryBuilderTest {
.then(invocation -> invocation.getArguments()[0] + "_sort");
when(searchService
.getFacetYearRange(eq(context), any(DSpaceObject.class), any(DiscoverySearchFilterFacet.class), any()))
.then(invocation
-> new FacetYearRange((DiscoverySearchFilterFacet) invocation.getArguments()[2]));
.getFacetYearRange(eq(context), any(BrowsableDSpaceObject.class), any(DiscoverySearchFilterFacet.class),
any(), any(DiscoverQuery.class)))
.then(invocation -> new FacetYearRange((DiscoverySearchFilterFacet) invocation.getArguments()[2]));
when(searchService.toFilterQuery(any(Context.class), any(String.class), any(String.class), any(String.class)))
.then(invocation -> new DiscoverFilterQuery((String) invocation.getArguments()[1],
invocation.getArguments()[1] + ":\"" + invocation
.getArguments()[3] + "\"",
(String) invocation.getArguments()[3]));
invocation.getArguments()[1] + ":\"" + invocation.getArguments()[3] + "\"",
(String) invocation.getArguments()[3]));
discoveryConfiguration = new DiscoveryConfiguration();
discoveryConfiguration.setDefaultFilterQueries(Arrays.asList("archived:true"));
DiscoveryHitHighlightingConfiguration discoveryHitHighlightingConfiguration = new
DiscoveryHitHighlightingConfiguration();
DiscoveryHitHighlightingConfiguration discoveryHitHighlightingConfiguration =
new DiscoveryHitHighlightingConfiguration();
List<DiscoveryHitHighlightFieldConfiguration> discoveryHitHighlightFieldConfigurations = new LinkedList<>();
DiscoveryHitHighlightFieldConfiguration discoveryHitHighlightFieldConfiguration = new
DiscoveryHitHighlightFieldConfiguration();
DiscoveryHitHighlightFieldConfiguration discoveryHitHighlightFieldConfiguration =
new DiscoveryHitHighlightFieldConfiguration();
discoveryHitHighlightFieldConfiguration.setField("dc.title");
DiscoveryHitHighlightFieldConfiguration discoveryHitHighlightFieldConfiguration1 = new
DiscoveryHitHighlightFieldConfiguration();
DiscoveryHitHighlightFieldConfiguration discoveryHitHighlightFieldConfiguration1 =
new DiscoveryHitHighlightFieldConfiguration();
discoveryHitHighlightFieldConfiguration1.setField("fulltext");
discoveryHitHighlightFieldConfigurations.add(discoveryHitHighlightFieldConfiguration1);
@@ -164,8 +163,8 @@ public class DiscoverQueryBuilderTest {
@Test
public void testBuildQuery() throws Exception {
DiscoverQuery discoverQuery = queryBuilder.buildQuery(context, scope, discoveryConfiguration, query,
Arrays.asList(searchFilter), "item", page);
DiscoverQuery discoverQuery = queryBuilder
.buildQuery(context, scope, discoveryConfiguration, query, Arrays.asList(searchFilter), "item", page);
assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\""));
assertThat(discoverQuery.getQuery(), is(query));
@@ -177,24 +176,21 @@ public class DiscoverQueryBuilderTest {
assertThat(discoverQuery.getFacetMinCount(), is(1));
assertThat(discoverQuery.getFacetOffset(), is(0));
assertThat(discoverQuery.getFacetFields(), hasSize(2));
assertThat(discoverQuery.getFacetFields(), containsInAnyOrder(
new ReflectionEquals(new DiscoverFacetField("subject", DiscoveryConfigurationParameters.TYPE_TEXT, 6,
DiscoveryConfigurationParameters.SORT.COUNT)),
new ReflectionEquals(
new DiscoverFacetField("hierarchy", DiscoveryConfigurationParameters.TYPE_HIERARCHICAL, 8,
DiscoveryConfigurationParameters.SORT.VALUE))
));
assertThat(discoverQuery.getFacetFields(), containsInAnyOrder(new ReflectionEquals(
new DiscoverFacetField("subject", DiscoveryConfigurationParameters.TYPE_TEXT, 6,
DiscoveryConfigurationParameters.SORT.COUNT)), new ReflectionEquals(
new DiscoverFacetField("hierarchy", DiscoveryConfigurationParameters.TYPE_HIERARCHICAL, 8,
DiscoveryConfigurationParameters.SORT.VALUE))));
assertThat(discoverQuery.getHitHighlightingFields(), hasSize(2));
assertThat(discoverQuery.getHitHighlightingFields(), containsInAnyOrder(
new ReflectionEquals(new DiscoverHitHighlightingField("dc.title", 0, 3)),
new ReflectionEquals(new DiscoverHitHighlightingField("fulltext", 0, 3))
));
assertThat(discoverQuery.getHitHighlightingFields(),
containsInAnyOrder(new ReflectionEquals(new DiscoverHitHighlightingField("dc.title", 0, 3)),
new ReflectionEquals(new DiscoverHitHighlightingField("fulltext", 0, 3))));
}
@Test
public void testBuildQueryDefaults() throws Exception {
DiscoverQuery discoverQuery = queryBuilder.buildQuery(context, null, discoveryConfiguration, null,
null, null, null);
DiscoverQuery discoverQuery =
queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, null, null);
assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true"));
assertThat(discoverQuery.getQuery(), isEmptyOrNullString());
@@ -208,26 +204,23 @@ public class DiscoverQueryBuilderTest {
assertThat(discoverQuery.getFacetMinCount(), is(1));
assertThat(discoverQuery.getFacetOffset(), is(0));
assertThat(discoverQuery.getFacetFields(), hasSize(2));
assertThat(discoverQuery.getFacetFields(), containsInAnyOrder(
new ReflectionEquals(new DiscoverFacetField("subject", DiscoveryConfigurationParameters.TYPE_TEXT, 6,
DiscoveryConfigurationParameters.SORT.COUNT)),
new ReflectionEquals(
new DiscoverFacetField("hierarchy", DiscoveryConfigurationParameters.TYPE_HIERARCHICAL, 8,
DiscoveryConfigurationParameters.SORT.VALUE))
));
assertThat(discoverQuery.getFacetFields(), containsInAnyOrder(new ReflectionEquals(
new DiscoverFacetField("subject", DiscoveryConfigurationParameters.TYPE_TEXT, 6,
DiscoveryConfigurationParameters.SORT.COUNT)), new ReflectionEquals(
new DiscoverFacetField("hierarchy", DiscoveryConfigurationParameters.TYPE_HIERARCHICAL, 8,
DiscoveryConfigurationParameters.SORT.VALUE))));
assertThat(discoverQuery.getHitHighlightingFields(), hasSize(2));
assertThat(discoverQuery.getHitHighlightingFields(), containsInAnyOrder(
new ReflectionEquals(new DiscoverHitHighlightingField("dc.title", 0, 3)),
new ReflectionEquals(new DiscoverHitHighlightingField("fulltext", 0, 3))
));
assertThat(discoverQuery.getHitHighlightingFields(),
containsInAnyOrder(new ReflectionEquals(new DiscoverHitHighlightingField("dc.title", 0, 3)),
new ReflectionEquals(new DiscoverHitHighlightingField("fulltext", 0, 3))));
}
@Test
public void testSortByScore() throws Exception {
page = new PageRequest(2, 10, Sort.Direction.ASC, "SCORE");
DiscoverQuery discoverQuery = queryBuilder.buildQuery(context, null, discoveryConfiguration, null,
null, null, page);
DiscoverQuery discoverQuery =
queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, null, page);
assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true"));
assertThat(discoverQuery.getQuery(), isEmptyOrNullString());
@@ -241,39 +234,36 @@ public class DiscoverQueryBuilderTest {
assertThat(discoverQuery.getFacetMinCount(), is(1));
assertThat(discoverQuery.getFacetOffset(), is(0));
assertThat(discoverQuery.getFacetFields(), hasSize(2));
assertThat(discoverQuery.getFacetFields(), containsInAnyOrder(
new ReflectionEquals(new DiscoverFacetField("subject", DiscoveryConfigurationParameters.TYPE_TEXT, 6,
DiscoveryConfigurationParameters.SORT.COUNT)),
new ReflectionEquals(
new DiscoverFacetField("hierarchy", DiscoveryConfigurationParameters.TYPE_HIERARCHICAL, 8,
DiscoveryConfigurationParameters.SORT.VALUE))
));
assertThat(discoverQuery.getFacetFields(), containsInAnyOrder(new ReflectionEquals(
new DiscoverFacetField("subject", DiscoveryConfigurationParameters.TYPE_TEXT, 6,
DiscoveryConfigurationParameters.SORT.COUNT)), new ReflectionEquals(
new DiscoverFacetField("hierarchy", DiscoveryConfigurationParameters.TYPE_HIERARCHICAL, 8,
DiscoveryConfigurationParameters.SORT.VALUE))));
assertThat(discoverQuery.getHitHighlightingFields(), hasSize(2));
assertThat(discoverQuery.getHitHighlightingFields(), containsInAnyOrder(
new ReflectionEquals(new DiscoverHitHighlightingField("dc.title", 0, 3)),
new ReflectionEquals(new DiscoverHitHighlightingField("fulltext", 0, 3))
));
assertThat(discoverQuery.getHitHighlightingFields(),
containsInAnyOrder(new ReflectionEquals(new DiscoverHitHighlightingField("dc.title", 0, 3)),
new ReflectionEquals(new DiscoverHitHighlightingField("fulltext", 0, 3))));
}
@Test(expected = InvalidDSpaceObjectTypeException.class)
public void testInvalidDSOType() throws Exception {
queryBuilder.buildQuery(context, scope, discoveryConfiguration, query,
Arrays.asList(searchFilter), "TEST", page);
queryBuilder
.buildQuery(context, scope, discoveryConfiguration, query, Arrays.asList(searchFilter), "TEST", page);
}
@Test(expected = InvalidSortingException.class)
public void testInvalidSortField() throws Exception {
page = new PageRequest(2, 10, Sort.Direction.ASC, "test");
queryBuilder.buildQuery(context, scope, discoveryConfiguration, query,
Arrays.asList(searchFilter), "ITEM", page);
queryBuilder
.buildQuery(context, scope, discoveryConfiguration, query, Arrays.asList(searchFilter), "ITEM", page);
}
@Test(expected = InvalidSearchFilterException.class)
public void testInvalidSearchFilter1() throws Exception {
searchFilter = new SearchFilter("test", "equals", "Smith, Donald");
queryBuilder.buildQuery(context, scope, discoveryConfiguration, query,
Arrays.asList(searchFilter), "ITEM", page);
queryBuilder
.buildQuery(context, scope, discoveryConfiguration, query, Arrays.asList(searchFilter), "ITEM", page);
}
@Test(expected = InvalidSearchFilterException.class)
@@ -281,8 +271,8 @@ public class DiscoverQueryBuilderTest {
when(searchService.toFilterQuery(any(Context.class), any(String.class), any(String.class), any(String.class)))
.thenThrow(SQLException.class);
queryBuilder.buildQuery(context, scope, discoveryConfiguration, query,
Arrays.asList(searchFilter), "ITEM", page);
queryBuilder
.buildQuery(context, scope, discoveryConfiguration, query, Arrays.asList(searchFilter), "ITEM", page);
}
@Test
@@ -310,7 +300,7 @@ public class DiscoverQueryBuilderTest {
@Test(expected = InvalidSearchFacetException.class)
public void testInvalidSearchFacet() throws Exception {
queryBuilder.buildFacetQuery(context, scope, discoveryConfiguration, null, query,
Arrays.asList(searchFilter), "item", page, "test");
Arrays.asList(searchFilter), "item", page, "test");
}
}

View File

@@ -7,6 +7,11 @@
##### Search Indexing #####
discovery.search.server = ${solr.server}/search
### See SolrServiceImpl, default number of threads is 5;
### WARNING: before changing this value please check the configuration of the connection pool to the Database.
#discovery.indexer.items.threads = 9
discovery.indexer.items.threads = 5
#Enable the url validation of the search.server setting above.
#Defaults to true: validation is enabled
#discovery.solr.url.validation.enabled = true
@@ -14,11 +19,12 @@ discovery.search.server = ${solr.server}/search
#Char used to ensure that the sidebar facets are case insensitive
#discovery.solr.facets.split.char=\n|||\n
# index.ignore-variants = false
# index.ignore-authority = false
# discovery.index.ignore-variants = false
# discovery.index.ignore-authority = false
discovery.index.projection=dc.title,dc.contributor.*,dc.date.issued
# ONLY-FOR-JSPUI:
# 1) you need to set the DiscoverySearchRequestProcessor in the dspace.cfg
# 2) to show facet on Site/Community/etc. you need to add a Site/Community/Collection
# Processors plugin in the dspace.cfg
discovery.facet.namedtype.item = 000item\n|||\nArchived###item
discovery.facet.namedtype.workspace = 001workspace\n|||\nWorkspace###workspace
discovery.facet.namedtype.workflow.item = 002workflow\n|||\nWorkflow###workflow
discovery.facet.namedtype.workflow.claimed = 003workflow\n|||\nValidation###validation
discovery.facet.namedtype.workflow.pooled = 004workflow\n|||\nWaiting for Controller###waitingforcontroller

View File

@@ -50,6 +50,9 @@
<!--Use site to override the default configuration for the home page & default discovery page-->
<entry key="site" value-ref="homepageConfiguration" />
<!--<entry key="123456789/7621" value-ref="defaultConfiguration"/>-->
<!-- Used to show filters and results on MyDSpace -->
<entry key="workspace" value-ref="workspaceConfiguration" />
<entry key="workflow" value-ref="workflowConfiguration" />
</map>
</property>
<property name="toIgnoreMetadataFields">
@@ -134,13 +137,14 @@
</property>
</bean>
</property>
<!--Any default filter queries, these filter queries will be used for all queries done by discovery for this configuration-->
<!--<property name="defaultFilterQueries">-->
<!--<list>-->
<!--Only find items-->
<!--<value>search.resourcetype:2</value>-->
<!--</list>-->
<!--</property>-->
<!--Any default filter queries, these filter queries will be used for all
queries done by discovery for this configuration -->
<property name="defaultFilterQueries">
<list>
<!--Only find items-->
<value>search.resourcetype:2</value>
</list>
</property>
<!--The configuration for the recent submissions-->
<property name="recentSubmissionConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryRecentSubmissionsConfiguration">
@@ -247,6 +251,14 @@
</property>
</bean>
</property>
<!--Any default filter queries, these filter queries will be used for all
queries done by discovery for this configuration-->
<property name="defaultFilterQueries">
<list>
<!--Only find items, communities and collections-->
<value>search.resourcetype:2</value>
</list>
</property>
<!-- Limit recent submissions on homepage to only 5 (default is 20) -->
<property name="recentSubmissionConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryRecentSubmissionsConfiguration">
@@ -289,6 +301,219 @@
<property name="spellCheckEnabled" value="true"/>
</bean>
<!--The workspace configuration settings for discovery -->
<bean id="workspaceConfiguration"
class="org.dspace.discovery.configuration.DiscoveryConfiguration"
scope="prototype">
<property name="id" value="workspace" />
<!--Which sidebar facets are to be displayed -->
<property name="sidebarFacets">
<list>
<ref bean="searchFilterObjectNamedType" />
<ref bean="searchFilterType" />
<ref bean="searchFilterIssued" />
</list>
</property>
<!--The search filters which can be used on the discovery search page -->
<property name="searchFilters">
<list>
<ref bean="searchFilterObjectNamedType" />
<ref bean="searchFilterType" />
<ref bean="searchFilterIssued" />
</list>
</property>
<!--The sort filters for the discovery search-->
<property name="searchSortConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoverySortConfiguration">
<!--<property name="defaultSort" ref="sortDateIssued"/>-->
<!--DefaultSortOrder can either be desc or asc (desc is default)-->
<property name="defaultSortOrder" value="desc"/>
<property name="sortFields">
<list>
<ref bean="sortTitle" />
<ref bean="sortDateIssued" />
</list>
</property>
</bean>
</property>
<!--Any default filter queries, these filter queries will be used for all
queries done by discovery for this configuration -->
<property name="defaultFilterQueries">
<list>
<!--Only find items, workspace and accepted for workflow -->
<value>search.resourcetype:2 OR search.resourcetype:[8 TO 9]</value>
</list>
</property>
<!--The configuration for the recent submissions-->
<property name="recentSubmissionConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryRecentSubmissionsConfiguration">
<property name="metadataSortField" value="dc.date.accessioned" />
<property name="type" value="date"/>
<property name="max" value="20"/>
<!-- If enabled the collection home page will not display metadata but show a pageable list of recent submissions -->
<property name="useAsHomePage" value="false"/>
</bean>
</property>
<!--Default result per page -->
<property name="defaultRpp" value="10" />
<property name="hitHighlightingConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightingConfiguration">
<property name="metadataFields">
<list>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.title"/>
<property name="snippets" value="5"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.contributor.author"/>
<property name="snippets" value="5"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.description.abstract"/>
<property name="maxSize" value="250"/>
<property name="snippets" value="2"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="fulltext"/>
<property name="maxSize" value="250"/>
<property name="snippets" value="2"/>
</bean>
</list>
</property>
</bean>
</property>
<property name="moreLikeThisConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryMoreLikeThisConfiguration">
<!--When altering this list also alter the "xmlui.Discovery.RelatedItems.help" key as it describes
the metadata fields below-->
<property name="similarityMetadataFields">
<list>
<value>dc.title</value>
<value>dc.contributor.author</value>
<value>dc.creator</value>
<value>dc.subject</value>
</list>
</property>
<!--The minimum number of matching terms across the metadata fields above before an item is found as related -->
<property name="minTermFrequency" value="5"/>
<!--The maximum number of related items displayed-->
<property name="max" value="3"/>
<!--The minimum word length below which words will be ignored-->
<property name="minWordLength" value="5"/>
</bean>
</property>
<!-- When true a "did you mean" example will be displayed, value can be true or false -->
<property name="spellCheckEnabled" value="true"/>
</bean>
<!--The workflow configuration settings for discovery -->
<bean id="workflowConfiguration"
class="org.dspace.discovery.configuration.DiscoveryConfiguration"
scope="prototype">
<property name="id" value="workflow" />
<!--Which sidebar facets are to be displayed -->
<property name="sidebarFacets">
<list>
<ref bean="searchFilterObjectNamedType" />
<ref bean="searchFilterType" />
<ref bean="searchFilterIssued" />
<ref bean="searchFilterSubmitter" />
</list>
</property>
<!--The search filters which can be used on the discovery search page -->
<property name="searchFilters">
<list>
<ref bean="searchFilterObjectNamedType" />
<ref bean="searchFilterType" />
<ref bean="searchFilterIssued" />
<ref bean="searchFilterSubmitter" />
</list>
</property>
<!--The sort filters for the discovery search-->
<property name="searchSortConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoverySortConfiguration">
<!--<property name="defaultSort" ref="sortDateIssued"/>-->
<!--DefaultSortOrder can either be desc or asc (desc is default)-->
<property name="defaultSortOrder" value="desc"/>
<property name="sortFields">
<list>
<ref bean="sortTitle" />
<ref bean="sortDateIssued" />
</list>
</property>
</bean>
</property>
<!--Any default filter queries, these filter queries will be used for all
queries done by discovery for this configuration -->
<property name="defaultFilterQueries">
<list>
<!--Only find PoolTask and ClaimedTask -->
<value>search.resourcetype:[10 TO 11]</value>
</list>
</property>
<!--The configuration for the recent submissions-->
<property name="recentSubmissionConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryRecentSubmissionsConfiguration">
<property name="metadataSortField" value="dc.date.accessioned" />
<property name="type" value="date"/>
<property name="max" value="20"/>
<!-- If enabled the collection home page will not display metadata but show a pageable list of recent submissions -->
<property name="useAsHomePage" value="false"/>
</bean>
</property>
<!--Default result per page -->
<property name="defaultRpp" value="10" />
<property name="hitHighlightingConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightingConfiguration">
<property name="metadataFields">
<list>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.title"/>
<property name="snippets" value="5"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.contributor.author"/>
<property name="snippets" value="5"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.description.abstract"/>
<property name="maxSize" value="250"/>
<property name="snippets" value="2"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="fulltext"/>
<property name="maxSize" value="250"/>
<property name="snippets" value="2"/>
</bean>
</list>
</property>
</bean>
</property>
<property name="moreLikeThisConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryMoreLikeThisConfiguration">
<!--When altering this list also alter the "xmlui.Discovery.RelatedItems.help" key as it describes
the metadata fields below-->
<property name="similarityMetadataFields">
<list>
<value>dc.title</value>
<value>dc.contributor.author</value>
<value>dc.creator</value>
<value>dc.subject</value>
</list>
</property>
<!--The minimum number of matching terms across the metadata fields above before an item is found as related -->
<property name="minTermFrequency" value="5"/>
<!--The maximum number of related items displayed-->
<property name="max" value="3"/>
<!--The minimum word length below which words will be ignored-->
<property name="minWordLength" value="5"/>
</bean>
</property>
<!-- When true a "did you mean" example will be displayed, value can be true or false -->
<property name="spellCheckEnabled" value="true"/>
</bean>
<!--TagCloud configuration bean for homepage discovery configuration-->
<bean id="homepageTagCloudFacetConfiguration" class="org.dspace.discovery.configuration.TagCloudFacetConfiguration">
<!-- Actual configuration of the tagcloud (colors, sorting, etc.) -->
@@ -468,6 +693,46 @@
</property>
</bean>
<bean id="searchFilterType" class="org.dspace.discovery.configuration.DiscoverySearchFilterFacet">
<property name="indexFieldName" value="itemtype" />
<property name="metadataFields">
<list>
<value>dc.type</value>
</list>
</property>
</bean>
<bean id="searchFilterObjectType"
class="org.dspace.discovery.configuration.DiscoverySearchFilterFacet">
<property name="indexFieldName" value="resourcetype" />
<property name="metadataFields">
<list>
<value>placeholder.placeholder.placeholder</value>
</list>
</property>
</bean>
<bean id="searchFilterObjectNamedType"
class="org.dspace.discovery.configuration.DiscoverySearchFilterFacet">
<property name="indexFieldName" value="namedresourcetype" />
<property name="metadataFields">
<list>
<value>placeholder.placeholder.placeholder</value>
</list>
</property>
</bean>
<!-- Used only to READ "submitter" facets (managed programmatically at SolrServiceImpl) -->
<bean id="searchFilterSubmitter"
class="org.dspace.discovery.configuration.DiscoverySearchFilterFacet">
<property name="indexFieldName" value="submitter" />
<property name="metadataFields">
<list>
<value>placeholder.placeholder.placeholder</value>
</list>
</property>
</bean>
<!--Sort properties-->
<bean id="sortTitle" class="org.dspace.discovery.configuration.DiscoverySortFieldConfiguration">
<property name="metadataField" value="dc.title"/>