2011-01-20 10 views
2

我在工作內存中有一個ArrayList,我在when子句中使用'from'語句進行迭代。但是,該規則正在向後遍歷數組。有沒有辦法來控制這種行爲?爲什麼'from'關鍵字向後迭代?

列表創建:

List<Map<String,String>> list = new ArrayList<Map<String,String>>(); 
Map<String,String> m1 = ... 
Map<String,String> m2 = ... 
list.add(m1); 
list.add(m2); 
ImportItem item = new ImportItem(list); //model object. Constructor arg returned by getInput() 
StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession(); 
session.insert(item); 
session.fireAllRules(); 

Drools的規則:

rule "My Rule" 
dialect "java" 
when 
    item : ImportItem(ignore == false) //model object that holds the input 
    map : Map() from item.getInput() // == the ArrayList from above 
then 
    System.out.println(map); 
end 

主要生產

<output of m2> 
<output of m1> 

回答

0

您應儘量寫的規則,使訂單不計。但是,如果您確實需要按照特定順序開啓規則,或者在這種情況下,請按照特定順序從列表中獲取事實。確保在更新到新版本的引擎時,規則引擎內部的任何更改都不會破壞規則。

即使以相反方式進行迭代,也不能相信「來自」。

這個解決方案有一個問題。如果更新ImportItem並需要再次遍歷輸入,則需要撤消與其相關的MyIterator。

declare MyIterator 
    index:int 
    lastIndex:int 
    importItem:ImportItem 
end 

rule "Insert ImportItem iterator" 
    when 
     item : ImportItem() 
     not MyIterator(importItem == item) 
    then 
     MyIterator myIterator = new MyIterator(); 
     myIterator.setImportItem(item); 
     myIterator.setIndex(0); 
     myIterator.setLastIndex(item.getInput().size()); 
     insert(myIterator); 
end 

rule "My Rule" 
    when 
     myIterator :MyIterator(index < lastIndex) 
     item : ImportItem( this == myIterator.importItem, 
          ignore == false) 
     map : Map() from item.getInput().get(myIterator.getIndex()) 
    then 
     System.out.println(map); 

     myIterator.setIndex(myIterator.getIndex() + 1); 
     update(myIterator); 
end 
+0

也許還有另一種方法來解決這個問題。對我的規則過於簡單的解釋是,輸入包含來自我映射到另一個對象的相同字段的文件的行。所以基本上我需要一個規則來完成myObj.setText(input.get(0)+ input.get(1)+ input.get(2)+ ...) – 2011-01-21 14:33:09

3

迭代不會倒退,因爲您可以看到是否將審計日誌附加到會話。默認情況下,規則的執行是LIFO命令(如果您沒有使用任何其他衝突解決策略)。

我的建議是不要試圖封裝數據結構中的對象。如果您正在讀取文件的行,並且您需要按順序處理這些行,則可以使用類來表示行並將行直接插入會話中。爲了保證執行順序,您可以使用行號作爲突出顯示的參數。

例如:

rule "Process lines in order" 
    // salience executes from higher number to lowest number, so using the 
    // negative value you will executem them from the first to the last 
    salience (- $lineNumber) 
when 
    $line : Line($lineNumber : lineNumber) 
then 
    // do something with $line 
end 

顯然,同樣的伎倆,可以與你採取了「從」方法一起使用,但發動機在工作記憶更加高效匹配的事實比它遍歷集合對象。

希望它有幫助。 Edson