Search in sources :

Example 1 with Rule

use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.

the class ModelToGraphConverter method generateGraphAnalysis.

private GraphAnalysis generateGraphAnalysis(AnalysisModel model) {
    GraphAnalysis graphAnalysis = new GraphAnalysis();
    for (Package pkg : model.getPackages()) {
        List<Rule> rules = pkg.getRules();
        for (Rule rule : rules) {
            graphAnalysis.addNode(new Node(rule));
            LeftHandSide lhs = rule.getLhs();
            List<Pattern> patterns = lhs.getPatterns();
            for (Pattern pattern : patterns) {
                Class<?> patternClass = pattern.getPatternClass();
                Collection<String> reactOnFields = pattern.getReactOnFields();
                if (pattern.isClassReactive()) {
                    // Pattern which cannot analyze reactivity (e.g. Person(blackBoxMethod())) so reacts to all properties
                    graphAnalysis.addClassReactiveRule(patternClass, rule, pattern.isPositive());
                } else if (reactOnFields.isEmpty()) {
                    // Pattern without constraint (e.g. Person()) so doesn't react to properties (only react to  insert/delete)
                    graphAnalysis.addInsertReactiveRule(patternClass, rule, pattern.isPositive());
                } else {
                    for (String field : reactOnFields) {
                        graphAnalysis.addPropertyReactiveRule(patternClass, field, rule, pattern.isPositive());
                    }
                }
            }
        }
    }
    return graphAnalysis;
}
Also used : Pattern(org.drools.impact.analysis.model.left.Pattern) LeftHandSide(org.drools.impact.analysis.model.left.LeftHandSide) Package(org.drools.impact.analysis.model.Package) Rule(org.drools.impact.analysis.model.Rule)

Example 2 with Rule

use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.

the class ModelToGraphConverter method parseGraphAnalysis.

private void parseGraphAnalysis(AnalysisModel model, GraphAnalysis graphAnalysis) {
    for (Package pkg : model.getPackages()) {
        String pkgName = pkg.getName();
        List<Rule> rules = pkg.getRules();
        for (Rule rule : rules) {
            String ruleName = rule.getName();
            RightHandSide rhs = rule.getRhs();
            List<ConsequenceAction> actions = rhs.getActions();
            for (ConsequenceAction action : actions) {
                switch(action.getType()) {
                    case INSERT:
                        processInsert(graphAnalysis, pkgName, ruleName, (InsertAction) action);
                        break;
                    case DELETE:
                        processDelete(graphAnalysis, pkgName, ruleName, action);
                        break;
                    case MODIFY:
                        processModify(graphAnalysis, pkgName, ruleName, (ModifyAction) action);
                        break;
                }
            }
        }
    }
}
Also used : ConsequenceAction(org.drools.impact.analysis.model.right.ConsequenceAction) Package(org.drools.impact.analysis.model.Package) Rule(org.drools.impact.analysis.model.Rule) RightHandSide(org.drools.impact.analysis.model.right.RightHandSide)

Example 3 with Rule

use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.

the class RhsParser method parse.

