Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图形描述中的Drools and descr(和OrDescr)_Java_Drools - Fatal编程技术网

Java 图形描述中的Drools and descr(和OrDescr)

Java 图形描述中的Drools and descr(和OrDescr),java,drools,Java,Drools,我以编程方式创建规则文件。下面是一个简单的例子: PackageDescr pkg = DescrFactory.newPackage() .name(Constants.DRL_FILE_PACKAGE) .newImport().target(Product.class.getName()).end() .getDescr(); RuleDescr testRule = new RuleDescr();

我以编程方式创建规则文件。下面是一个简单的例子:

    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);
这将生成以下DRL规则:

rule "null"
when
    test.Product( [OR [productId.id == null, operation == 5] ] )  
then
System.out.println("Hi");
end
然后,当使用此规则创建容器时,我有一个例外:

[ERR 101] Line 7:53 no viable alternative at input 'OR' in rule "null"
在PatternDescr中使用AndDescr或OrDescr是否无效

如果是这样的话,我是否可以覆盖AndDescr和OrDescr中的toString方法(这里打印的就是这个方法),使其成为有效的语法,或者是否有更好的方法来处理这种情况


如果它不是无效的,那么成功构建KieContainer还缺少什么呢?

您使用的是内部API来构建并非真正用户友好的规则

即使我们回答这个问题,你也会发现很多这样的问题。另外,内部结构最终会发生变化,所以我建议您不要使用它

相反,开始使用可执行模型以编程方式构建规则,这是一个完全为您所需而创建的JavaDSL。这样,您就不必担心描述符的内部结构

看看
org.drools.modelcompiler.patterndlstest
org.drools.model.flowdlstest
,您会发现一些与您所做的非常类似的示例,例如

    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());
    }
public void testOr(){
结果=新结果();
变量personV=declarationOf(Person.class);
变量markV=declarationOf(Person.class);
变量nameV=declarationOf(String.class);
规则=规则(“或”)
.建造(
或(
模式(personV.expr(“exprA”,p->p.getName().equals(“Mark”)),
及(
模式(markV.expr(“exprA”,p->p.getName().equals(“Mark”)),
模式(personV.expr(“exprB”,markV,(p1,p2)->p1.getAge()>p2.getAge())
)
),
pattern(nameV).expr(“exprC”,personV,(s,p)->s.equals(p.getName()),
在(nameV)上执行(结果::setValue)
);
Model Model=new modeimpl().addRule(rule);
KieBase KieBase=KieBaseBuilder.createKieBaseFromModel(model);
KieSession ksession=kieBase.newKieSession();
K段插入(“马里奥”);
K段插入(新人(“马克”,37));
K段插入(新人(“Edson”,35));
K段插入(新人(“马里奥”,40));
ksession.fireAllRules();
assertEquals(“Mario”,result.getValue());
}

希望这有帮助

Drools的编程方面没有太多文档,所以我一直在努力确定正确的方法来处理所有这些,感谢您提供了正确的参考。对于我现在正在进行的工作,我可能无法实现这种方法(需要重写的内容太多),但这对于将来的参考非常有用。