Hi All,
I have a bunch of rules that evaluate using some constant variable
(say "slackTicks"). Currently, in my rules, I write down the value
of this "slack" each and every time I use it, for example:
TransferSchedule( tick > currentTick - 10d )
where 10 is the slack.
A solution would be to insert constant facts:
Constant( key = "slack", $slackTicks : value )
TransferSchedule( tick > currentTick - $slackTicks )
Or inject a global properties object:
global Properties constants
$slackTicks :
Double.valueOf(constants.getPropertyValue("model.slack", "0"))
Or, the last one I can think of: a public final static on the fact
class:
TransferSchedule( tick > currentTick -
TransferSchedule.SLACK_TICKS )
These all cross the boundary between Java and Drools. In my Java
code I have to insert the Constant facts or inject the global. When
my drools developers think of some new ways to create the rules, I
run the risk of having to go in and modify the .properties file or,
worse, change the Java code.
To be able to define a "constant" would be a clean solution:
declare
constant double SLACK_TICKS = 10
;
...
TransferSchedule( tick > currentTick - SLACK_TICKS )
...
This separates the rules from the Java code and give the rules
developer all freedom to do whatever they want to make constant.
Ah, just thought of another way to do it. You can insert the facts
from within Drools itself:
declare Constant
key : String
value : Object
end
rule initialize
salience 100000
when
// always
then
insert( new Constant( "slack", 10d ) );
//... other constants go here
end
I will still have to "capture" the constants that I need in every
rule with a Constants( key == "...", $c : value ) premise, though...
And you would need to add some more Constant classes to cater to
contain type safety...
What's your thought? What strategy do you use?
Regards,
Willem