diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java index 98d1194e..3b9a783d 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java @@ -100,9 +100,15 @@ public class ComponentCreationService { */ public void create(String ruleIdentifier, String name, String value, String valueDescription, Collection references) { + System.out.println("AAAA: " + ruleIdentifier + " ; " + name + " ; " + value + " ; " + valueDescription + " ; " + references); + referencedEntities.addAll(references); - kieSession.insert(Component.builder().matchedRule(RuleIdentifier.fromString(ruleIdentifier)).name(name).value(value).valueDescription(valueDescription) + kieSession.insert(Component.builder() + .matchedRule(RuleIdentifier.fromString(ruleIdentifier)) + .name(name) + .value(value) + .valueDescription(valueDescription) .references(new LinkedList<>(references)) .build()); } @@ -354,7 +360,9 @@ public class ComponentCreationService { */ public void createComponentsForUnMappedEntities(String ruleIdentifier, Collection entities) { - entities.stream().filter(entity -> !referencedEntities.contains(entity)).sorted(EntityComparators.first()) + entities.stream() + .filter(entity -> !referencedEntities.contains(entity)) + .sorted(EntityComparators.first()) .forEach(entity -> create(ruleIdentifier, entity.getType(), entity.getValue(), "Unmapped Entity", List.of(entity))); } @@ -427,11 +435,15 @@ public class ComponentCreationService { .entrySet() .stream() .sorted(Comparator.comparingInt(Map.Entry::getKey)) - .map(Map.Entry::getValue) - .forEach(entitiesInSameRow -> create(ruleIdentifier, - name, entitiesInSameRow.stream().sorted(EntityComparators.first()).map(Entity::getValue).collect(Collectors.joining(", ")), - valueDescription, - entitiesInSameRow)); + .forEach(integerListEntry -> { + var rowNumber = integerListEntry.getKey(); + var entitiesInSameRow = integerListEntry.getValue(); + create(ruleIdentifier, + name + " " + rowNumber, + entitiesInSameRow.stream().sorted(EntityComparators.first()).map(Entity::getValue).collect(Collectors.joining(", ")), + valueDescription, + entitiesInSameRow); + }); }); } @@ -474,7 +486,9 @@ public class ComponentCreationService { */ public void create(String ruleIdentifier, String name, String value) { - kieSession.insert(Component.builder().matchedRule(RuleIdentifier.fromString(ruleIdentifier)).name(name) + kieSession.insert(Component.builder() + .matchedRule(RuleIdentifier.fromString(ruleIdentifier)) + .name(name) .value(value) .valueDescription("") .references(Collections.emptyList()) diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl index 69015695..bdd92ef9 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl @@ -139,28 +139,26 @@ rule "TAB.4.0: Combined Columns Extraction - Sex and Dosage" when FileAttribute(label == "OECD Number", valueEqualsAnyOf("425")) $section: Section(getHeadline().containsString("Combined Columns")) - $table: Table(hasHeader("Sex"), hasHeader("Dosage (mg/kg bw)")) from $section.getParent().streamAllSubNodesOfType(NodeType.TABLE).toList() - $maleCells: TableCell($row: row, containsAnyWordIgnoreCase("Male")) from $table.streamTableCellsWithHeader("Sex").toList() - $dosageCells: TableCell($row == row) from $table.streamTableCellsWithHeader("Dosage").toList() + $table: Table(hasHeader("Dosage (mg/kg bw)")) from $section.getParent().streamAllSubNodesOfType(NodeType.TABLE).toList() then - entityCreationService.bySemanticNode($maleCells, "combined_male_dosage", EntityType.ENTITY) - .ifPresent(entity -> entity.apply("TAB.4.0", "Dosage combined in row with male")); - entityCreationService.bySemanticNode($dosageCells, "combined_male_dosage", EntityType.ENTITY) - .ifPresent(entity -> entity.apply("TAB.4.0", "Dosage combined in row with male")); + $table.streamTableCellsWithHeader("Dosage (mg/kg bw)") + .map(tableCell -> entityCreationService.bySemanticNode(tableCell, "dose_mortality_dose", EntityType.ENTITY)) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(redactionEntity -> redactionEntity.apply("TAB.4.0", "Dose Mortality dose found.")); end rule "TAB.4.1: Combined Columns Extraction - Sex and Mortality" when FileAttribute(label == "OECD Number", valueEqualsAnyOf("425")) $section: Section(getHeadline().containsString("Combined Columns")) - $table: Table(hasHeader("Sex"), hasHeader("Mortality")) from $section.getParent().streamAllSubNodesOfType(NodeType.TABLE).toList() - $femaleCells: TableCell($row: row, containsAnyWordIgnoreCase("Female")) from $table.streamTableCellsWithHeader("Sex").toList() - $mortalityCells: TableCell($row == row) from $table.streamTableCellsWithHeader("Mortality").toList() + $table: Table(hasHeader("Mortality")) from $section.getParent().streamAllSubNodesOfType(NodeType.TABLE).toList() then - entityCreationService.bySemanticNode($femaleCells, "combined_female_mortality", EntityType.ENTITY) - .ifPresent(entity -> entity.apply("TAB.4.1", "Mortality combined in row with female")); - entityCreationService.bySemanticNode($mortalityCells, "combined_female_mortality", EntityType.ENTITY) - .ifPresent(entity -> entity.apply("TAB.4.1", "Mortality combined in row with female")); + $table.streamTableCellsWithHeader("Mortality") + .map(tableCell -> entityCreationService.bySemanticNode(tableCell, "dose_mortality", EntityType.ENTITY)) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(redactionEntity -> redactionEntity.apply("TAB.4.1", "Dose Mortality found.")); end rule "TAB.5.0: Targeted cell extraction" diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo_components.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo_components.drl index f1d18f26..61d07425 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo_components.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo_components.drl @@ -45,6 +45,70 @@ declare GuidelineMapping guideline: String end +//------------------------------------ Demo Components rules ------------------------------------ + +rule "FullTable.1.1: All rows of matching table" + when + $tableRowValues: List() from collect (Entity(type == "full_table_row")) + then + componentCreationService.joiningFromSameTableRow("FullTable.1.1", "Full Table", $tableRowValues); + end + + +rule "IndivRowExtr.1.2: Individual rows of table" + when + $oecdNumber: String() from List.of("425") + FileAttribute(label == "OECD Number", value == $oecdNumber) + $clinicalSigns: List() from collect (Entity(type == "clinical_signs")) + then + componentCreationService.joining("IndivRowExtr.1.2", "Extracted experiment", $clinicalSigns, "\n"); + end + + +rule "IndivColExtr.1.3: Individual column of table" + when + $tableColValues: List() from collect (Entity(type == "dosages")) + then + componentCreationService.joining("IndivColExtr.1.3", "Dosages", $tableColValues); + end + + +/* +rule "CombColExtr.2.1: Combined Columns Extraction" + when + $oecdNumber: String() from List.of("425") + FileAttribute(label == "OECD Number", value == $oecdNumber) + $doseMortalities: List() from collect (Entity(type == "dose_mortality" || type == "dose_mortality_dose")) + then + componentCreationService.joiningFromSameTableRow("DoseMortality.0.0", "Dose Mortality", $doseMortalities); + end +*/ + + +rule "ValueExtrRef.2.2: Cells containing dose for survived males" + when + $tableValues: List() from collect (Entity(type == "doses_mg_kg_bw")) + then + componentCreationService.joining("ValueExtrRef.2.2", "Doses", $tableValues); + end + + +rule "AdvTableExtr.2.3: Cells containing dose for survived males" + when + $tableValues: List() from collect (Entity(type == "experiment_female_survived")) + then + componentCreationService.joining("AdvTableExtr.2.3", "Experiment Female Survived", $tableValues); + end + + +rule "EntityBasedExtr.2.4: Cells containing dose for survived males" + when + $tableValues: List() from collect (Entity(type == "study_design")) + then + componentCreationService.joiningFromSameTableRow("EntityBasedExtr.2.4", "Vertebrate in row", $tableValues); + end + + //------------------------------------ Default Components rules ------------------------------------ rule "StudyTitle.0.0: First Title found"