将嵌套对象插入KieSession

时间:2016-01-06 17:46:09

标签: performance session object nested drools

我在Drools中有以下场景:

package test;

public class A {
   public ArrayList<B> b = new ArrayList<B>();
}

public class B {
   public ArrayList<C> c = new ArrayList<C>();
   public ArrayList<D> d = new ArrayList<D>();
}

public class C {
   some attributes
}

public class D {
   some attributes
}

当我要将这些事实插入KieSession时,为了使它们直接进入工作记忆,我必须遍历整个对象,即:

for( int i=0; i< a.getB().size(); i++ ){
    ksession.insert(a.getB().get(i));
    for( int j=0; j< a.getB().get(i).getC().size; j++ ){
         ksession.insert(a.getB().get(i).getC().get(j));
         etc...
    }
}

根据我的理解,如果您不想通过其父级访问一个对象,则必须这样做,例如:

rule "Do something with B"
    when
        B()
    then
        ....
end

而不是

rule "Do something with B"
    when
       A.b()
then
       ....
end

我的问题是:有没有办法以比嵌套FOR LOOP加载更快的方式加载所有嵌套事实?

我希望我的问题有道理。

感谢您的反馈。

1 个答案:

答案 0 :(得分:1)

使用流畅的Java语句编写它看起来并不那么糟糕:

for( B b: a.getB() ){
     for( C c: b.getC() ) ksession.insert( c );
     for( D d: b.getD() ) ksession.insert( d );
     ksession.insert( b );
}

Drools不会“压扁”一组递归的集合 - 当你想要扩展C的列表而不是D列表时,任何SW如何读取你的想法?

可能没有必要对所有列表执行此操作或直到最后一级。在编写需要引用集合中的子对象的规则时,from子句在某些情况下可能是更好的选择。

另外,请检查您的对象模型。使这些列表收集子对象可能不是最好的决定。有许多方法可以表示图形,有些方法通过避免重复字段更接近某些范式,这也有助于编写规则。