2010-03-23 125 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