public void parse(RuleDescr ruleDescr, RuleContext context, Rule rule) {
    BlockStmt ruleVariablesBlock = new BlockStmt();
    MethodCallExpr consequenceExpr = new Consequence(context).createCall(ruleDescr, ruleDescr.getConsequence().toString(), ruleVariablesBlock, false);
    consequenceExpr.findAll(MethodCallExpr.class).stream().filter(m -> m.getScope().map(s -> s.toString().equals("drools")).orElse(false)).map(m -> processStatement(context, consequenceExpr, m, ruleVariablesBlock)).filter(Objects::nonNull).forEach(a -> rule.getRhs().addAction(a));
}
Also used : ParserUtil.getLiteralString(org.drools.impact.analysis.parser.impl.ParserUtil.getLiteralString) RuleDescr(org.drools.drl.ast.descr.RuleDescr) ParserUtil.literalToValue(org.drools.impact.analysis.parser.impl.ParserUtil.literalToValue) DeclarationSpec(org.drools.modelcompiler.builder.generator.DeclarationSpec) InsertedProperty(org.drools.impact.analysis.model.right.InsertedProperty) VariableDeclarator(com.github.javaparser.ast.body.VariableDeclarator) ParserUtil.isLiteral(org.drools.impact.analysis.parser.impl.ParserUtil.isLiteral) ModifiedProperty(org.drools.impact.analysis.model.right.ModifiedProperty) Rule(org.drools.impact.analysis.model.Rule) ObjectCreationExpr(com.github.javaparser.ast.expr.ObjectCreationExpr) ParserUtil.getLiteralValue(org.drools.impact.analysis.parser.impl.ParserUtil.getLiteralValue) ParserUtil.literalType(org.drools.impact.analysis.parser.impl.ParserUtil.literalType) Map(java.util.Map) Expression(com.github.javaparser.ast.expr.Expression) ParserUtil.objectCreationExprToValue(org.drools.impact.analysis.parser.impl.ParserUtil.objectCreationExprToValue) Method(java.lang.reflect.Method) PackageRegistry(org.drools.compiler.compiler.PackageRegistry) ParserUtil.stripEnclosedAndCast(org.drools.impact.analysis.parser.impl.ParserUtil.stripEnclosedAndCast) ClassUtils(org.drools.core.util.ClassUtils) MethodCallExpr(com.github.javaparser.ast.expr.MethodCallExpr) AssignExpr(com.github.javaparser.ast.expr.AssignExpr) StringUtils.ucFirst(org.drools.core.util.StringUtils.ucFirst) ModifiedMapProperty(org.drools.impact.analysis.model.right.ModifiedMapProperty) Collectors(java.util.stream.Collectors) ModifyAction(org.drools.impact.analysis.model.right.ModifyAction) VariableDeclarationExpr(com.github.javaparser.ast.expr.VariableDeclarationExpr) Objects(java.util.Objects) RuleContext(org.drools.modelcompiler.builder.generator.RuleContext) List(java.util.List) InsertAction(org.drools.impact.analysis.model.right.InsertAction) Consequence(org.drools.modelcompiler.builder.generator.Consequence) Optional(java.util.Optional) ConsequenceAction(org.drools.impact.analysis.model.right.ConsequenceAction) BlockStmt(com.github.javaparser.ast.stmt.BlockStmt) BlockStmt(com.github.javaparser.ast.stmt.BlockStmt) Consequence(org.drools.modelcompiler.builder.generator.Consequence) MethodCallExpr(com.github.javaparser.ast.expr.MethodCallExpr)

Example 4 with Rule

use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.

the class PackageParser method parseRule.

private Rule parseRule(RuleDescr ruleDescr) {
    RuleContext context = new ImpactAnalysisRuleContext(kbuilder, packageModel, pkgRegistry.getTypeResolver(), ruleDescr);
    context.addGlobalDeclarations();
    context.setDialectFromAttributes(packageDescr.getAttributes());
    Rule rule = new Rule(packageDescr.getName(), ruleDescr.getName(), ruleDescr.getResource().getSourcePath());
    logger.debug("Parsing : " + rule.getName());
    new LhsParser(packageModel, pkgRegistry).parse(ruleDescr, context, rule);
    new RhsParser(pkgRegistry).parse(ruleDescr, context, rule);
    return rule;
}
Also used : RuleContext(org.drools.modelcompiler.builder.generator.RuleContext) Rule(org.drools.impact.analysis.model.Rule)

Example 5 with Rule

use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.

the class ModelToGraphConverter method processModify.

