RED-3616: Do not remove annotation that intersects with skipped imported redactions
This commit is contained in:
parent
49d47a0682
commit
d050070dc7
@ -159,7 +159,7 @@ public class AnalyzeService {
|
|||||||
PageEntities pageEntities = entityRedactionService.findEntities(dictionary, reanalysisSections, kieContainer, analyzeRequest, nerEntities);
|
PageEntities pageEntities = entityRedactionService.findEntities(dictionary, reanalysisSections, kieContainer, analyzeRequest, nerEntities);
|
||||||
var newRedactionLogEntries = redactionLogCreatorService.createRedactionLog(pageEntities, text.getNumberOfPages(), analyzeRequest.getDossierTemplateId());
|
var newRedactionLogEntries = redactionLogCreatorService.createRedactionLog(pageEntities, text.getNumberOfPages(), analyzeRequest.getDossierTemplateId());
|
||||||
|
|
||||||
var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), newRedactionLogEntries, false);
|
var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), newRedactionLogEntries, false, analyzeRequest.getManualRedactions());
|
||||||
|
|
||||||
redactionLog.getRedactionLogEntry()
|
redactionLog.getRedactionLogEntry()
|
||||||
.removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType()
|
.removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType()
|
||||||
@ -195,7 +195,7 @@ public class AnalyzeService {
|
|||||||
.getDossierTemplateVersion(), dictionary.getVersion()
|
.getDossierTemplateVersion(), dictionary.getVersion()
|
||||||
.getDossierVersion(), rulesVersion, legalBasisClient.getVersion(analyzeRequest.getDossierTemplateId()));
|
.getDossierVersion(), rulesVersion, legalBasisClient.getVersion(analyzeRequest.getDossierTemplateId()));
|
||||||
|
|
||||||
var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), redactionLog.getRedactionLogEntry(), true);
|
var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), redactionLog.getRedactionLogEntry(), true, analyzeRequest.getManualRedactions());
|
||||||
redactionLog.setRedactionLogEntry(importedRedactionFilteredEntries);
|
redactionLog.setRedactionLogEntry(importedRedactionFilteredEntries);
|
||||||
|
|
||||||
return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionary.getVersion(), false);
|
return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionary.getVersion(), false);
|
||||||
|
|||||||
@ -1,12 +1,21 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.redaction.service;
|
package com.iqser.red.service.redaction.v1.server.redaction.service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions;
|
||||||
import com.iqser.red.service.redaction.v1.model.ImportedRedaction;
|
import com.iqser.red.service.redaction.v1.model.ImportedRedaction;
|
||||||
import com.iqser.red.service.redaction.v1.model.ImportedRedactions;
|
import com.iqser.red.service.redaction.v1.model.ImportedRedactions;
|
||||||
|
import com.iqser.red.service.redaction.v1.model.Point;
|
||||||
import com.iqser.red.service.redaction.v1.model.Rectangle;
|
import com.iqser.red.service.redaction.v1.model.Rectangle;
|
||||||
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
|
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
|
||||||
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService;
|
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService;
|
||||||
@ -24,17 +33,34 @@ public class ImportedRedactionService {
|
|||||||
|
|
||||||
|
|
||||||
public List<RedactionLogEntry> processImportedRedactions(String dossierTemplateId, String dossierId, String fileId,
|
public List<RedactionLogEntry> processImportedRedactions(String dossierTemplateId, String dossierId, String fileId,
|
||||||
List<RedactionLogEntry> redactionLogEntries, boolean addImportedRedactions) {
|
List<RedactionLogEntry> redactionLogEntries,
|
||||||
|
boolean addImportedRedactions,
|
||||||
|
ManualRedactions manualRedactions) {
|
||||||
|
|
||||||
var importedRedactions = redactionStorageService.getImportedRedactions(dossierId, fileId);
|
var importedRedactions = redactionStorageService.getImportedRedactions(dossierId, fileId);
|
||||||
if (importedRedactions == null) {
|
if (importedRedactions == null || importedRedactions.getImportedRedactions().isEmpty()) {
|
||||||
return redactionLogEntries;
|
return redactionLogEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
redactionLogEntries.removeIf(redactionLogEntry -> hasIntersections(redactionLogEntry, importedRedactions));
|
var approvedRemoveRedactions = manualRedactions == null ? new HashSet<String>() : manualRedactions.getIdsToRemove()
|
||||||
|
.stream()
|
||||||
|
.filter(idRemoval -> idRemoval.getStatus().equals(AnnotationStatus.APPROVED))
|
||||||
|
.map(idRemoval -> idRemoval.getAnnotationId())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
var approvedResizeRedactions = new HashMap<String, List<Rectangle>>();
|
||||||
|
if (manualRedactions != null) {
|
||||||
|
manualRedactions.getResizeRedactions().forEach(resizeRedaction -> {
|
||||||
|
if (resizeRedaction.getStatus().equals(AnnotationStatus.APPROVED)) {
|
||||||
|
approvedResizeRedactions.put(resizeRedaction.getAnnotationId(), convert(resizeRedaction.getPositions()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
redactionLogEntries.removeIf(redactionLogEntry -> !(redactionLogEntry.isImage() && !redactionLogEntry.isRedacted()) && hasIntersections(redactionLogEntry, importedRedactions, approvedRemoveRedactions, approvedResizeRedactions));
|
||||||
|
|
||||||
if (addImportedRedactions) {
|
if (addImportedRedactions) {
|
||||||
return addImportedRedactionsRedactionLogEntries(dossierTemplateId, redactionLogEntries, importedRedactions);
|
return addImportedRedactionsRedactionLogEntries(dossierTemplateId, redactionLogEntries, importedRedactions, approvedRemoveRedactions);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redactionLogEntries;
|
return redactionLogEntries;
|
||||||
@ -42,8 +68,9 @@ public class ImportedRedactionService {
|
|||||||
|
|
||||||
|
|
||||||
private List<RedactionLogEntry> addImportedRedactionsRedactionLogEntries(String dossierTemplateId,
|
private List<RedactionLogEntry> addImportedRedactionsRedactionLogEntries(String dossierTemplateId,
|
||||||
List<RedactionLogEntry> redactionLogEntries,
|
List<RedactionLogEntry> redactionLogEntries,
|
||||||
ImportedRedactions importedRedactions) {
|
ImportedRedactions importedRedactions,
|
||||||
|
Set<String> approvedRemoveRedactions) {
|
||||||
|
|
||||||
for (List<ImportedRedaction> importedRedactionsValues : importedRedactions.getImportedRedactions().values()) {
|
for (List<ImportedRedaction> importedRedactionsValues : importedRedactions.getImportedRedactions().values()) {
|
||||||
for (ImportedRedaction importedRedaction : importedRedactionsValues) {
|
for (ImportedRedaction importedRedaction : importedRedactionsValues) {
|
||||||
@ -51,9 +78,9 @@ public class ImportedRedactionService {
|
|||||||
.id(importedRedaction.getId())
|
.id(importedRedaction.getId())
|
||||||
.type(IMPORTED_REDACTION_TYPE)
|
.type(IMPORTED_REDACTION_TYPE)
|
||||||
.imported(true)
|
.imported(true)
|
||||||
.redacted(true)
|
.redacted(approvedRemoveRedactions.contains(importedRedaction.getId()) ? false : true)
|
||||||
.positions(importedRedaction.getPositions())
|
.positions(importedRedaction.getPositions())
|
||||||
.color(getColor("imported_redaction", dossierTemplateId))
|
.color(getColor(IMPORTED_REDACTION_TYPE, dossierTemplateId))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
redactionLogEntries.add(redactionLogEntry);
|
redactionLogEntries.add(redactionLogEntry);
|
||||||
@ -64,13 +91,20 @@ public class ImportedRedactionService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean hasIntersections(RedactionLogEntry redactionLogEntry, ImportedRedactions importedRedactions) {
|
private boolean hasIntersections(RedactionLogEntry redactionLogEntry, ImportedRedactions importedRedactions,
|
||||||
|
Set<String> approvedRemoveRedactions,
|
||||||
|
Map<String, List<Rectangle>> approvedResizeRedactions) {
|
||||||
|
|
||||||
for (Rectangle rectangle : redactionLogEntry.getPositions()) {
|
for (Rectangle rectangle : redactionLogEntry.getPositions()) {
|
||||||
if (importedRedactions.getImportedRedactions().containsKey(rectangle.getPage())) {
|
if (importedRedactions.getImportedRedactions().containsKey(rectangle.getPage())) {
|
||||||
var importedRedactionsOnPage = importedRedactions.getImportedRedactions().get(rectangle.getPage());
|
var importedRedactionsOnPage = importedRedactions.getImportedRedactions().get(rectangle.getPage());
|
||||||
for (ImportedRedaction importedRedaction : importedRedactionsOnPage) {
|
for (ImportedRedaction importedRedaction : importedRedactionsOnPage) {
|
||||||
for (Rectangle importedRedactionPosition : importedRedaction.getPositions()) {
|
|
||||||
|
if (approvedRemoveRedactions.contains(importedRedaction.getId())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Rectangle importedRedactionPosition : approvedResizeRedactions.containsKey(importedRedaction.getId()) ? approvedResizeRedactions.get(importedRedaction.getId()) : importedRedaction.getPositions()) {
|
||||||
if (intersects(importedRedactionPosition, rectangle)) {
|
if (intersects(importedRedactionPosition, rectangle)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -99,4 +133,14 @@ public class ImportedRedactionService {
|
|||||||
return dictionaryService.getColor(type, dossierTemplateId);
|
return dictionaryService.getColor(type, dossierTemplateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private List<Rectangle> convert(
|
||||||
|
List<com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle> positions) {
|
||||||
|
|
||||||
|
return positions.stream()
|
||||||
|
.map(pos -> new Rectangle(new Point(pos.getTopLeftX(), pos.getTopLeftY()), pos.getWidth(), pos.getHeight(), pos.getPage()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user