mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-15 05:53:08 +00:00
71752: Refactored metadatafield indexing via event > consumer
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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));
|
||||||
|
@@ -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");
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user