Geoffrey De Smet wrote:
How hard would it be to allow something like this in the DRL?

rule "myRule"
  when
    t: Total()
    ... // a bunch of complicated fact constraints
  then
    t.increment();
  undo-then
    t.decrement();
end

The current workarounds don't are clunky:
- Writing an negative (opposite) rule isn't efficient: it means declaring the rule twice effectively. Also the negative rule is usually using lots of or's and not's which isn't fast.
- Using logical inserts is a more heavy weight (= slower).

This sounds like my logical closure/stateful callback idea that I'd like to do, where a closure is called when a rule is no longer true. So in the "then" part you would do something using MVEL like lamba expressions:
logicalClosure( [a, b, c] { my closure code here } );

Where a, b, c are the variables to capture from the surrounding scope and the my closure here is the code to be executed. In java it would look something like

final Map vars = new HashMap();
vars.put( "a", a );
vars.put( "b", b);
vars.put( "c", c);

Closure closure = new Closure() {
  private Map vars;
   public void call() {
       a = vars.get(a");
       b = vars.get("b");
       c = vars.get("c");
       .... my closure code here;
   }
   public void setVars( Map vars ) {
       this.vars = vars;
   }
}

closure.setVars( vars );

so it forms a sort of encapsulated command that is called when the rule is no longer true.

Mark



Here's another description of this feature request from the user mailing list:

Ah, well that's my point of ignorance, then. I was thinking in stateless mode. :) And to do what I suggest in a stateful manner would require a "modifyLogical" type functionality in place of the insertLogical. i.e.

modifyLogical (object) {
  //do this when the condition obtains
} else {
  //do this when the condition no longer obtains
}

Could be an interesting functionality to have, though.




_______________________________________________
rules-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-dev

Reply via email to