2011-01-20 3 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

생성합니다. 그러나 특정 순서로 규칙을 실행해야하거나이 경우 목록에서 특정 순서로 사실을 가져와야합니다. 엔진의 새 버전으로 업데이트 할 때 규칙 엔진 내부의 변경 사항이 규칙을 어기지 않도록하십시오.

반대로 반복 한 경우에도 "보낸 사람"을 신뢰할 수 없습니다.

이 솔루션에는 한 가지 문제가 있습니다. 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

관련 문제