hotfix: fix rule creating endless loop with dossier-redactions

This commit is contained in:
Kilian Schuettler 2023-07-20 15:30:40 +02:00
parent 3bc11b7d33
commit 25762e71b7
6 changed files with 36 additions and 31 deletions

View File

@ -1,4 +1,4 @@
package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter; package com.iqser.red.service.redaction.v1.server.redaction.adapter;
import static java.lang.String.format; import static java.lang.String.format;
import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.groupingBy;
@ -58,9 +58,10 @@ public class CustomEntityCreationAdapter {
public List<RedactionEntity> createRedactionEntities(Set<ManualRedactionEntry> manualRedactionEntries, SemanticNode node) { public List<RedactionEntity> createRedactionEntities(Set<ManualRedactionEntry> manualRedactionEntries, SemanticNode node) {
List<EntityIdentifier> entityIdentifiers = manualRedactionEntries.stream() List<EntityIdentifier> entityIdentifiers = manualRedactionEntries.stream()
.filter(manualRedactionEntry -> !manualRedactionEntry.isAddToDictionary() || !manualRedactionEntry.isAddToDossierDictionary()) .filter(manualRedactionEntry -> !(manualRedactionEntry.isAddToDictionary() || manualRedactionEntry.isAddToDossierDictionary()))
.map(EntityIdentifier::fromManualRedactionEntry) .map(EntityIdentifier::fromManualRedactionEntry)
.toList(); .toList();
return toRedactionEntity(entityIdentifiers, node); return toRedactionEntity(entityIdentifiers, node);
} }
@ -204,10 +205,21 @@ public class CustomEntityCreationAdapter {
private double calculateDistance(Rectangle2D rectangle, Rectangle2D rectangle2D) { private double calculateDistance(Rectangle2D rectangle, Rectangle2D rectangle2D) {
return Math.abs(rectangle.getMinX() - rectangle2D.getMinX()) // // mirrored coordinates safe comparison
+ Math.abs(rectangle.getMinY() - rectangle2D.getMinY()) // double minX1 = Math.min(rectangle.getMinX(), rectangle.getMaxX());
+ Math.abs(rectangle.getMaxX() - rectangle2D.getMaxX()) // double minY1 = Math.min(rectangle.getMinY(), rectangle.getMaxY());
+ Math.abs(rectangle.getMaxY() - rectangle2D.getMaxY()); double maxX1 = Math.max(rectangle.getMinX(), rectangle.getMaxX());
double maxY1 = Math.max(rectangle.getMinY(), rectangle.getMaxY());
double minX2 = Math.min(rectangle2D.getMinX(), rectangle2D.getMaxX());
double minY2 = Math.min(rectangle2D.getMinY(), rectangle2D.getMaxY());
double maxX2 = Math.max(rectangle2D.getMinX(), rectangle2D.getMaxX());
double maxY2 = Math.max(rectangle2D.getMinY(), rectangle2D.getMaxY());
return Math.abs(minX1 - minX2) //
+ Math.abs(minY1 - minY2) //
+ Math.abs(maxX1 - maxX2) //
+ Math.abs(maxY1 - maxY2);
} }

View File

@ -11,9 +11,8 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequ
import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute;
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.annotations.entitymapped.ManualRedactionEntry;
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine;
import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.CustomEntityCreationAdapter; import com.iqser.red.service.redaction.v1.server.redaction.adapter.CustomEntityCreationAdapter;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService;

View File

@ -5,11 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.io.IOException; import java.io.IOException;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.drools.io.ClassPathResource; import org.drools.io.ClassPathResource;
@ -27,10 +24,9 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog;
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry;
import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest;
import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.CustomEntityCreationAdapter; import com.iqser.red.service.redaction.v1.server.redaction.adapter.CustomEntityCreationAdapter;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity;
import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document;
import com.iqser.red.service.redaction.v1.server.redaction.service.RedactionLogCreatorService; import com.iqser.red.service.redaction.v1.server.redaction.service.RedactionLogCreatorService;
import com.knecon.fforesight.tenantcommons.TenantContext; import com.knecon.fforesight.tenantcommons.TenantContext;

View File

@ -451,7 +451,6 @@ rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confi
$dossierRedaction: RedactionEntity(type == "dossier_redaction") $dossierRedaction: RedactionEntity(type == "dossier_redaction")
then then
$dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential");
update($dossierRedaction);
$dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); $dossierRedaction.getIntersectingNodes().forEach(node -> update(node));
end end

View File

@ -489,14 +489,14 @@ rule "CBI.14.0: Redact CBI_sponsor entities if preceded by \"batches produced at
rule "CBI.15.0: Redact row if row contains \"determination of residues\" and livestock keyword" rule "CBI.15.0: Redact row if row contains \"determination of residues\" and livestock keyword"
when when
$keyword: String() from List.of("livestock", $keyword: String() from List.of("livestock",
"live stock", "live stock",
"tissue", "tissue",
"tissues", "tissues",
"liver", "liver",
"muscle", "muscle",
"bovine", "bovine",
"ruminant", "ruminant",
"ruminants") "ruminants")
$residueKeyword: String() from List.of("determination of residues", "determination of total residues") $residueKeyword: String() from List.of("determination of residues", "determination of total residues")
$section: Section(!hasTables(), $section: Section(!hasTables(),
containsStringIgnoreCase($residueKeyword), containsStringIgnoreCase($residueKeyword),

View File

@ -320,14 +320,14 @@ rule "CBI.14.0: Redact CBI_sponsor entities if preceded by \"batches produced at
rule "CBI.15.0: Redact row if row contains \"determination of residues\" and livestock keyword" rule "CBI.15.0: Redact row if row contains \"determination of residues\" and livestock keyword"
when when
$keyword: String() from List.of("livestock", $keyword: String() from List.of("livestock",
"live stock", "live stock",
"tissue", "tissue",
"tissues", "tissues",
"liver", "liver",
"muscle", "muscle",
"bovine", "bovine",
"ruminant", "ruminant",
"ruminants") "ruminants")
$residueKeyword: String() from List.of("determination of residues", "determination of total residues") $residueKeyword: String() from List.of("determination of residues", "determination of total residues")
$section: Section(!hasTables(), $section: Section(!hasTables(),
containsStringIgnoreCase($residueKeyword), containsStringIgnoreCase($residueKeyword),
@ -792,7 +792,6 @@ rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confi
$dossierRedaction: RedactionEntity(type == "dossier_redaction") $dossierRedaction: RedactionEntity(type == "dossier_redaction")
then then
$dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential");
update($dossierRedaction);
$dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); $dossierRedaction.getIntersectingNodes().forEach(node -> update(node));
end end