我正在尝试收集Drools中的一些对象,但我只想收集具有相同属性的对象。也就是说,想象一下TestData类:
public class TestData {
int number;
String name;
//Getters, setters, rest of class
}
我想使用collect来获取所有具有相同名称的TestDatas。对于以下数据集,我想要一个规则,它可以收集前两个(两个都具有名称' Test1')和第二个(' Test2')作为单独的集合。
custom.package.TestData< number: 1, name:'Test1' >
custom.package.TestData< number: 2, name:'Test1' >
custom.package.TestData< number: 3, name:'Test2' >
custom.package.TestData< number: 4, name:'Test2' >
像
这样的东西rule "Test Rule"
when
$matchingTestDatas : ArrayList( size > 1 ) from collect ( TestData( *magic* ) )
then
//Code
end
但很明显,如果没有魔法就无法工作 - 它会为我提供一个包含所有名称的所有TestData条目的数组。我可以使用它作为规则的基础,并在右侧迭代所有测试数据条目进行扩展处理,但感觉就像drools中应该存在足够聪明的东西来匹配这种方式。
答案 0 :(得分:2)
据推测,“神奇”只是:
TestData( name == 'Test1' )
或
TestData( name == 'Test2' )
...对于每个集合。但这似乎太明显了。我错过了什么吗?
根据OP对此答案的评论中的澄清,似乎需要Map
个集合,从名称开始。为了支持这一点,需要accumulate
,而不是collect
。
$tests: HashMap()
from accumulate( $test : TestData( name == $name ),
init( HashMap tests = new HashMap(); ),
action(
if (tests.get($name) == null) tests.put($name, new ArrayList();
tests.get($name).add($test);
),
reverse(
tests.get($name).remove($test);
),
result( tests )
);