From 09525f9b354c48fe7bba22ab2741e9997943d9aa Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Mon, 17 Apr 2023 16:34:08 +0200 Subject: [PATCH] RED-6369: Rules Refactor *removed manualredaction handling for further analysis of how it actually works --- .../document/graph/entity/EntityNode.java | 34 +++++++++++++--- .../document/graph/entity/EntityPosition.java | 39 ------------------- .../graph/entity/RedactionPosition.java | 22 +++++++++++ .../graph/textblock/AtomicTextBlock.java | 12 +++--- .../textblock/ConcatenatedTextBlock.java | 32 +++++++-------- .../document/graph/textblock/TextBlock.java | 4 +- .../service/RedactionLogCreatorService.java | 16 ++++---- .../v1/server/redaction/utils/IdBuilder.java | 13 +++++++ .../server/DocumentGraphIntegrationTest.java | 4 +- .../graph/ManualResizeRedactionTest.java | 12 ++++++ .../src/test/resources/drools/rules.drl | 15 +------ 11 files changed, 109 insertions(+), 94 deletions(-) delete mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityPosition.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionTest.java diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityNode.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityNode.java index 93911b70..e3a824ee 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityNode.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityNode.java @@ -1,9 +1,13 @@ package com.iqser.red.service.redaction.v1.server.document.graph.entity; +import java.awt.geom.Rectangle2D; import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Comparator; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import com.google.common.hash.Hashing; @@ -12,6 +16,7 @@ import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.redaction.model.EntityType; +import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -50,7 +55,7 @@ public class EntityNode { CharSequence textAfter; @Builder.Default Set pages = new HashSet<>(); - List entityPositionsPerPage; + List redactionPositionsPerPage; @Builder.Default List intersectingNodes = new LinkedList<>(); SemanticNode deepestFullyContainingNode; @@ -93,13 +98,30 @@ public class EntityNode { } - public List getEntityPositionsPerPage() { + public List getRedactionPositionsPerPage() { - if (entityPositionsPerPage == null || entityPositionsPerPage.isEmpty()) { - entityPositionsPerPage = deepestFullyContainingNode.buildTextBlock().getEntityPositionsPerPage(boundary); + if (redactionPositionsPerPage == null || redactionPositionsPerPage.isEmpty()) { + Map> rectanglesPerLinePerPage = deepestFullyContainingNode.buildTextBlock().getEntityPositionsPerPage(boundary); + + PageNode firstPage = rectanglesPerLinePerPage.keySet() + .stream() + .min(Comparator.comparingInt(PageNode::getNumber)) + .orElseThrow(() -> new RuntimeException("No Positions found on any page!")); + + String id = IdBuilder.buildId(pages, rectanglesPerLinePerPage.values().stream().flatMap(Collection::stream).toList()); + redactionPositionsPerPage = rectanglesPerLinePerPage.entrySet().stream().map(entry -> buildRedactionPosition(firstPage, id, entry)).toList(); } + return redactionPositionsPerPage; + } - return entityPositionsPerPage; + + private static RedactionPosition buildRedactionPosition(PageNode firstPage, String id, Map.Entry> entry) { + + if (entry.getKey().equals(firstPage)) { + return new RedactionPosition(id, entry.getKey(), entry.getValue()); + } else { + return new RedactionPosition(id + "-" + entry.getKey().getNumber(), entry.getKey(), entry.getValue()); + } } @@ -141,7 +163,7 @@ public class EntityNode { public boolean matchesResizedAnnotationId(String resizedAnnotationId) { - return getEntityPositionsPerPage().stream().anyMatch(entityPosition -> entityPosition.getId().equals(resizedAnnotationId)); + return getRedactionPositionsPerPage().stream().anyMatch(entityPosition -> entityPosition.getId().equals(resizedAnnotationId)); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityPosition.java deleted file mode 100644 index 24a1336c..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityPosition.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.graph.entity; - -import java.awt.geom.Rectangle2D; -import java.nio.charset.StandardCharsets; -import java.util.List; - -import com.google.common.hash.Hashing; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; - -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@FieldDefaults(level = AccessLevel.PRIVATE) -public class EntityPosition { - - PageNode pageNode; - List rectanglePerLine; - - - public String getId() { - - return String.valueOf(hashCode()); - } - - - @Override - public int hashCode() { - - StringBuilder sb = new StringBuilder(); - sb.append(pageNode.getNumber()); - rectanglePerLine.forEach(r -> sb.append(r.getX()).append(r.getY()).append(r.getWidth()).append(r.getHeight())); - return Hashing.murmur3_128().hashString(sb.toString(), StandardCharsets.UTF_8).hashCode(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java new file mode 100644 index 00000000..73d768c3 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.redaction.v1.server.document.graph.entity; + +import java.awt.geom.Rectangle2D; +import java.util.List; + +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.FieldDefaults; + +@Data +@AllArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class RedactionPosition { + + final String id; + PageNode pageNode; + List rectanglePerLine; + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java index 3f0751e6..ea9b6d85 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java @@ -3,10 +3,11 @@ package com.iqser.red.service.redaction.v1.server.document.graph.textblock; import static java.lang.String.format; import java.awt.geom.Rectangle2D; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityPosition; import com.iqser.red.service.redaction.v1.server.document.graph.factory.RectangleTransformations; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; @@ -112,15 +113,16 @@ public class AtomicTextBlock implements TextBlock { } - public List getEntityPositionsPerPage(Boundary stringBoundary) { + public Map> getEntityPositionsPerPage(Boundary stringBoundary) { - List positionsPerLine = stringBoundary.split(getLineBreaks().stream().map(lb -> lb + boundary.start()).filter(stringBoundary::contains).toList()) + List rectanglesPerLine = stringBoundary.split(getLineBreaks().stream().map(lb -> lb + boundary.start()).filter(stringBoundary::contains).toList()) .stream() .map(this::getPositions) .map(RectangleTransformations::rectangleUnion) .toList(); - - return List.of(EntityPosition.builder().rectanglePerLine(positionsPerLine).pageNode(page).build()); + Map> rectanglePerLinePerPage = new HashMap<>(); + rectanglePerLinePerPage.put(page, rectanglesPerLine); + return rectanglePerLinePerPage; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java index b8ce8729..cbc5b5f1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java @@ -1,17 +1,14 @@ package com.iqser.red.service.redaction.v1.server.document.graph.textblock; import static java.lang.String.format; -import static java.util.stream.Collectors.flatMapping; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.toList; import java.awt.geom.Rectangle2D; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityPosition; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; import lombok.AccessLevel; @@ -139,7 +136,7 @@ public class ConcatenatedTextBlock implements TextBlock { @Override - public List getEntityPositionsPerPage(Boundary stringBoundary) { + public Map> getEntityPositionsPerPage(Boundary stringBoundary) { List textBlocks = getAllAtomicTextBlocksPartiallyInStringBoundary(stringBoundary); @@ -148,29 +145,28 @@ public class ConcatenatedTextBlock implements TextBlock { } AtomicTextBlock firstTextBlock = textBlocks.get(0); - List positions = new LinkedList<>(firstTextBlock.getEntityPositionsPerPage(new Boundary(stringBoundary.start(), firstTextBlock.getBoundary().end()))); + Map> rectanglesPerLinePerPage = firstTextBlock.getEntityPositionsPerPage(new Boundary(stringBoundary.start(), + firstTextBlock.getBoundary().end())); for (AtomicTextBlock textBlock : textBlocks.subList(1, textBlocks.size() - 1)) { - positions.addAll(textBlock.getEntityPositionsPerPage(textBlock.getBoundary())); + rectanglesPerLinePerPage = mergeEntityPositionsWithSamePageNode(rectanglesPerLinePerPage, textBlock.getEntityPositionsPerPage(textBlock.getBoundary())); } AtomicTextBlock lastTextBlock = textBlocks.get(textBlocks.size() - 1); - positions.addAll(lastTextBlock.getEntityPositionsPerPage(new Boundary(lastTextBlock.getBoundary().start(), stringBoundary.end()))); + rectanglesPerLinePerPage = mergeEntityPositionsWithSamePageNode(rectanglesPerLinePerPage, lastTextBlock.getEntityPositionsPerPage(lastTextBlock.getBoundary())); - return mergeEntityPositionsWithSamePageNode(positions); + return rectanglesPerLinePerPage; } - private List mergeEntityPositionsWithSamePageNode(List positions) { - - Map> entityPositionsPerPage = positions.stream().collect(// - groupingBy(EntityPosition::getPageNode, // - flatMapping(entityPosition -> entityPosition.getRectanglePerLine().stream(), toList()))); - - return entityPositionsPerPage.entrySet().stream()// - .map(entry -> EntityPosition.builder().pageNode(entry.getKey()).rectanglePerLine(entry.getValue()).build())// - .toList(); + private Map> mergeEntityPositionsWithSamePageNode(Map> map1, Map> map2) { + Map> mergedMap = new HashMap<>(map1); + map2.forEach((pageNode, rectangles) -> mergedMap.merge(pageNode, rectangles, (rects1, rects2) -> { + rects1.addAll(rects2); + return rects1; + })); + return mergedMap; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java index b8e1b48c..bd4d2f91 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java @@ -6,11 +6,11 @@ import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityPosition; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; public interface TextBlock extends CharSequence { @@ -39,7 +39,7 @@ public interface TextBlock extends CharSequence { List getPositions(Boundary stringBoundary); - List getEntityPositionsPerPage(Boundary stringBoundary); + Map> getEntityPositionsPerPage(Boundary stringBoundary); int numberOfLines(); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java index 0fc204da..ac2d004b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java @@ -15,7 +15,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityNode; -import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSequence; import com.iqser.red.service.redaction.v1.server.redaction.model.Entity; import com.iqser.red.service.redaction.v1.server.redaction.model.EntityPositionSequence; @@ -52,20 +52,20 @@ public class RedactionLogCreatorService { // Duplicates can exist due table extraction columns over multiple rows. - for (EntityPosition entityPosition : entityNode.getEntityPositionsPerPage()) { + for (RedactionPosition redactionPosition : entityNode.getRedactionPositionsPerPage()) { RedactionLogEntry redactionLogEntry = createRedactionLogEntry(entityNode, dossierTemplateId); - if (processedIds.contains(entityPosition.getId())) { + if (processedIds.contains(redactionPosition.getId())) { continue; } - processedIds.add(entityPosition.getId()); - redactionLogEntry.setId(entityPosition.getId()); + processedIds.add(redactionPosition.getId()); + redactionLogEntry.setId(redactionPosition.getId()); - List rectanglesPerLine = entityPosition.getRectanglePerLine() + List rectanglesPerLine = redactionPosition.getRectanglePerLine() .stream() - .map(rectangle2D -> toRectangle(rectangle2D, entityPosition.getPageNode().getNumber())) + .map(rectangle2D -> toRectangle(rectangle2D, redactionPosition.getPageNode().getNumber())) .toList(); redactionLogEntry.setPositions(rectanglesPerLine); @@ -79,7 +79,7 @@ public class RedactionLogCreatorService { private RedactionLogEntry createRedactionLogEntry(EntityNode entity, String dossierTemplateId) { Set referenceIds = new HashSet<>(); - entity.getReferences().forEach(ref -> ref.getEntityPositionsPerPage().forEach(pos -> referenceIds.add(pos.getId()))); + entity.getReferences().forEach(ref -> ref.getRedactionPositionsPerPage().forEach(pos -> referenceIds.add(pos.getId()))); return RedactionLogEntry.builder() .color(getColor(entity.getType(), dossierTemplateId, entity.isRedaction())) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java index 246ea964..f183b6f9 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java @@ -3,9 +3,11 @@ package com.iqser.red.service.redaction.v1.server.redaction.utils; import java.awt.geom.Rectangle2D; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Set; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.PageNode; import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSequence; import com.iqser.red.service.redaction.v1.server.redaction.model.RedRectangle2D; @@ -28,12 +30,23 @@ public final class IdBuilder { } + public String buildId(Set pages, List rectanglesPerLine) { + + StringBuilder sb = new StringBuilder(); + pages.forEach(pageNode -> sb.append(pageNode.getNumber())); + rectanglesPerLine.forEach(rectangle2D -> sb.append(rectangle2D.getX()).append(rectangle2D.getY()).append(rectangle2D.getWidth()).append(rectangle2D.getHeight())); + + return hashFunction.hashString(sb.toString(), StandardCharsets.UTF_8).toString(); + } + + public String buildId(Rectangle2D rectangle2D, int page) { return hashFunction.hashString("x" + rectangle2D.getX() + "y" + rectangle2D.getY() + "h" + rectangle2D.getHeight() + "w" + rectangle2D.getWidth() + "p" + page, StandardCharsets.UTF_8).toString(); } + public String buildId(RedRectangle2D rectangle2D, int page) { return hashFunction.hashString("x" + rectangle2D.getX() + "y" + rectangle2D.getY() + "h" + rectangle2D.getHeight() + "w" + rectangle2D.getWidth() + "p" + page, diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumentGraphIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumentGraphIntegrationTest.java index 89922fbd..bbd4fcdb 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumentGraphIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumentGraphIntegrationTest.java @@ -217,7 +217,7 @@ public class DocumentGraphIntegrationTest extends AbstractTestWithDictionaries { .stream() .filter(entityNode -> !entityNode.isRemoved()) .filter(EntityNode::isRedaction) - .flatMap(entityNode -> entityNode.getEntityPositionsPerPage().stream()) + .flatMap(entityNode -> entityNode.getRedactionPositionsPerPage().stream()) .filter(entityPosition -> entityPosition.getPageNode().equals(page)) .flatMap(entityPosition -> entityPosition.getRectanglePerLine().stream()) .toList(); @@ -231,7 +231,7 @@ public class DocumentGraphIntegrationTest extends AbstractTestWithDictionaries { .stream() .filter(entityNode -> !entityNode.isRemoved()) .filter(entityNode -> !entityNode.isRedaction()) - .flatMap(entityNode -> entityNode.getEntityPositionsPerPage().stream()) + .flatMap(entityNode -> entityNode.getRedactionPositionsPerPage().stream()) .filter(entityPosition -> entityPosition.getPageNode().equals(page)) .flatMap(entityPosition -> entityPosition.getRectanglePerLine().stream()) .toList(); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionTest.java new file mode 100644 index 00000000..254bcba5 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionTest.java @@ -0,0 +1,12 @@ +package com.iqser.red.service.redaction.v1.server.document.graph; + +import org.junit.jupiter.api.Test; + +public class ManualResizeRedactionTest extends BuildDocumentGraphTest { + + @Test + public void manualResizeRedactionTest() { + + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl index 0ac78b23..dac47463 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl @@ -32,19 +32,6 @@ query "getFileAttributes" $fileAttribute: FileAttribute() end -// --------------------------------------- apply resize redactions ------------------------------------------------------------------- - -rule "apply resize redactions" - salience 200 - no-loop true - - when - $resizeRedaction: ManualResizeRedaction($id: annotationId) - $resizedEntity: EntityNode(matchesResizedAnnotationId($id)) - then - $resizedEntity.setResized(true); - update($resizedEntity); - end // --------------------------------------- merging rules ------------------------------------------------------------------- rule "merge intersecting Entities of same type" @@ -57,9 +44,9 @@ rule "merge intersecting Entities of same type" $first.removeFromGraph(); $second.removeFromGraph(); EntityNode mergedEntity = entityCreationService.byEntities(List.of($first, $second), $type, $entityType, document); - insert(mergedEntity); retract($first); retract($second); + insert(mergedEntity); end rule "remove Entity of type ENTITY when contained by FALSE_POSITIVE"