访问运行时创建的流口水列表
Accessing list in drools which are created runtime
我有一个情况,我需要在drools中动态添加规则。如果它是一个简单的规则,我可以为其创建一个字符串并将其添加到 knowledgebase
中,但在某些情况下,我需要将列表作为规则的一部分包含在内,该列表也将动态创建。添加规则和添加列表将作为不同的事件发生。
我想到了一个 hashmap<String, List<String>>
,其中 key 是列表的名称,现在我想知道,有没有办法访问 hashmap,使用列表名称检索列表,并在 when
流口水的标准为:
$pojo:Pojo($listOfString : list1, $listOfString contains input)
同时将规则添加到 drools 中。
据我所知,即使在 pojo 中为列表起一个通用名称也行不通,就像在 fireRule
期间一样,流口水的人在选择要使用的列表时会完全困惑,如果我分配在触发规则时将值添加到列表中,然后对于每个规则,他将使用相同的列表,结果将与预期不同。
或者如果有任何其他方法可以达到同样的目的,请告诉我。
我正在使用 drools 5.1
您可以通过插入包含列表标识和元素值的查询事实来启动对其中一个列表中的元素的查询。 eval 应该在 IIRC 5.1.1 中工作。您可能必须防止键 x 没有列表以避免 NPE。
rule "is element y in list with key x"
when
Query( $x: key, $y: element )
Pojo( $map: map )
eval( $map.get($x).contains( $y ) )
then
...
end
最后,我能够通过稍微不同的规则格式实现相同的效果,但这一切都要感谢@laune 展示了正确的方法。规则可以写成:
rule "is element value in list with key key1"
when
pojo: Pojo($map:map)
entry: Entry() from $map.entrySet()
value : String() from entry.getValue()
key1 : String() from entry.getKey()
Boolean(booleanValue == true) from (value == pojo.input && key1 == pojo.key)
then
........
end
这里input
是我们要在列表中搜索的元素,key1
是输入要搜索的列表名
编辑
pojo.key
不会被使用,因为在创建规则时已经设置了列表名称,因此唯一的变量将是 String(pojo.value) 必须根据其评估列表。
我有一个情况,我需要在drools中动态添加规则。如果它是一个简单的规则,我可以为其创建一个字符串并将其添加到 knowledgebase
中,但在某些情况下,我需要将列表作为规则的一部分包含在内,该列表也将动态创建。添加规则和添加列表将作为不同的事件发生。
我想到了一个 hashmap<String, List<String>>
,其中 key 是列表的名称,现在我想知道,有没有办法访问 hashmap,使用列表名称检索列表,并在 when
流口水的标准为:
$pojo:Pojo($listOfString : list1, $listOfString contains input)
同时将规则添加到 drools 中。
据我所知,即使在 pojo 中为列表起一个通用名称也行不通,就像在 fireRule
期间一样,流口水的人在选择要使用的列表时会完全困惑,如果我分配在触发规则时将值添加到列表中,然后对于每个规则,他将使用相同的列表,结果将与预期不同。
或者如果有任何其他方法可以达到同样的目的,请告诉我。
我正在使用 drools 5.1
您可以通过插入包含列表标识和元素值的查询事实来启动对其中一个列表中的元素的查询。 eval 应该在 IIRC 5.1.1 中工作。您可能必须防止键 x 没有列表以避免 NPE。
rule "is element y in list with key x"
when
Query( $x: key, $y: element )
Pojo( $map: map )
eval( $map.get($x).contains( $y ) )
then
...
end
最后,我能够通过稍微不同的规则格式实现相同的效果,但这一切都要感谢@laune 展示了正确的方法。规则可以写成:
rule "is element value in list with key key1"
when
pojo: Pojo($map:map)
entry: Entry() from $map.entrySet()
value : String() from entry.getValue()
key1 : String() from entry.getKey()
Boolean(booleanValue == true) from (value == pojo.input && key1 == pojo.key)
then
........
end
这里input
是我们要在列表中搜索的元素,key1
是输入要搜索的列表名
编辑
pojo.key
不会被使用,因为在创建规则时已经设置了列表名称,因此唯一的变量将是 String(pojo.value) 必须根据其评估列表。