Drools规则:如何在“when”部分使用方法?

时间:2010-03-23 20:22:31

标签: java syntax rules drools

我需要在DSLR文件的“when”部分执行一个方法,但我不确定它是否可行。例如:

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()和hasAtLeastOptIns()是User的方法)

我尝试使用eval()并且没有出现任何错误,但它没有执行。像这样:

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

如何解决此问题?

1 个答案:

答案 0 :(得分:8)

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

就最简单的重写而言,我可以想到:

  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将无需编写eval即可工作!)。