Итерация списка объектов класса в механизме правил Drools

Я изучаю Drools с помощью Kie Workbench. мой ввод будет именем внутри класса возможного продукта, и я ожидаю вывода в Ip внутри класса возможности. после выполнения механизма правил я получаю на выходе только нулевое значение.

Структура Pojo:

Opportunity.Java :
    private java.lang.Boolean result;
    private java.lang.String ip;
    private java.util.List<com.sample2.sampledemo2.OpportunityProduct> productlist;

OpportunityProduct.Java
    private java.lang.String name;

Ввод:

{
   "commands":[
      {
         "insert":{
            "out-identifier":"com.sample2.sampledemo2.Opportunity",
            "return-object":true,
            "object":{
               "com.sample2.sampledemo2.Opportunity":{
                  "productlist":[
                     {
                        "name":"abc"
                     }
                  ]
               }
            }
         }
      },
      {
         "fire-all-rules":""
      }
   ]
}

Вывод:

{
   "type":"SUCCESS",
   "msg":"Container abcdef successfully called.",
   "result":{
      "execution-results":{
         "results":[
            {
               "key":"",
               "value":0
            },
            {
               "key":"com.sample2.sampledemo2.Opportunity",
               "value":{
                  "com..sample2.sampledemo2.Opportunity":{
                     "result":null,
                     "ip":null,
                     "productlist":[
                        {
                           "name":"abc"
                        }
                     ]
                  }
               }
            }
         ],
         "facts":[
            {
               "key":"com.sample2.sampledemo2.Opportunity",
               "value":{
                  "org.drools.core.common.DefaultFactHandle":{
                     "external-form":"0:2:1366747666:1366747666:2:DEFAULT:NON_TRAIT:com.sample2.sampledemo2.Opportunity"
                  }
               }
            }
         ]
      }
   }
}

Таблица решений:

NAME                  CONDITION                               ACTION

           o:Opportunity(pd: productlist)
             OpportunityProduct
      (name == $param , this memberOf pd)      o.setIp($param);

Origination  "abc"                                  "IPP"

Доктор :

rule "Origination"
    when
        o:Opportunity(pd: productlist)
        (OpportunityProduct(name == "abc" , this memberOf pd))
    then
        o.setIp("IPP");
end

Я не смог определить, неверен ли мой ввод или условие в таблице решений неверно.


person Saravanan    schedule 26.02.2019    source источник


Ответы (2)


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

Помните, что в Drools вы можете рассуждать только о фактах, которые были вставлены в ваш сеанс, и что вложенные объекты внутри факта сами по себе не являются фактами.

Если вы не планируете вставлять OpportunityProduct в качестве независимых фактов, вы можете использовать условный элемент from для рассуждения о данных, которые не являются фактами:

rule "Origination"
    when
        o:Opportunity(pd: productlist)
        OpportunityProduct(name == "abc") from pd
    then
        o.setIp("IPP");
end

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

person Esteban Aliverti    schedule 27.02.2019

Это связано с тем, что по умолчанию интерфейс отдыха kie-сервера работает так:

1) На стороне клиента A, связанный с B (A.b=b)

2) Вы вставляете A, а затем B

3) на стороне сервера для каждой команды вставки будет:

3.1) объект A (вставленный в сеанс kie), связанный с экземпляром B1 (который не вставлен)

3.2) другой экземпляр B2 (точная копия содержимого B1, но не связанная с A)

Здесь два решения:

1) Живите с этим и используйте от

2) сделайте свое собственное расширение kie-сервера, и это то, что я делаю в моем проекте с открытым исходным кодом, чтобы упростить жизнь с помощью drools. Все мои клиенты используют этот тип kie-сервера, который вставляет путем отражения все объекты Java, подключенные к верхнему объекту (большую часть времени называется запросом)

С Уважением

person Nicolas Héron    schedule 28.02.2020