drools:在使用packagedescr生成规则时如何给变量赋值?

fwzugrvs  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(444)

我正在尝试使用packagedescr编写以下规则:

package com.sample 
import com.sample.Data

rule "my rule"
when
   $d: Data( value > 5 || id == 1  )  
then
System.out.println($d);

end

到目前为止我就是这么做的

PackageDescr pkg = DescrFactory.newPackage()
            .name("com.sample")
            .newImport().target(Data.class.getName()).end()
            .getDescr();
    RuleDescr testRule = new RuleDescr();

    RelationalExprDescr expr1 = new RelationalExprDescr(">", false, null, new ExprConstraintDescr("value"), new ExprConstraintDescr("5"));
    RelationalExprDescr expr2 = new RelationalExprDescr("==", false, null, new ExprConstraintDescr("id"), new ExprConstraintDescr("1"));
    OrDescr or = new OrDescr();
    PatternDescr patternDescr = new PatternDescr();
    AndDescr and = new AndDescr();

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

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

    and.addDescr(patternDescr);

    testRule.setName("my rule");
    testRule.setLhs(and);
    testRule.setConsequence("System.out.println(\"smthg\");");
    pkg.addRule(testRule);

    String drl = new DrlDumper().dump(pkg);
    System.out.println(drl);

这是我得到的结果:

package com.sample 

import com.sample.Data

rule "my rule"
when
    com.sample.Data( [OR [value > 5, id == 1] ] )  
then
System.out.println("smthg");

end

我不知道如何将结果赋给变量$d,以便在lhs中使用它。

mfuanj7w

mfuanj7w1#

使用 PatternDescr 采用标识符的构造函数:

public PatternDescr(String objectType, String identifier)

您当前正在使用默认构造函数。通过使用此构造函数,还可以省略对 setObjectType .

PatternDescr patternDescr = new PatternDescr(Data.class.getName(), "$d");
patternDescr.addConstraint(or);

或者,如果你决定使用默认构造函数,那么 setIdentifier 方法来做同样的事情。
(而且,这可能是我见过的最低效的编写规则的方法之一,强烈建议你用正常的方式做事。)
参考:javadoc

相关问题