Drools: добавить функцию, определенную в drools, во внешний список - PullRequest
0 голосов
/ 30 октября 2019

Для меня требуется вызов некоторых функций, определенных в 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

Я что-то здесь не так делаю? Слюни поддерживают это?

...