2011-01-20 11 views
2

私は、私のwhen節で 'from'ステートメントを使って反復している作業メモリーにArrayListを持っています。ただし、ルールは配列を逆方向に反復しています。この動作を制御する方法はありますか?なぜ '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

を生成します。しかし、実際にルールが特定の順序で実行される必要がある場合、またはこの場合、リストから特定の順序でファクトを取得する必要があります。新しいバージョンのエンジンに更新するときに、ルールエンジンの内部の変更がルールを破らないようにしてください。

「元」は、反復を逆にしても信頼できません。

この解決策には1つの問題があります。 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)+ ...)を達成するルールが必要です –

+0

あなたの状態でリストを反復処理できますか?そのように聞こえます。 –

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

関連する問題