Skip to content

Commit 2c66da3

Browse files
authored
Merge pull request DSpace#11963 from 4Science/task/main/DURACOM-448-inverse-relation
[DSpace-CRIS] Inverse Relations via Authority Framework (Backend)
2 parents 549d73b + dc232b8 commit 2c66da3

12 files changed

Lines changed: 1236 additions & 76 deletions

File tree

dspace-api/src/main/java/org/dspace/discovery/FacetYearRange.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.regex.Matcher;
1212
import java.util.regex.Pattern;
1313

14+
import org.apache.commons.lang3.StringUtils;
1415
import org.dspace.core.Context;
1516
import org.dspace.discovery.configuration.DiscoverySearchFilterFacet;
1617

@@ -104,7 +105,15 @@ private void calculateNewRangeBasedOnSearchIndex(Context context, List<String> f
104105
yearRangeQuery.setSortField(dateFacet + "_sort", DiscoverQuery.SORT_ORDER.asc);
105106
yearRangeQuery.addFilterQueries(filterQueries.toArray(new String[filterQueries.size()]));
106107
yearRangeQuery.addSearchField(dateFacet);
107-
DiscoverResult lastYearResult = searchService.search(context, scope, yearRangeQuery);
108+
boolean isRelatedEntity =
109+
StringUtils.isNotBlank(parentQuery.getDiscoveryConfigurationName()) &&
110+
parentQuery.getDiscoveryConfigurationName().toUpperCase().startsWith("RELATION");
111+
DiscoverResult lastYearResult;
112+
if (isRelatedEntity) {
113+
lastYearResult = searchService.search(context, yearRangeQuery);
114+
} else {
115+
lastYearResult = searchService.search(context, scope, yearRangeQuery);
116+
}
108117

109118
if (0 < lastYearResult.getIndexableObjects().size()) {
110119
List<DiscoverResult.SearchDocument> searchDocuments = lastYearResult
@@ -115,7 +124,12 @@ private void calculateNewRangeBasedOnSearchIndex(Context context, List<String> f
115124
}
116125
//Now get the first year
117126
yearRangeQuery.setSortField(dateFacet + "_sort", DiscoverQuery.SORT_ORDER.desc);
118-
DiscoverResult firstYearResult = searchService.search(context, scope, yearRangeQuery);
127+
DiscoverResult firstYearResult;
128+
if (isRelatedEntity) {
129+
firstYearResult = searchService.search(context, yearRangeQuery);
130+
} else {
131+
firstYearResult = searchService.search(context, scope, yearRangeQuery);
132+
}
119133
if (0 < firstYearResult.getIndexableObjects().size()) {
120134
List<DiscoverResult.SearchDocument> searchDocuments = firstYearResult
121135
.getSearchDocument(firstYearResult.getIndexableObjects().get(0));

dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ public Map<String, DiscoveryConfiguration> getMap() {
5353

5454
public void setMap(Map<String, DiscoveryConfiguration> map) {
5555
this.map = map;
56+
if (map != null) {
57+
// improve the configuration assigning the map key as id to any configuration
58+
// that doesn't have one
59+
for (Map.Entry<String, DiscoveryConfiguration> entry : map.entrySet()) {
60+
DiscoveryConfiguration conf = entry.getValue();
61+
if (StringUtils.isBlank(conf.getId())) {
62+
conf.setId(entry.getKey());
63+
}
64+
}
65+
}
5666
}
5767

5868
public Map<Integer, List<String>> getToIgnoreMetadataFields() {

dspace-api/src/main/java/org/dspace/discovery/utils/DiscoverQueryBuilder.java

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
1313

1414
import java.sql.SQLException;
15+
import java.text.MessageFormat;
1516
import java.util.ArrayList;
1617
import java.util.List;
1718
import java.util.Objects;
@@ -33,10 +34,12 @@
3334
import org.dspace.discovery.configuration.DiscoveryConfiguration;
3435
import org.dspace.discovery.configuration.DiscoveryConfigurationParameters;
3536
import org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration;
37+
import org.dspace.discovery.configuration.DiscoveryRelatedItemConfiguration;
3638
import org.dspace.discovery.configuration.DiscoverySearchFilter;
3739
import org.dspace.discovery.configuration.DiscoverySearchFilterFacet;
3840
import org.dspace.discovery.configuration.DiscoverySortConfiguration;
3941
import org.dspace.discovery.configuration.DiscoverySortFieldConfiguration;
42+
import org.dspace.discovery.configuration.DiscoverySortFunctionConfiguration;
4043
import org.dspace.discovery.configuration.MultiLanguageDiscoverSearchFilterFacet;
4144
import org.dspace.discovery.indexobject.factory.IndexFactory;
4245
import org.dspace.discovery.utils.parameter.QueryBuilderSearchFilter;
@@ -112,15 +115,21 @@ public DiscoverQuery buildQuery(Context context, IndexableObject scope,
112115
String sortDirection)
113116
throws IllegalArgumentException, SearchServiceException {
114117

115-
DiscoverQuery queryArgs = buildCommonDiscoverQuery(context, discoveryConfiguration, query, searchFilters,
116-
dsoTypes);
118+
DiscoverQuery queryArgs =
119+
buildCommonDiscoverQuery(
120+
context, discoveryConfiguration, query, searchFilters,
121+
dsoTypes, scope
122+
);
117123

118124
//When all search criteria are set, configure facet results
119125
addFaceting(context, scope, queryArgs, discoveryConfiguration);
120126

121127
//Configure pagination and sorting
122128
configurePagination(pageSize, offset, queryArgs);
123-
configureSorting(sortProperty, sortDirection, queryArgs, discoveryConfiguration.getSearchSortConfiguration());
129+
configureSorting(
130+
sortProperty, sortDirection, queryArgs, discoveryConfiguration.getSearchSortConfiguration(),
131+
scope
132+
);
124133

125134
addDiscoveryHitHighlightFields(discoveryConfiguration, queryArgs);
126135
return queryArgs;
@@ -187,7 +196,7 @@ public DiscoverQuery buildFacetQuery(Context context, IndexableObject scope,
187196
throws IllegalArgumentException {
188197

189198
DiscoverQuery queryArgs = buildCommonDiscoverQuery(context, discoveryConfiguration, query, searchFilters,
190-
dsoTypes);
199+
dsoTypes, scope);
191200

192201
//When all search criteria are set, configure facet results
193202
addFacetingForFacets(context, scope, prefix, queryArgs, discoveryConfiguration, facetName, pageSize);
@@ -202,8 +211,8 @@ public DiscoverQuery buildFacetQuery(Context context, IndexableObject scope,
202211
}
203212

204213
private void configurePaginationForFacets(Long offset, DiscoverQuery queryArgs) {
205-
if (offset != null) {
206-
queryArgs.setFacetOffset(Math.toIntExact(offset));
214+
if (offset != null && queryArgs.getFacetFields().size() == 1) {
215+
queryArgs.getFacetFields().get(0).setOffset(offset.intValue());
207216
}
208217
}
209218

@@ -261,9 +270,11 @@ private void fillFacetIntoQueryArgs(Context context, IndexableObject scope, Stri
261270

262271
private DiscoverQuery buildCommonDiscoverQuery(Context context, DiscoveryConfiguration discoveryConfiguration,
263272
String query,
264-
List<QueryBuilderSearchFilter> searchFilters, List<String> dsoTypes)
273+
List<QueryBuilderSearchFilter> searchFilters,
274+
List<String> dsoTypes,
275+
IndexableObject scope)
265276
throws IllegalArgumentException {
266-
DiscoverQuery queryArgs = buildBaseQueryForConfiguration(discoveryConfiguration);
277+
DiscoverQuery queryArgs = buildBaseQueryForConfiguration(discoveryConfiguration, scope);
267278

268279
queryArgs.addFilterQueries(convertFiltersToString(context, discoveryConfiguration, searchFilters));
269280

@@ -282,19 +293,27 @@ private DiscoverQuery buildCommonDiscoverQuery(Context context, DiscoveryConfigu
282293
return queryArgs;
283294
}
284295

285-
private DiscoverQuery buildBaseQueryForConfiguration(DiscoveryConfiguration discoveryConfiguration) {
296+
private DiscoverQuery buildBaseQueryForConfiguration(DiscoveryConfiguration discoveryConfiguration,
297+
IndexableObject scope) {
298+
286299
DiscoverQuery queryArgs = new DiscoverQuery();
287300
queryArgs.setDiscoveryConfigurationName(discoveryConfiguration.getId());
288-
queryArgs.addFilterQueries(discoveryConfiguration.getDefaultFilterQueries()
289-
.toArray(
290-
new String[discoveryConfiguration
291-
.getDefaultFilterQueries()
292-
.size()]));
301+
302+
String[] queryArray = discoveryConfiguration.getDefaultFilterQueries()
303+
.toArray(new String[discoveryConfiguration.getDefaultFilterQueries().size()]);
304+
305+
if (scope != null && discoveryConfiguration instanceof DiscoveryRelatedItemConfiguration) {
306+
for (int i = 0; i < queryArray.length; i++) {
307+
queryArray[i] = MessageFormat.format(queryArray[i], scope.getID());
308+
}
309+
}
310+
311+
queryArgs.addFilterQueries(queryArray);
293312
return queryArgs;
294313
}
295314

296315
private void configureSorting(String sortProperty, String sortDirection, DiscoverQuery queryArgs,
297-
DiscoverySortConfiguration searchSortConfiguration)
316+
DiscoverySortConfiguration searchSortConfiguration, IndexableObject scope)
298317
throws IllegalArgumentException, SearchServiceException {
299318
String sortBy = sortProperty;
300319
String sortOrder = sortDirection;
@@ -318,8 +337,18 @@ private void configureSorting(String sortProperty, String sortDirection, Discove
318337
.getSortFieldConfiguration(sortBy);
319338

320339
if (sortFieldConfiguration != null) {
321-
String sortField = searchService
322-
.toSortFieldIndex(sortFieldConfiguration.getMetadataField(), sortFieldConfiguration.getType());
340+
341+
String sortField;
342+
343+
if (DiscoverySortFunctionConfiguration.SORT_FUNCTION.equals(sortFieldConfiguration.getType())) {
344+
sortField = MessageFormat.format(
345+
((DiscoverySortFunctionConfiguration) sortFieldConfiguration).getFunction(scope.getID()),
346+
scope.getID());
347+
} else {
348+
sortField = searchService
349+
.toSortFieldIndex(
350+
sortFieldConfiguration.getMetadataField(), sortFieldConfiguration.getType());
351+
}
323352

324353
if ("asc".equalsIgnoreCase(sortOrder)) {
325354
queryArgs.setSortField(sortField, DiscoverQuery.SORT_ORDER.asc);

dspace-api/src/test/java/org/dspace/builder/ItemBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,18 @@ public ItemBuilder withDescriptionAbstract(String description) {
248248
return addMetadataValue(item, MetadataSchemaEnum.DC.getName(), "description", "abstract", description);
249249
}
250250

251+
public ItemBuilder withRelationProject(String project, String authority) {
252+
return addMetadataValue(item, DC.getName(), "relation", "project", null, project, authority, 600);
253+
}
254+
251255
public ItemBuilder withRelationJournal(String journal, String authority) {
252256
return addMetadataValue(item, DC.getName(), "relation", "journal", null, journal, authority, 600);
253257
}
254258

259+
public ItemBuilder withProjectInvestigator(String investigator, String authority) {
260+
return addMetadataValue(item, "crispj", "investigator", null, null, investigator, authority, 600);
261+
}
262+
255263
public ItemBuilder withType(String type) {
256264
return addMetadataValue(item, "dc", "type", null, type);
257265
}

dspace-api/src/test/java/org/dspace/discovery/utils/DiscoverQueryBuilderTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,9 @@ public void testBuildFacetQuery() throws Exception {
322322
assertThat(discoverQuery.getMaxResults(), is(0));
323323
assertThat(discoverQuery.getStart(), is(0));
324324
assertThat(discoverQuery.getFacetMinCount(), is(1));
325-
assertThat(discoverQuery.getFacetOffset(), is(10));
326325
assertThat(discoverQuery.getFacetFields(), hasSize(1));
327326
assertThat(discoverQuery.getFacetFields(), contains(
328-
discoverFacetFieldMatcher(new DiscoverFacetField("subject", TYPE_TEXT, 11, COUNT, "prefix"))
327+
discoverFacetFieldMatcher(new DiscoverFacetField("subject", TYPE_TEXT, 11, COUNT, "prefix", 10))
329328
));
330329
}
331330

dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ private void setRequestInformation(Context context, String facetName, String pre
8282
facetResultsRest.setPrefix(prefix);
8383
facetResultsRest.setScope(dsoScope);
8484
facetResultsRest.setDsoTypes(dsoTypes);
85-
85+
if (configuration != null) {
86+
facetResultsRest.setConfiguration(configuration.getId());
87+
}
8688
facetResultsRest.setFacetEntry(convertFacetEntry(facetName, searchResult, configuration, page, projection));
8789

8890
facetResultsRest.setSort(SearchResultsRest.Sorting.fromPage(page));

dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.dspace.discovery.SearchServiceException;
3535
import org.dspace.discovery.configuration.DiscoveryConfiguration;
3636
import org.dspace.discovery.configuration.DiscoveryConfigurationService;
37+
import org.dspace.discovery.configuration.DiscoveryRelatedItemConfiguration;
3738
import org.springframework.beans.factory.annotation.Autowired;
3839
import org.springframework.data.domain.PageRequest;
3940
import org.springframework.data.domain.Pageable;
@@ -98,13 +99,19 @@ public SearchResultsRest getSearchObjects(final String query, final List<String>
9899
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
99100
.getDiscoveryConfigurationByNameOrIndexableObject(context, configuration, scopeObject);
100101

101-
DiscoverResult searchResult = null;
102-
DiscoverQuery discoverQuery = null;
102+
boolean isRelatedItem = discoveryConfiguration instanceof DiscoveryRelatedItemConfiguration;
103+
104+
DiscoverResult searchResult;
105+
DiscoverQuery discoverQuery;
103106

104107
try {
105108
discoverQuery = queryBuilder
106109
.buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoTypes, page);
107-
searchResult = searchService.search(context, scopeObject, discoverQuery);
110+
if (isRelatedItem) {
111+
searchResult = searchService.search(context, discoverQuery);
112+
} else {
113+
searchResult = searchService.search(context, scopeObject, discoverQuery);
114+
}
108115

109116
} catch (SearchServiceException e) {
110117
log.error("Error while searching with Discovery", e);
@@ -140,9 +147,22 @@ public FacetResultsRest getFacetObjects(String facetName, String prefix, String
140147
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
141148
.getDiscoveryConfigurationByNameOrIndexableObject(context, configuration, scopeObject);
142149

143-
DiscoverQuery discoverQuery = queryBuilder.buildFacetQuery(context, scopeObject, discoveryConfiguration, prefix,
144-
query, searchFilters, dsoTypes, page, facetName);
145-
DiscoverResult searchResult = searchService.search(context, scopeObject, discoverQuery);
150+
boolean isRelatedItem = discoveryConfiguration instanceof DiscoveryRelatedItemConfiguration;
151+
152+
DiscoverResult searchResult;
153+
DiscoverQuery discoverQuery;
154+
try {
155+
discoverQuery = queryBuilder.buildFacetQuery(context, scopeObject, discoveryConfiguration, prefix, query,
156+
searchFilters, dsoTypes, page, facetName);
157+
if (isRelatedItem) {
158+
searchResult = searchService.search(context, discoverQuery);
159+
} else {
160+
searchResult = searchService.search(context, scopeObject, discoverQuery);
161+
}
162+
} catch (SearchServiceException e) {
163+
log.error("Error while searching with Discovery", e);
164+
throw new IllegalArgumentException("Error while searching with Discovery: " + e.getMessage());
165+
}
146166

147167
FacetResultsRest facetResultsRest = discoverFacetResultsConverter.convert(context, facetName, prefix, query,
148168
dsoTypes, dsoScope, searchFilters, searchResult, discoveryConfiguration, page,
@@ -159,12 +179,20 @@ public SearchResultsRest getAllFacets(String query, List<String> dsoTypes, Strin
159179
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
160180
.getDiscoveryConfigurationByNameOrIndexableObject(context, configuration, scopeObject);
161181

182+
boolean isRelatedItem = discoveryConfiguration instanceof DiscoveryRelatedItemConfiguration;
183+
162184
DiscoverResult searchResult = null;
163-
DiscoverQuery discoverQuery = null;
185+
DiscoverQuery discoverQuery;
164186

165187
try {
166188
discoverQuery = queryBuilder
167189
.buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoTypes, page);
190+
191+
if (isRelatedItem) {
192+
searchResult = searchService.search(context, discoverQuery);
193+
} else {
194+
searchResult = searchService.search(context, scopeObject, discoverQuery);
195+
}
168196
searchResult = searchService.search(context, scopeObject, discoverQuery);
169197

170198
} catch (SearchServiceException e) {

0 commit comments

Comments
 (0)