如何从 Drools 中的函数访问常见的声明类型?

How to access common declared types from a function in Drools?

我在 .drl 文件中有多个规则。他们正在更新 6 个不同的 JSONArray。这些更新发生在 Drools 的 "then" 部分。我没有在规则中使用类似的逻辑,而是尝试编写一个函数来更新 6 JSONArray。这怎么可能?

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

初始化发生在具有最高显着性的 "Set Up" 规则中 -

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 并在函数中更新它的逻辑,以便从不同的规则中只调用这个函数。

声明的类型可以在声明的函数中访问。但是,从您的示例来看,听起来您只需要能够对声明类型中包含的 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_LISTUSER2_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

请参考文档here。我已经链接到 Drools 7.11.0.Final 文档,特别是关于函数的部分;关于声明类型的部分是以下部分并且非常广泛。