Type Generics are used to control type cast conversion errors at compile time.  
In runtime, it's just a List, not a List<T>.  What is unique is that all the 
contents of the List are of the same type.  To define the global use:

Global List tasks

In rules, you can evaluate this as:

Rule 'some-rule'
When
        $pds : ProjectDataSet() from tasks


Or you can add your contraints to the ProjectDataSet fact as needed.  
Collection tasks could conceivable return several different object classes, but 
the Query Criteria states to only inspect those Objects that are an instance of 
ProjectDataSet.

This would be synonymous to the following java process:

        List<ProjectDataSet> pds = new ArrayList<ProjectDataSet>()
        for(Object o : tasks) {
                if ( o instanceof ProjectDataSet )
                        pds.add( (ProjectDataSet) o );
        }
        return pds;


However, in your java code that loads the fact, you are not setting a global, 
you are inserting all members of the tasks collection into drools working 
memory.
This means, that your rule would evaluate those facts as:

Import com.some.project.path.ProjectDataSet

Rule 'some-rule'
When
        $pds : ProjectDataSet()

Then
        // some action
End


So in this case, you do not have a global, and you do not need to be concerned 
with the fact you are loading in a List, because the function call you are 
calling is a helper function that essentially does this:

        for (Collection c : tasks) {
                commands.add(CommandFactory.newInsert( c );
        }

So what is in working memory, is a whole lot of ProjectDataSet objects, but not 
the list itself.  In reality,  the actual code implementation of the function 
is not likely to be what I have shown, but this is how you can think of the 
command's implementation.

Regards,
Armand


-----Original Message-----
From: rules-users-boun...@lists.jboss.org 
[mailto:rules-users-boun...@lists.jboss.org] On Behalf Of Adrigan
Sent: Thursday, November 17, 2011 1:56 PM
To: rules-users@lists.jboss.org
Subject: Re: [rules-users] How to handle generics in Drools?

Hello Edson,

        If the generic *<T>* is not allowed, and drools appears to be written 
to operate over collections of objects, how do you insert a List of items like
this:
*List<ProjectDataSet.Task> tasks*?  In my code I insert the tasks as facts like 
this:
*commands.add(CommandFactory.newInsertElements(tasks));*
I use a decision table and have as one of the variables: (in the variable
row)
*List<ProjectDataSet.Task> tasks*.

        The error I receive is this:
/org.drools.template.parser.DecisionTableParseException: The format for global 
variables is incorrect. It should be: [Class name, Class otherName].
But it was: [List<ProjectDataSet.Task> tasks]
        at
org.drools.decisiontable.parser.RuleSheetParserUtil.getVariableList(RuleSheetParserUtil.java:84)/

        I desire the rules in the table to iterate through all the tasks in 
that list and identify tasks that are due soon (a part of my condition column 
*TASKACTSTART< today* … etc.  The TASKACTSTART is a field named by Microsoft in 
the ProjectDataSet.Task class.)

        Have I misunderstood the power of drools?  How do you address a 
collection of a type like List<T> in a rule?

Thank you in advance for your help,
        Adrigan




--
View this message in context: 
http://drools.46999.n3.nabble.com/rules-users-How-to-handle-generics-in-Drools-tp3427723p3517186.html
Sent from the Drools: User forum mailing list archive at Nabble.com.

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to