【发布时间】:2013-02-22 23:51:04
【问题描述】:
我需要从工作记忆中检索特定类型的事实,而不是检索所有事实。
我了解到我可以从以下工作记忆中检索所有事实。
drools.getWorkingMemory().getWorkingMemoryEntryPoint("Stream").getObjects();
请提供一些指针以从工作内存中检索特定类型的对象。
【问题讨论】:
标签: drools drools-fusion
我需要从工作记忆中检索特定类型的事实,而不是检索所有事实。
我了解到我可以从以下工作记忆中检索所有事实。
drools.getWorkingMemory().getWorkingMemoryEntryPoint("Stream").getObjects();
请提供一些指针以从工作内存中检索特定类型的对象。
【问题讨论】:
标签: drools drools-fusion
您可以使用查询来代替使用 getObjects() 方法。查询就像没有 RHS 的规则:
query "getObjectsOfClassA"
$result: ClassA()
end
您可以在查询中使用 DRL 语言的所有功能来创建真正复杂的匹配模式。你甚至可以将参数传递给查询:http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e7632
然后,在您的 java 代码中,您可以使用以下方法调用您的查询:
QueryResults results = ksession.getQueryResults( "getObjectsOfClassA" );
for ( QueryResultsRow row : results ) {
ClassA classA = ( ClassA ) row.get( "$result" ); //you can retrieve all the bounded variables here
//do whatever you want with classA
}
如果您需要所有 ClassA 的集合,您可以在查询中使用累积函数。
希望对你有帮助,
【讨论】:
你可以使用 ObjectFilter
Collection<Object> myfacts = session.getObjects( new ClassObjectFilter(MyFact.class) );
不幸的是,在 Drools 5.5.0 Final 中,生成的集合的 contains 方法无法按预期工作。通常一个 contains 方法返回 true,如果在集合中搜索到的对象 equals,但是 Drool 的集合只找到具有相同引用的对象(它使用 == 来比较对象)。
【讨论】: