Aha! That's exactly the sort of syntax I was looking for! :)

I just couldn't find any examples of the DRL syntax for 'creating' a value like 
that in the LHS. A quick test with a contrived little example shows me that the 
following works:

rule "Warn when my meal is too large"
when
    $meal: Meal($calories: calories > 1000)
    $unit: String() from "calories"
then
    insert(new MealTooBigWarning("That meal is bigger than your 1000 " + $unit 
+ " limit."));
end

So, based on that I'm able to write a DSL like this:

[when][]I am given a meal of more than "{sizeLimit}" "{unit}" = $meal: 
Meal($size: {unit} > {sizeLimit}); $sizeLimit: Integer() from {sizeLimit}; 
$unit: String() from "{unit}"
[then][]Warn that the meal is too big = insertLogical(new 
MealTooBigWarning("That meal is bigger than your " + $sizeLimit + " " + $unit + 
" meal limit."));

Which means that I can write DSLR like this:

rule "Warn when my meal has too many calories"
when
    I am given a meal of more than "1000" "calories"
then
    Warn that the meal is too big
end

… which gives me:

That meal is bigger than your 1000 calories meal limit.

Or this:

rule "Warn when my meal has too many diet club points"
when
    I am given a meal of more than "11" "dietClubPoints"
then
    Warn that the meal is too big
end

… which gives me:

That meal is bigger than your 11 dietClubPoints meal limit.

So I can define an enumeration:

'MealSize.units': ['calories=calories', 'dietClubPoints=diet club points']

So that in Guvnor, I have a single sentence with a drop-down menu containing 
the options "calories" and "diet club points". That keeps things nice and clean 
for the users.

Thanks for the pointer.

Steve


ps - My 'real' application is validating different types of exposure limits for 
a hedge fund, but the examples above seemed a bit more readable for anybody who 
doesn't work for a hedge fund. :)



On 4 Jun 2013, at 17:18, Davide Sottara <[email protected]> wrote:

> The usual (and only reasonable way) to "set" a variable in the LHS is to bind 
> it to a Drools variable, 
> including things like:
> 
> ...
> $x : String() from /* expression here */
> ...
> 
> any usage of the "=" operator is generally suspicious.. 
> but I'm not sure I have understood your use case completely.. :)
> 
> 
> 
> On 06/04/2013 05:59 PM, Stephen Masters wrote:
>> Thanks for the cheat idea Mike. I wasn't really expecting any help from the 
>> tooling itself. Just hoping that there might be some trickery within the DSL 
>> that I could try, to generate some code which would set up a variable for me.
>> 
>> Unfortunately I do need to combine LHS sentences and multiple RHS sentences, 
>> so your idea isn't really an option in this case. :(
>> 
>> As it is I have created a little enumeration in the RHS sentence, and it's 
>> not looking too bad. At least, with some selective wording, it doesn't look 
>> completely redundant!
>> 
>> Steve
>> 
>> 
>> 
>> On 4 Jun 2013, at 16:33, Michael Anstis <[email protected]> wrote:
>> 
>>> This would need to be provided by the tooling; I don't think it's something 
>>> that's even remotely possible at runtime (unless you stored the field name 
>>> in a Fact and used reflection on the RHS).
>>> 
>>> That said (and you're going to guess my next comment) this is not provided 
>>> in the guided editors. Depending on how complex your DSLs are and whether 
>>> users need to combine DSL Sentences; IDK if a "cheat" works:
>>> 
>>> [when]Do something with {field} and {value}=$f : Fact({field}=={value} then 
>>> $f.{field} = {value}
>>> 
>>> I've not tried it; nor know whether it fits your requirements.. but a hack 
>>> worth trying?
>>> 
>>> 
>>> On 3 June 2013 17:40, stephen.masters <[email protected]> wrote:
>>> Hi folks,
>>> 
>>> Is there a decent way to set a value in the LHS of a rule so that it's 
>>> available in the RHS?
>>> 
>>> Reason being I have a DSL driving the guided rules editor which will pluck 
>>> out the value of a field, where the name of that field is driven by a drop 
>>> down menu enumeration.
>>> 
>>> A change I now have would be a lot easier if I could assign a string to a 
>>> variable in the LHS, which could be read by the RHS. Otherwise I might need 
>>> to extend the RHS DSLs to include the same enumeration as the LHS. Which 
>>> looks a bit redundant for a business user wondering why the need to write 
>>> the same thing twice.
>>> 
>>> Any thoughts?
>>> 
>>> Steve
>>> 
>>> 
>>> 
>>> 
>>> Sent from Samsung Mobile
>>> 
>>> _______________________________________________
>>> rules-users mailing list
>>> [email protected]
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>> 
>> 
>> 
>> 
>> _______________________________________________
>> rules-users mailing list
>> [email protected]
>> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> _______________________________________________
> rules-users mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/rules-users

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

Reply via email to