71752: Refactored metadatafield indexing via event > consumer

This commit is contained in:
Marie Verdonck
2020-08-21 16:07:07 +02:00
parent 735c3bc791
commit 2f26cf7def
4 changed files with 45 additions and 20 deletions

View File

@@ -9,6 +9,8 @@ package org.dspace.content;
import java.io.IOException; import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@@ -20,11 +22,12 @@ import org.dspace.content.dao.MetadataFieldDAO;
import org.dspace.content.service.MetadataFieldService; import org.dspace.content.service.MetadataFieldService;
import org.dspace.content.service.MetadataSchemaService; import org.dspace.content.service.MetadataSchemaService;
import org.dspace.content.service.MetadataValueService; import org.dspace.content.service.MetadataValueService;
import org.dspace.content.service.SiteService;
import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.LogManager; import org.dspace.core.LogManager;
import org.dspace.discovery.IndexingService;
import org.dspace.discovery.indexobject.IndexableMetadataField; import org.dspace.discovery.indexobject.IndexableMetadataField;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.event.Event;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
/** /**
@@ -49,7 +52,8 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
protected MetadataValueService metadataValueService; protected MetadataValueService metadataValueService;
@Autowired(required = true) @Autowired(required = true)
protected MetadataSchemaService metadataSchemaService; protected MetadataSchemaService metadataSchemaService;
private IndexingService indexer; @Autowired
protected SiteService siteService;
protected MetadataFieldServiceImpl() { protected MetadataFieldServiceImpl() {
@@ -82,7 +86,7 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
log.info(LogManager.getHeader(context, "create_metadata_field", log.info(LogManager.getHeader(context, "create_metadata_field",
"metadata_field_id=" + metadataField.getID())); "metadata_field_id=" + metadataField.getID()));
// Update the index of type metadatafield // Update the index of type metadatafield
this.updateMetadataFieldIndex(context); this.triggerEventToUpdateIndex(context, metadataField.getID());
return metadataField; return metadataField;
} }
@@ -156,7 +160,7 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
.getElement() .getElement()
+ "qualifier=" + metadataField.getQualifier())); + "qualifier=" + metadataField.getQualifier()));
// Update the index of type metadatafield // Update the index of type metadatafield
this.updateMetadataFieldIndex(context); this.triggerEventToUpdateIndex(context, metadataField.getID());
} }
@Override @Override
@@ -186,21 +190,20 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
log.info(LogManager.getHeader(context, "delete_metadata_field", log.info(LogManager.getHeader(context, "delete_metadata_field",
"metadata_field_id=" + metadataField.getID())); "metadata_field_id=" + metadataField.getID()));
// Update the index of type metadatafield // Update the index of type metadatafield
this.updateMetadataFieldIndex(context); this.triggerEventToUpdateIndex(context, metadataField.getID());
} }
/** /**
* Updates the index of type metadatafield. Indexed metadatafields are used by the /search/byFieldName endpoint, * Calls a MODIFY SITE event with the identifier of the changed mdField, so it can be indexed in
* see MetadataFieldRestRepository * {@link org.dspace.discovery.IndexEventConsumer}, with type of {@link org.dspace.discovery.IndexableObject} in
* {@link Event}.detail and the identifiers of the changed mdFields in {@link Event}.identifiers
*
* @param context DSpace context * @param context DSpace context
* @param mdFieldId ID of the metadata field that needs to be (re)indexed
*/ */
private void updateMetadataFieldIndex(Context context) { private void triggerEventToUpdateIndex(Context context, int mdFieldId) {
if (this.indexer == null) { context.addEvent(new Event(Event.MODIFY, Constants.SITE, null, IndexableMetadataField.TYPE, new ArrayList<>(
this.indexer = DSpaceServicesFactory.getInstance().getServiceManager() Arrays.asList(Integer.toString(mdFieldId)))));
.getServiceByName(IndexingService.class.getName(),
IndexingService.class);
}
this.indexer.updateIndex(context, true, IndexableMetadataField.TYPE);
} }
/** /**

View File

@@ -8,6 +8,7 @@
package org.dspace.discovery; package org.dspace.discovery;
import java.util.HashSet; import java.util.HashSet;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -15,6 +16,7 @@ import org.dspace.content.Bundle;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.discovery.indexobject.factory.IndexFactory;
import org.dspace.discovery.indexobject.factory.IndexObjectFactoryFactory; import org.dspace.discovery.indexobject.factory.IndexObjectFactoryFactory;
import org.dspace.event.Consumer; import org.dspace.event.Consumer;
import org.dspace.event.Event; import org.dspace.event.Event;
@@ -67,7 +69,7 @@ public class IndexEventConsumer implements Consumer {
int st = event.getSubjectType(); int st = event.getSubjectType();
if (!(st == Constants.ITEM || st == Constants.BUNDLE if (!(st == Constants.ITEM || st == Constants.BUNDLE
|| st == Constants.COLLECTION || st == Constants.COMMUNITY)) { || st == Constants.COLLECTION || st == Constants.COMMUNITY || st == Constants.SITE)) {
log log
.warn("IndexConsumer should not have been given this kind of Subject in an event, skipping: " .warn("IndexConsumer should not have been given this kind of Subject in an event, skipping: "
+ event.toString()); + event.toString());
@@ -104,10 +106,28 @@ public class IndexEventConsumer implements Consumer {
case Event.MODIFY: case Event.MODIFY:
case Event.MODIFY_METADATA: case Event.MODIFY_METADATA:
if (subject == null) { if (subject == null) {
if (st == Constants.SITE) {
// Update the indexable objects of type in event.detail of objects with ids in event.identifiers
for (String id : event.getIdentifiers()) {
IndexFactory indexableObjectService = IndexObjectFactoryFactory.getInstance().
getIndexFactoryByType(event.getDetail());
Optional<IndexableObject> indexableObject = Optional.empty();
indexableObject = indexableObjectService.findIndexableObject(ctx, id);
if (indexableObject.isPresent()) {
log.debug("consume() adding event to update queue: " + event.toString());
objectsToUpdate
.addAll(indexObjectServiceFactory
.getIndexableObjects(ctx, indexableObject.get().getIndexedObject()));
} else {
log.warn("Cannot resolve " + id);
}
}
} else {
log.warn(event.getEventTypeAsString() + " event, could not get object for " log.warn(event.getEventTypeAsString() + " event, could not get object for "
+ event.getSubjectTypeAsString() + " id=" + event.getSubjectTypeAsString() + " id="
+ event.getSubjectID() + event.getSubjectID()
+ ", perhaps it has been deleted."); + ", perhaps it has been deleted.");
}
} else { } else {
log.debug("consume() adding event to update queue: " + event.toString()); log.debug("consume() adding event to update queue: " + event.toString());
objectsToUpdate.addAll(indexObjectServiceFactory.getIndexableObjects(ctx, subject)); objectsToUpdate.addAll(indexObjectServiceFactory.getIndexableObjects(ctx, subject));

View File

@@ -140,7 +140,8 @@ public class MetadataFieldRestRepository extends DSpaceRestRepository<MetadataFi
if (StringUtils.isBlank(exactName)) { if (StringUtils.isBlank(exactName)) {
// Find matches in Solr Search core // Find matches in Solr Search core
DiscoverQuery discoverQuery = this.createDiscoverQuery(context, schemaName, elementName, qualifierName, query); DiscoverQuery discoverQuery =
this.createDiscoverQuery(context, schemaName, elementName, qualifierName, query);
try { try {
DiscoverResult searchResult = searchService.search(context, null, discoverQuery); DiscoverResult searchResult = searchService.search(context, null, discoverQuery);
for (IndexableObject object : searchResult.getIndexableObjects()) { for (IndexableObject object : searchResult.getIndexableObjects()) {
@@ -153,7 +154,8 @@ public class MetadataFieldRestRepository extends DSpaceRestRepository<MetadataFi
throw new IllegalArgumentException("Error while searching with Discovery: " + e.getMessage()); throw new IllegalArgumentException("Error while searching with Discovery: " + e.getMessage());
} }
} else { } else {
if (StringUtils.isNotBlank(elementName) || StringUtils.isNotBlank(qualifierName) || StringUtils.isNotBlank(schemaName) || StringUtils.isNotBlank(query)) { if (StringUtils.isNotBlank(elementName) || StringUtils.isNotBlank(qualifierName) ||
StringUtils.isNotBlank(schemaName) || StringUtils.isNotBlank(query)) {
throw new UnprocessableEntityException("Use either exactName or a combination of element, qualifier " + throw new UnprocessableEntityException("Use either exactName or a combination of element, qualifier " +
"and schema to search discovery for metadata fields"); "and schema to search discovery for metadata fields");
} }

View File

@@ -672,7 +672,7 @@ event.dispatcher.noindex.consumers = eperson
# consumer to maintain the discovery index # consumer to maintain the discovery index
event.consumer.discovery.class = org.dspace.discovery.IndexEventConsumer event.consumer.discovery.class = org.dspace.discovery.IndexEventConsumer
event.consumer.discovery.filters = Community|Collection|Item|Bundle+Add|Create|Modify|Modify_Metadata|Delete|Remove event.consumer.discovery.filters = Community|Collection|Item|Bundle|Site+Add|Create|Modify|Modify_Metadata|Delete|Remove
# consumer related to EPerson changes # consumer related to EPerson changes
event.consumer.eperson.class = org.dspace.eperson.EPersonConsumer event.consumer.eperson.class = org.dspace.eperson.EPersonConsumer