option to exclude the submitter being indexed to solr in archived items

https://github.com/DSpace/DSpace/issues/9660
(cherry picked from commit 8ed2cdcff7)
This commit is contained in:
Gantner, Florian Klaus
2024-10-08 13:42:07 +02:00
committed by github-actions[bot]
parent 46e02859bd
commit 7ed3d326a8
3 changed files with 120 additions and 4 deletions

View File

@@ -154,9 +154,11 @@ public class ItemIndexFactoryImpl extends DSpaceObjectIndexFactoryImpl<Indexable
doc.addField("latestVersion", isLatestVersion(context, item));
EPerson submitter = item.getSubmitter();
if (submitter != null) {
addFacetIndex(doc, "submitter", submitter.getID().toString(),
submitter.getFullName());
if (submitter != null && !(DSpaceServicesFactory.getInstance().getConfigurationService().getBooleanProperty(
"discovery.index.item.submitter.enabled", false))) {
doc.addField("submitter_authority", submitter.getID().toString());
} else if (submitter != null) {
addFacetIndex(doc, "submitter", submitter.getID().toString(), submitter.getFullName());
}
// Add the item metadata

View File

@@ -8,6 +8,10 @@
package org.dspace.discovery;
import static org.dspace.discovery.SolrServiceWorkspaceWorkflowRestrictionPlugin.DISCOVER_WORKSPACE_CONFIGURATION_NAME;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -21,6 +25,10 @@ import java.util.List;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.dspace.AbstractIntegrationTestWithDatabase;
import org.dspace.app.launcher.ScriptLauncher;
import org.dspace.app.scripts.handler.impl.TestDSpaceRunnableHandler;
@@ -99,6 +107,9 @@ public class DiscoveryIT extends AbstractIntegrationTestWithDatabase {
MetadataAuthorityService metadataAuthorityService = ContentAuthorityServiceFactory.getInstance()
.getMetadataAuthorityService();
MockSolrSearchCore solrSearchCore = DSpaceServicesFactory.getInstance().getServiceManager()
.getServiceByName(null, MockSolrSearchCore.class);
@Override
@Before
public void setUp() throws Exception {
@@ -796,6 +807,104 @@ public class DiscoveryIT extends AbstractIntegrationTestWithDatabase {
}
}
/**
* Test designed to check if the submitter is not indexed in all in solr documents for items
* and the submitter authority is still indexed
* @throws SearchServiceException
*/
@Test
public void searchWithNoSubmitterTest() throws SearchServiceException {
configurationService.setProperty("discovery.index.item.submitter.enabled", false);
DiscoveryConfiguration defaultConf = SearchUtils.getDiscoveryConfiguration(context, "default", null);
// Populate the testing objects: create items in eperson's workspace and perform search in it
int numberItems = 10;
context.turnOffAuthorisationSystem();
EPerson submitter = null;
try {
submitter = EPersonBuilder.createEPerson(context).withEmail("submitter@example.org")
.withNameInMetadata("Peter", "Funny").build();
} catch (SQLException e) {
throw new RuntimeException(e);
}
context.setCurrentUser(submitter);
Community community = CommunityBuilder.createCommunity(context).build();
Collection collection = CollectionBuilder.createCollection(context, community).build();
for (int i = 0; i < numberItems; i++) {
ItemBuilder.createItem(context, collection)
.withTitle("item " + i)
.build();
}
context.restoreAuthSystemState();
// Build query with default parameters (except for workspaceConf)
QueryResponse result = null;
try {
result = solrSearchCore.getSolr().query(new SolrQuery(String.format(
"search.resourcetype:\"Item\"")));
} catch (SolrServerException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
assertEquals(result.getResults().size(), numberItems);
for (SolrDocument doc : result.getResults()) {
assertThat(doc.getFieldNames(),
not(hasItems("submitter_keyword", "submitter_ac", "submitter_acid", "submitter_filter")));
assertThat(doc.getFieldNames(), hasItem("submitter_authority"));
}
}
/**
* Test designed to check if the submitter is indexed in all in solr documents for items
* @throws SearchServiceException
*/
@Test
public void searchWithSubmitterTest() throws SearchServiceException {
configurationService.setProperty("discovery.index.item.submitter.enabled", true);
DiscoveryConfiguration defaultConf = SearchUtils.getDiscoveryConfiguration(context, "default", null);
// Populate the testing objects: create items in eperson's workspace and perform search in it
int numberItems = 10;
context.turnOffAuthorisationSystem();
EPerson submitter = null;
try {
submitter = EPersonBuilder.createEPerson(context).withEmail("submitter@example.org")
.withNameInMetadata("Peter", "Funny").build();
} catch (SQLException e) {
throw new RuntimeException(e);
}
context.setCurrentUser(submitter);
Community community = CommunityBuilder.createCommunity(context).build();
Collection collection = CollectionBuilder.createCollection(context, community).build();
for (int i = 0; i < numberItems; i++) {
ItemBuilder.createItem(context, collection)
.withTitle("item " + i)
.build();
}
context.restoreAuthSystemState();
// Build query with default parameters (except for workspaceConf)
QueryResponse result = null;
try {
result = solrSearchCore.getSolr().query(new SolrQuery(String.format(
"search.resourcetype:\"Item\"")));
} catch (SolrServerException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
assertEquals(result.getResults().size(), numberItems);
for (SolrDocument doc : result.getResults()) {
for (String fieldname : doc.getFieldNames()) {
assertThat(doc.getFieldNames(), hasItems("submitter_keyword","submitter_ac", "submitter_filter",
"submitter_authority"));
}
}
}
private void assertSearchQuery(String resourceType, int size) throws SearchServiceException {
assertSearchQuery(resourceType, size, size, 0, -1);
}

View File

@@ -24,6 +24,11 @@ discovery.search.server = ${solr.server}/${solr.multicorePrefix}search
# discovery.index.ignore-authority = false
discovery.index.projection=dc.title,dc.contributor.*,dc.date.issued
# Restricts the indexing of the submitter for archived items
# By default the submitter information from the corresponding eperson is not indexed.
# If you set this value to true, than the submitter information is indexed and you will need to reindex search core
# discovery.index.item.submitter.enabled = false
# Allow auto-reindexing.
# If any database migrations are applied to your database (via Flyway), then a
# reindex flag is always written to '[dspace]/solr/search/conf/reindex.flag'.