2016-01-06 77 views
1

我在Drools的以下情形:插入嵌套对象为KieSession

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 

我的问题是:有没有什么办法来加载比的嵌套荷载回路更快的方式,所有的嵌套的事实吗?

我希望我的问题有道理。

感谢您的反馈。

回答

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不会“扁平化”的递归组的集合 - 怎么可能任何SW读你的心,当你想Cs的列表扩大但不是Ds的名单?

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

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