2014-11-24 2 views
0

Я пытаюсь сделать что-то вроде ниже, чтобы собрать объекты типа ecrtain, заполняющие определенные условия.Как использовать collect() в drools в этом сценарии

rule "collect_other" 
$lineItem2 : A($iVal : iValue, $qd2 : quantity) 
B($bVal : bId) 
$rowLowerOther : C(iValue == $iVal, bId == $bVal, 
        $lsequence : sequence, $jValue : jAvlDate) 
$rowHigherOther : List() 
    from collect(C(iValue == $iVal, bId == $bVal, 
        sequence == $lsequence-1, jAvlDate != $jValue)) 

then 
    //do something 
end 

Прямо сейчас я получаю только один объект, даже если у меня есть количество объектов fullfilliong условия.

Примечание: Я хочу, чтобы собрать все предметы fullfilling условия, принимая значения от первого объекта экземпляра «C»

Пожалуйста, помогите мне.

+0

Вам нужно будет показать значения объектов C, которые вы вставляете в рабочую память, по крайней мере, значения полей, используемые в этом правиле. – laune

+0

ivalueis целочисленный тип, bId - строковый тип, последовательность имеет целочисленный тип, а jAvlDate - тип String. Что вы понимаете, показывая данные. – Kumar

+0

Я не использовал «показ данных». Нужно знать значения объектов класса C, вставленных в рабочую память, чтобы понять, что может случиться. – laune

ответ

1

Объекты класса C являются:

C(101, "BU1", 1,"2014-11-23"); 
C(101, "BU1", 2,"2014-11-24"); 
C(101, "BU1", 3,"2014-11-25"); 
C(101, "BU1", 4,"2014-11-26") 

Давайте предположим, что мы имеем

A(101,...) 
B("BU1") 

Затем образец

C(iValue == $iVal, bId == $bVal,$lsequence : sequence,...) 

совпадает с любым из этих объектов C, связывание $ lsequence к 1, 2, 3 и т. Д. Для первой привязки правило не срабатывает, потому что никакой факт C не соответствует последовательности == 1-1

Для каждого из значений 2, 3, 4 и т. Д. Правило будет точно совпадать и собираться на C факт в список, т. е. тот, который имеет seuqnce == 1, 2, 3, ... соответственно.

Возможно, это делает то, что вы хотите - но я только догадываюсь.

rule "collect_other" 
when 
    $lineItem2: A($iVal: iValue, $qd2 : quantity) 
       B($bVal : bId) 
    $rowLowerOther: C(iValue == $iVal, bId == $bVal, 
        $lsequence : sequence, $jValue: jAvlDate) 
    not C(iValue == $iVal, bId == $bVal, sequence < $lsequence) 
    $rowHigherOther : List() 
    from collect(C(iValue == $iVal, bId == $bVal, jAvlDate != $jValue)) 
then 
    //... 
end 
+0

Привет Laune, спасибо для вашего ответа. Как я упомянул; Я получаю один за другим; однако мне нужно все согласованное в одном списке. Как я могу это достичь. – Kumar

+0

Проблема в том, что вы знаете, что означает «совпадающие», но я не вижу того, что вижу только правило, которое не делает то, что вы ожидаете. – laune

+0

Очень простым способом я хочу собрать все типы объектов C, соответствующие всем вышеперечисленным условиям. Мне нужно передать java-метод в THEN part of rule. – Kumar

Смежные вопросы