Search in sources :

Example 16 with NotDescr

use of org.drools.drl.ast.descr.NotDescr in project drools by kiegroup.

the class RuleParserTest method testFromComplexAcessor.

@Test
public void testFromComplexAcessor() throws Exception {
    String source = "rule \"Invalid customer id\" ruleflow-group \"validate\" lock-on-active true \n" + " when \n" + "     o: Order( ) \n" + "     not( Customer( ) from customerService.getCustomer(o.getCustomerId()) ) \n" + " then \n" + "     System.err.println(\"Invalid customer id found!\"); \n" + "     o.addError(\"Invalid customer id\"); \n" + "end \n";
    PackageDescr pkg = (PackageDescr) parse("compilationUnit", source);
    assertFalse(parser.getErrorMessages().toString(), parser.hasErrors());
    RuleDescr rule = (RuleDescr) pkg.getRules().get(0);
    assertEquals("Invalid customer id", rule.getName());
    assertEquals(2, rule.getLhs().getDescrs().size());
    NotDescr not = (NotDescr) rule.getLhs().getDescrs().get(1);
    PatternDescr customer = (PatternDescr) not.getDescrs().get(0);
    assertEquals("Customer", customer.getObjectType());
    assertEquals("customerService.getCustomer(o.getCustomerId())", ((FromDescr) customer.getSource()).getDataSource().getText());
}
Also used : NotDescr(org.drools.drl.ast.descr.NotDescr) PatternDescr(org.drools.drl.ast.descr.PatternDescr) RuleDescr(org.drools.drl.ast.descr.RuleDescr) FromDescr(org.drools.drl.ast.descr.FromDescr) PackageDescr(org.drools.drl.ast.descr.PackageDescr) Test(org.junit.Test)

Example 17 with NotDescr

use of org.drools.drl.ast.descr.NotDescr in project drools by kiegroup.

the class AndDescrTest method testAddUnboundPatternsEtc.

@Test
public void testAddUnboundPatternsEtc() {
    final AndDescr and = new AndDescr();
    and.addDescr(new NotDescr());
    and.addDescr(new PatternDescr("Foo"));
    and.addDescr(new NotDescr());
    assertEquals(3, and.getDescrs().size());
}
Also used : NotDescr(org.drools.drl.ast.descr.NotDescr) PatternDescr(org.drools.drl.ast.descr.PatternDescr) AndDescr(org.drools.drl.ast.descr.AndDescr) Test(org.junit.Test)

Example 18 with NotDescr

use of org.drools.drl.ast.descr.NotDescr in project drools by kiegroup.

the class ForallBuilder method build.

