Для меня требуется вызов некоторых функций, определенных в drools, перед добавлением данных в рабочую память.
Say Person (name: String, age: int) является объектом данных и говорит, что одно правило заботит только имяи другие только возраст. Поэтому я хотел отфильтровать нежелательные данные. Person - простой пример, но у меня есть данные с тысячами полей.
Идея для этого состоит в том, чтобы определить набор функций, которые преобразуют Person для выбора только необходимых данных в файле drl, например,
f1: Person -> Int
f2: Int -> String
Затем я использую эти функции для предварительной обработки моих данных и, наконец, вставляю результат:
Person -> f1 -> f2 -> session.insert(obtained result)
Чтобы достичь этого, я пытаюсь определить правило, в котором я добавляюопределения функций в drools для внешнего списка и внешнего вызова этих функций для фильтрации данных.
Я изменил "testMethodReferenceInRHS" in Misc2Test.java
Drools для тестирования и попал в стену. Я получаю эту ошибку:
16:15:20.343 [main] ERROR o.d.c.k.b.impl.AbstractKieProject.buildKnowledgePackages:267 - Unable to build KieBaseModel:defaultKieBase
Rule Compilation error : [Rule name='Example with Lambda expression']
defaultpkg/Rule_Example_with_Lambda_expression218752065.java (12:624) : list cannot be resolved
Код, который я пытался:
String drl =
"global java.util.List list;\n" +
"function Object doit(Object o){return o;}\n"+
"rule \"Example with Lambda expression\"\n" +
" when\n" +
" then\n" +
" java.util.function.Function<Object,Object> f = (Object o) -> {\n" +
" System.out.println(\"called\"); \n " +
" doit(o);\n" +
" };\n"+
" java.util.List<Integer> $list = java.util.Arrays.asList(1, 2, 3, 4);\n" +
" $list.forEach(y -> list.add(f));\n" +
"end\n";
KieSession ksession = new KieHelper().addContent( drl, ResourceType.DRL )
.build()
.newKieSession();
List<Integer> list = new ArrayList<>();
ksession.setGlobal( "list", list );
ksession.fireAllRules();
assertEquals( 4, list.size() );
Затем я пытался:
"global java.util.List list;\n" +
"function Object doit(Object o){return o;}\n"+
"rule \"Example with Lambda expression\"\n" +
" when\n" +
" then\n" +
" java.util.function.Function<Object,Object> f = (Object o) -> doit(o);" +
" java.util.List<Integer> $list = java.util.Arrays.asList(1, 2, 3, 4);\n" +
" $list.forEach(y -> list.add(f));\n" +
"end\n";
Выше один дает:
16:38:47.676 [main] ERROR o.d.c.k.b.impl.AbstractKieProject.buildKnowledgePackages:267 - Unable to build KieBaseModel:defaultKieBase
Rule Compilation error : [Rule name='Example with Lambda expression']
defaultpkg/Rule_Example_with_Lambda_expression1329504409.java (7:474) : Unhandled exception type Exception
Я что-то здесь не так делаю? Слюни поддерживают это?