Drools规则来自不匹配的列表对象

时间:2014-07-17 22:23:14

标签: drools

我有一个包含列表的类。列表中的项目具有子类型。我希望这个类中的每个事实都包含具有相同子类型的项目列表。我正在尝试编写一个规则,该规则可以获取来自同一列表的所有项目,并检查它们是否具有不同的子类型。 以下尝试无法编译最后一个条件:

public class ListContainer {
    private List<MyType> myTypes;
    //getters-setters-hashcode-equals generated by eclipse
    ...
}



public class MyType{
    private String subType;
    //getters-setters-hashcode-equals generated by eclipse
    ...
}

rule "invalidate inconsistent subtypes"
    when
        $list: ListContainer($myTypes: myTypes)
        $myType1 : MyType() from $myTypes
        $myType2 : MyType() from $myTypes
        not($myType1.subType == $myType2.subType)
    then
        //actions
end

编译错误说它无法解析$ myType1.subType 我怀疑使用关键字from获得的项目不会转换为原始类。但是我不是要编译这个,我只是在寻找这个问题的最佳规则。

非常感谢。


这是由于laune评论编译的版本:

rule "invalidate inconsistent subtypes"
    when
        $list: ListContainer($myTypes: myTypes)
        $myType : MyType( $subType: subType ) from $myTypes
        exists MyType( subType != $subType ) from $myTypes
    then
        //actions
end

1 个答案:

答案 0 :(得分:1)

(术语“子类型”在Java中具有特定含义。最好使用另一个术语,例如“kind”。)

你拥有的not在语法上是不正确的。使用Java的逻辑否定的eval可能有效,但这里只是确定ListContainer是否具有不同MyType.subType值的列表的版本:

rule "invalidate inconsistent subtypes"
when
    $list: ListContainer($myTypes: myTypes)
    MyType( $st0: subType ) from $myTypes.get( 0 )
    exists MyType( subType != $st0 ) from $myTypes
then
    System.out.println( "mismatch " + $st0 );
end

有多少不同的值,它们在哪里是另一回事。

这是您的版本,已更正:

rule "invalidate inconsistent subtypes"
when
    $list: ListContainer($myTypes: myTypes)
    $mt1: MyType( $st1: subType ) from $myTypes
    $mt2: MyType( $st2: subType ) from $myTypes
    eval( ! $st1.equals( $st2 ) )
then
    System.out.println( "mismatch " + $st1 + " " + $st2 );
end

但正如Steve正确评论的那样,在单个ListContainer中,每对不同的值会触发两次。