2010-03-23 121 views
6

我需要在DSLR文件的“when”部分执行一个方法,但我不确定是否有可能。例如:Drools规则:如何在“何时”部分使用方法?

rule "WNPRules_10" 
    when 
    $reminder:Reminder(source == "HMI") 
    $user:User(isInAgeRange("30-100")==true) 
    Reminder(clickPercentual >= 10) 
    User(haveAtLeastOptIns("1,2,3,4") == true) 
    then 
    $reminder.setPriority(1);update($reminder); 
end 

(注:isInAgeRange()和haveAtLeastOptIns()是用户的方法)

我试着用的eval(),并没有错误出现,但它didn't执行。像这样:

rule "WNPRules_10" 
when 
    $reminder:Reminder(source == "HMI") 
    $user:User(eval($user.isInAgeRange("30-100")==true)) 
    Reminder(clickPercentual >= 10) 
    User(eval($user.haveAtLeastOptIns("1,2,3,4") == true)) 
then 
    $reminder.setPriority(1);update($reminder); 
end 

我该如何解决这个问题?

回答

7

你的第二次尝试看起来相当困惑 - 也 - 你有这样的用户模式 ​​- 你想让他们引用同一个用户实例吗?或者它们可以是单独的实例(或者它们必须是单独的吗?) - 在某些情况下会根据您的意图改变一些事情。

在我能想到的最简单的重写方面:

rule "WNPRules_10" 
    when 
    $reminder:Reminder(source == "HMI") 
    $user:User() 
    eval($user.isInAgeRange("30-100") && $user.haveAtLeastOptIns("1,2,3,4")) 
    Reminder(clickPercentual >= 10) 
    then 
    $reminder.setPriority(1);update($reminder); 
    end 

注意使用eval()顶级元素 - 它也只使用一个用户模式 ​​- ,然后应用约束它。 (在未来的版本中,内联evals将无需编写评估工作!)。

+0

它的工作原理!谢谢! – manoelhc 2010-03-25 16:12:03