From 6a8f3665198ec2d7452ed0dac43b9a7d220c8bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thierry=20G=C3=B6ckel?= Date: Wed, 30 Sep 2020 16:08:56 +0200 Subject: [PATCH] Remove entries from must_redact dict, add test and refactor rules --- .../v1/server/redaction/model/Section.java | 12 ++++----- .../v1/server/RedactionIntegrationTest.java | 24 +++++++++++++++++- .../resources/dictionaries/must_redact.txt | 1 - .../src/test/resources/drools/rules.drl | 18 ++++++------- .../Minimal Examples/sponsor_companies.pdf | Bin 0 -> 38571 bytes 5 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/sponsor_companies.pdf diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java index e0ec1bb8..68e7140b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java @@ -44,7 +44,7 @@ public class Section { } - public boolean contains(String type) { + public boolean matchesType(String type) { return entities.stream().anyMatch(entity -> entity.getType().equals(type)); } @@ -83,12 +83,10 @@ public class Section { public void redactIfPrecededBy(String prefix, String type, int ruleNumber, String reason) { entities.forEach(entity -> { - if (entity.getType().equals(type)) { - if (searchText.indexOf(prefix + entity.getWord()) != 1) { - entity.setRedaction(true); - entity.setMatchedRule(ruleNumber); - entity.setRedactionReason(reason); - } + if (entity.getType().equals(type) && searchText.indexOf(prefix + entity.getWord()) != 1) { + entity.setRedaction(true); + entity.setMatchedRule(ruleNumber); + entity.setRedactionReason(reason); } }); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java index 73526fbc..5c942080 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java @@ -445,13 +445,35 @@ public class RedactionIntegrationTest { RedactionResult result = redactionController.redact(request); result.getRedactionLog().getRedactionLogEntry().forEach(entry -> { - if(!entry.isHint()){ + if (!entry.isHint()) { assertThat(entry.getReason()).isEqualTo("Not redacted because row is not a vertebrate study"); } }); } + @Test + public void sponsorCompanyTest() throws IOException { + + long start = System.currentTimeMillis(); + ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/sponsor_companies.pdf"); + + RedactionRequest request = RedactionRequest.builder() + .document(IOUtils.toByteArray(pdfFileResource.getInputStream())) + .build(); + request.setFlatRedaction(false); + + RedactionResult result = redactionController.redact(request); + + try (FileOutputStream fileOutputStream = new FileOutputStream("/tmp/Redacted.pdf")) { + fileOutputStream.write(result.getDocument()); + } + long end = System.currentTimeMillis(); + + System.out.println("duration: " + (end - start)); + System.out.println("numberOfPages: " + result.getNumberOfPages()); + } + private static String loadFromClassPath(String path) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/dictionaries/must_redact.txt b/redaction-service-v1/redaction-service-server-v1/src/test/resources/dictionaries/must_redact.txt index 34387b57..0a4416d4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/dictionaries/must_redact.txt +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/dictionaries/must_redact.txt @@ -1,3 +1,2 @@ -Batches Produced at CTL determination of residues \ No newline at end of file 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 2c31a62b..fc0cc47f 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 @@ -7,7 +7,7 @@ global Section section rule "1: Redacted because Section contains Vertebrate" when - eval(section.contains("vertebrate")==true); + Section(matchesType("vertebrate")) then section.redact("name", 1, "Redacted because Section contains Vertebrate"); section.redact("address", 1, "Redacted because Section contains Vertebrate"); @@ -16,7 +16,7 @@ rule "1: Redacted because Section contains Vertebrate" rule "2: Not Redacted because Section contains no Vertebrate" when - eval(section.contains("vertebrate")==false); + Section(matchesType("vertebrate")) then section.redactNot("name", 2, "Not Redacted because Section contains no Vertebrate"); section.redactNot("address", 2, "Not Redacted because Section contains no Vertebrate"); @@ -25,7 +25,7 @@ rule "2: Not Redacted because Section contains no Vertebrate" rule "3: Do not redact Names and Addresses if no redaction Indicator is contained" when - eval(section.contains("vertebrate")==true && section.contains("no_redaction_indicator")==true); + Section(matchesType("vertebrate"), matchesType("no_redaction_indicator")) then section.redactNot("name", 3, "Vertebrate was found, but also a no redaction indicator"); section.redactNot("address", 3, "Vertebrate was found, but also a no redaction indicator"); @@ -34,7 +34,7 @@ rule "3: Do not redact Names and Addresses if no redaction Indicator is containe rule "4: Redact Names and Addresses if no_redaction_indicator and redaction_indicator is contained" when - eval(section.contains("vertebrate")==true && section.contains("no_redaction_indicator")==true && section.contains("redaction_indicator")==true); + Section(matchesType("vertebrate"), matchesType("no_redaction_indicator"), matchesType("redaction_indicator")) then section.redact("name", 4, "Vertebrate was found and no_redaction_indicator and redaction_indicator"); section.redact("address", 4, "Vertebrate was found and no_redaction_indicator and redaction_indicator"); @@ -43,7 +43,7 @@ rule "4: Redact Names and Addresses if no_redaction_indicator and redaction_indi rule "5: Do not redact in guideline sections" when - eval(section.headlineContainsWord("guideline") || section.headlineContainsWord("Guidance")); + Section(headlineContainsWord("guideline") || headlineContainsWord("Guidance")) then section.redactNot("name", 5, "Section is a guideline section."); section.redactNot("address", 5, "Section is a guideline section."); @@ -52,7 +52,7 @@ rule "5: Do not redact in guideline sections" rule "6: Redact contact information if applicant is found" when - eval(section.headlineContainsWord("applicant") || section.getText().contains("Applicant") || section.headlineContainsWord("Primary contact") || section.headlineContainsWord("Alternative contact")); + Section(headlineContainsWord("applicant") || text.contains("Applicant") || headlineContainsWord("Primary contact") || headlineContainsWord("Alternative contact")) then section.redactLineAfter("Name:", "address", 6, "Applicant information was found"); section.redactBetween("Address:", "Contact", "address", 6, "Applicant information was found"); @@ -79,7 +79,7 @@ rule "6: Redact contact information if applicant is found" rule "7: Redact contact information if Producer is found" when - eval(section.getText().toLowerCase().contains("producer of the plant protection") || section.getText().toLowerCase().contains("producer of the active substance") || section.getText().contains("Manufacturer of the active substance") || section.getText().contains("Manufacturer:") || section.getText().contains("Producer or producers of the active substance")); + Section(text.toLowerCase().contains("producer of the plant protection") || text.toLowerCase().contains("producer of the active substance") || text.contains("Manufacturer of the active substance") || text.contains("Manufacturer:") || text.contains("Producer or producers of the active substance")) then section.redactLineAfter("Name:", "address", 7, "Producer was found"); section.redactBetween("Address:", "Contact", "address", 7, "Producer was found"); @@ -110,7 +110,7 @@ rule "8: Not redacted because Vertebrate Study = N" rule "9: Redact if must redact entry is found" when - eval(section.contains("must_redact")==true); + Section(matchesType("must_redact")) then section.redact("name", 9, "must_redact entry was found."); section.redact("address", 9, "must_redact entry was found."); @@ -128,7 +128,7 @@ rule "10: Redact Authors and Addresses in Reference Table if it is a Vertebrate rule "11: Redact sponsor company" when - Section(section.getText().toLowerCase().contains("batches produced at")) + Section(text.toLowerCase().contains("batches produced at")) then section.redactIfPrecededBy("batches produced at", "sponsor", 11, "Redacted because it represents a sponsor company"); end \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/sponsor_companies.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/sponsor_companies.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45b9f39a28de097994400d24e4e1aab1aa5c4259 GIT binary patch literal 38571 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 L#!Xaco{oz@BFF_7i*r2s@9^X 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 literal 0 HcmV?d00001