我可以在规则触发之前在drl文件中添加事实(基本上是“之前”的“when”子句)吗?

时间:2015-08-04 21:51:40

标签: drools

我正在考虑生成(或“编译”)来自单独数据模型的drl文件。理想情况下,我想让drl文件尽可能自包含,并且不需要与相应的java代码进行大量交互(插入事实,设置全局变量等)。

我知道我可以在drl规则中声明事实(类),我可以在“then”结果中插入事实。 我也知道我可以在规则中使用全局变量,但我需要在我的会话中明确设置它们(即在java代码中)。

有没有办法在规则被触发之前将事实实例添加到工作内存中但仍然不在任何Java代码之外?

示例代码:

declare SomeFact end;

// pseudo code as I dont know if its possible
$listOfStrings = {"one", "two", "three"}; 

rule "some name"

when 
    $someFact:SomeFact($code:code)
    $listOfStrings contains $code

then
    // ...

这个想法是,在创建时我知道我需要在我的规则中确定一系列事实来检查。现在可以在任何java代码之外插入那些插件吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您希望将所有内容都放在DRL文件中,您可以使用以下模式:

declare SomeFact
    code: String
end

rule kickoff
  salience 999999999
when
then
  // initialize globals, if necessary
  // insert facts      
  insert( new SomeFact( "one" ) );
end

规则可以写成

rule "some name"
when 
  $someFact: SomeFact( code in ("one", "two", "three") )
then
  // ...
end