From f8963feac1095f529b5139c4668e7fda4566471a Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Tue, 16 May 2023 14:38:09 +0200 Subject: [PATCH] RED-6009: Document Tree Structure * remove instanceof as much as possible --- .../document/graph/nodes/Document.java | 4 ++-- .../layoutparsing/document/graph/nodes/Section.java | 3 +-- .../document/graph/nodes/SemanticNode.java | 13 ++++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java index b56c0e59..c5e8d73a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java @@ -73,7 +73,7 @@ public class Document implements GenericSemanticNode { @Override public Headline getHeadline() { - return streamChildrenOfType(NodeType.HEADLINE).map(node -> (Headline) node).findFirst().orElseThrow(() -> new NotFoundException("No Headlines found in this document!")); + return streamAllSubNodesOfType(NodeType.HEADLINE).map(node -> (Headline) node).findFirst().orElseThrow(() -> new NotFoundException("No Headlines found in this document!")); } @@ -85,7 +85,7 @@ public class Document implements GenericSemanticNode { public Stream streamAllImages() { - return streamAllSubNodes().filter(node -> node instanceof Image).map(node -> (Image) node); + return streamAllSubNodesOfType(NodeType.IMAGE).map(node -> (Image) node); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java index 9fa15727..7bb1fee2 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java @@ -55,8 +55,7 @@ public class Section implements GenericSemanticNode { public Headline getHeadline() { - return streamChildren()// - .filter(node -> node instanceof Headline)// + return streamChildrenOfType(NodeType.HEADLINE)// .map(node -> (Headline) node)// .findFirst()// .orElseGet(() -> getParent().getHeadline()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java index 10ee10be..572c97ac 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java @@ -323,7 +323,7 @@ public interface SemanticNode { /** - * Streams all children located directly underneath this node in the DocumentTree. + * Streams all children located directly underneath this node in the DocumentTree of the provided type. * * @return Stream of all children */ @@ -344,6 +344,17 @@ public interface SemanticNode { } + /** + * Recursively streams all SemanticNodes of the provided type located underneath this node in the DocumentTree in order. + * + * @return Stream of all SubNodes + */ + default Stream streamAllSubNodesOfType(NodeType nodeType) { + + return getDocumentTree().streamAllSubEntriesInOrder(getTreeId()).filter(entry -> entry.getType().equals(nodeType)).map(DocumentTree.Entry::getNode); + } + + /** * The Boundary is the start and end string offsets in the reading order of the document. *