RED-9472: seperation of system rules

introduced tests
This commit is contained in:
yhampe 2024-10-09 12:17:49 +02:00
parent 3f043c5fdd
commit 56011341b7
5 changed files with 47 additions and 18 deletions

View File

@ -33,6 +33,7 @@ configurations {
dependencies {
implementation(project(":rules-management"))
implementation(project(":redaction-service-api-v1")) { exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1") }
implementation("com.iqser.red.service:persistence-service-internal-api-v1:${persistenceServiceVersion}") { exclude(group = "org.springframework.boot") }
implementation("com.iqser.red.service:persistence-service-shared-mongo-v1:${persistenceServiceVersion}")

View File

@ -60,8 +60,8 @@ public class RuleBuilderService {
log.info("starting to merge user rules update with system rules");
RuleFileBluePrint ruleFileBluePrintExisting = RuleFileParser.buildBluePrintFromRulesString(existingRules);
RuleFileBluePrint mergedRuleFileBlueprint = RuleFileParser.buildBluePrintFromRulesString(userUpdatedRules);
removeAllRulesExceptSystemRules(ruleFileBluePrintExisting);
RuleFileBluePrint mergedRuleFileBlueprint = RuleFileParser.buildBluePrintFromRulesString(userUpdatedRules, true);
removeAllRulesExceptSystemRulesAndCheck(ruleFileBluePrintExisting);
ruleFileBluePrintExisting.getRuleClasses()
.stream()
.flatMap(ruleClass -> ruleClass.ruleUnits()
@ -89,12 +89,13 @@ public class RuleBuilderService {
.collect(Collectors.toSet());
removeAllRulesExceptSystemRules(ruleFileBluePrint);
ruleFileBluePrint.getRuleClasses()
.forEach(ruleClass -> Assert.assertFalse("there was an error removing all rules except system rules", systemRuleNames.contains(ruleClass.ruleType().name())));
.forEach(ruleClass -> Assert.assertTrue("there was an error removing all rules except system rules", systemRuleNames.contains(ruleClass.ruleType().name())));
}
private void removeAllRulesExceptSystemRules(RuleFileBluePrint ruleFileBluePrint) {
List<RuleIdentifier> rules = new ArrayList();
Set<String> systemRuleNames = systemRules.stream()
.map(RuleType::name)
.collect(Collectors.toSet());
@ -105,7 +106,10 @@ public class RuleBuilderService {
.flatMap(ruleClass -> ruleClass.ruleUnits()
.stream()
.map(ruleUnit -> new RuleIdentifier(ruleClass.ruleType(), ruleUnit.unit(), null)))
.forEach(ruleFileBluePrint::removeRule);
.forEach(rule -> rules.add(rule));
rules.forEach(ruleIdentifier -> {
ruleFileBluePrint.removeRule(ruleIdentifier);
});
}

View File

@ -37,6 +37,8 @@ import com.iqser.red.storage.commons.service.StorageService;
import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService;
import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.utility.rules.management.factory.RuleFileParser;
import com.knecon.fforesight.utility.rules.management.models.RuleFileBluePrint;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ -114,6 +116,12 @@ public class RuleBuilderTest extends AbstractRedactionIntegrationTest {
RuleMergingResult mergingResult = this.ruleBuilderService.mergeUserRulesAndSystemRules(RULES, USER_RULES);
String mergedRules = mergingResult.getMergedRules();
RuleFileBluePrint ruleFileBluePrintUserRulesUpdate = RuleFileParser.buildBluePrintFromRulesString(mergedRules, true);
RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(mergedRules);
ruleFileBluePrintUserRulesUpdate.getRuleClasses()
.forEach(ruleClass -> {
Assert.assertTrue(ruleFileBluePrint.getRuleClasses().contains(ruleClass));
});
}

View File

@ -1,3 +1,4 @@
package drools
//------------------------------------ Table extraction rules ------------------------------------
// Rule unit: TAB.0
@ -35,7 +36,7 @@ rule "TAB.0.1: Changed Guidelines"
// Rule unit: TAB.6
rule "TAB.6.0: Changed Targeted cell extraction (Experimental Stop date)"
rule "TAB.6.1: Changed Targeted cell extraction (Experimental Stop date)"
when
$section: Section(getHeadline().containsString("Advanced Table Extraction"), containsAllStrings("female", "Female", "Survived", "Group 2"))
$table: Table(hasHeader("Group 2")) from $section.streamChildren().toList()

View File

@ -49,6 +49,13 @@ public class RuleFileParser {
@SneakyThrows
public RuleFileBluePrint buildBluePrintFromRulesString(String rulesString) {
return buildBluePrintFromRulesString(rulesString, false);
}
@SneakyThrows
public RuleFileBluePrint buildBluePrintFromRulesString(String rulesString, boolean isUserRuleUpdate) {
DrlParser parser = new DrlParser(LanguageLevelOption.DRL6);
PackageDescr packageDescr = parser.parse(false, rulesString);
StringBuilder queryBuilder = new StringBuilder();
@ -78,12 +85,15 @@ public class RuleFileParser {
for (AbstractClassTypeDeclarationDescr declaration : packageDescr.getTypeDeclarations()) {
declarations.add(BasicDeclaration.fromDeclarationDescription(declaration, rulesString));
}
String imports = rulesString.substring(0,
packageDescr.getImports()
.stream()
.mapToInt(ImportDescr::getEndCharacter)
.max()
.orElseThrow() + 1);
String imports = "";
if (isUserRuleUpdate && !packageDescr.getImports().isEmpty()) {
imports = rulesString.substring(0,
packageDescr.getImports()
.stream()
.mapToInt(ImportDescr::getEndCharacter)
.max()
.orElseThrow() + 1);
}
String globals = packageDescr.getGlobals()
.stream()
.map(globalDescr -> rulesString.substring(globalDescr.getStartCharacter(), globalDescr.getEndCharacter()))
@ -108,13 +118,18 @@ public class RuleFileParser {
private List<RuleUnit> groupingByGroup(List<BasicRule> rules) {
Map<Integer, List<BasicRule>> rulesPerUnit = rules.stream()
.collect(groupingBy(rule -> rule.identifier().unit()));
return rulesPerUnit.keySet()
.stream()
.sorted()
.map(unit -> new RuleUnit(unit, rulesPerUnit.get(unit)))
.collect(Collectors.toList());
try {
Map<Integer, List<BasicRule>> rulesPerUnit = rules.stream()
.collect(groupingBy(rule -> rule.identifier().unit()));
return rulesPerUnit.keySet()
.stream()
.sorted()
.map(unit -> new RuleUnit(unit, rulesPerUnit.get(unit)))
.collect(Collectors.toList());
} catch (NullPointerException e) {
System.out.println(rules);
throw e;
}
}