From 29d25d432cc4f489185526984d342d52255a573f Mon Sep 17 00:00:00 2001 From: maverickstuder Date: Mon, 2 Dec 2024 12:25:36 +0100 Subject: [PATCH] RED-10200: Spike performant rules update logic --- .../server/utils/EntityCreationUtility.java | 22 +++++------ .../build.gradle.kts | 4 ++ .../document/EntityCreationService.java | 38 +++++++++---------- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/redaction-service-v1/document/src/main/java/com/iqser/red/service/redaction/v1/server/utils/EntityCreationUtility.java b/redaction-service-v1/document/src/main/java/com/iqser/red/service/redaction/v1/server/utils/EntityCreationUtility.java index 3bdee504..2e0afd66 100644 --- a/redaction-service-v1/document/src/main/java/com/iqser/red/service/redaction/v1/server/utils/EntityCreationUtility.java +++ b/redaction-service-v1/document/src/main/java/com/iqser/red/service/redaction/v1/server/utils/EntityCreationUtility.java @@ -10,18 +10,18 @@ import com.iqser.red.service.redaction.v1.server.model.document.nodes.Page; import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock; -public final class EntityCreationUtility { +import lombok.experimental.UtilityClass; - private EntityCreationUtility() {throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");} +@UtilityClass +public class EntityCreationUtility { - - public static void checkIfBothStartAndEndAreEmpty(String start, String end) { + public void checkIfBothStartAndEndAreEmpty(String start, String end) { checkIfBothStartAndEndAreEmpty(List.of(start), List.of(end)); } - public static void checkIfBothStartAndEndAreEmpty(List start, List end) { + public void checkIfBothStartAndEndAreEmpty(List start, List end) { if ((start == null || start.isEmpty()) && (end == null || end.isEmpty())) { throw new IllegalArgumentException("Start and end values are empty!"); @@ -29,7 +29,7 @@ public final class EntityCreationUtility { } - public static int truncateEndIfLineBreakIsBetween(int end, int expandedEnd, TextBlock textBlock) { + public int truncateEndIfLineBreakIsBetween(int end, int expandedEnd, TextBlock textBlock) { if (textBlock.getNextLinebreak(end) < expandedEnd) { return end; @@ -38,7 +38,7 @@ public final class EntityCreationUtility { } - public static Set findIntersectingSubNodes(SemanticNode initialIntersectingNode, TextRange textRange) { + public Set findIntersectingSubNodes(SemanticNode initialIntersectingNode, TextRange textRange) { IntersectingNodeVisitor visitor = new IntersectingNodeVisitor(textRange); @@ -50,7 +50,7 @@ public final class EntityCreationUtility { } - public static void addToPages(TextEntity entity) { + public void addToPages(TextEntity entity) { Set pages = entity.getDeepestFullyContainingNode().getPages(entity.getTextRange()); entity.getPages().addAll(pages); @@ -58,14 +58,14 @@ public final class EntityCreationUtility { } - public static void addEntityToNodeEntitySets(TextEntity entity) { + public void addEntityToNodeEntitySets(TextEntity entity) { entity.getIntersectingNodes() .forEach(node -> node.getEntities().add(entity)); } - public static boolean allEntitiesIntersectAndHaveSameTypes(List entitiesToMerge) { + public boolean allEntitiesIntersectAndHaveSameTypes(List entitiesToMerge) { if (entitiesToMerge.isEmpty()) { return true; @@ -83,7 +83,7 @@ public final class EntityCreationUtility { } - public static TextRange toLineAfterTextRange(TextBlock textBlock, TextRange textRange) { + public TextRange toLineAfterTextRange(TextBlock textBlock, TextRange textRange) { if (textBlock.getTextRange().end() == textRange.end()) { return new TextRange(textRange.end(), textRange.end()); diff --git a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts index 019606c1..b0c73b09 100644 --- a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts +++ b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts @@ -102,6 +102,10 @@ dependencies { group = "com.iqser.red.service", module = "persistence-service-shared-api-v1" ) + exclude( + group = "com.knecon.fforesight", + module = "document" + ) } testImplementation("com.pdftron:PDFNet:10.11.0") } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/EntityCreationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/EntityCreationService.java index 093b67cf..9ce3197f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/EntityCreationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/EntityCreationService.java @@ -1,6 +1,5 @@ package com.iqser.red.service.redaction.v1.server.service.document; -import static com.iqser.red.service.redaction.v1.server.utils.EntityCreationUtility.*; import static com.iqser.red.service.redaction.v1.server.utils.SeparatorUtils.boundaryIsSurroundedBySeparators; import java.util.Arrays; @@ -31,6 +30,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table; import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell; import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock; import com.iqser.red.service.redaction.v1.server.service.drools.KieSessionUpdater; +import com.iqser.red.service.redaction.v1.server.utils.EntityCreationUtility; import com.iqser.red.service.redaction.v1.server.utils.EntityEnrichmentService; import com.iqser.red.service.redaction.v1.server.utils.RectangleTransformations; import com.iqser.red.service.redaction.v1.server.utils.RedactionSearchUtility; @@ -65,7 +65,7 @@ public class EntityCreationService { */ public Stream betweenStrings(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startTextRanges = RedactionSearchUtility.findTextRangesByString(start, node.getTextBlock()); List stopTextRanges = RedactionSearchUtility.findTextRangesByString(stop, node.getTextBlock()); @@ -87,7 +87,7 @@ public class EntityCreationService { */ public Stream betweenStringsIgnoreCase(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(stop, node.getTextBlock()); @@ -109,7 +109,7 @@ public class EntityCreationService { */ public Stream betweenStringsIncludeStart(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByString(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByString(stop, node.getTextBlock()); @@ -136,7 +136,7 @@ public class EntityCreationService { */ public Stream betweenStringsIncludeStartIgnoreCase(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(stop, node.getTextBlock()); @@ -163,7 +163,7 @@ public class EntityCreationService { */ public Stream betweenStringsIncludeEnd(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByString(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByString(stop, node.getTextBlock()); @@ -190,7 +190,7 @@ public class EntityCreationService { */ public Stream betweenStringsIncludeEndIgnoreCase(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(stop, node.getTextBlock()); @@ -217,7 +217,7 @@ public class EntityCreationService { */ public Stream betweenStringsIncludeStartAndEnd(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByString(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByString(stop, node.getTextBlock()); @@ -248,7 +248,7 @@ public class EntityCreationService { */ public Stream betweenStringsIncludeStartAndEndIgnoreCase(String start, String stop, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(start, stop); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(start, stop); List startBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(start, node.getTextBlock()); List stopBoundaries = RedactionSearchUtility.findTextRangesByStringIgnoreCase(stop, node.getTextBlock()); @@ -279,7 +279,7 @@ public class EntityCreationService { */ public Stream shortestBetweenAnyString(List starts, List stops, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(starts, stops); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(starts, stops); List startTextRanges = RedactionSearchUtility.findTextRangesByList(starts, node.getTextBlock()); List stopTextRanges = RedactionSearchUtility.findTextRangesByList(stops, node.getTextBlock()); @@ -301,7 +301,7 @@ public class EntityCreationService { */ public Stream shortestBetweenAnyStringIgnoreCase(List starts, List stops, String type, EntityType entityType, SemanticNode node) { - checkIfBothStartAndEndAreEmpty(starts, stops); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(starts, stops); List startTextRanges = RedactionSearchUtility.findTextRangesByListIgnoreCase(starts, node.getTextBlock()); List stopTextRanges = RedactionSearchUtility.findTextRangesByListIgnoreCase(stops, node.getTextBlock()); @@ -324,7 +324,7 @@ public class EntityCreationService { */ public Stream shortestBetweenAnyStringIgnoreCase(List starts, List stops, String type, EntityType entityType, SemanticNode node, int limit) { - checkIfBothStartAndEndAreEmpty(starts, stops); + EntityCreationUtility.checkIfBothStartAndEndAreEmpty(starts, stops); List startTextRanges = RedactionSearchUtility.findTextRangesByListIgnoreCase(starts, node.getTextBlock()); List stopTextRanges = RedactionSearchUtility.findTextRangesByListIgnoreCase(stops, node.getTextBlock()); @@ -480,7 +480,7 @@ public class EntityCreationService { TextBlock textBlock = node.getTextBlock(); SearchImplementation searchImplementation = new SearchImplementation(strings, false); return searchImplementation.getBoundaries(textBlock) - .map(boundary -> toLineAfterTextRange(textBlock, boundary)) + .map(boundary -> EntityCreationUtility.toLineAfterTextRange(textBlock, boundary)) .filter(boundary -> isValidEntityTextRange(textBlock, boundary)) .map(boundary -> byTextRange(boundary, type, entityType, node)) .filter(Optional::isPresent) @@ -502,7 +502,7 @@ public class EntityCreationService { TextBlock textBlock = node.getTextBlock(); SearchImplementation searchImplementation = new SearchImplementation(strings, true); return searchImplementation.getBoundaries(textBlock) - .map(boundary -> toLineAfterTextRange(textBlock, boundary)) + .map(boundary -> EntityCreationUtility.toLineAfterTextRange(textBlock, boundary)) .filter(boundary -> isValidEntityTextRange(textBlock, boundary)) .map(boundary -> byTextRange(boundary, type, entityType, node)) .filter(Optional::isPresent) @@ -524,7 +524,7 @@ public class EntityCreationService { TextBlock textBlock = node.getTextBlock(); return RedactionSearchUtility.findTextRangesByString(string, textBlock) .stream() - .map(boundary -> toLineAfterTextRange(textBlock, boundary)) + .map(boundary -> EntityCreationUtility.toLineAfterTextRange(textBlock, boundary)) .filter(boundary -> isValidEntityTextRange(textBlock, boundary)) .map(boundary -> byTextRange(boundary, type, entityType, node)) .filter(Optional::isPresent) @@ -546,7 +546,7 @@ public class EntityCreationService { TextBlock textBlock = node.getTextBlock(); return RedactionSearchUtility.findTextRangesByStringIgnoreCase(string, textBlock) .stream() - .map(boundary -> toLineAfterTextRange(textBlock, boundary)) + .map(boundary -> EntityCreationUtility.toLineAfterTextRange(textBlock, boundary)) .filter(boundary -> isValidEntityTextRange(textBlock, boundary)) .map(boundary -> byTextRange(boundary, type, entityType, node)) .filter(Optional::isPresent) @@ -931,7 +931,7 @@ public class EntityCreationService { public Optional bySuffixExpansionRegex(TextEntity entity, String regexPattern) { int expandedEnd = RedactionSearchUtility.getExpandedEndByRegex(entity, regexPattern); - expandedEnd = truncateEndIfLineBreakIsBetween(entity.getTextRange().end(), expandedEnd, entity.getDeepestFullyContainingNode().getTextBlock()); + expandedEnd = EntityCreationUtility.truncateEndIfLineBreakIsBetween(entity.getTextRange().end(), expandedEnd, entity.getDeepestFullyContainingNode().getTextBlock()); return byTextRange(new TextRange(entity.getTextRange().start(), expandedEnd), entity.type(), entity.getEntityType(), entity.getDeepestFullyContainingNode()); } @@ -1039,7 +1039,7 @@ public class EntityCreationService { @Deprecated(forRemoval = true) public TextEntity mergeEntitiesOfSameType(List entitiesToMerge, String type, EntityType entityType, SemanticNode node) { - if (!allEntitiesIntersectAndHaveSameTypes(entitiesToMerge)) { + if (!EntityCreationUtility.allEntitiesIntersectAndHaveSameTypes(entitiesToMerge)) { throw new IllegalArgumentException("Provided entities can not be merged, since they do not intersect or are not the same type!" + entitiesToMerge); } if (entitiesToMerge.isEmpty()) { @@ -1475,7 +1475,7 @@ public class EntityCreationService { entityToDuplicate.setDeepestFullyContainingNode(deepestSharedNode); - Set additionalIntersectingNodes = findIntersectingSubNodes(deepestSharedNode, newTextRange); + Set additionalIntersectingNodes = EntityCreationUtility.findIntersectingSubNodes(deepestSharedNode, newTextRange); additionalIntersectingNodes.forEach(additionalIntersectingNode -> { if (entityToDuplicate.getIntersectingNodes().contains(additionalIntersectingNode)) {