Drools:使用 PackageDescr 生成规则时如何为变量赋值?
Drools : how to assign value to variable when using PackageDescr to generate rule?
我正在尝试使用 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 中使用它。
使用带标识符的 PatternDescr
构造函数:
public PatternDescr(String objectType, String identifier)
您当前正在使用默认构造函数。通过使用此构造函数,您还可以省略对 setObjectType
.
的调用
PatternDescr patternDescr = new PatternDescr(Data.class.getName(), "$d");
patternDescr.addConstraint(or);
或者,如果您决定使用默认构造函数,那么 setIdentifier
方法可以做同样的事情。
(此外,这可能是我见过的最低效的规则编写方式之一,强烈建议您以正常方式进行操作。)
参考:Javadoc
我正在尝试使用 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 中使用它。
使用带标识符的 PatternDescr
构造函数:
public PatternDescr(String objectType, String identifier)
您当前正在使用默认构造函数。通过使用此构造函数,您还可以省略对 setObjectType
.
PatternDescr patternDescr = new PatternDescr(Data.class.getName(), "$d");
patternDescr.addConstraint(or);
或者,如果您决定使用默认构造函数,那么 setIdentifier
方法可以做同样的事情。
(此外,这可能是我见过的最低效的规则编写方式之一,强烈建议您以正常方式进行操作。)
参考:Javadoc