Merge branch 'RED-8490' into 'master'
RED-8490 - Add ADD_TO_DICTIONARY in manual changes for entries Closes RED-8490 See merge request redactmanager/redaction-service!277
This commit is contained in:
commit
46990eb632
@ -1,6 +1,7 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.service;
|
package com.iqser.red.service.redaction.v1.server.service;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -12,6 +13,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
||||||
|
|
||||||
@ -46,19 +48,43 @@ public class EntityChangeLogService {
|
|||||||
entityLogEntry.getChanges().add(new Change(analysisNumber, ChangeType.ADDED, now));
|
entityLogEntry.getChanges().add(new Change(analysisNumber, ChangeType.ADDED, now));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var previousEntity = optionalPreviousEntity.get();
|
|
||||||
|
EntityLogEntry previousEntity = optionalPreviousEntity.get();
|
||||||
entityLogEntry.getChanges().addAll(previousEntity.getChanges());
|
entityLogEntry.getChanges().addAll(previousEntity.getChanges());
|
||||||
if (!previousEntity.getState().equals(entityLogEntry.getState())) {
|
if (!previousEntity.getState().equals(entityLogEntry.getState())) {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
ChangeType changeType = calculateChangeType(entityLogEntry.getState(), previousEntity.getState());
|
ChangeType changeType = calculateChangeType(entityLogEntry.getState(), previousEntity.getState());
|
||||||
entityLogEntry.getChanges().add(new Change(analysisNumber, changeType, now));
|
entityLogEntry.getChanges().add(new Change(analysisNumber, changeType, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addManualChanges(entityLogEntry, previousEntity);
|
||||||
}
|
}
|
||||||
addRemovedEntriesAsRemoved(previousEntityLogEntries, newEntityLogEntries, manualRedactions, analysisNumber, now);
|
addRemovedEntriesAsRemoved(previousEntityLogEntries, newEntityLogEntries, manualRedactions, analysisNumber, now);
|
||||||
return hasChanges;
|
return hasChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// If a manual change is present in the previous entity but not in the new entity, add it to the new one and
|
||||||
|
// sort them, so they are displayed in the correct order.
|
||||||
|
private void addManualChanges(EntityLogEntry entityLogEntry, EntityLogEntry previousEntity) {
|
||||||
|
|
||||||
|
Comparator<ManualChange> manualChangeComparator =
|
||||||
|
Comparator.comparing(ManualChange::getManualRedactionType)
|
||||||
|
.thenComparing(ManualChange::getRequestedDate);
|
||||||
|
|
||||||
|
previousEntity.getManualChanges().forEach(manualChange -> {
|
||||||
|
boolean contains = entityLogEntry.getManualChanges()
|
||||||
|
.stream()
|
||||||
|
.anyMatch(existingChange -> manualChangeComparator.compare(existingChange, manualChange) == 0);
|
||||||
|
|
||||||
|
if (!contains) {
|
||||||
|
entityLogEntry.getManualChanges().add(manualChange);
|
||||||
|
entityLogEntry.getManualChanges().sort(Comparator.comparing(ManualChange::getRequestedDate));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void addRemovedEntriesAsRemoved(List<EntityLogEntry> previousEntityLogEntries,
|
private void addRemovedEntriesAsRemoved(List<EntityLogEntry> previousEntityLogEntries,
|
||||||
List<EntityLogEntry> newEntityLogEntries,
|
List<EntityLogEntry> newEntityLogEntries,
|
||||||
ManualRedactions manualRedactions,
|
ManualRedactions manualRedactions,
|
||||||
|
|||||||
@ -18,6 +18,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis;
|
||||||
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
||||||
import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient;
|
import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient;
|
||||||
@ -136,24 +137,47 @@ public class EntityLogCreatorService {
|
|||||||
|
|
||||||
private List<EntityLogEntry> createEntityLogEntries(Document document, AnalyzeRequest analyzeRequest, List<PrecursorEntity> notFoundPrecursorEntries) {
|
private List<EntityLogEntry> createEntityLogEntries(Document document, AnalyzeRequest analyzeRequest, List<PrecursorEntity> notFoundPrecursorEntries) {
|
||||||
|
|
||||||
|
Set<ManualRedactionEntry> dictionaryEntries;
|
||||||
|
Set<String> dictionaryEntriesValues;
|
||||||
|
|
||||||
|
if (analyzeRequest.getManualRedactions() != null && !analyzeRequest.getManualRedactions().getEntriesToAdd().isEmpty()) {
|
||||||
|
dictionaryEntries = analyzeRequest.getManualRedactions().getEntriesToAdd()
|
||||||
|
.stream()
|
||||||
|
.filter(e -> e.isAddToDictionary() || e.isAddToDossierDictionary())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
dictionaryEntriesValues = dictionaryEntries.stream()
|
||||||
|
.map(ManualRedactionEntry::getValue)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
} else {
|
||||||
|
dictionaryEntriesValues = new HashSet<>();
|
||||||
|
dictionaryEntries = new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
String dossierTemplateId = analyzeRequest.getDossierTemplateId();
|
String dossierTemplateId = analyzeRequest.getDossierTemplateId();
|
||||||
|
|
||||||
List<EntityLogEntry> entries = new ArrayList<>();
|
List<EntityLogEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
document.getEntities()
|
document.getEntities()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(entity -> !entity.getValue().isEmpty())
|
.filter(entity -> !entity.getValue().isEmpty())
|
||||||
.filter(EntityLogCreatorService::notFalsePositiveOrFalseRecommendation)
|
.filter(EntityLogCreatorService::notFalsePositiveOrFalseRecommendation)
|
||||||
.filter(entity -> !entity.removed())
|
.filter(entity -> !entity.removed())
|
||||||
.forEach(entityNode -> entries.addAll(toEntityLogEntries(entityNode)));
|
.forEach(entityNode -> entries.addAll(toEntityLogEntries(entityNode, dictionaryEntries, dictionaryEntriesValues)));
|
||||||
document.streamAllImages().filter(entity -> !entity.removed()).forEach(imageNode -> entries.add(createEntityLogEntry(imageNode, dossierTemplateId)));
|
document.streamAllImages().filter(entity -> !entity.removed()).forEach(imageNode -> entries.add(createEntityLogEntry(imageNode, dossierTemplateId)));
|
||||||
notFoundPrecursorEntries.stream().filter(entity -> !entity.removed()).forEach(precursorEntity -> entries.add(createEntityLogEntry(precursorEntity, dossierTemplateId)));
|
notFoundPrecursorEntries.stream().filter(entity -> !entity.removed()).forEach(precursorEntity -> entries.add(createEntityLogEntry(precursorEntity, dossierTemplateId)));
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<EntityLogEntry> toEntityLogEntries(TextEntity textEntity) {
|
private List<EntityLogEntry> toEntityLogEntries(TextEntity textEntity, Set<ManualRedactionEntry> dictionaryEntries, Set<String> dictionaryEntriesValues) {
|
||||||
|
|
||||||
List<EntityLogEntry> entityLogEntries = new ArrayList<>();
|
List<EntityLogEntry> entityLogEntries = new ArrayList<>();
|
||||||
|
|
||||||
|
// Adding ADD_TO_DICTIONARY manual change to the entity's manual overwrite
|
||||||
|
if (dictionaryEntriesValues.contains(textEntity.getValue())) {
|
||||||
|
textEntity.getManualOverwrite().addChange(dictionaryEntries.stream().filter(entry -> entry.getValue().equals(textEntity.getValue())).findFirst().get());
|
||||||
|
}
|
||||||
|
|
||||||
// split entity into multiple entries if it occurs on multiple pages, since FE can't handle multi page entities
|
// split entity into multiple entries if it occurs on multiple pages, since FE can't handle multi page entities
|
||||||
for (PositionOnPage positionOnPage : textEntity.getPositionsOnPagePerPage()) {
|
for (PositionOnPage positionOnPage : textEntity.getPositionsOnPagePerPage()) {
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package com.iqser.red.service.redaction.v1.server.service;
|
|||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ public class ManualChangeFactory {
|
|||||||
|
|
||||||
public List<ManualChange> toManualChangeList(List<BaseAnnotation> manualChanges, boolean isHint) {
|
public List<ManualChange> toManualChangeList(List<BaseAnnotation> manualChanges, boolean isHint) {
|
||||||
|
|
||||||
return manualChanges.stream().map(baseAnnotation -> toManualChange(baseAnnotation, isHint)).toList();
|
return manualChanges.stream().map(baseAnnotation -> toManualChange(baseAnnotation, isHint)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user