Объявленные типы могут быть доступны в объявленных функциях. Однако из вашего примера кажется, что вам просто нужно иметь возможность работать с объектами 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, а именно с разделом о функциях; раздел об объявленных типах следующий и довольно обширный.