在drools中使用collect来获取类似的对象

时间:2014-05-06 22:22:27

标签: drools business-rules

我正在尝试收集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中应该存在足够聪明的东西来匹配这种方式。

1 个答案:

答案 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 )
    );