From 9bb0468b2b934e3f276f3a407429e9aa9582bdfe Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 18 Apr 2024 14:36:25 +0200 Subject: [PATCH 1/3] RED-8402: Header and footer are not indexed / searched added unit test and file --- .../server/SimplifiedTextServiceTest.java | 78 ++++++++++++++++++ .../files/headerFooterTest3Pages.pdf | Bin 0 -> 40502 bytes 2 files changed, 78 insertions(+) create mode 100644 layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java create mode 100644 layoutparser-service/layoutparser-service-server/src/test/resources/files/headerFooterTest3Pages.pdf diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java new file mode 100644 index 0000000..d2dfe41 --- /dev/null +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java @@ -0,0 +1,78 @@ +package com.knecon.fforesight.service.layoutparser.server; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.SimplifiedSectionText; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.SimplifiedText; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingStorageService; +import com.knecon.fforesight.service.layoutparser.processor.model.ClassificationDocument; +import com.knecon.fforesight.service.layoutparser.processor.model.graph.nodes.Document; +import com.knecon.fforesight.service.layoutparser.processor.python_api.model.image.ImageServiceResponse; +import com.knecon.fforesight.service.layoutparser.processor.python_api.model.table.TableServiceResponse; +import com.knecon.fforesight.service.layoutparser.processor.python_api.model.table.VisualLayoutParsingResponse; +import com.knecon.fforesight.service.layoutparser.processor.services.SimplifiedSectionTextService; +import com.knecon.fforesight.service.layoutparser.processor.services.factory.DocumentGraphFactory; +import com.knecon.fforesight.service.layoutparser.server.utils.AbstractTest; + +import io.micrometer.observation.Observation; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class SimplifiedTextServiceTest + extends AbstractTest { + + @Autowired + private LayoutParsingPipeline layoutParsingPipeline; + @Autowired + private SimplifiedSectionTextService simplifiedSectionTextService; + + + @Test + @SneakyThrows + public void testSearchIndexing() { + + File file = new ClassPathResource("files/headerFooterTest3Pages.pdf").getFile(); + String footerExample = "Footer to search for "; + String headerExample ="Header to search for "; + Document document = buildGraph(file); + SimplifiedText simplifiedText = simplifiedSectionTextService.toSimplifiedText(document); + List sectionTexts = simplifiedText.getSectionTexts(); + assertThat(sectionTexts.stream().filter(section -> section.getText().equals(footerExample)).collect(Collectors.toList()).size()).isGreaterThan(0); + assertThat(sectionTexts.stream().filter(section -> section.getText().equals(headerExample)).collect(Collectors.toList()).size()).isGreaterThan(0); + + + + } + + @SneakyThrows + protected Document buildGraph(File file) { + + return DocumentGraphFactory.buildDocumentGraph(LayoutParsingType.REDACT_MANAGER, + layoutParsingPipeline.parseLayout(LayoutParsingType.REDACT_MANAGER, + file, + new ImageServiceResponse(), + new TableServiceResponse(), + new VisualLayoutParsingResponse(), + Map.of("file",file.toString()))); + } + + + +} diff --git a/layoutparser-service/layoutparser-service-server/src/test/resources/files/headerFooterTest3Pages.pdf b/layoutparser-service/layoutparser-service-server/src/test/resources/files/headerFooterTest3Pages.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f80c5b796469f254ac08012b5d9a0ae218f57767 GIT binary patch literal 40502 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 Date: Thu, 18 Apr 2024 14:36:25 +0200 Subject: [PATCH 2/3] RED-8402: Header and footer are not indexed / searched added unit test and file --- .../server/SimplifiedTextServiceTest.java | 78 ++++++++++++++++++ .../files/headerFooterTest3Pages.pdf | Bin 0 -> 40502 bytes 2 files changed, 78 insertions(+) create mode 100644 layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java create mode 100644 layoutparser-service/layoutparser-service-server/src/test/resources/files/headerFooterTest3Pages.pdf diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java new file mode 100644 index 0000000..d2dfe41 --- /dev/null +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/SimplifiedTextServiceTest.java @@ -0,0 +1,78 @@ +package com.knecon.fforesight.service.layoutparser.server; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.SimplifiedSectionText; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.SimplifiedText; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingStorageService; +import com.knecon.fforesight.service.layoutparser.processor.model.ClassificationDocument; +import com.knecon.fforesight.service.layoutparser.processor.model.graph.nodes.Document; +import com.knecon.fforesight.service.layoutparser.processor.python_api.model.image.ImageServiceResponse; +import com.knecon.fforesight.service.layoutparser.processor.python_api.model.table.TableServiceResponse; +import com.knecon.fforesight.service.layoutparser.processor.python_api.model.table.VisualLayoutParsingResponse; +import com.knecon.fforesight.service.layoutparser.processor.services.SimplifiedSectionTextService; +import com.knecon.fforesight.service.layoutparser.processor.services.factory.DocumentGraphFactory; +import com.knecon.fforesight.service.layoutparser.server.utils.AbstractTest; + +import io.micrometer.observation.Observation; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class SimplifiedTextServiceTest + extends AbstractTest { + + @Autowired + private LayoutParsingPipeline layoutParsingPipeline; + @Autowired + private SimplifiedSectionTextService simplifiedSectionTextService; + + + @Test + @SneakyThrows + public void testSearchIndexing() { + + File file = new ClassPathResource("files/headerFooterTest3Pages.pdf").getFile(); + String footerExample = "Footer to search for "; + String headerExample ="Header to search for "; + Document document = buildGraph(file); + SimplifiedText simplifiedText = simplifiedSectionTextService.toSimplifiedText(document); + List sectionTexts = simplifiedText.getSectionTexts(); + assertThat(sectionTexts.stream().filter(section -> section.getText().equals(footerExample)).collect(Collectors.toList()).size()).isGreaterThan(0); + assertThat(sectionTexts.stream().filter(section -> section.getText().equals(headerExample)).collect(Collectors.toList()).size()).isGreaterThan(0); + + + + } + + @SneakyThrows + protected Document buildGraph(File file) { + + return DocumentGraphFactory.buildDocumentGraph(LayoutParsingType.REDACT_MANAGER, + layoutParsingPipeline.parseLayout(LayoutParsingType.REDACT_MANAGER, + file, + new ImageServiceResponse(), + new TableServiceResponse(), + new VisualLayoutParsingResponse(), + Map.of("file",file.toString()))); + } + + + +} diff --git a/layoutparser-service/layoutparser-service-server/src/test/resources/files/headerFooterTest3Pages.pdf b/layoutparser-service/layoutparser-service-server/src/test/resources/files/headerFooterTest3Pages.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f80c5b796469f254ac08012b5d9a0ae218f57767 GIT binary patch literal 40502 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 Date: Wed, 17 Apr 2024 17:40:21 +0200 Subject: [PATCH 3/3] RED-8995: unclassified text might be missing from document data * treat TablePageBlock.OTHER like PARAGRAPH (no special treatment) --- .../processor/services/SectionsBuilderService.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/SectionsBuilderService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/SectionsBuilderService.java index c98c688..fec1b29 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/SectionsBuilderService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/SectionsBuilderService.java @@ -44,7 +44,6 @@ public class SectionsBuilderService { for (ClassificationPage page : document.getPages()) { List header = new ArrayList<>(); List footer = new ArrayList<>(); - List unclassifiedText = new ArrayList<>(); for (AbstractPageBlock current : page.getTextBlocks()) { if (current.getClassification() == null) { @@ -63,11 +62,6 @@ public class SectionsBuilderService { continue; } - if (current.getClassification().equals(PageBlockType.OTHER)) { - unclassifiedText.add((TextPageBlock) current); - continue; - } - if (prev != null && current.getClassification().isHeadline() && !prev.getClassification().isHeadline() || !document.isHeadlines()) { ClassificationSection chunkBlock = buildTextBlock(chunkWords, lastHeadline); chunkBlock.setHeadline(lastHeadline); @@ -95,9 +89,6 @@ public class SectionsBuilderService { if (!footer.isEmpty()) { footers.add(new ClassificationFooter(footer)); } - if (!unclassifiedText.isEmpty()) { - unclassifiedTexts.add(new UnclassifiedText(unclassifiedText)); - } } ClassificationSection chunkBlock = buildTextBlock(chunkWords, lastHeadline);