private void processModify(GraphAnalysis graphAnalysis, String pkgName, String ruleName, ModifyAction action) {
    Node source = graphAnalysis.getNode(fqdn(pkgName, ruleName));
    Class<?> modifiedClass = action.getActionClass();
    if (!graphAnalysis.isRegisteredClass(modifiedClass)) {
        // Not likely happen but not invalid
        logger.warn("Not found {} in reactiveMap", modifiedClass);
        return;
    }
    List<ModifiedProperty> modifiedProperties = action.getModifiedProperties();
    for (ModifiedProperty modifiedProperty : modifiedProperties) {
        String property = modifiedProperty.getProperty();
        for (AnalyzedRule reactedRule : graphAnalysis.getRulesReactiveTo(modifiedClass, property)) {
            List<Constraint> constraints = reactedRule.getRule().getLhs().getPatterns().stream().filter(pattern -> pattern.getPatternClass() == modifiedClass).flatMap(pattern -> pattern.getConstraints().stream()).filter(constraint -> constraint.getProperty() != null && constraint.getProperty().equals(property)).filter(constraint -> {
                if (constraint instanceof MapConstraint) {
                    return doesAssertSameKey((MapConstraint) constraint, modifiedProperty);
                } else {
                    return true;
                }
            }).collect(Collectors.toList());
            ReactivityType combinedLinkType = ReactivityType.UNKNOWN;
            if (constraints.isEmpty()) {
                // This rule is reactive to the property but cannot find its constraint (e.g. [age > $a] non-literal constraint). It means UNKNOWN impact
                combinedLinkType = ReactivityType.UNKNOWN;
            } else {
                // If constraints contain at least one POSITIVE, we consider it's POSITIVE.
                for (Constraint constraint : constraints) {
                    ReactivityType linkType = linkType(constraint, modifiedProperty);
                    if (linkType == ReactivityType.POSITIVE) {
                        combinedLinkType = ReactivityType.POSITIVE;
                        break;
                    } else if (linkType == ReactivityType.NEGATIVE) {
                        // NEGATIVE is stronger than UNKNOWN (but may be configurable)
                        combinedLinkType = ReactivityType.NEGATIVE;
                    } else if (combinedLinkType == ReactivityType.NEGATIVE && linkType == ReactivityType.UNKNOWN) {
                    // Don't overwrite with UNKNOWN
                    } else {
                        // UNKNOWN
                        combinedLinkType = linkType;
                    }
                }
            }
            if (reactedRule.getReactivityType() == ReactivityType.NEGATIVE) {
                combinedLinkType = combinedLinkType.negate();
            }
            Node target = graphAnalysis.getNode(fqdn(pkgName, reactedRule.getRule().getName()));
            linkNodesIfExpected(source, target, combinedLinkType);
        }
    }
}
Also used : LeftHandSide(org.drools.impact.analysis.model.left.LeftHandSide) Logger(org.slf4j.Logger) Collection(java.util.Collection) LoggerFactory(org.slf4j.LoggerFactory) AnalysisModel(org.drools.impact.analysis.model.AnalysisModel) ModifiedMapProperty(org.drools.impact.analysis.model.right.ModifiedMapProperty) Collectors(java.util.stream.Collectors) Pattern(org.drools.impact.analysis.model.left.Pattern) InsertedProperty(org.drools.impact.analysis.model.right.InsertedProperty) ModifyAction(org.drools.impact.analysis.model.right.ModifyAction) List(java.util.List) InsertAction(org.drools.impact.analysis.model.right.InsertAction) ModifiedProperty(org.drools.impact.analysis.model.right.ModifiedProperty) Rule(org.drools.impact.analysis.model.Rule) RightHandSide(org.drools.impact.analysis.model.right.RightHandSide) MapConstraint(org.drools.impact.analysis.model.left.MapConstraint) ConsequenceAction(org.drools.impact.analysis.model.right.ConsequenceAction) Package(org.drools.impact.analysis.model.Package) Constraint(org.drools.impact.analysis.model.left.Constraint) MapConstraint(org.drools.impact.analysis.model.left.MapConstraint) Constraint(org.drools.impact.analysis.model.left.Constraint) MapConstraint(org.drools.impact.analysis.model.left.MapConstraint) ModifiedProperty(org.drools.impact.analysis.model.right.ModifiedProperty)

Aggregations

Rule (org.drools.impact.analysis.model.Rule)7 Package (org.drools.impact.analysis.model.Package)4 ConsequenceAction (org.drools.impact.analysis.model.right.ConsequenceAction)4 List (java.util.List)3 Collectors (java.util.stream.Collectors)3 LeftHandSide (org.drools.impact.analysis.model.left.LeftHandSide)3 Pattern (org.drools.impact.analysis.model.left.Pattern)3 InsertAction (org.drools.impact.analysis.model.right.InsertAction)3 InsertedProperty (org.drools.impact.analysis.model.right.InsertedProperty)3 ModifiedMapProperty (org.drools.impact.analysis.model.right.ModifiedMapProperty)3 ModifiedProperty (org.drools.impact.analysis.model.right.ModifiedProperty)3 ModifyAction (org.drools.impact.analysis.model.right.ModifyAction)3 RightHandSide (org.drools.impact.analysis.model.right.RightHandSide)3 Collection (java.util.Collection)2 AnalysisModel (org.drools.impact.analysis.model.AnalysisModel)2 Constraint (org.drools.impact.analysis.model.left.Constraint)2 MapConstraint (org.drools.impact.analysis.model.left.MapConstraint)2 RuleContext (org.drools.modelcompiler.builder.generator.RuleContext)2 Logger (org.slf4j.Logger)2 LoggerFactory (org.slf4j.LoggerFactory)2