2013-08-02 41 views
0

我想知道如何修改列表中的對象。我試着跟隨,但它給出了一個錯誤。Drools - 修改列表中的特定對象?

when 
     Category($bookList : books) 
     UserProfile(profile == UserProfile.STUDENT) 
     $book : Book(student == true) 
     $category : Category(books contains $group) 
then 
     modify($category.books[$book]) { setEligible(true) } 
end 

Book.setEligible是我需要調用的方法。但我需要在Cagegory.books列表中調用此選定對象。我究竟做錯了什麼 ?誰能幫忙?

謝謝!

回答

1

第一件事:您確定要在規則中包含2個不同的類別模式嗎?如果您有兩個不同的類別,則最終可能會執行該規則的4次執行。

第二件事,如果要修改這本書,你爲什麼不只是做:

modify($book) { 
    setEligible(true) 
} 

希望它能幫助,

0

你還需要確保書是一個事實。這意味着你將這個事實插入Ksession .. 你得到的錯誤是什麼?你正在使用哪個版本的流口水?

+0

我試圖修改對象,因爲我只插入「類別」對象作爲事實的清單。如果我插入Book作爲一個事實,那麼我可以使用'modify($ book){setEligible(true)}'輕鬆修改。但是我很好奇如果這個對象駐留在一個列表中,該怎麼做。我收到錯誤,表示符合條件不可見。我正在使用Drools 5.5.0.final。 – Viraj

0

我修改嵌套集合像這樣的項目... [使用 「從」]

rule "4G complete" 
salience -1 
when 
    $tr: TopTowerResult() 
    $ptncascade: PtnCascade() from $tr.cascadeList 
    Timestamp() from $ptncascade.cascadeFact.actual4g 
then 
    $ptncascade.getCascadeFact().setComplete4g(true); 
    $ptncascade.getCascadeFact().setEstimate4g("Completed"); 
end 


解釋 -
此行PtnCascade的每個實例匹配$ tr.cascadeList
您可以在此處添加其他模式以限制列表中的所選項目。

$ptncascade: PtnCascade() from $tr.cascadeList 

下一行上PtnCascade(),將匹配的每個實例進行操作。

Timestamp() from $ptncascade.cascadeFact.actual4g 

後果也操作上在列表中匹配的特定PtnCascade -

$ptncascade.getCascadeFact().setComplete4g(true);