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

man*_*lhc 6 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
Run Code Online (Sandbox Code Playgroud)

(注意: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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Mic*_*ale 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
Run Code Online (Sandbox Code Playgroud)

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