[
https://issues.jboss.org/browse/DROOLS-365?page=com.atlassian.jira.plugin...
]
Davide Sottara commented on DROOLS-365:
---------------------------------------
I see your use case. Here is another possible way to do it. If you like it, we may work on
getting it into master by default.
We need the notion of "Undercutting", borrowed from non-monotonic logic. This is
the core idea, to be expanded on as needed.
Imagine you have two rules potentially triggered by the same object(s), and you want one
to take precedence over the other.
Use an annotation like @Undercuts in the first, passing the name of the other rule as an
argument.
{code}
rule "handle all Bars of type second"
@Undercuts( others )
when
$bar : Bar( type == 'second', $total : total )
then
System.out.println( "Second bars " + $total );
end
rule "others"
when
$bar : Bar( $total : total )
then
System.out.println( "Other bars " + $total );
end
{code}
In the main, enable the declarative agenda:
{code}
knowledgeBaseConfiguration.setOption( DeclarativeAgendaOption.ENABLED );
{code}
And finally add a "utility" rule. This rule is generic, but its purpose is to
enable the desired functionality:
{code}
rule "Undercut"
salience 9999 // should have max priority
when
$m : Match( $handles : factHandles )
$v : Match( rule.name == $m.Undercuts, factHandles == $handles )
then
System.out.println( "Activation of rule " + $m.getRule().getName() + "
overrides " + $v.getRule().getName() + " for tuple " + $handles );
kcontext.cancelMatch( $v );
end
{code}
Let me know if this would be enough for your concrete use case.
Davide
Rule attribute for adding inverse of consequence as rule condition
------------------------------------------------------------------
Key: DROOLS-365
URL:
https://issues.jboss.org/browse/DROOLS-365
Project: Drools
Issue Type: Feature Request
Security Level: Public(Everyone can see)
Affects Versions: 5.5.0.Final
Reporter: Adar Dembo
Assignee: Mark Proctor
I have quite a few rules that look like this:
{noformat}
rule "if foo then bar"
when
Foo($a : a, $b : b)
not Bar(a == $a, b == $b)
then
insert(new Bar($a, $b));
end
{noformat}
This is a fairly common pattern for me: a rule should not activate if the facts generated
by its consequence were already asserted. It's a pattern I use extensively to generate
linear (i.e. non-repeating) workflows.
Ideally I'd be able to express it as follows:
{noformat}
rule "if foo then bar"
condition-on-inverse-of-consequence
when
Foo($a : a, $b : b)
then
insert(new Bar($a, $b));
end
{noformat}
And {{condition-on-inverse-of-consequence}} would cause Drools to generate the right kind
of condition, which would be the inverse of the fact changes made by the consequence.
I think {{lock-on-active}} is similar but harsher: it prevents the rule from firing a
second time altogether, regardless of input. At least, that's based on my reading of
the docs. In my example, that would be equivalent to {{not Bar()}} condition in the rule,
which is stricter than {{not Bar(a == $a, b == $b)}}.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira