[rules-users] Guvnor and drools implementation - questions

Eddy Hautot eddyhautot at gmail.com
Fri Mar 4 09:43:39 EST 2011


Thank you for your answer.
Yes it's what i have done as i didn't find a better idea. User will have 
to enter it but if the DSL is clear shouldn't be a problem.

In fact 1 rule will be something like :
- Find a map with properties 'prop1' = "value1" and store it in variable 
$m1 (because i will need access in the Then part also)
- Find a map with properties 'prop1' = "value1" (and different then $m1) 
and store it in variable $m2.
- And using properties 'unixTimestampInSecond' and 
'unixTimestampInMillisecond' (so complete timestamp in Millisecond = 
'unixTimestampInSecond' * 1000 + 'unixTimestampInMillisecond') of the 2 
Maps, $m1 has to be before $m2.

So i use 2 times this one to find $m1 and $m2 : [when]The property 
{key:ENUM:Map.properties} of the map *{mapVar}* is {value}=*{mapVar} *: 
Map((this["{key}"] == "{value}"))

Then this one to drop the case when the Map would be the same : 
[when]The map *{mapVar1}* is not map *{mapVar2}*=*eval ({mapVar1}*["id"] 
!= *{mapVar2}*["id"]))*
*
Then i can do something like : [when]The map *{mapVar1}* is before 
*{mapVar2}*=*eval (orderTimeStamp(*(Long) 
*{mapVar1}*["unixTimestampInSecond"], (Long) 
*{mapVar1}*["unixTimestampInMillisecond"], (Long) *{mapVar2}*[" 
unixTimestampInSecond"], (Long) *{mapVar2}*["unixTimestampInMillisecond"]))*
*
where i would have a function *:
function Boolean orderTimeStamp(Long a, Long b, Long c, Long d)*
{
     Long timestamp1 = a*1000+b;
     Long timestamp2 = c*1000+d;

     if (timestamp1 <= timestamp2)
         return true;
     else
         return false;
}

I will rethink of POJO but i think, it will be more ennoying to update 
any change. I will need a reference to these maps in almost every case 
in the THEN clause so not a big problem finally.


For the second question :

In fact i have to make rules using these Enum and DSL and put rules in 
their specific files.
For example now i am working with 4 different drl files :

- file1.drl which contains rule1, rule2, rule3, rule4
- file2.drl which contains rule5, rule6, rule7, rule8
- file3.drl which contains rule9, rule10, rule11, rule12
- file4.drl which contains rule13, rule14, rule15, rule16

These files have to have this specific name and the name cannot change 
because the java code use this name to load the drl file in the session.

To put each rule in its specific file, do i have to create a package per 
file and name the package with the name of the file i want? And copy 
Enum and DSL in each package or can i put this in global? Or maybe be is 
there a better way i didn't find?


To use the Test Scenario, do you know if we have to do special things? I 
tried to add Maps in the Given part and run the scenario but i get an 
error ; "unable to find constructor for java.util.Map" and the same if i 
put a boolean, string...   Is the Guvnor Test Scenario not able to find 
java class and how to make it reachable?
I have already tried Test Scenario with adding object for which i gave a 
Pojo but never with basic java type.

Thanks again


Le 4/03/2011 11:50, Vincent Legendre a écrit :
> For your problem of different instances of a map : If you want to 
> match 2 maps, and compare them, your have to set a placeholder in your 
> DSL to set the variable's name
> [when]The property {key:ENUM:Map.properties} of the map *{mapVar}* is 
> {value}=*{mapVar} *: Map((this["{key}"] == "{value}"))
>
> **And another DSL phrase to check that instances are different
> [when]The map *{mapVar1}* is not map *{mapVar2}*=*eval 
> ({mapVar1}*["id"] != *{mapVar2}*["id"]))*
> *
> But it will force your users to handle variables. I can't see simpler 
> way for doing that with DSL.
>
> You may consider completely another way. If your property lists are 
> constant (and they are because you can create static enums), you can 
> write a simple program to generate the corresponding POJOs (which 
> contains the map inside them and use it in set/get methods for 
> corresponding key) and create a jar with them.
> Each POJO will then have its fields listed automatically in Guided 
> Editor, which will prevent you for writing complex DSL and enums, and 
> provide a good way for users to edit rules. For instance, you can bind 
> an object to a variable only if you need it (with DSL you are forced 
> to bind a variable at each time you use the phrase), and you can use 
> other operator (not only equals) without writing a new DSL phrase.
>
>
> I did not understand this question :
>
>> I have to put my rules in 4 drl files separate (i know which rules go 
>> in which drl file), is the only way to create a different package for 
>> each drl file i want? And to put the Enum and DSL part in Global if i 
>> have to use it for the 4 files? If i want a precise name for my drl 
>> file, i have to give this exact name to the package?
> But yes, a DSL (and enums) is specific to its package.
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110304/b2cf303f/attachment.html 


More information about the rules-users mailing list