Skip to content

Commit

Permalink
Merge pull request DSpace#9690 from uniba-ub/issue-9660
Browse files Browse the repository at this point in the history
exclude submitter information in solr indexing
  • Loading branch information
tdonohue authored Jan 13, 2025
2 parents 8e8979c + 8ed2cdc commit b853804
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,11 @@ public SolrInputDocument buildDocument(Context context, IndexableItem indexableI
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
Expand Down
109 changes: 109 additions & 0 deletions dspace-api/src/test/java/org/dspace/discovery/DiscoveryIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,6 +25,10 @@
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;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -796,6 +807,104 @@ public void searchWithDefaultSortServiceTest() throws SearchServiceException {
}
}

/**
* 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("[email protected]")
.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("[email protected]")
.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);
}
Expand Down
7 changes: 6 additions & 1 deletion dspace/config/modules/discovery.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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'.
Expand All @@ -48,4 +53,4 @@ discovery.facet.namedtype.workflow.pooled = 004workflow\n|||\nWaiting for Contro
# Set the number of retry of a query when stale objects are found.
# Set to -1 if stale objects should be ignored. Set to 0 if you want to avoid extra query but take the chance to cleanup
# the index each time that stale objects are found. Default 3
discovery.removestale.attempts = 3
discovery.removestale.attempts = 3

0 comments on commit b853804

Please sign in to comment.