首页 > 其他分享 >drools_07_macro_functions

drools_07_macro_functions

时间:2022-10-22 22:13:59浏览次数:59  
标签:drools functions 07 触发 modify update rule order 属性

delete()和retract() 宏函数

delete() 用于在rule RHS中将对象从工作内存中删除, retract()函数有同样的作用, 不过已经被标记为废弃状态.

insert() 宏函数

insert() 用于在rule RHS中增加新的fact对象, 新的fact对象会自动完成模式匹配, 所以需要避免循环触发问题.

update()和 modify() 宏函数

update和modify 用于在rule RHS中修改fact对象,并期望对该fact对象重新模式匹配, 如果不期望重新模式匹配, 不需要调用这两个宏函数, 调用这两个函数需要额外注意不要引起循环rule触发.

循环触发问题

当然, drools 也有机制尽量避免无谓的重复模式匹配, 具体说明:

  • 在update()/modify()所在的rule, 如果更新的属性同时用在了LHS条件中, 那么drools认为需要触发该规则, 这时很容易发生循环触发问题, 需要格外注意, 可以为rule增加 no-loop 属性来避免.
  • 在update()/modify()所在的rule, 如果修改的属性没用在了LHS条件中, drools会智能地判断出没有必要触发该规则, 对于该规则来讲是没有循环重复问题. 但如果先触发了另一个规则, 在那个规则中又对原规则的LHS条件属性做了修改, 这样还会出现循环触发问题, 这时即使加了no-loop 属性也不管用.
// 修改了amount属性, 但是LHS用的是originalPrice属性, 所以对于本规则不会循环触发
rule "not_worry_loop"
   when
       $order:Order(originalPrice>0)
   then
      $order.setAmount(100);
      update($order) ;
      System.out.println("rule fired") ;
end  
// 修改了amount属性, LHS也使用了amount属性, 所以会循环触发
rule "always_loop"
   when
       $order:Order(amount>0)
   then
      $order.setAmount(100);
      update($order) ;
      System.out.println("rule fired") ;
end    

update() 和 modify()区别

  • 推荐使用 modify() 而不是 update()
    官方的解释是: After a fact has changed, you must call update before changing another fact that might be affected by the updated values. To avoid this added step, use the modify method instead.
  • 语法比较
    update()语法简单, modify()语法比较奇怪, 要将修改的属性包在{ } 中, 见下面的示例.
rule "not_worry_loop2"
   when
       $order:Order(originalPrice>0)
   then
      modify($order) {
        setAmount(100);
      }
      System.out.println("rule fired") ;
end  

标签:drools,functions,07,触发,modify,update,rule,order,属性
From: https://www.cnblogs.com/harrychinese/p/drools_07_macro_functions.html

相关文章

  • 07 Ceph 集群运维
    目录Ceph守护服务管理全局管理一台机器有多个ceph服务STARTINGALLdaemonsSTOPPINGALLdaemons服务分类管理STARTINGALLDAEMONSBYTYPESTOPPINGALLDAEMONSBYTY......
  • P2607 [ZJOI2008] 骑士
    #include<bits/stdc++.h>//#include<windows.h>usingnamespacestd;#definelllonglongconstintN=1e6+1;intn;inth[N],nt[N*2],to[N*2];intcnt;voidadd(i......
  • Python教程Day07-集合
    集合一、创建集合创建集合使用​​{}​​​或​​set()​​​,但是如果要创建空集合只能使用​​set()​​​,因为​​{}​​用来创建空字典。s1={10,20,30,40,50}pri......
  • 单调栈(P1823 [COI2007] Patrik 音乐会的等待)
    [COI2007]Patrik音乐会的等待题目描述\(n\)个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人\(a\)和......
  • LY3207/LY3208可定时18秒36秒集成充电马达
    概述LY3208 是一款可充电的带使能控制的马达驱动芯片,集成了锂电池充电管理模块、马达驱动控制模块和保护模块,关机待机电流仅 5uA。LY3208 充电电流为 0.3A-1A 可调,最大......
  • [Typescript] Tips: Use assertion functions inside classes
    Youcandosomereally,reallyneatstuffwithassertionfunctionsinsideclasses.Here,weassertthattheuserisloggedinandgetproperinferenceontheu......
  • 自然语言处理学习笔记-lecture07-句法分析01
    句法分析(syntacticparsing)的任务就是识别句子的句法结构(syntacticstructure)。包含短语结构分析(Phraseparsing)和依存句法分析(Dependencyparsing)短语结构分析......
  • Python教程Day07-列表
    一、列表的应用场景当我们需要存一个数据时,可以直接使用变量,但是,当我们要存储100个,设置更多的时候,变量肯定不行,这时候我们要用啥?此时列表就有它的用武之地了,一次性存储多个......
  • 07代码
    1classGeese:   '''大雁类'''   def__init__(self,beak,wing,claw):       print('我是大雁类!我有以下特征:')       print(beak)   ......
  • 02 - functions
    functionsSummingUpDigitsusingfunctiontosolveit//everytimegetthelastdigitandadd.intsumOfDigitsOf(intn){intresult=0while(n>0......