Как получить доступ к общим объявленным типам из функции в Drools? - PullRequest
0 голосов
/ 14 сентября 2018

Здесь у меня несколько правил в файле .drl. Они обновляют 6 разных JSONArray. Эти обновления происходят в разделе «тогда» Drools. Вместо того, чтобы иметь подобную логику внутри правила, я пытаюсь написать функцию, которая обновит 6 JSONArray. Как это возможно?

declare USER1_LIST
     querysetUser1 :JSONArray
end
declare USER2_LIST
     querysetUser2 :JSONArray
end
......
......
......

Инициализация происходит по правилу «Настройка» с самым высоким значением -

rule "setUp"
salience 25
when
then
USER1_LIST user1_list = new USER1_LIST();
user1_list.setQuerysetUser1(new JSONArray());
insert(user1_list);
....

В правиле я использую один из списков на основе логики -

rule "RULE_XYZ"
salience 5
when
USER1_LIST($querysetUser1 :querysetUser1)
...<Some code>
then
...<Some code>
$querysetUser1.add(...);

Здесь я хочу выполнить операцию "$ querysetUser1.add (...);" внутри функции. Эти JSONArray обновляются по другим правилам. Поэтому моя цель состоит в том, чтобы переместить логику выбора JSONArray и обновить его в функции, чтобы только эта функция вызывалась из различных правил.

1 Ответ

0 голосов
/ 14 сентября 2018

Объявленные типы могут быть доступны в объявленных функциях. Однако из вашего примера кажется, что вам просто нужно иметь возможность работать с объектами JSONArray, содержащимися в объявленных типах.

Функция будет выглядеть примерно так:

function void addToQuerySet(JSONArray querySet, JSONObject object) {// I have guessed the type of 'object'
  querySet.add(object);
}

И вы бы вызвали его из предложения then:

rule "RULE_XYZ"
when
  USER1_LIST($querysetUser1 :querysetUser1)
  // ...<Some code>
  someObject: JSONObject() // the thing to insert
then
  addToQuerySet($querysetUser1, someObject);
end

То, что вы не можете сделать, - это написать универсальный метод, который будет принимать любой из объявленных вами типов USER1_LIST, USER2_LIST и т. Д., Потому что они являются уникальными и не связанными типами, даже если они все имеют одинаковую структуру.

Обратите внимание, что тот факт, что ваши объявленные типы, имеющие одинаковую структуру, указывают на плохой дизайн - вполне вероятно, что все они должны быть экземплярами одного типа, с каким-то другим способом определения, к какому пользователю он принадлежит. Например, что-то вроде этого:

declare UserList 
  querySet: JSONArray
  userNum: int
end

Где userNum будет указывать, для какого пользователя это. Затем вы могли бы написать функцию, которая принимает UserList и JSONObject (или что-то типа того, что вы добавляете в набор запросов), например так:

function void addToQuerySet(UserList userList, JSONObject object) {
  userList.getQuerySet().add(object);
}

И вызвать его в предложении then следующим образом:

rule "RULE XYZ version 2"
when
  $user1List: UserList( userNum == 1, querySet != null)
  // more code
  $someObject: JSONObject() // to insert
then
  addToQuerySet( $user1List, $someObject );
end

Пожалуйста, обратитесь к документации здесь . Я связался с документацией Drools 7.11.0.Final, а именно с разделом о функциях; раздел об объявленных типах следующий и довольно обширный.

...