So the question is it a bug or a feature? :)
Well, there are no bugs, only features! ;)
But we still should change the feature to properly match the spec
semantics of "not". :) Can you please open a ticket and attach your test
case bellow? Should be an easy fix.
Thanks,
Edson
2010/1/12 Taras Svirskyi <stware(a)gmail.com>
> Hi,
> I don't know exactly is it a bug or am I doing something wrong.
> Consider following example.
> There are nodes that are connected into directed graph. Each node has
> special collection of attributes. Under some conditions attributes
> should be propagated along the edges in the graph.
>
> Lets model this with following code.
>
> /******* propagation rules **********************/
> package com.test.collection;
>
> rule "move child"
> when
> c : Child()
> s : CNode( children contains c)
> l : Link( src == s,
> t : target && target.children not contains c )
> then
> System.out.println("adding "+c+" from "+s+" to
"+t);
> t.addChild(c);
> update(t);
> end
>
>
> /** Child.java (represent special attributes of a node) *******/
> package com.test.collection;
>
> public class Child {
> private String name;
> public Child(String name){
> this.name = name;
> }
> public String getName() {
> return name;
> }
> @Override
> public String toString() {
> return "child("+name+")";
> }
> }
>
> /********* CNode.java - nodes of a graph *************/
> package com.test.collection;
>
> import java.util.HashSet;
> import java.util.Set;
>
> public class CNode {
> private Set<Child> children;
>
> public CNode() {
> this.children = new HashSet<Child>();
> }
>
> public Set<Child> getChildren() {
> return children;
> }
>
> public void addChild(Child ch){
> children.add(ch);
> }
>
> @Override
> public String toString() {
> return "Node{children="+children+"}";
> }
> }
>
> /**** Link.java - edges of a graph *******/
> package com.test.collection;
>
> public class Link {
> private CNode src;
> private CNode target;
>
> public Link(CNode src, CNode target) {
> this.src = src;
> this.target = target;
> }
>
> public CNode getSrc() {
> return src;
> }
>
> public CNode getTarget() {
> return target;
> }
> }
>
> /********************* populate session with facts **********/
> Child c0 = new Child("x");
> Child c1 = new Child("y");
> Child c2 = new Child("z");
>
> CNode src = new CNode();
> src.addChild(c0);
> src.addChild(c1);
>
> CNode target = new CNode();
> target.addChild(c0);
>
> Link link = new Link(src,target);
>
> // populate with facts
> ksession.insert(c0);
> ksession.insert(c1);
> ksession.insert(c2);
> ksession.insert(link);
> ksession.insert(src);
> ksession.insert(target);
>
> /****************************************************************/
> So with all that code listed below I've got following output from rules:
> --
> adding child(x) from Node{children=[child(x), child(y)]} to
> Node{children=[child(x)]}
> --
> That means that 'not contains' operator actually works as 'contains'
> one. Still when I changed it to older operator 'excludes' everything
> goes right printing out.
> ---
> adding child(y) from Node{children=[child(y), child(x)]} to
> Node{children=[child(x)]}
> ---
>
> I've noticed that rewriting rule in form of simple statements also fix
> issue.
>
> rule "move child"
> when
> c : Child()
> s : CNode( children contains c)
> t : CNode( children not contains c )
> l : Link( src == s, target == t)
> then
> System.out.println("adding "+c+" from "+s+" to
"+t);
> t.addChild(c);
> update(t);
> end
>
So the question is it a bug or a feature? :)
>
> regards,
> Taras
> _______________________________________________
> rules-dev mailing list
> rules-dev(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-dev
>
--
Edson Tirelli
JBoss Drools Core Development
JBoss by Red Hat @
www.jboss.com