Drools AndDescr (y OrDescr) en el interior PatternDescr

StrongJoshua:

Puedo crear archivos de reglas mediante programación. Aquí está una callados ejemplo:

    PackageDescr pkg = DescrFactory.newPackage()
            .name(Constants.DRL_FILE_PACKAGE)
            .newImport().target(Product.class.getName()).end()
            .getDescr();
    RuleDescr testRule = new RuleDescr();

    RelationalExprDescr expr1 = new RelationalExprDescr("==", false, null, new ExprConstraintDescr("productId.id"), new ExprConstraintDescr(null));
    RelationalExprDescr expr2 = new RelationalExprDescr("==", false, null, new ExprConstraintDescr("operation"), new ExprConstraintDescr("5"));
    OrDescr or = new OrDescr();
    PatternDescr patternDescr = new PatternDescr();
    AndDescr and = new AndDescr();

    or.addDescr(expr1);
    or.addDescr(expr2);

    patternDescr.setObjectType(Product.class.getName());
    patternDescr.addConstraint(or);

    and.addDescr(patternDescr);

    testRule.setLhs(and);
    testRule.setConsequence("System.out.println(\"Hi\");");
    pkg.addRule(testRule);

    String drl = new DrlDumper().dump(pkg);

Esto genera la siguiente regla DRL:

rule "null"
when
    test.Product( [OR [productId.id == null, operation == 5] ] )  
then
System.out.println("Hi");
end

A continuación, cuando se crea el KieContainer usando esta regla Tengo una excepción:

[ERR 101] Line 7:53 no viable alternative at input 'OR' in rule "null"

Es inválido tener AndDescr o OrDescr dentro de un PatternDescr?

Si es así, ¿podría simplemente sobrescribir el método toString (esto es lo que se está imprimiendo aquí) dentro del AndDescr y OrDescr ser una sintaxis válida o hay una mejor manera de manejar esta situación?

Si no es válida, lo que me falta para tener la acumulación KieContainer con éxito?

Luca Molteni:

Estás usando una API interna para construir reglas que no es muy fácil de usar.

Incluso si respondemos a esta pregunta encontrará muchos problemas de este tipo. También la estructura interna es finalmente obligado a cambiar así que sugiero que no lo utilice.

En su lugar, empezar a construir reglas mediante programación utilizando el modelo ejecutable, un DSL de Java creado exactamente para lo que necesita. De esta manera usted no tiene que preocuparse acerca de la estructura interna de los descriptores.

Echar un vistazo a org.drools.modelcompiler.PatternDSLTest, o org.drools.model.FlowDSLTest, se pueden encontrar algunos ejemplos muy similares a lo que está haciendo como este

    public void testOr() {
        Result result = new Result();
        Variable<Person> personV = declarationOf( Person.class );
        Variable<Person> markV = declarationOf( Person.class );
        Variable<String> nameV = declarationOf( String.class );

        Rule rule = rule( "or" )
                .build(
                        or(
                                pattern( personV ).expr("exprA", p -> p.getName().equals("Mark")),
                                and(
                                        pattern( markV ).expr("exprA", p -> p.getName().equals("Mark")),
                                        pattern( personV ).expr("exprB", markV, (p1, p2) -> p1.getAge() > p2.getAge())
                                )
                        ),
                        pattern( nameV ).expr("exprC", personV, (s, p) -> s.equals( p.getName() )),
                        on(nameV).execute( result::setValue )
                );

        Model model = new ModelImpl().addRule( rule );
        KieBase kieBase = KieBaseBuilder.createKieBaseFromModel( model );

        KieSession ksession = kieBase.newKieSession();

        ksession.insert( "Mario" );
        ksession.insert(new Person("Mark", 37));
        ksession.insert(new Person("Edson", 35));
        ksession.insert(new Person("Mario", 40));
        ksession.fireAllRules();

        assertEquals("Mario", result.getValue());
    }

Espero que esto ayude

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=314154&siteId=1
Recomendado
Clasificación