From 47f5a340c870eae28bd03bdcceea04542dc4753b Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Fri, 3 Nov 2023 17:32:22 +0100 Subject: [PATCH] RED-7679: Removed unnecessary logs and updated tables demo rules --- .../document/ComponentCreationService.java | 7 - .../src/test/resources/drools/table_demo.drl | 81 ++- .../drools/table_demo_components.drl | 495 +----------------- 3 files changed, 68 insertions(+), 515 deletions(-) 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 49e01176..9c8b22e9 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,8 +100,6 @@ 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() @@ -469,11 +467,6 @@ public class ComponentCreationService { } - public void joiningFromSameTableSeperatedByRow(String ruleIdentifier, String name, Collection entities) { - - } - - private Optional getFirstTable(Entity entity) { SemanticNode node = entity.getContainingNode(); 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 bdd92ef9..26fee332 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 @@ -53,7 +53,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; global Document document global EntityCreationService entityCreationService @@ -65,7 +65,23 @@ global Dictionary dictionary query "getFileAttributes" $fileAttribute: FileAttribute() end -//--------------------------------------------------------------------------- + +//------------------------------------ Local dictionary search rules ------------------------------------ + +// Rule unit: LocalDictionarySearch.0 +rule "LDS.0.0: Run local dictionary search" + agenda-group "LOCAL_DICTIONARY_ADDS" + salience -999 + when + $dictionaryModel: DictionaryModel(!localEntriesWithMatchedRules.isEmpty()) from dictionary.getDictionaryModels() + then + entityCreationService.bySearchImplementation($dictionaryModel.getLocalSearch(), $dictionaryModel.getType(), EntityType.RECOMMENDATION, document) + .forEach(entity -> { + Collection matchedRules = $dictionaryModel.getLocalEntriesWithMatchedRules().get(entity.getValue()); + entity.addMatchedRules(matchedRules); + }); + end +// --------------------------------------- Your rules below this line -------------------------------------------------- rule "TAB.0.0: Study Type File Attribute" when @@ -106,7 +122,7 @@ rule "TAB.1.0: Full Table extraction (Guideline Deviation)" $table: Table() from $section.getParent().streamAllSubNodesOfType(NodeType.TABLE).toList() $tableCell: TableCell(!header) from $table.streamTableCells().toList() then - entityCreationService.bySemanticNode($tableCell, "guideline_deviation", EntityType.ENTITY) + entityCreationService.bySemanticNode($tableCell, "full_table_row", EntityType.ENTITY) .ifPresent(entity -> entity.apply("TAB.1.0", "full table extracted")); end @@ -192,7 +208,7 @@ rule "TAB.7.0: Indicator (Species)" $section: Section(getHeadline().containsString("Entity-Based")) $table: Table() from $section.streamAllSubNodesOfType(NodeType.TABLE).toList() TableCell(isHeader(), containsString("Title"), $col: col) from $table.streamTableCells().toList() - TableCell(hasEntitiesOfType("vertebrate"), $row: row) from $table.streamTableCells().toList() + TableCell(hasEntitiesOfType("vertebrates"), $row: row) from $table.streamTableCells().toList() $cell: TableCell($col == col, $row == row) from $table.streamTableCells().toList() then entityCreationService.bySemanticNode($cell, "study_design", EntityType.ENTITY) @@ -355,6 +371,22 @@ rule "X.0.0: Remove Entity contained by Entity of same type" end +// Rule unit: X.1 +rule "X.1.0: Merge intersecting Entities of same type" + salience 64 + when + $first: TextEntity($type: type, $entityType: entityType, !resized(), active()) + $second: TextEntity(intersects($first), type == $type, entityType == $entityType, this != $first, !hasManualChanges(), active()) + then + TextEntity mergedEntity = entityCreationService.mergeEntitiesOfSameType(List.of($first, $second), $type, $entityType, document); + $first.remove("X.1.0", "merge intersecting Entities of same type"); + $second.remove("X.1.0", "merge intersecting Entities of same type"); + retract($first); + retract($second); + mergedEntity.getIntersectingNodes().forEach(node -> update(node)); + end + + // Rule unit: X.2 rule "X.2.0: Remove Entity of type ENTITY when contained by FALSE_POSITIVE" salience 64 @@ -405,6 +437,31 @@ rule "X.5.0: Remove Entity of type RECOMMENDATION when contained by ENTITY" end +// Rule unit: X.6 +rule "X.6.0: Remove Entity of lower rank, when contained by by entity of type ENTITY" + salience 32 + when + $higherRank: TextEntity($type: type, (entityType == EntityType.ENTITY || entityType == EntityType.HINT), active()) + $lowerRank: TextEntity(containedBy($higherRank), type != $type, dictionary.getDictionaryRank(type) < dictionary.getDictionaryRank($type), !hasManualChanges(), active()) + then + $lowerRank.getIntersectingNodes().forEach(node -> update(node)); + $lowerRank.remove("X.6.0", "remove Entity of lower rank, when contained by entity of type ENTITY"); + retract($lowerRank); + end + + +rule "X.6.1: remove Entity of higher rank, when intersected by entity of type ENTITY and length of lower rank Entity is bigger than the higher rank Entity" + salience 32 + when + $higherRank: TextEntity($type: type, $value: value, (entityType == EntityType.ENTITY || entityType == EntityType.HINT), active()) + $lowerRank: TextEntity(intersects($higherRank), type != $type, dictionary.getDictionaryRank(type) < dictionary.getDictionaryRank($type), !hasManualChanges(), active(), $lowerRank.getValue().length() > $value.length()) + then + $higherRank.getIntersectingNodes().forEach(node -> update(node)); + $higherRank.remove("X.6.1", "remove Entity of higher rank, when intersected by entity of type ENTITY and length of lower rank Entity is bigger than the higher rank Entity"); + retract($higherRank); + end + + // Rule unit: X.7 rule "X.7.0: remove all images" salience 512 @@ -428,19 +485,3 @@ rule "FA.1.0: Remove duplicate FileAttributes" retract($duplicate); end - -//------------------------------------ Local dictionary search rules ------------------------------------ - -// Rule unit: LDS.0 -rule "LDS.0.0: Run local dictionary search" - agenda-group "LOCAL_DICTIONARY_ADDS" - salience -999 - when - $dictionaryModel: DictionaryModel(!localEntriesWithMatchedRules.isEmpty()) from dictionary.getDictionaryModels() - then - entityCreationService.bySearchImplementation($dictionaryModel.getLocalSearch(), $dictionaryModel.getType(), EntityType.RECOMMENDATION, document) - .forEach(entity -> { - Collection matchedRules = $dictionaryModel.getLocalEntriesWithMatchedRules().get(entity.getValue()); - entity.addMatchedRules(matchedRules); - }); - end 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 61d07425..d3e5c6ff 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 @@ -51,17 +51,15 @@ 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); + componentCreationService.joiningFromSameTableRow("FullTable.1.1", "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"); + componentCreationService.joiningFromSameTableRow("IndivRowExtr.1.2", "1.2 Individual Rows", $clinicalSigns); end @@ -69,27 +67,23 @@ rule "IndivColExtr.1.3: Individual column of table" when $tableColValues: List() from collect (Entity(type == "dosages")) then - componentCreationService.joining("IndivColExtr.1.3", "Dosages", $tableColValues); + componentCreationService.joiningFromSameTableRow("IndivColExtr.1.3", "1.3 Individual Column", $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); + componentCreationService.joiningFromSameTableRow("DoseMortality.0.0", "2.1 Combined Columns", $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); + componentCreationService.joining("ValueExtrRef.2.2", "2.2 Individual Table Values", $tableValues); end @@ -97,7 +91,7 @@ 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); + componentCreationService.rowValueCount("AdvTableExtr.2.3", "2.3 Advanced Table Values", $tableValues); end @@ -105,480 +99,5 @@ 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); + componentCreationService.joiningFromSameTableRow("EntityBasedExtr.2.4", "2.4 Entity-Based Values", $tableValues); end - - -//------------------------------------ Default Components rules ------------------------------------ - -rule "StudyTitle.0.0: First Title found" - when - $titleCandidates: List() from collect (Entity(type == "title")) - then - componentCreationService.firstOrElse("StudyTitle.0.0", "Study_Title", $titleCandidates, ""); - end - - -rule "PerformingLaboratory.1.0: Performing Laboratory name and country found in same section" - when - $laboratoryName: Entity(type == "laboratory_name", $node: containingNode) - $laboratoryCountry: Entity(type == "laboratory_country", containingNode == $node) - not Entity(type == "laboratory_country", containingNode == $node, Math.abs($laboratoryName.startOffset - startOffset) < Math.abs($laboratoryName.startOffset - $laboratoryCountry.startOffset)) - then - componentCreationService.create("PerformingLaboratory.1.0", "Performing_Laboratory", $laboratoryName.getValue() + ", " + $laboratoryCountry.getValue(), "Laboratory name and country found!", List.of($laboratoryName, $laboratoryCountry)); - end - -rule "PerformingLaboratory.2.0: Performing Laboratory name but no country found in same section" - when - $laboratoryName: Entity(type == "laboratory_name", $node: containingNode) - not Entity(type == "laboratory_country", containingNode == $node) - then - componentCreationService.create("PerformingLaboratory.2.0", "Performing_Laboratory", $laboratoryName.getValue(), "Only laboratory name found!", List.of($laboratoryName)); - end - -rule "PerformingLaboratory.0.2: Performing Laboratory not found" - salience -1 - when - not Component(name == "Performing_Laboratory") - then - componentCreationService.create("PerformingLaboratory.0.2", "Performing_Laboratory", "", "fallback"); - end - - -rule "ReportNumber.0.0: First Report number found" - when - $reportNumberCandidates: List() from collect (Entity(type == "report_number")) - then - componentCreationService.firstOrElse("ReportNumber.0.0", "Report_Number", $reportNumberCandidates, ""); - end - - -rule "GLPStudy.0.0: GLP Study found" - when - $glpStudyList: List(!isEmpty) from collect(Entity(type == "glp_study")) - then - componentCreationService.create("GLPStudy.0.0", "GLP_Study", "Yes", "Yes if present, No if not", $glpStudyList); - end - -rule "GLPStudy.1.0: GLP Study not found" - when - not Entity(type == "glp_study") - then - componentCreationService.create("GLPStudy.1.0", "GLP_Study", "No", "Yes if present, No if not"); - end - - -rule "TestGuideline.0.0: create OECD number and year guideline mappings" - salience 2 - when - Entity(type == "oecd_guideline_number") - Entity(type == "oecd_guideline_year") - then - insert(new GuidelineMapping("425", "2008", "Nº 425: Acute oral Toxicity - Up-and-Down Procedure (03/10/2008)")); - insert(new GuidelineMapping("425", "2001", "Nº 425: Acute oral Toxicity - Up-and-Down Procedure (17/12/2001)")); - insert(new GuidelineMapping("402", "2017", "Nº 402: Acute Dermal Toxicity (09/10/2017)")); - insert(new GuidelineMapping("402", "1987", "Nº 402: Acute Dermal Toxicity (24/02/1987)")); - insert(new GuidelineMapping("403", "2009", "Nº 403: Acute Inhalation Toxicity (08/09/2009)")); - insert(new GuidelineMapping("403", "1981", "Nº 403: Acute Inhalation Toxicity (12/05/1981)")); - insert(new GuidelineMapping("433", "2018", "Nº 433: Acute Inhalation Toxicity: Fixed Concentration Procedure (27/06/2018)")); - insert(new GuidelineMapping("433", "2017", "Nº 433: Acute Inhalation Toxicity: Fixed Concentration Procedure (09/10/2017)")); - insert(new GuidelineMapping("436", "2009", "Nº 436: Acute Inhalation Toxicity – Acute Toxic Class Method (08/09/2009)")); - insert(new GuidelineMapping("404", "1981", "Nº 404: Acute Dermal Irritation/Corrosion (12/05/1981)")); - insert(new GuidelineMapping("404", "1992", "Nº 404: Acute Dermal Irritation/Corrosion (17/07/1992)")); - insert(new GuidelineMapping("404", "2002", "Nº 404: Acute Dermal Irritation/Corrosion (24/04/2002)")); - insert(new GuidelineMapping("404", "2015", "Nº 404: Acute Dermal Irritation/Corrosion (28/07/2015)")); - insert(new GuidelineMapping("405", "2017", "Nº 405: Acute Eye Irritation/Corrosion (09/10/2017)")); - insert(new GuidelineMapping("405", "2012", "Nº 405: Acute Eye Irritation/Corrosion (02/10/2012)")); - insert(new GuidelineMapping("405", "2002", "Nº 405: Acute Eye Irritation/Corrosion (24/04/2002)")); - insert(new GuidelineMapping("405", "1987", "Nº 405: Acute Eye Irritation/Corrosion (24/02/1987)")); - insert(new GuidelineMapping("429", "2002", "Nº 429: Skin Sensitisation: Local Lymph Node Assay (24/04/2002)")); - insert(new GuidelineMapping("429", "2010", "Nº 429: Skin Sensitisation (23/07/2010)")); - insert(new GuidelineMapping("442A", "2018", "Nº 442A: Skin Sensitization (23/07/2018)")); - insert(new GuidelineMapping("442B", "2018", "Nº 442B: Skin Sensitization (27/06/2018)")); - insert(new GuidelineMapping("471", "1997", "Nº 471: Bacterial Reverse Mutation Test (21/07/1997)")); - insert(new GuidelineMapping("471", "2020", "Nº 471: Bacterial Reverse Mutation Test (26/06/2020)")); - insert(new GuidelineMapping("406", "1992", "Nº 406: Skin Sensitisation (1992)")); - insert(new GuidelineMapping("428", "2004", "Nº 428: Split-Thickness Skin test (2004)")); - insert(new GuidelineMapping("438", "2018", "Nº 438: Eye Irritation (26/06/2018)")); - insert(new GuidelineMapping("439", "2019", "Nº 439: Skin Irritation (2019)")); - insert(new GuidelineMapping("474", "2016", "Nº 474: Micronucleus Bone Marrow Cells Rat (2016)")); - insert(new GuidelineMapping("487", "2016", "Nº 487: Micronucleus Human Lymphocytes (2016)")); - end - -rule "TestGuideline.0.1: match OECD number and year with guideline mappings" - salience 1 - when - not Component(name == "Test_Guidelines_1") - GuidelineMapping($year: year, $number: number, $guideline: guideline) - $guidelineNumber: Entity(type == "oecd_guideline_number", value == $number) - $guidelineYear: Entity(type == "oecd_guideline_year", value == $year) - then - componentCreationService.create( - "TestGuideline.0.0", - "Test_Guidelines_1", - $guideline, - "OECD Number and guideline year mapped!", - List.of($guidelineNumber, $guidelineYear) - ); - end - -rule "TestGuideline.1.0: no guideline mapping found" - when - not Component(name == "Test_Guidelines_1") - $guideLine: Entity(type == "oecd_guideline") - then - componentCreationService.create("TestGuideline.2.0", "Test_Guidelines_1", $guideLine.getValue(), "No Mapping for OECD number and year found, using fallback instead!", List.of($guideLine)); - end - -rule "TestGuideline.2.0: All values of EPA guideline and EC guidelines" - when - $guidelines: List() from collect (Entity(type == "epa_guideline" || type == "ec_guideline")) - then - componentCreationService.joining("TestGuideline.2.0", "Test_Guidelines_2", $guidelines); - end - - -rule "StartDate.0.0: All experimental start dates converted to dd/MM/yyyy" - when - $startDates: List() from collect (Entity(type == "experimental_start_date")) - then - componentCreationService.convertDates("StartDate.0.0", "Experimental_Starting_Date", $startDates); - end - - -rule "CompletionDate.0.0: All experimental end dates converted to dd/MM/yyyy" - when - $endDates: List() from collect (Entity(type == "experimental_end_date")) - then - componentCreationService.convertDates("CompletionDate.0.0", "Experimental_Completion_Date", $endDates); - end - - -rule "AnalysisCertificate.0.0: Unique values of certificate of analysis batch identification" - when - $batchNumbers: List() from collect (Entity(type == "batch_number")) - then - componentCreationService.joiningUnique("AnalysisCertificate.0.0", "Certificate_of_Analysis_Batch_Identification", $batchNumbers); - end - -rule "StudyConclusion.0.0: Study conclusion in first found section" - when - $oecdNumber: String() from List.of("402", "403", "404", "405", "425", "429", "436", "471") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $studyConclusions: List() from collect(Entity(type == "study_conclusion")) - then - componentCreationService.joiningFromFirstSectionOnly("StudyConclusion.0.0", "Study_Conclusion", $studyConclusions, " "); - end - -rule "GuidelineDeviation.0.0: Guideline deviation as sentences" - when - $oecdNumber: String() from List.of("402", "403", "404", "405", "425", "429", "436", "471") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $guidelineDeviations: List() from collect (Entity(type == "guideline_deviation")) - then - componentCreationService.joining("GuidelineDeviation.0.0", "Deviation_from_the_Guideline", $guidelineDeviations, "\n"); - end - -rule "Species.0.0: First found species" - when - $oecdNumber: String() from List.of("402", "403", "404", "405", "425", "429", "436", "471") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $species: List() from collect (Entity(type == "species")) - then - componentCreationService.firstOrElse("Species.0.0", "Species", $species, ""); - end - -rule "Strain.0.0: First found strain" - when - $oecdNumber: String() from List.of("402", "403", "404", "405", "425", "429", "436", "471") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $strain: List() from collect (Entity(type == "strain")) - then - componentCreationService.firstOrElse("Strain.0.0", "Strain", $strain, ""); - end - -rule "Conclusion.0.0: Unique values of Conclusion LD50" - when - $oecdNumber: String() from List.of("402", "403", "425", "436") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $conclusions: List() from collect (Entity(type == "ld50_value")) - then - componentCreationService.joiningUnique("Conclusion.0.0", "Conclusion_LD50_mg_per_kg", $conclusions); - end - -rule "Conclusion0.1.0: Greater than found" - when - $oecdNumber: String() from List.of("402", "403", "425", "436") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $conclusions: List(!isEmpty()) from collect (Entity(type == "ld50_greater")) - then - componentCreationService.create("Conclusion.1.0", "Conclusion_LD50_Greater_than", "Greater than", "Entity of type 'ld50_greater' found", $conclusions); - end - -rule "Conclusion.1.1: Greater than not found" - when - $oecdNumber: String() from List.of("402", "403", "425", "436") - FileAttribute(label == "OECD Number", value == $oecdNumber) - not Entity(type == "ld50_greater") - then - componentCreationService.create("Conclusion.1.1", "Conclusion_LD50_Greater_than", "", "No entity of type 'ld50_greater' found"); - end - -rule "Conclusion.2.0: Minimum confidence as unique values" - when - $oecdNumber: String() from List.of("402", "403", "425", "436") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $conclusions: List() from collect (Entity(type == "confidence_minimal")) - then - componentCreationService.joiningUnique("Conclusion.2.0", "Conclusion_Minimum_Confidence", $conclusions); - end - -rule "Conclusion.3.0: Maximum confidence as unique values" - when - $oecdNumber: String() from List.of("402", "403", "425", "436") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $conclusions: List() from collect (Entity(type == "confidence_maximal")) - then - componentCreationService.joiningUnique("Conclusion.3.0", "Conclusion_Maximum_Confidence", $conclusions); - end - -rule "Necropsy.0.0: Necropsy findings from longest section" - when - FileAttribute(label == "OECD Number", value == "402") - $necropsies: List() from collect (Entity(type == "necropsy_findings")) - then - componentCreationService.joiningFromLongestSectionOnly("Necropsy.0.0", "Necropsy_Findings", $necropsies, " "); - end - -rule "Necropsy.0.1: Necropsy findings joined with \n" - when - FileAttribute(label == "OECD Number", value == "403" || value == "436") - $necropsies: List() from collect (Entity(type == "necropsy_findings")) - then - componentCreationService.joining("Necropsy.0.0", "Necropsy_Findings", $necropsies, "\n"); - end - -rule "Necropsy.1.0: Doses mg per kg of Bodyweight as one block" - when - FileAttribute(label == "OECD Number", value == "402") - $dosages: List() from collect (Entity(type == "doses_(mg_kg_bw)")) - then - componentCreationService.joining("Necropsy.1.0", "Doses_mg_per_kg_bw", $dosages, " "); - end - -rule "Necropsy.2.0: Conducted with 4 hours of exposure as one block" - when - $oecdNumber: String() from List.of("403", "436") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $exposures: List() from collect (Entity(type == "4h_exposure")) - then - componentCreationService.joining("Necropsy.3.0", "Conducted_with_4_Hours_of_Exposure", $exposures, " "); - end - -rule "StudyDesign.0.0: Study design as one block" - when - $oecdNumber: String() from List.of("404", "405", "429", "406", "428", "438", "439", "474", "487") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $studyDesigns: List() from collect (Entity(type == "study_design")) - then - componentCreationService.joining("StudyDesign.0.0", "Study_Design", $studyDesigns, " "); - end - -rule "Results.0.0: Results and conclusions as joined values" - when - $oecdNumber: String() from List.of("406", "428", "438", "439", "474", "487") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $results: List() from collect (Entity(type == "results_and_conclusion")) - then - componentCreationService.joining("Results.0.0", "Results_and_Conclusions", $results, " "); - end - -rule "WeightBehavior.0.0: Weight change behavior as sentences" - when - FileAttribute(label == "OECD Number", value == "402") - $weightChanges: List() from collect (Entity(type == "weight_behavior_changes")) - then - componentCreationService.joining("WeightBehavior.0.0", "Weight_Behavior_Changes", $weightChanges, "\n"); - end - -rule "MortalityStatement.0.0: Mortality statements as one block" - when - FileAttribute(label == "OECD Number", value == "402") - $mortalityStatements: List() from collect (Entity(type == "mortality_statement")) - then - componentCreationService.joining("MortalityStatement.0.0", "Mortality_Statement", $mortalityStatements, " "); - end - -rule "ClinicalObservations.0.0: Clinical observations as sentences" - when - FileAttribute(label == "OECD Number", value == "403") - $observations: List() from collect (Entity(type == "clinical_observations")) - then - componentCreationService.joining("MortalityStatement.0.0", "Clinical_Observations", $observations, "\n"); - end - -rule "BodyWeight.0.0: Bodyweight changes as sentences" - when - FileAttribute(label == "OECD Number", value == "403") - $weightChanges: List() from collect (Entity(type == "bodyweight_changes")) - then - componentCreationService.joining("BodyWeight.0.0", "Body_Weight_Changes", $weightChanges, "\n"); - end - -rule "Detailing.0.0: Detailing of reported changes as one block" - when - $oecdNumber: String() from List.of("404", "405") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $detailings: List() from collect (Entity(type == "detailing")) - then - componentCreationService.joining("Detailing.0.0", "Detailing_of_Reported_Changes", $detailings, " "); - end - -rule "Sex.0.0: Male sex found" - when - $oecdNumber: String() from List.of("405", "429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $males: List(!isEmpty) from collect (Entity(type == "sex", (value.toLowerCase() == "male" || value.toLowerCase() == "males"))) - then - componentCreationService.create("Sex.0.0", "Sex", "male", "male sex found", $males); - end - -rule "Sex.1.0: Female sex found" - when - $oecdNumber: String() from List.of("405", "429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $females: List(!isEmpty) from collect (Entity(type == "sex", (value.toLowerCase() == "female" || value.toLowerCase() == "females"))) - then - componentCreationService.create("Sex.0.0", "Sex", "female", "female sex found", $females); - end - -rule "NumberOfAnimals.0.0: Number of animals found" - when - $oecdNumber: String() from List.of("405", "429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $numberOfAnimals: Entity(type == "number_of_animals") - then - componentCreationService.create("NumberOfAnimals.0.0", "Number_of_Animals", $numberOfAnimals.getValue(), "Number of animals found directly", $numberOfAnimals); - end - -rule "NumberOfAnimals.1.0: Count unique occurences of animals" - when - $oecdNumber: String() from List.of("405", "429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - not Entity(type == "number_of_animals") - $animals: List() from collect (Entity(type == "animal_number")) - then - componentCreationService.uniqueValueCount("NumberOfAnimals.1.0", "Number_of_Animals", $animals); - end - -rule "ClinicalSigns.0.0: Clinical signs as sentences" - when - $oecdNumber: String() from List.of("425") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $clinicalSigns: List() from collect (Entity(type == "clinical_signs")) - then - componentCreationService.joining("ClinicalSigns.0.0", "Clinical_Signs", $clinicalSigns, "\n"); - end - -rule "DoseMortality.0.0: Dose mortality joined with dose from same table row" - 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 "Mortality.0.0: Mortality as one block" - when - $oecdNumber: String() from List.of("425") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $mortalities: List() from collect (Entity(type == "mortality")) - then - componentCreationService.joining("Mortality.0.0", "Mortality", $mortalities, " "); - end - -rule "Dosages.0.0: First found value of Dosages" - when - $oecdNumber: String() from List.of("425") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $mortalities: List() from collect (Entity(type == "dosages")) - then - componentCreationService.firstOrElse("Dosages.0.0", "Dosages", $mortalities, ""); - end - -rule "PrelimResults.0.0: Preliminary test results as sentences" - when - $oecdNumber: String() from List.of("429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $results: List() from collect (Entity(type == "preliminary_test_results")) - then - componentCreationService.joining("PrelimResults.0.0", "Preliminary_Test_Results", $results, "\n"); - end - -rule "TestResults.0.0: Test results as one block" - when - $oecdNumber: String() from List.of("429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $results: List() from collect (Entity(type == "test_results")) - then - componentCreationService.joining("TestResults.0.0", "Test_Results", $results, " "); - end - -rule "PositiveControl.0.0: Was the definitive study conducted with positive control" - when - $oecdNumber: String() from List.of("429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $results: List() from collect (Entity(type == "positive_control")) - then - componentCreationService.joining("PositiveControl.0.0", "Was_the_definitive_study_conducted_with_positive_control", $results, " "); - end - -rule "MainResults.0.0: Results from main study as one block" - when - $oecdNumber: String() from List.of("429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $results: List() from collect (Entity(type == "results_(main_study)")) - then - componentCreationService.joining("MainResults.0.0", "Results_Main_Study", $results, " "); - end - -rule "UsedApproach.0.0: Used approach found and mapped to 'Group'" - when - $oecdNumber: String() from List.of("429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - $results: List(!isEmpty()) from collect (Entity(type == "approach_used")) - then - componentCreationService.create("UsedApproach.0.0", "What_was_the_approach_used", "Group", "'Group' when approach used is present, else 'Individual'", $results); - end - -rule "UsedApproach.1.0: Used approach not found and thus 'Individual'" - when - $oecdNumber: String() from List.of("429") - FileAttribute(label == "OECD Number", value == $oecdNumber) - not Entity(type == "approach_used") - then - componentCreationService.create("UsedApproach.1.0", "What_was_the_approach_used", "Individual", "'Group' when approach used is present, else 'Individual'"); - end - -/* -rule "DefaultComponents.999.0: Create components for all unmapped entities." - salience -999 - when - $allEntities: List(!isEmpty()) from collect (Entity()) - then - componentCreationService.createComponentsForUnMappedEntities("DefaultComponents.999.0", $allEntities); - end -*/ - -//------------------------------------ Component merging rules ------------------------------------ -/* -rule "X.0.0: merge duplicate component references" - when - $first: Component() - $duplicate: Component(this != $first, name == $first.name, value == $first.value) - then - $first.getReferences().addAll($duplicate.getReferences()); - retract($duplicate); - end -*/ \ No newline at end of file