I am sorry I didn't mean 'for' but 'from'.
:D

2007/9/27, Chris Woodrow <woodrow.chris@gmail.com>:
Hi,
I recently find out a few issues using for, and I wanted to share it with you. I made a simple exemple to illustrate my purpose.

My classes are (I did not represent accessors & constructors):

public class Cheese {
    protected String name;
}

public class FrenchCheese extends Cheese{
    private String smell;
}

public class Person {
    private Cheese likes;
}

Here is my rule set :

package rules

rule "likes cheese"
    when
        $person : Person ()
        Cheese(  ) from $person.getLikes()
    then
        System.out.println ("likes cheese");
end


rule "likes french cheese"
    when
        $person : Person ()
        FrenchCheese(  ) from $person.getLikes()
    then
        System.out.println ("likes french cheese");
end

First test :
        Cheese cheese = new FrenchCheese("good", "camembert");
        Person person = new Person();
        person.setLikes(cheese);

Output :
likes french cheese
likes cheese

Wich is expected...

Second test :
        Cheese cheese = new Cheese();
        Person person = new Person();
        person.setLikes(cheese);

Output :
likes french cheese
likes cheese

That's the first strange thing. As far as I am concerned, rule "likes french cheese" should not match (since a Cheese is not a FrenchCheese).

I made a change to the second rule :
rule "likes french cheese"
    when
        $person : Person ()
        FrenchCheese( smell == "good" ) from $person.getLikes()
    then
        System.out.println("likes french cheese");
end

Third test :
        Cheese cheese = new Cheese();
        Person person = new Person();
        person.setLikes(cheese);

output :
It throwed an exception : Exception in thread "main" java.lang.ClassCastException: rules.Cheese
I am not saying the ClassCastException is not to expect in such a case but I think I would simply expect it not to match (as far as a Cheese is not a FrenchCheese).

Chris