[rules-users] Accessing maps (hashmaps) keys and values in rules
Anstis, Michael (M.)
manstis1 at ford.com
Wed Nov 7 05:25:43 EST 2007
Hi,
Perhaps I'm reading too much into your example but I have a number of
questions:-
*
I assume the rule is defined by the user?
*
Do you only have one instance of RaCdrMoc?
*
Why do you have a pattern for CDRError when this object is created
by the function? Is this needed in LHS?
* Why do you have a pattern for LinkedList (unless you're asserting
one LinkedList to hold the results - this could be a good candidate for a
global)
* I assume "cdrStructure : RaCdrStructure()" is where you wanted to
perform the (MyClass)mapOfObj.get("keyOfObj") mentioned in your earlier
email but for now is redundant as it is in the function?
Also, what is relationship between a field structure and a field validation?
(Your example structures contain validations like max length, optionality
and datatype)?
I assume a field validation is a rule.
Thanks,
Mike
_____
From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of shaz
Sent: 07 November 2007 02:49
To: Rules Users List
Subject: Re: [rules-users] Accessing maps (hashmaps) keys and values in
rules
Hi,
I'll try to explain my case...
I have an Object which has around 90 fields. For each of these fields, there
can be unlimited validations that needs to be made. By unlimited, I mean
that the user can create rules for each specific field. So not all rules are
applicable to all fields. The objects I'm placing on the Map are the field
structure of the 90 fields. These are things like the maxlength,
mandatory/optional, alphanumeric/numeric of each field.
Here is a sample code wherein I just used the Map in the then clause...
==================
global java.util.HashMap recordTypeMap;
global java.util.TreeMap structMap;
global java.util.ArrayList structList;
function CDRError setCDRError(RaCdrMoc cdr, CDRError cdrError, TreeMap
structMap,
String fieldName, String errorType, String editedValue, boolean
autoCorrected) {
cdrError = new CDRError();
cdrError.setCdrUploadId(cdr.getId().getCdruploadId());
cdrError.setCdrNo(cdr.getId().getCdrNo());
cdrError.setCdrType(0);
RaCdrStructure cdrStructure = new RaCdrStructure();
cdrStructure = (RaCdrStructure) structMap.get(fieldName);
cdrError.setFieldNo(cdrStructure.getId().getFieldNo());
cdrError.setErrorType(errorType);
cdrError.setEditedFieldValue(editedValue);
cdrError.setAutoCorrected(autoCorrected);
return cdrError;
}
rule "MOC Check Missing Filename"
when
cdr : RaCdrMoc(mocflnm == ""); //this is the Object with 90 fields
cdrError : CDRError(); //the resulting object that will be added to
the list
errorList : LinkedList(); //all errors will be placed here
cdrStructure : RaCdrStructure();
then
System.out.println("========No filename================");
cdr.setMocflnm("Testfile.csv");
cdrError = setCDRError(cdr, cdrError, structMap, "MOCFLNM", "01",
"Testfile.csv", true);
errorList.addLast(cdrError);
end
=========================
My other rules would require the accessing of Hashmaps from the when clause.
IWould there be a need to change my data model
Thanks a lot,
shaz
----- Original Message ----
From: "Anstis, Michael (M.)" <manstis1 at ford.com>
To: Rules Users List <rules-users at lists.jboss.org>
Sent: Friday, November 2, 2007 5:20:38 PM
Subject: RE: [rules-users] Accessing maps (hashmaps) keys and values in
rules
IMHO you should still think about putting the Map values into working
memory.
This would both simplify your rules and make their execution faster (eval
cannot be indexed, if I remember correctly).
You might need to adapt your data model representation into one that is more
efficient for use in a RETE network.
Can you explain your use case to help understand? Unless you have very good
reason to keep the facts in the Map your life will be more difficult than it
need be.
An "eval" returns a boolean indiciating whether the "pattern" matched and
therefore, whilst you can reference other bound LHS facts, you cannot bind
other objects to variables.
Thanks,
Mike
_____
From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of shaz
Sent: 02 November 2007 02:32
To: Rules Users List
Subject: Re: [rules-users] Accessing maps (hashmaps) keys and values in
rules
Hi,
I am placing objects in the Hashmap that were retrieved from the database.
There are currently a hundred objects that I'm storing in the HashMap. I
just made a simple example earlier :) . What works for me now is putting the
getting of the values in the eval(). However, I don't know how to assign the
values that I've taken from the Map.
eval( ( (MyClass)mapOfObj.get("keyOfObj")).getId() > 30);
How do I assign (MyClass)mapOfObj.get("keyOfObj") to a variable?
tnx,
shaz
----- Original Message ----
From: "Anstis, Michael (M.)" <manstis1 at ford.com>
To: Rules Users List <rules-users at lists.jboss.org>
Sent: Friday, November 2, 2007 12:17:51 AM
Subject: RE: [rules-users] Accessing maps (hashmaps) keys and values in
rules
By way of example (if you misunderstand how the rule engine should be
used):-
rule chkobj
when
$o : MyClass( id == "1", name == "name" )
then
//Do something else
$o.doSomething();
end
_____
From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Edson Tirelli
Sent: 01 November 2007 15:48
To: Rules Users List
Subject: Re: [rules-users] Accessing maps (hashmaps) keys and values in
rules
Shaz,
We strongly advise you to move to 4.0.3, but this is not related to your
problem.
I think you are misunderstanding something. Why are you using the global
map to store your fact? Simply insert it into the working memory and it will
work fine.
[]s
Edson
2007/11/1, Shaz Tumulak <shauii at yahoo.com>:
Hi,
I can't seem to make this syntax work in Drools 4.0.2. Pls. see my sample
code below.
________________________________________
class MyClass {
String id;
String name;
MyClass(String id, String name){
this.id = id;
this.name = name;
}
:
getter, setter methods
:
}
MyClass obj = new MyClass("1"", "name");
TreeMap<String, MyClass> mapOfObj = new TreeMap<String, MyClass>();
mapOfObj.put("keyOfObj", obj);
________________________________________
DRL file
-------
global java.util.TreeMap mapOfObj;
rule chkobj
when
obj : MyClass(mapOfObj["keyOfObj"].id == "1");
eval(obj.getName() == "name");
________________________________________
I'm getting this error: org.drools.RuntimeDroolsException:
java.lang.NullPointerException
at
org.drools.rule.EvalCondition.isAllowed(EvalCondition.java:76)
Is my syntax correct and has someone used this in 4.0.2 or should I move on
to Drools 4.0.3? Thanks in advance.
Regards,
shaz
Edson Tirelli-3 wrote:
>
> Denis,
>
> If you are using latest build from trunk (I'm not sure it already works
> in MR3), you can use a simplified MVEL syntax:
>
> when
> Person( address["business"].phone == "99999999" )
> then
> ...
> end
>
> Although, the above will be converted into an inline-eval. Not as bad
> as
> a top level eval, but still more costly then using regular fields.
>
> []s
> Edson
>
> 2007/7/19, Ryan, Dennis (Dennis) <dennisryan at avaya.com
<mailto:dennisryan at avaya.com> >:
>>
>> We are using Maps (HashMaps) in our rules and the only way we have found
>> to access keys and values in the Map in the "when" clauses is thru use on
>> eval() which I know is a big no-no by rules purists. Is there a better
>> way,
>> maybe some shorthand I'm not familiar with to deal with Maps in the when
>> clause?
>>
>>
>>
>> Thanks,
>>
>> Dennis
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
>
> --
> Edson Tirelli
> Software Engineer - JBoss Rules Core Developer
> Office: +55 11 3529-6000
> Mobile: +55 11 9287-5646
> JBoss, a division of Red Hat @ www.jboss.com
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
shauii at yahoo.com
--
View this message in context:
http://www.nabble.com/Accessing-maps-%28hashmaps%29-keys-and-values-in-rules
-tf4112197.html#a13524477
<http://www.nabble.com/Accessing-maps-%28hashmaps%29-keys-and-values-in-rule
s-tf4112197.html#a13524477>
Sent from the drools - user mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users at lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3529-6000
Mobile: +55 11 9287-5646
JBoss, a division of Red Hat @ www.jboss.com
_____
Platonic friends of the opposite sex - the real deal?
Be a better buddy
Find out at Yahoo! Answers
<http://ph.answers.yahoo.com/dir/index;_ylt=AsCq4OcgSoQ9qZZdke2cnGhL5Qt.;_yl
v=3?link=over&sid=396545433>
_____
Tired of spam? Yahoo! Mail has the best spam protection around
http://ph.mail.yahoo.com
<http://sg.rd.yahoo.com/mail/ph/footer/def/*http://ph.mail.yahoo.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20071107/a7d202ae/attachment.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4159 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/rules-users/attachments/20071107/a7d202ae/attachment.bin
More information about the rules-users
mailing list