[rules-dev] "not contains" doesn't work on inner fields

Edson Tirelli ed.tirelli at gmail.com
Tue Jan 12 12:57:53 EST 2010


> 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 at 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 at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20100112/1063eda7/attachment.html 


More information about the rules-dev mailing list