diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/document/nodes/Section.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/document/nodes/Section.java index 0b7a7af4..c79d6e6f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/document/nodes/Section.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/document/nodes/Section.java @@ -1,10 +1,12 @@ package com.iqser.red.service.redaction.v1.server.model.document.nodes; import java.awt.geom.Rectangle2D; +import java.util.ArrayList; import java.util.HashSet; 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.model.document.entity.TextEntity; import com.iqser.red.service.redaction.v1.server.model.document.DocumentTree; @@ -33,7 +35,6 @@ import lombok.extern.slf4j.Slf4j; @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) public class Section extends AbstractSemanticNode { - @Override public NodeType getType() { @@ -60,7 +61,6 @@ public class Section extends AbstractSemanticNode { } - @Override public String toString() { @@ -85,7 +85,14 @@ public class Section extends AbstractSemanticNode { */ public boolean anyHeadlineContainsString(String value) { - return streamAllSubNodesOfType(NodeType.HEADLINE).anyMatch(h -> h.containsString(value)) || getHeadline().containsString(value); + boolean found = streamAllSubNodesOfType(NodeType.HEADLINE).anyMatch(h -> h.containsString(value)) || getHeadline().containsString(value); + if (!found) { + List previousHeadlines = new ArrayList<>(); + headlinesByPreviousSibling(this, previousHeadlines); + return previousHeadlines.stream() + .anyMatch(headline -> headline.containsString(value)); + } + return true; } @@ -97,8 +104,37 @@ public class Section extends AbstractSemanticNode { */ public boolean anyHeadlineContainsStringIgnoreCase(String value) { - return streamAllSubNodesOfType(NodeType.HEADLINE).anyMatch(h -> h.containsStringIgnoreCase(value)) || getHeadline().containsStringIgnoreCase(value); + boolean found = streamAllSubNodesOfType(NodeType.HEADLINE).anyMatch(h -> h.containsStringIgnoreCase(value)) || getHeadline().containsStringIgnoreCase(value); + if (!found) { + List previousHeadlines = new ArrayList<>(); + headlinesByPreviousSibling(this, previousHeadlines); + return previousHeadlines.stream() + .anyMatch(headline -> headline.containsStringIgnoreCase(value)); + } + return true; } + private void headlinesByPreviousSibling(SemanticNode section, List found) { + + if (section.getPreviousSibling() + .isPresent() && section.getPreviousSibling() + .get() instanceof Section previousSection) { + + var subnodes = previousSection.streamAllSubNodes() + .toList(); + if (subnodes.size() == 1 && subnodes.get(0) instanceof Headline previousHeadline) { + found.add(previousHeadline); + headlinesByPreviousSibling(previousSection, found); + } + } + + if (section.getPreviousSibling() + .isPresent() && section.getPreviousSibling() + .get() instanceof Headline previousHeadline) { + found.add(previousHeadline); + headlinesByPreviousSibling(previousHeadline, found); + } + } + }