2012-04-02 115 views
1

我試圖用這樣的規則:屬性訪問問題

rule "conformSyncConstraint" 
    when 
    $syn_con : SyncConstraint(
     $left_stp_period : leftSTP.period, 
     $right_stp_period : rightSTP.period) 
    eval(($left_stp_period.dayOfWeek == $right_stp_period.dayOfWeek && 
     $left_stp_period.dayOrder == $right_stp_period.dayOrder) == false) 

    then 
    insertLogical(new IntConstraintOccurrence("conformSyncConstraint", 
     ConstraintType.NEGATIVE_HARD, 
     1, 
       $syn_con)); 
end 

但我面對這個錯誤,這似乎是一個黑盒子:

Rule Compilation error : [Rule name='conformSyncConstraint'] 
    in/co/technovia/timetabler/domain/Rule_conformSyncConstraint_4401252830cd4ee7bc49416ead3da86c.java (8:1459) : The field Period.dayOfWeek is not visible 
    in/co/technovia/timetabler/domain/Rule_conformSyncConstraint_4401252830cd4ee7bc49416ead3da86c.java (8:1490) : The field Period.dayOfWeek is not visible 


    at org.drools.planner.config.solver.SolverConfig.buildRuleBase(SolverConfig.java:238) 
    at org.drools.planner.config.solver.SolverConfig.buildSolver(SolverConfig.java:170) 
    at org.drools.planner.config.XmlSolverConfigurer.buildSolver(XmlSolverConfigurer.java:103) 
    at in.co.technovia.timetabler.TimeTableApp.createSolver(TimeTableApp.java:61) 
    at in.co.technovia.timetabler.TimeTableApp.main(TimeTableApp.java:45) 

這是怎麼回事錯在這裏?

回答

3

無論何時使用eval,您都會回退到所使用的方言。在你的情況下,你使用java方言,所以你必須用java語法編寫表達式:.getDayOfWeek()而不是.dayOfWeek。

如果您不使用evals,或者如果將方言切換爲mvel,則可以使用簡化的語法。

例如爲:

when 
    $syn_con : SyncConstraint(
     leftSTP.period.dayOfWeek != rightSTP.period.dayOfWeek || 
     leftSTP.period.dayOrder != rightSTP.period.dayOrder 
    ) 
then 
+0

你能否澄清時使用eval?我在[我問到的問題]中瞭解到了這個問題[http://drools.46999.n3.nabble.com/Cant-check-complex-boolean-expressions-with-Collections-disjoint-td3842259.html] when [an answer你給我](http://stackoverflow.com/a/9241089/604511)沒有工作。那我做錯了什麼?我還沒有嘗試它:我的工作時間是12小時:-) – aitchnyu 2012-04-02 17:07:39

+0

直到Drools 5.2,當使用更復雜的表達式作爲約束時,或者當您的約束需要方法調用時,您必須使用evals(),因爲DRL語言不支持這些構造,所以eval允許用戶回退到Java或MVEL來寫下複雜的約束。 Drools 5.3改進了對自由格式約束的支持,5.4基本上不需要evals了,因爲任何布爾約束都可以直接編寫。但是,重要的是要記住,形式爲「」的約束仍然具有更好的性能。 (繼續...) – 2012-04-02 17:50:03

+0

(...繼續之前的評論)我們正在努力改進5.4+中越來越複雜表達式的索引和JITing,但保持簡單始終對引擎和可讀性和維護都更好規則。 – 2012-04-02 17:51:59