代码之家  ›  专栏  ›  技术社区  ›  piyushj Ragesh Kumar

访问运行时创建的drool中的列表

  •  0
  • piyushj Ragesh Kumar  · 技术社区  · 10 年前

    我有一种情况,我需要在drools中动态添加规则。如果这是一个简单的规则,我可以为其创建一个字符串并将其添加到 knowledgebase ,但在某些情况下,我需要将列表作为规则的一部分,它也将动态创建。添加规则和添加列表将作为不同的事件发生。

    我想有一个 hashmap<String, List<String>> 其中key是列表的名称,现在我想知道,是否有方法访问hashmap,使用列表名称检索列表,并在中使用 when 口水标准如下:

    $pojo:Pojo($listOfString : list1, $listOfString contains input)
    

    同时将规则添加到drools中。

    据我所知,即使在pojo中为列表取一个通用名称也不会像在 fireRule ,drools在选择要使用的列表时会完全困惑,如果我在触发规则时为列表赋值,那么对于每个规则,他都将使用相同的列表,结果将与预期不同。

    或者如果有其他方法可以达到同样的效果,请告诉我。

    我在用口水5.1

    2 回复  |  直到 10 年前
        1
  •  0
  •   laune    10 年前

    您可以通过插入包含列表标识和元素值的query事实来启动一个列表中元素的查询。评估应符合IIRC第5.1.1条的规定。为了避免NPE,您可能必须防止密钥x没有列表。

    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 
    
        2
  •  0
  •   piyushj Ragesh Kumar    10 年前

    最后,我能够通过稍微不同的规则形成实现同样的目标,但这都要感谢@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),list必须根据它进行计算。