public RuleConditionElement build(final RuleBuildContext context, final BaseDescr descr) {
    final ForallDescr forallDescr = (ForallDescr) descr;
    if (forallDescr.isSinglePattern()) {
        PatternDescr pattern = (PatternDescr) forallDescr.getDescrs().get(0);
        NotDescr notDescr = new NotDescr(pattern.negateConstraint());
        RuleConditionBuilder builder = (RuleConditionBuilder) context.getDialect().getBuilder(notDescr.getClass());
        return builder.build(context, notDescr);
    }
    BaseDescr selfJoin = forallDescr.getSelfJoinConstraint();
    if (selfJoin != null) {
        // transforms a self join forall in the form
        // forall( $t : Type( constraints1 ) Type( this == $t, constraints2 ) )
        // into
        // exists( Type( constraints1 ) ) and not( Type( constraints1, !constraints2 ) )
        GroupElement transformedForall = new GroupElement();
        PatternDescr p1 = (PatternDescr) forallDescr.getDescrs().get(0);
        PatternDescr p2 = (PatternDescr) forallDescr.getDescrs().get(1);
        ExistsDescr existDescr = new ExistsDescr(p1);
        RuleConditionBuilder existsBuilder = (RuleConditionBuilder) context.getDialect().getBuilder(existDescr.getClass());
        transformedForall.addChild(existsBuilder.build(context, existDescr));
        NotDescr notDescr = new NotDescr(p1);
        p2.removeConstraint(selfJoin);
        p2.negateConstraint().getConstraint().getDescrs().forEach(p1::addConstraint);
        RuleConditionBuilder notBuilder = (RuleConditionBuilder) context.getDialect().getBuilder(notDescr.getClass());
        transformedForall.addChild(notBuilder.build(context, notDescr));
        return transformedForall;
    }
    final PatternBuilder patternBuilder = (PatternBuilder) context.getDialect().getBuilder(PatternDescr.class);
    final Pattern basePattern = (Pattern) patternBuilder.build(context, forallDescr.getBasePattern());
    if (basePattern == null) {
        return null;
    }
    final Forall forall = new Forall(basePattern);
    // adding the newly created forall CE to the build stack
    // this is necessary in case of local declaration usage
    context.getDeclarationResolver().pushOnBuildStack(forall);
    for (BaseDescr baseDescr : forallDescr.getRemainingPatterns()) {
        final Pattern anotherPattern = (Pattern) patternBuilder.build(context, (PatternDescr) baseDescr);
        forall.addRemainingPattern(anotherPattern);
    }
    if (forallDescr.getDescrs().size() == 1) {
        // An optimization for unlinking, where we allow unlinking if the resulting 'not' node has no constraints
        // we need to record this here, due to getRemainingPatterns injecting "this == " + BASE_IDENTIFIER $__forallBaseIdentifier
        // which we wish to ignore
        PatternDescr p = (PatternDescr) forallDescr.getDescrs().get(0);
        if (p.getConstraint().getDescrs().isEmpty()) {
            forall.setEmptyBetaConstraints(true);
        }
    }
    // poping the forall
    context.getDeclarationResolver().popBuildStack();
    return forall;
}
Also used : NotDescr(org.drools.drl.ast.descr.NotDescr) Pattern(org.drools.core.rule.Pattern) ExistsDescr(org.drools.drl.ast.descr.ExistsDescr) PatternDescr(org.drools.drl.ast.descr.PatternDescr) GroupElement(org.drools.core.rule.GroupElement) BaseDescr(org.drools.drl.ast.descr.BaseDescr) Forall(org.drools.core.rule.Forall) ForallDescr(org.drools.drl.ast.descr.ForallDescr)

Aggregations

NotDescr (org.drools.drl.ast.descr.NotDescr)18 PatternDescr (org.drools.drl.ast.descr.PatternDescr)14 Test (org.junit.Test)14 RuleDescr (org.drools.drl.ast.descr.RuleDescr)10 AndDescr (org.drools.drl.ast.descr.AndDescr)8 PackageDescr (org.drools.drl.ast.descr.PackageDescr)7 ExprConstraintDescr (org.drools.drl.ast.descr.ExprConstraintDescr)5 ExistsDescr (org.drools.drl.ast.descr.ExistsDescr)4 OrDescr (org.drools.drl.ast.descr.OrDescr)4 GroupElement (org.drools.core.rule.GroupElement)2 Pattern (org.drools.core.rule.Pattern)2 BaseDescr (org.drools.drl.ast.descr.BaseDescr)2 ConditionalElementDescr (org.drools.drl.ast.descr.ConditionalElementDescr)2 FromDescr (org.drools.drl.ast.descr.FromDescr)2 InputStreamReader (java.io.InputStreamReader)1 KnowledgeBuilderImpl (org.drools.compiler.builder.impl.KnowledgeBuilderImpl)1 XmlPackageReader (org.drools.compiler.compiler.xml.XmlPackageReader)1 RuleImpl (org.drools.core.definitions.rule.impl.RuleImpl)1 Forall (org.drools.core.rule.Forall)1 ForallDescr (org.drools.drl.ast.descr.ForallDescr)1