使用“not”根据类类型调整条件中的变量声明

时间:2013-09-16 10:33:22

标签: java drools

我正在处理在Drools中扩展公共基类的消息,对于一个类型,我需要在规则条件中为变量定义调用不同的getter。对于异常和所有其他类,值都是 int ,但getter名称不同。否则规则完全相同,这就是为什么我试图在一个规则中解决它。

public class ClassBase {
    private int baseVal = 42;
    public int getBaseVal() {
        return baseVal;
    }
}

public class ClassA extends ClassBase {
    private int myVal = 42;
    public int getAval() {
        return myVal;
    }
}

public class ClassB extends ClassBase {
    private int myVal = 42;
    public int getBval() {
        return myVal;
    }
}

public class SomeClassWithInt {
    private int comp = 42;
    public int getComp() {
        return comp;
    }
}

我的目标是使用变量来查找其他事实,并在结果中使用它。

rule "different getter depending on class type"
when
    $base: ClassBase()
    ( ClassB( this == $base, $value: bval ) or
      not ClassB( this == $base, $value: baseVal ))
    $some: SomeClassWithInt( comp == $value )
then
    System.out.println($value);
end

现在,如果我添加一个 ClassA ,一个 ClassB 和一个 SomeClassWithInt ,并调用 fireAllRules()这个规则不开火。如果我用 ClassA(...)替换 not classB(...)部分,它的工作方式就像我想要的那样。

有人可以告诉我为什么版本不起作用吗?

2 个答案:

答案 0 :(得分:1)

经过一番研究后,我找到了解决方案。

rule "Working"
when
    $base: ClassBase( )
    (ClassB( this == $base, $value : bval ) or
    ClassBase( this == $base, $cl : class, $cl != ClassB, $value : baseVal) )
then
    // Do something with $value
end

this comment中所述,我之前尝试过此操作,但没有分配给$cl这不应该是必要的,但我的版本(它是一个自定义版本,不知道它是基于什么版本)的Drools似乎有一个错误,版本class != ClassB不起作用。

答案 1 :(得分:0)

显然,满足条件not ClassB(this == $base, $value:baseVal)意味着$value仍然未绑定。因此Drools正确拒绝允许您使用此变量。