亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 PatternDescr 中 Drools AndDescr(和 OrDescr)

在 PatternDescr 中 Drools AndDescr(和 OrDescr)

慕無忌1623718 2023-07-19 15:37:59
我以編程方式創建規則文件。這是一個簡單的例子:    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] ] )  thenSystem.out.println("Hi");end然后,當使用此規則創建 KieContainer 時,我遇到了一個例外:[ERR 101] Line 7:53 no viable alternative at input 'OR' in rule "null"PatternDescr 中包含 AndDescr 或 OrDescr 是否無效?如果是這樣,我是否可以覆蓋 AndDescr 和 OrDescr 中的 toString 方法(這就是此處打印的內容),使其成為有效語法,或者是否有更好的方法來處理這種情況?如果它不是無效的,那么我缺少什么才能成功構建 KieContainer?
查看完整描述

1 回答

?
慕神8447489

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());

    }

希望這可以幫助


查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號