Thanks for your help Vincent.

To be sure i have understood all well.

I've just created 2 class like you show me with some changes to fit and test all (timestamp are long in fact, i have put int, double and string as well) :

First class :

import java.util.HashMap;

public class MapPojo extends HashMap<String, Object> {

     public Object getId() {
         return this.get("id");
     }

     @Override
     public boolean equals(Object o) {
         return (o instanceof MapPojo) && ((MapPojo)o).getId().equals(getId());
     }

     public long getTimeStamp() {
         return (Long) this.get("timeStamp");
     }

     public boolean isBefore(MapPojo other) {
         if (this.getTimeStamp() < other.getTimeStamp())
             return true;
         else
             return false;          
     }
}

Second class :

public class MapTest1 extends MapPojo {

    private String     Att1String;
    private String     id;
    private double    Att2Double;
    private int          Att3Int;
    private long       timeStamp;
   
    public String getId() {
        return (String)this.get("id");
    }
    public void setId(String val) {
        this.put("id",val);
    }
   
    public String getAtt1String() {
        return (String)this.get("Att1String");
    }
    public void setAtt1String(String val) {
        this.put("Att1String",val);
    }

    public double getAtt2Double() {
        return (Double)this.get("Att2Double");
    }
    public void setAtt2Double(double val) {
        this.put("Att2Double",val);
    }
   
    public int getAtt3Int() {
        return Integer.parseInt((String)this.get("Att3Int"));
    }
    public void setAtt3Int(int val) {
        this.put("Att3Int",val);
    }

    public long getTimeStamp() {
        return (Long)this.get("timeStamp");
    }
    public void setTimeStamp(Long val) {
        this.put("timeStamp",val);
    }
}

Then i have imported this in Guvnor.

I have made 2 categories. I have put the model (jar) in the 2 categories. I have created 2 simple rules playing with the attributes id, timestamp...

Then i get some code like this (when i clic on view code or get the drl file) :
1.|rule "Rule1InCat1"
2.|    dialect "mvel"
3.|    when
4.|        $m1 : MapTest1( att1String == "value1" )
5.|        $m2 : MapTest1( att1String == "value1" )
6.|        MapTest1( att2Double == 3.5 )
7. |    then
8.|         MapTest1 fact0 = new MapTest1();
9.|         fact0.setId( "id4" );
10.|        insert(fact0 );
11.|end

1) For the condition Map $m1 different then Map $m2. I suppose i have to use the function define in MapPojo? I have to write it by hand using "free from drl" : eval($m1 != $m2) ? or is there a better way?

The same for testing that $m1 timestamp (Long) is befor $m2. I have to write it by hand : eval($m1.isBefore($m2))? So they have to know it exist a method isBefore if not said by the gui?

2) In the code It's written MapTest1(..) instead of Map(...) so i suppose drools has to do it with the precompiled package  .pkg to know about the MapPojo and MapTest1.. If i take only the .drl, drools won't know about class MapTest1.

I think it could be for the biggest file about 100+ rules. And the smallest about 2-3 only.

I can have : MapTest1, MapTest2, MapTest3, MapTest4 for example with each their own attributes. And For now if i have 4 drl files (file1.drl go for MapTest1 objects, file2.drl go for MapTest2 objects...) with their own rules, i know when to use which file.

Yes i can set a category to each of my rule. Do you mean create 4 categories (cat1, cat2, cat3, cat4) and for rules of file1.drl, put them it cat1, for file2.drl, put them in cat2... ? Set a first condition in the rules? Am i obliged to create a package per file and filter by category or is it possible to make a package with all and filtering when creating the knowledgeBase or something like that?


Thanks again for your precious help.



On Fri, Mar 4, 2011 at 7:35 PM, Vincent Legendre <vincent.legendre@eurodecision.com> wrote:

> I just tried to make a pojo. But i will have to do a single Pojo
> called "Map" with all the properties? Right now i had 4 Enum. Here i
> will have to have all in the same POJO with name "Map".
No. Don't name the Pojo "Map" ... And create as much Pojo that you have
different enums. Make them extend a common class where are defined
common behaviour.
To make that clear once for all, see this code :

public class MapPojo extends HashMap<String, Object> {

    public Object getId() {
        return this.get("id");
    }

    @Override
    public boolean equals(Object o) {
        return (o instanceof MapPojo)
&& ((MapPojo)o).getId().equals(getId());
    }

    public Date getTimeStamp() {
        return (Date) this.get("timeStamp");
    }

    public boolean isBefore(MapPojo other) {
        return this.getTimeStamp().before(other.getTimeStamp());
    }
}

// for enum 1
public class MapPojoGroup1 extends MapPojo {

    public String getAtt1() {
        return (String)this.get("att1");
    }
    public void setAtt1(String val) {
        this.put("att1",val);
    }

    public Long getAtt2() {
        return (Long)this.get("att2");
    }
    public void setAtt2(Long val) {
        this.put("att2",val);
    }

}

... etc etc etc for other enums
Easy to generate isn't it ?

>
> The advantage i suppose is that with the Pojo, we can directly tell
> this attribute is a String, this one is a Integer, this one a Double
> and this one a Long and in the rules all will be done automatically
> without casting?
Yep. And Guided editor will work "out of the box", providing the
suitable list of fields, and suitable operators according to the field
type.
And if subsequent Pojo generation remove a field, compilation will warn you.


For the files, please tell how you cut them. Can you set a category ? If
yes, you can also set a first condition. How many rules do you (plan to)
have ?
And yes, you can compile only rules that match a given category. But you
will have to store it in a snapshot just after that. Please refer to the
doc for this point.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org