1 回答

TA貢獻1780條經驗 獲得超1個贊
您使用內部 API 來構建對用戶來說并不友好的規則。
即使我們回答了這個問題,你也會發現很多這樣的問題。而且內部結構最終肯定會改變,所以我建議你不要使用它。
相反,開始使用可執行模型以編程方式構建規則,這是一個完全根據您的需要創建的 Java DSL。這樣你就不必擔心描述符的內部結構。
看一下org.drools.modelcompiler.PatternDSLTest或org.drools.model.FlowDSLTest,您可以找到一些與您正在做的事情非常相似的示例,例如
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());
}
希望這可以幫助
添加回答
舉報