Извлечение фактов определенного типа из оперативной памяти

Вместо того, чтобы извлекать все факты, мне нужно извлекать факты определенного типа из рабочей памяти.

я узнал, что могу извлечь все факты из рабочей памяти, как показано ниже.

drools.getWorkingMemory().getWorkingMemoryEntryPoint("Stream").getObjects();

Предоставьте несколько указателей для извлечения объектов определенного типа из рабочей памяти.


person user1668653    schedule 22.02.2013    source источник


Ответы (2)


Вместо использования метода 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, вы можете использовать функцию накопления в своем запросе.

Надеюсь, поможет,

person Esteban Aliverti    schedule 23.02.2013

Вы можете использовать ObjectFilter

Collection<Object> myfacts = session.getObjects( new ClassObjectFilter(MyFact.class) );

К сожалению, в Drools 5.5.0 Final метод contains результирующей коллекции не работает должным образом. Обычно метод contains возвращает true, если искомый объект равен чему-то в коллекции, но коллекция Drool находит только объекты, имеющие одинаковую ссылку (используется == для сравнения объектов).

person kao    schedule 05.06.2013