2013-02-22 5 views
5

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

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

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

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

ответ

4

Вместо использования метода getObjects() вы можете использовать запрос. Запросы, как правила без РИТ:

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

Надеется, что это помогает,

5

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

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

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