2012-04-02 94 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