如何在Drools LHS中获取已定义变量并添加约束?
如何通过Drools API复用并修改已定义的$stu变量约束
要实现给已定义的$stu变量添加额外约束,核心是在构建规则时保存Student对应的PatternDescr实例,后续直接对该实例添加新约束即可。具体操作如下:
方案一:拆分链式调用,保存Pattern实例
把原来的链式调用拆解开,单独保存Student模式的实例,后续直接调用其constraint方法添加新条件:
// 先构建到LHS的and节点,保存该节点实例 AndDescr andDescr = DescrFactory.newPackage() .name("org.drools.example") .newRule().name("Xyz") .attribute("ruleflow-group","bla") .lhs() .and(); // 创建Student模式并保存其实例 PatternDescr studentPattern = andDescr.pattern("Student") .id("$stu", false) .constraint("name==miko") .constraint("age > 6") .end(); // 给保存的Student模式添加新约束 studentPattern.constraint("grade != 2"); // 继续完成剩余规则的构建 andDescr.not().pattern("Bar").constraint("a+b==c").end().end(); PackageDescr pkg = andDescr.end().end().end();
方案二:链式调用中通过also方法保存实例
如果不想拆分链式调用,可以通过also方法在构建过程中直接捕获PatternDescr实例:
PackageDescr pkg; PatternDescr studentPattern = null; pkg = DescrFactory.newPackage() .name("org.drools.example") .newRule().name("Xyz") .attribute("ruleflow-group","bla") .lhs() .and() .pattern("Student").id( "$stu", false ).constraint("name==miko").constraint("age > 6") // 捕获当前Pattern实例 .also(pattern -> studentPattern = pattern) .end() .not().pattern("Bar").constraint("a+b==c").end().end() .end() .end(); // 后续添加新约束 if (studentPattern != null) { studentPattern.constraint("grade != 2"); }
最终生成的DRL效果
经过上述修改后,生成的DRL会自动合并所有约束:
$stu: Student(name == miko, age > 6, grade != 2) not Bar(a + b == c)
内容的提问来源于stack exchange,提问作者Miko
相关产品推荐
相关产品推荐

