我在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加载更快的方式加载所有嵌套事实?
我希望我的问题有道理。
感谢您的反馈。
答案 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
子句在某些情况下可能是更好的选择。
另外,请检查您的对象模型。使这些列表收集子对象可能不是最好的决定。有许多方法可以表示图形,有些方法通过避免重复字段更接近某些范式,这也有助于编写规则。