[jboss-svn-commits] JBL Code SVN: r26251 - in labs/jbossrules/branches/DroolsChance: drools-core and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Apr 24 22:31:25 EDT 2009


Author: dsotty
Date: 2009-04-24 22:31:25 -0400 (Fri, 24 Apr 2009)
New Revision: 26251

Modified:
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java
   labs/jbossrules/branches/DroolsChance/drools-core/.classpath
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl
   labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl
   labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt
Log:
quantifiers and args

Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,56 +1,118 @@
 package org.drools.reteoo;
 
+import java.util.Collection;
+import java.util.LinkedList;
+
+import org.drools.InitialFact;
+
 public class ArgList {
 	
-	private Object[] args;
+	private LinkedList<Object> args;
 	
 	private boolean isPersistent = false;
 	
+	public ArgList() {
+		args = new LinkedList<Object>();
+	}
+	
 	public ArgList(Object[] args) {
-		this.args = args;
-		for (int j = 0; j < args.length; j++)
-			if (args[j] instanceof Jolly)
-				isPersistent = true;
+		this();
+		merge(args);
 	}
 	
 	public ArgList(Object arg) {
-		this.args = new Object[] {arg};
-		if (arg instanceof Jolly)
-			isPersistent = true;
+		this();
+		merge(arg);
 	}
 	
 	public ArgList(Object[] args, Object arg) {
-		this.args = new Object[args.length+1];
-		for (int j = 0; j < args.length; j++) {
-			if (args[j] instanceof Jolly)
-				isPersistent = true;
-			this.args[j] = args[j];
-		}
-		this.args[args.length] = arg;
-		if (arg instanceof Jolly)
-			isPersistent = true;
+		this();
+		merge(args);
+		merge(arg);
 	}
 	
 	
+	protected ArgList(Collection<Object> args) {
+		this();
+		 
+		merge(args);
+		
+	}
 	
 	
+	
+	
 	public Object getObject() {
-		return args[args.length-1];
+		return args.getLast();
 	}
 	
-
+	public Object clone() {
+		ArgList ans = new ArgList(this.args);
+		return ans;
+	}
 	
 	
+	public int merge(Object[] more) {
+		int j = 0;
+		for (Object o : more) {
+			if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {
+				this.args.add(o);
+				j++;
+			}			
+		}
+		return j;
+	}
 	
+	public int merge(ArgList more) {
+		int j = 0;
+		for (Object o : more.args) {
+			if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {
+				this.args.add(o);
+				j++;
+			}			
+		}
+		return j;
+	}
 	
+	public int merge(Object o) {
+		if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) { 
+			this.args.add(o);
+			return 1;
+		}
+		return 0;
+	}
 	
+	
+	
+	public int merge(Collection< ? extends Object> args) {
+		int j = 0;
+		for (Object o : args) {
+			if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {  
+				this.args.add(o);
+				j++;
+			}
+		}
+		return j;
+	}
+	
+	
+	
+	
+	
+	
+	
+	
 	public int hashCode() {
-		int ans = 2131;
-		for (int j = 0; j < args.length; j++)
-			ans ^= args[j].hashCode();
+		int ans = 0;
+		for (int j = 0; j < args.size(); j++)
+			ans ^= args.get(j).hashCode();
 		return ans;
 	}
 	
+	
+	
+	
+	
 	public boolean equals(Object other) {
 		if (other == null) return false;
 		if (other == this) return true;
@@ -58,15 +120,15 @@
 		ArgList otherArgs = (ArgList) other;
 		
 		if (otherArgs != null) {
-			if (this.args.length != otherArgs.args.length)
+			if (this.args.size() != otherArgs.args.size())
 				return false;
 			
 			boolean ans = true;
-				for (int j = 0; j < this.args.length; j++) {
-					if (this.args[j] instanceof Jolly || otherArgs.args[j] instanceof Jolly) {
+				for (int j = 0; j < this.args.size(); j++) {
+					if (this.args.get(j) instanceof Jolly || otherArgs.args.get(j) instanceof Jolly) {
 						ans = ans && true;
 					} else {
-						ans = ans && this.args[j].equals(otherArgs.args[j]);
+						ans = ans && this.args.get(j).equals(otherArgs.args.get(j));
 					}
 				}
 								
@@ -82,14 +144,23 @@
 		return isPersistent;
 	}
 	
+	public String toString() {
+		StringBuilder sb = new StringBuilder("L : ");
+		for (Object o : args) {
+			sb.append(o.getClass().getSimpleName()).append(" ").append(o.hashCode()).append("\t");
+		}
+		return sb.toString();
+	}
 	
 	
-	
 	public static class Jolly {
 		
 		public Jolly() {
 			
 		}
 	}
+
+
 	
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,6 +1,8 @@
 package org.drools.reteoo;
 
+import com.sun.tools.xjc.model.CNonElement;
 
+
 public class ConstraintKey {
 	
 	protected String key;
@@ -22,7 +24,7 @@
 	}
 	
 	
-
+	
 	protected String buildKey(String op, String arg) {
 		return op+"("+arg+")";
 	}
@@ -34,6 +36,11 @@
 	public ConstraintKey(String key) {
 		this.key = key;
 	}
+	
+	
+	public ConstraintKey cloneReplace(String oldK, String newK) {
+		return new ConstraintKey(key.replaceFirst(oldK, newK));
+	}
 
 	/**
 	 * @return the key
@@ -46,8 +53,10 @@
 	
 	public boolean equals(Object other) {
 		if (other == null) return false;
-		if (other instanceof ConstraintKey)
-			return this.key.equals(((ConstraintKey) other).key);
+		if (other instanceof ConstraintKey) {
+			ConstraintKey otherK = (ConstraintKey) other;
+			return this.key.equals(otherK.key);
+		}
 		else 
 			return false;		
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -8,6 +8,10 @@
 		super(op, "");
 		this.op = op;
 	}
+	
+	public ConstraintKey cloneReplace(String oldK, String newK) {
+		return new DynamicConstraintKey(key.replaceFirst(oldK, newK));
+	}
 
 	
 	public void reset() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/.classpath
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/.classpath	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/.classpath	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry excluding="org/drools/reteoo/JoinNodeBackup.java" kind="src" output="target/classes" path="src/main/java"/>
 	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
 	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
 	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1988,12 +1988,12 @@
 		return;
 	}
 
-	private Evaluation prepareEval(String ruleName, Object object, ConstraintKey key,
+	private Evaluation prepareEval(String ruleName, ArgList args, ConstraintKey key,
 			IDegree degree, IGammaNode node) {
 				
 		EvaluationTemplate templ = node.getEvaluationTemplate(key);
 		
-		return templ.spawn(ruleName,degree);
+		return templ.spawn(ruleName,degree, args);
 		
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -155,12 +155,12 @@
 
 	public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return null;
+		return new Evaluation[0];
 	}
 
 	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) { 
-		return null;
+		return new Evaluation[0];
 	}
 	
 	private ConstraintKey[] singletonKeys = null;

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -12,14 +12,18 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.SingleEvaluationTemplate;
+import org.drools.reteoo.ModusPonensNode.MPContextEntry;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.ContextEntry;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.util.LeftTupleList;
 import org.drools.util.LinkedList;
 import org.drools.util.RightTupleList;
@@ -190,14 +194,23 @@
     
 	public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		Evaluation eval = template[0].spawn(factory.Unknown());
+		
+		//merge to ensure uniqueness
+		ArgList args = ((MPContextEntry) context[0]).getLeftTuple().getArgList();
+//		args.merge(handle.getObject());
+		
+		Evaluation eval = template[0].spawn(factory.Unknown(),args);
 			eval.addDegree(Evaluation.PRIOR, this.priorDegree, 1,true);
 		return new Evaluation[] {eval};
 	}
 
 	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
-			LeftTuple tuple, IDegreeFactory factory) { 
-		Evaluation eval = template[0].spawn(factory.Unknown());
+			LeftTuple tuple, IDegreeFactory factory) {
+		
+		//ArgList args = ((ImperfectLeftTuple) tuple).getArgList();
+		ArgList args = new ArgList();
+		
+		Evaluation eval = template[0].spawn(factory.Unknown(),args);
 			eval.addDegree(Evaluation.PRIOR, this.priorDegree, 1,true);
 		return new Evaluation[] {eval};
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -26,9 +26,11 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
@@ -99,7 +101,7 @@
     
     public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
+		return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)),new ArgList(handle.getObject()));
 	}
 
     public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -109,7 +111,7 @@
     
 	public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
+		return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)),((ImperfectLeftTuple) tuple).getArgList());
 	}
 
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -26,9 +26,11 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
@@ -98,7 +100,7 @@
     
     public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return getTemplate().spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
+		return getTemplate().spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)),new ArgList(handle.getObject()));
 	}
 
 	
@@ -110,7 +112,7 @@
     
     public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return getTemplate().spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
+		return getTemplate().spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)),((ImperfectLeftTuple) tuple).getArgList());
 	}
 
     public String toString() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -26,9 +26,11 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
@@ -108,7 +110,7 @@
     
     public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
+		return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)), new ArgList(handle.getObject()));
 	}
     
 
@@ -119,7 +121,8 @@
 
     public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
+		return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)), 
+				((ImperfectLeftTuple) tuple).getArgList());
 	}
     
     public String toString() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -6,27 +6,16 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
 
-public class IntervalNegationOperator implements IDegreeCombiner {
+public class IntervalNegationOperator extends NegationOperator {
 
-	public IDegree eval(IDegree[] args) {
-		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-			
-		IntervalDegree arg = (IntervalDegree) args[0];
-		return new IntervalDegree(arg.getUpp(),arg.getLow());
+	
+	protected IDegree negate(IDegree arg) {
+		IntervalDegree iDeg = (IntervalDegree) arg;
+		return new IntervalDegree(iDeg.getPhi(),1-iDeg.getTau());
 	}
-
-	public IDegree eval(Collection<? extends IDegree> args) {
-		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-			
-		IntervalDegree arg = (IntervalDegree) args.iterator().next();
-		return new IntervalDegree(arg.getUpp(),arg.getLow());
-	}
-
-	public String getName() {
-		return "i_not";
-	}
-
+	
+	
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -5,20 +5,14 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
 
-public class SimpleNot implements IDegreeCombiner {
+public class SimpleNot extends NegationOperator {
 
-	public IDegree eval(IDegree[] args) {
-		return new SimpleDegree(1-args[0].getDegree().getValue());
+	protected IDegree negate(IDegree arg) {
+		return new SimpleDegree(1-arg.getDegree().getValue());
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
-		return new SimpleDegree(1-args.iterator().next().getDegree().getValue());
+	
 
-	}
-
-	public String getName() {
-		return "not";
-	}
-
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -51,6 +51,10 @@
     public RightTupleMemory getRightTupleMemory() {
         return this.rightTupleMemory;
     }
+    
+    public void setRightTupleMemory(RightTupleMemory newMem) {
+    	this.rightTupleMemory = newMem;
+    }
 
     public LeftTupleMemory getLeftTupleMemory() {
         return this.leftTupleMemory;
@@ -77,4 +81,6 @@
     public void setBehaviorContext(Object behaviorContext) {
         this.behaviorContext = behaviorContext;
     }
+    
+    
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -21,8 +21,8 @@
 	private float opRate;
 	
 	public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			Evaluation[] evalDegrees, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {		
-		super(id,key,deps,mergeStrat,nullStrat);
+			Evaluation[] evalDegrees, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {		
+		super(id,key,deps,mergeStrat,nullStrat, args);
 		
 		if (evalDegrees != null) {
 			this.operands = new Vector<Evaluation>(evalDegrees.length);
@@ -30,7 +30,7 @@
 					setOperand(j,evalDegrees[j]);
 				}
 		} else {
-			this.operands = new Vector<Evaluation>(0);
+			this.operands = new Vector<Evaluation>(1,1);
 		}
 	
 		this.operator = operator;
@@ -41,10 +41,10 @@
 	
 	
 	protected CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {		
-		super(id,key,deps,mergeStrat,nullStrat);
+			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat,ArgList args) {		
+		super(id,key,deps,mergeStrat,nullStrat, args);
 				
-		this.operands = new Vector<Evaluation>(0);			
+		this.operands = new Vector<Evaluation>(1,1);			
 		this.operator = null;
 				
 	}
@@ -54,10 +54,10 @@
 	
 	
 	public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			int arity, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {		
-		super(id,key,deps,mergeStrat,nullStrat);
+			int arity, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {		
+		super(id,key,deps,mergeStrat,nullStrat, args);
 				
-		this.operands = new Vector<Evaluation>(arity);
+		this.operands = new Vector<Evaluation>(arity,2);
 		
 	
 		this.operator = operator;
@@ -116,16 +116,23 @@
 	
 	public void setOperand(int position, Evaluation operand) {
 				
+		System.out.println(operand.expand());
+
+		
 		if (operands.size() <= position) {
 			// Surely a new operand!
+			
 			operands.setSize(position+1);
 			
 			operand.addObserver(this);
+			System.out.println(operand.expand());
 			//operands.set(position,operand);
 		} else {
 			if (operands.get(position) != null && operands.get(position) != operand) {
+				
 				System.out.println("SET OPERAND "+operand.getKey()+ "with " + operand.getBitS());
 				operands.get(position).deleteObserver(this);
+				
 				operand.addObserver(this);
 				//operands.set(position,operand);
 				//combine();
@@ -134,10 +141,17 @@
 //				if (operands.get(position) != null)
 //					throw new RuntimeDroolsException("DD");														
 				//operands.set(position,operand);
+				//this.setArgCode(this.getArgCode()^operands.get(position).getArgCode());
 			}
 		}		
+
 		
+
 		operands.set(position,operand);
+		
+		this.getArgs().merge(operand.getArgs());
+
+		//this.setArgCode(this.getArgCode()^operand.getArgCode());
 	}
 	
 	public Collection<Evaluation> getEvalTree() {
@@ -180,11 +194,21 @@
 	
 	
 	public void update(Observable o, Object arg) {
-		System.out.println("\nUPDATE HAS BEEN CALLED ON COMBOVAL by" + o.toString());
-		incInfo("EVAL",-getOpRate());
-		combine();	
+		System.out.println("\nUPDATE HAS BEEN CALLED ON COMBOVAL by" + o.toString()+ " " + getOpRate());
+		//incInfo("EVAL",-getOpRate());
 		
-		this.notifyObservers(this);
+		if (arg instanceof ArgList) {
+			int added = this.getArgs().merge((ArgList) arg);
+			if (added > 0) {
+				this.setChanged();
+				this.notifyObservers(arg);
+			}
+		} else {
+			boolean newContrib = combine();
+		}
+		
+		//this.notifyObservers(this);
+		
 	}
 	
 	protected IDegreeCombiner getOperator() {
@@ -209,6 +233,8 @@
 			for (Evaluation eval : getOperands()) {
 				for (int j = 0; j <= depth; j++)
 					sb.append("\t");
+				if (eval == null)
+					System.out.println("NULL??");
 				sb.append(eval.toString()+"\n");
 				if (eval instanceof CompositeEvaluation)
 					sb.append(((CompositeEvaluation) eval).toStringTree(depth+1));			

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -5,10 +5,13 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.drools.common.BetaConstraints;
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
+import org.drools.spi.PropagationContext;
 
 public class CompositeEvaluationTemplate extends EvaluationTemplate {
 
@@ -45,29 +48,33 @@
 
 	
 	public Evaluation spawn(Evaluation[] evalDegree) {
-		return new CompositeEvaluation(id,key,deps,evalDegree,operator,mergeStrat,nullStrat);
+		return new CompositeEvaluation(id,key,deps,evalDegree,operator,mergeStrat,nullStrat,new ArgList());
 	}
 	
-	public Evaluation spawn() {
-		return new CompositeEvaluation(id,key,deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat);
+	public Evaluation spawn(ArgList args) {
+		return new CompositeEvaluation(id,key,deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat,args);
 	}
 	
 	public Evaluation spawn(int N) {
-		return new CompositeEvaluation(id,key,deps,N,operator,mergeStrat,nullStrat);
+		return new CompositeEvaluation(id,key,deps,N,operator,mergeStrat,nullStrat,new ArgList());
 	}
 	
-	public Evaluation spawn(IOperandSet args) {
-		return new SetCompositeEvaluation(id,key,deps,operator,args,mergeStrat,nullStrat);
+	public Evaluation spawn(OperandSet args, BetaConstraints joinConstraints) {
+		return new SetCompositeEvaluation(id,key,deps,operator,args,mergeStrat,nullStrat,joinConstraints);
 	}
 	
 	
 	protected IDegreeCombiner getOperator() {
 		return operator;
 	}
+
 	
 	
 	
 	
 	
 	
+	
+	
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -47,7 +47,7 @@
 			EvalRecord record, boolean leftTupleMemoryEnabled) {
     	
     	for( LeftTupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
-            ImperfectLeftTuple newLeftTuple = new ImperfectLeftTuple( leftTuple, rightTuple, sink, leftTupleMemoryEnabled,record);
+            ImperfectLeftTuple newLeftTuple = new ImperfectLeftTuple( leftTuple, rightTuple, sink, leftTupleMemoryEnabled,record.clone());
             doPropagateAssertLeftTuple( context, workingMemory, factory, sink, newLeftTuple );
         }
 		
@@ -95,7 +95,7 @@
 
     	for( LeftTupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
     		
-    		EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy()); 
+    		EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList()); 
         		masterRecord.addEvaluation(record);
             doPropagateAssertLeftTuple( context, workingMemory, factory, sink,
                                         new ImperfectLeftTuple( factHandle, sink, leftTupleMemoryEnabled, masterRecord ) );

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -400,7 +400,8 @@
         if ( this.otherSinks != null ) {
             // propagate others
             for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
-                doPropagateAssertObject( factHandle, context, workingMemory, factory, record.clone(), sink );
+            	EvalRecord newRec = record.clone();
+                doPropagateAssertObject( factHandle, context, workingMemory, factory, newRec, sink );
             }
         }
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -331,7 +331,7 @@
 		
 			for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
 				System.out.println(this.getClass() + " dispatching obj to node "+i);
-				EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());				
+				EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());				
 				cachedNodes[i].assertObject(handle,
 		                        context,
 		                        workingMemory,

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -219,7 +219,7 @@
         ConstraintKey key = new ConstraintKey("eval",this.condition.getEvalExpression().toString());
         EvaluationTemplate templ = new SingleEvaluationTemplate(this.getId(),key,Collections.EMPTY_SET,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
         
-        Evaluation eval = templ.spawn(ans);
+        Evaluation eval = templ.spawn(ans,leftTuple.getArgList());
         record.addEvaluation(eval);
         
         //TODO: Imperfect strategy here!

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -25,9 +25,15 @@
 public class EvalRecord extends CompositeEvaluation implements Observer {
 	
 	
+	public static final HashSet<ConstraintKey> 		blackList = new HashSet<ConstraintKey>();
+	{
+		blackList.add(new ConstraintKey("class","==","org.drools.InitialFact"));
+	}
+	
 	public static final int INITIAL_ID = -99;
 
-	private Map<ConstraintKey, Evaluation> 		evalMap;
+	//private Map<ConstraintKey, Evaluation> 		evalMap;
+	private Map<Evaluation,Evaluation>				evalSet;
 	//private ConstraintKey 						mainKey;
 	
 	// private IDegree 							overallDegree;
@@ -51,15 +57,16 @@
 //	}
 	
 		
-	public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat) {
-		super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat);
+	public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat, ArgList args) {
+		super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat, args);
 		
 		//mainKey = null;
-		evalMap = new HashMap<ConstraintKey, Evaluation>();
+		//evalMap = new HashMap<ConstraintKey, Evaluation>();
+		evalSet = new HashMap<Evaluation,Evaluation>();
 	}
 	
 	public Collection<Evaluation> getEvaluations() {
-		return evalMap.values();
+		return evalSet.values();
 	}
 	
 	
@@ -76,10 +83,12 @@
 			}			
 		}
 		
-		Evaluation prevEval = evalMap.get(eval.getKey());
+		//Evaluation prevEval = evalMap.get(eval.getKey());
+		Evaluation prevEval = evalSet.get(eval);
 		if (prevEval == null) {
 			System.out.println(this.getClass()+" insert "+eval.toString());
-			evalMap.put(eval.getKey(),eval);	
+			//evalMap.put(eval.getKey(),eval);	
+			evalSet.put(eval,eval);
 			prevEval = eval;
 			//eval.addObserver(this);
 		} else {
@@ -98,15 +107,20 @@
 	
 	public void addEvaluation(Evaluation eval) {
 		
-		boolean newEval = ! this.evalMap.containsKey(eval.getKey());
+		if (eval == null || blackList.contains(eval.getKey()))
+			return;
 		
+		//boolean newEval = ! this.evalMap.containsKey(eval.getKey());
+		boolean newEval = ! this.evalSet.containsKey(eval);
+		
 		Evaluation addedEval = insert(eval);		
 		
 		if (newEval) {
 			if (operands == null) {
-				operands = new Vector<Evaluation>(1);
+				//operands = new Vector<Evaluation>(1);
 				
-				operands.add(addedEval);
+				//operands.add(addedEval);
+				setOperand(0, addedEval );
 			} else {
 				/*
 				int N = operands.size();
@@ -119,8 +133,12 @@
 				
 				operands.set(N,addedEval);
 				*/
-				operands.add(addedEval);
+				//operands.add(addedEval);
+				setOperand(operands.size(),addedEval);
 			}
+			//this.setArgCode(this.getArgCode()^eval.getArgCode());
+		} else {
+			
 		}
 		
 			addedEval.deleteObserver(this);
@@ -128,9 +146,10 @@
 		
 		((DynamicConstraintKey) this.getKey()).addArg(eval.getKey());
 		
+		
 		combine();
-		this.setChanged();
-		this.notifyObservers(null);
+//		this.setChanged();
+//		this.notifyObservers(null);
 		
 //		if (mainKey != null && mainKey.equals(addedEval.getKey()) /*&& ! prevEval.getDegree().equals(overallDegree)*/) {
 //			mainKey = addedEval.getKey();
@@ -147,8 +166,12 @@
 	
 	public void addEvaluations(EvalRecord other) {				
 		//for (Evaluation eval : other.getEvaluations())
-		for (Evaluation eval : other.getOperands())
+		for (Evaluation eval : other.getOperands()) {
 			this.addEvaluation(eval);
+			
+			
+			eval.deleteObserver(other);
+		}
 	}
 	
 	public void addEvaluations(Collection<Evaluation> evals) {
@@ -161,7 +184,7 @@
 	
 	public EvalRecord clone() {
 		
-		EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat());
+		EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat(), (ArgList) this.getArgs().clone());
 		ans.addEvaluations(this);
 		
 		return ans;
@@ -193,13 +216,15 @@
 	
 	
 	public String expand() {
-		StringBuilder sb = new StringBuilder("Eval Record :"+this.getInfoRate()+"\n");
+		StringBuilder sb = new StringBuilder("Eval Record info("+this.getInfoRate()+") for args " + getArgs().toString() + " \n");
 //		
 		
 		sb.append("AND{\n");
 		if (getOperands() != null)
-			for (Evaluation ev : getOperands())
+			for (Evaluation ev : getOperands()) {
+				
 				sb.append(ev.toString()+"\n");
+			}
 		sb.append("}\n\n");
 		
 		sb.append(toString()+"\n");
@@ -341,12 +366,13 @@
 		
 				
 			operator.combine();				
-			evalMap.put(operator.getKey(),operator);	
+			//evalMap.put(operator.getKey(),operator);
+			evalSet.put(operator,operator);
 			operator.addObserver(this);
 		
 		this.combine();
-		this.setChanged();
-		this.notifyObservers(null);
+//		this.setChanged();
+//		this.notifyObservers(null);
 		
 		
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -34,10 +34,12 @@
 	
 	private IMergeStrategy 				mergeStrat;
 	private INullHandlingStrategy 		nullStrat;
+	
+	private ArgList args;
 
 	
 	
-	public Evaluation(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+	public Evaluation(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
 		if (deps == null)
 			deps = Collections.emptySet();
 		this.nodeId = id;
@@ -54,16 +56,18 @@
 		this.key = key;
 		this.nullStrat = nullStrat;
 		this.mergeStrat = mergeStrat;
+		
+		this.args = args;
 	}
 	
-	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
-		this(id,key,deps,mergeStrat,nullStrat);
+	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+		this(id,key,deps,mergeStrat,nullStrat,args);
 		this.addDegree(Evaluation.EVAL,evalDeg,1,true);
 		
 	}
 	
-	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, String source, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
-		this(id,key,deps,mergeStrat,nullStrat);
+	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, String source, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+		this(id,key,deps,mergeStrat,nullStrat,args);
 		this.addDegree(source,evalDeg,1,true);
 	}
 	
@@ -120,9 +124,12 @@
 			}
 		}
 		if (newContrib) {
+//			IDegree oldVal = aggDegree;
 			aggDegree = mergeDegrees();
-			this.setChanged();
-			this.notifyObservers();
+//			if (! oldVal.equals(aggDegree)) {
+//				this.setChanged();
+//				this.notifyObservers(this);
+//			}
 		}
 	    
 	
@@ -132,6 +139,7 @@
 	public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean immediateUpdate) {
 		boolean newContrib = false;
 		boolean rateIncr = false;
+		Float prevConf;
 		
 		if (evalDeg == null) {
 			/*
@@ -141,7 +149,8 @@
 		} else {
 		
 		
-			Float prevConf = confidence.get(source);
+			prevConf = confidence.get(source);
+			System.out.println(prevConf);
 				confidence.put(source, wgt);
 			rateIncr = prevConf == null ? true : prevConf.floatValue() < wgt;
 			
@@ -180,14 +189,14 @@
 		
 		if (immediateUpdate && (newContrib || rateIncr)) {
 			this.setChanged();
-			this.notifyObservers();
+			this.notifyObservers(this);
 		}
 		
 		return (newContrib || rateIncr);
 		
 	}
 	
-	protected void incInfo(String source, float delta) {
+	protected void setInfoRate(String source, float delta) {
 		confidence.put(source,new Float(delta));
 	}
 	
@@ -211,7 +220,7 @@
 		boolean cleared = false;
 		if (getDegreeBit(source) != null) {
 			cleared = true;
-			incInfo(source,-1);
+			setInfoRate(source,0);
 		}
 		this.degrees.put(source,null);
 		return cleared;
@@ -234,7 +243,7 @@
 	
 	
 	public String toString() {
-		return "("+this.nodeId + ")" + this.key+ " : " + this.aggDegree +" "+ this.getBitS();
+		return "("+this.args.hashCode()+"@"+this.nodeId + ") : " + this.aggDegree  + " " + this.key +" "+ this.getBitS();
 	}
 	
 	public String expand() {
@@ -320,5 +329,25 @@
 		return nullStrat;
 	}
 	
-
+	
+	
+	public int hashCode() {
+		return this.key.hashCode() ^ args.hashCode();
+	}
+	
+	public boolean equals(Object other) {
+		if (other == null) 
+			return false;
+		if (other instanceof Evaluation) {
+			Evaluation otherEv = (Evaluation) other;
+			return this.key.equals(otherEv.key)  && this.args.equals(otherEv.args);
+		}
+		return false;
+	}
+	
+	public ArgList getArgs() {
+		return args;
+	}
+	
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -30,16 +30,16 @@
 
 	
 	
-	public Evaluation spawn(IDegree evalDegree) {		
-		return new Evaluation(id,key,deps,evalDegree,mergeStrat,nullStrat);		
+	public Evaluation spawn(IDegree evalDegree, ArgList args) {		
+		return new Evaluation(id,key,deps,evalDegree,mergeStrat,nullStrat,args);		
 	}
 	
-	public Evaluation spawn(String source, IDegree evalDegree) {		
-		return new Evaluation(id,key,deps,evalDegree,source,mergeStrat,nullStrat);		
+	public Evaluation spawn(String source, IDegree evalDegree, ArgList args) {		
+		return new Evaluation(id,key,deps,evalDegree,source,mergeStrat,nullStrat,args);		
 	}
 		
-	public Evaluation spawn() {
-		return new Evaluation(id,key,deps,null,mergeStrat,nullStrat);
+	public Evaluation spawn(ArgList args) {
+		return new Evaluation(id,key,deps,null,mergeStrat,nullStrat,args);
 	}
 	
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,7 +1,9 @@
 package org.drools.reteoo;
 
+import java.util.Map;
 import java.util.Observable;
 import java.util.Observer;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuntimeDroolsException;
@@ -10,6 +12,9 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.TupleStartEqualsConstraint;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.IMergeStrategy;
+import org.drools.degrees.operators.INullHandlingStrategy;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.reteoo.filters.IFilterStrategy;
 import org.drools.rule.Behavior;
@@ -36,6 +41,8 @@
 		IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();    	
 			this.filterStrat = factory.getDefaultStrategy();
 			
+		this.constraints.buildEvaluationTemplates(this.id,context.getRule().getDependencies(), factory);
+			
 //		ConstraintKey argKey = null;
 //		if (this.rightInput instanceof RightInputAdapterNode)
 //			argKey = ((RightInputAdapterNode) this.rightInput).getConstraintKeys()[0];
@@ -45,22 +52,37 @@
 //			throw new RuntimeDroolsException("Source of type"+rightInput.getClass()+ " temporarily not supported");
 		
 		//ConstraintKey key = new ConstraintKey(factory.getExistsOperator().getName(),argKey.toString());
-		ConstraintKey key = new DynamicConstraintKey(factory.getExistsOperator().getName());
-		template = new CompositeEvaluationTemplate(this.getId(),
-							key,
-							context.getRule().getDependencies().get(key),
-							1,
-							factory.getExistsOperator(),
-							factory.getMergeStrategy(),
-							factory.getNullHandlingStrategy());
+		
 								        
 	}
 	
 	
+	public EvaluationTemplate buildEvaluationTemplate(IDegreeCombiner operator, Map<ConstraintKey,Set<String>> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+		
+		
+		
+		ConstraintKey key = new DynamicConstraintKey(operator.getName());
+		template = new CompositeEvaluationTemplate(this.getId(),
+				key,
+				deps.get(key),
+				1,
+				operator,
+				mergeStrat,
+				nullStrat);
+		
+		return template;
+	
+	} 
+		
+	
+	
+	
 	public Object createMemory(final RuleBaseConfiguration config) {
-		BetaMemory memory = new BetaMemory( new LeftTupleList(),
-									new ObservableRightTupleMemoryWrapper(new RightTupleList()),
-                                    new ContextEntry[0] );
+		BetaMemory memory = (BetaMemory) super.createMemory(config);
+		
+		memory.setRightTupleMemory(
+					new ObservableRightTupleMemoryWrapper(memory.getRightTupleMemory()));
+				
         return memory;
     }
 	
@@ -84,7 +106,16 @@
 		 		return;
 		 	}
 
-		 	memory.getRightTupleMemory().add( rightTuple );		 
+		 	
+		 	this.constraints.updateFromFactHandle( memory.getContext(),
+                    workingMemory,
+                    factHandle );
+		 	
+		 		memory.getRightTupleMemory().add( rightTuple );
+		 	
+		 	this.constraints.resetFactHandle( memory.getContext() );
+		 	
+		 	
 		 	//will call notify on observers!
 		 			 			 			 			 
 		 	if ( !this.tupleMemoryEnabled ) {
@@ -134,26 +165,38 @@
 			IDegreeFactory factory) {
 		
 		final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
-		RightTupleMemory rtMem = memory.getRightTupleMemory();
-		ObservableRightTupleMemoryWrapper opSet = (ObservableRightTupleMemoryWrapper) rtMem; 
+		
+		
+		RightTupleMemory rtMem = memory.getRightTupleMemory();		
+		ObservableRightTupleMemoryWrapper wMemory = (ObservableRightTupleMemoryWrapper) rtMem; 
 
+		OperandSet opSet = new OperandSet(leftTuple,wMemory,this.constraints,memory.getContext(),workingMemory,factory);
+		
+		
 		EvalRecord mainRecord = leftTuple.getRecord();
 		
-		SetCompositeEvaluation eval = (SetCompositeEvaluation) template.spawn(opSet);
-			opSet.addObserver( eval);
+				
+		 this.constraints.updateFromTuple( memory.getContext(),
+                 workingMemory,
+                 leftTuple );
+
+		 SetCompositeEvaluation eval = (SetCompositeEvaluation) template.spawn(opSet,this.constraints);
+
+		 this.constraints.resetTuple( memory.getContext() );
+
+		
+										
+		opSet.addObserver( eval);
 			
 		mainRecord.addEvaluation(eval);
-		
-        
-		
-		
+		        				
 		System.out.println("Situation at EXISTS eval"+mainRecord.expand());        		        		        		        	
     	
 		
     	switch (this.filterStrat.doTry(mainRecord)) {
     		case IFilterStrategy.DROP : 
-    			System.out.println("Exist FAIL at assertTuple: DROP record");
-    			return;
+//    			System.out.println("Exist FAIL at assertTuple: DROP record");
+//    			return;
 		
     		case IFilterStrategy.HOLD : //TODO: HOLD
     			System.out.println("HOLD RULES @EXIST NODE"+this.getId());
@@ -197,15 +240,23 @@
 		
 		System.out.println(this.getClass().toString() + " NOTIFIED OF CHANGE");
 		
-		EvalRecord mainRecord = (EvalRecord) o;
+		EvalRecord mainRecord = null;
+		
+		if (arg instanceof EvalRecord)
+			mainRecord = (EvalRecord) arg;
+		
+		if (mainRecord == null) 
+			return;
+		
+		
 		System.out.println("Situation changed at EXISTS eval"+mainRecord.expand());        		        		        		        	
     	
 		
     	switch (this.filterStrat.doTry(mainRecord)) {
     		case IFilterStrategy.DROP : 
-    			System.out.println("Exist FAIL at assertTuple: DROP record");
-    			return;
-		
+//    			System.out.println("Exist FAIL at assertTuple: DROP record");
+//    			return;
+//		
     		case IFilterStrategy.HOLD : //TODO: HOLD
     			System.out.println("HOLD RULES @EXIST NODE"+this.getId());
     			System.out.println("Situation is "+mainRecord.expand());    			    				    			
@@ -225,5 +276,17 @@
 		
     	}		
 	}
+	
+	
+	
+	
+	
+	
+	
+	
+	public String toString() {
+        
+        return "[Imp_ExistsNode - " +this.constraints.toString() + "]";
+    }
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -55,4 +55,9 @@
 	}
 	
 	
+	public ArgList getArgList() {
+		return new ArgList(this.toObjectArray());
+	}
+	
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -142,7 +142,8 @@
 				EvalRecord record = new EvalRecord(EvalRecord.INITIAL_ID,
 						getDegreeFactory().getAndOperator(),
 						getDegreeFactory().getMergeStrategy(),
-						getDegreeFactory().getNullHandlingStrategy());
+						getDegreeFactory().getNullHandlingStrategy(),
+						new ArgList(object));
 		
 				getRete().assertObject( (ImperfectFactHandle) handle,
 						context,

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -19,4 +19,12 @@
 
     public void writeExternal(ObjectOutput out) throws IOException {
     }
+    
+    public int hashCode() {
+    	return -1;
+    }
+    
+    public boolean equals(Object other) {
+    	return other instanceof InitialFactHandleDummyObject;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -176,7 +176,7 @@
         for ( ImperfectRightTuple rightTuple = (ImperfectRightTuple) memory.getRightTupleMemory().getFirst( leftTuple ); rightTuple != null; rightTuple = (ImperfectRightTuple) rightTuple.getNext() ) {
             
         	final ImperfectFactHandle factHandle = (ImperfectFactHandle) rightTuple.getFactHandle();
-        	EvalRecord record = rightTuple.getRecord();
+        	EvalRecord record = rightTuple.getRecord().clone();
                        
             EvalRecord mainRecord = leftTuple.getRecord().clone();
         	
@@ -193,8 +193,8 @@
         	//Call internal evaluator, if not done before
     		ConstraintKey[] keys = this.constraints.getConstraintKeys();
     		if (keys != null) {
-		    		Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
-		    		if (evalTest == null) {
+//		    		Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
+//		    		if (evalTest == null) {
 		    			Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
 		                        													  leftTuple, 
 		                        													  factory );
@@ -207,25 +207,25 @@
 		    					}
 		    					record.addEvaluation(eval);
 		    				}
-		    			}
-		    				    			    			
-		    		} else {
-		    			
-		    			if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
-		    			
-		    				//B-constraints are 0 to N
-		        			//As above, in case EVAL hasn't been called yet, but no need to add to the handle
-		    				Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
-									  leftTuple, 
-									  factory );
-		
-		    				if (evals != null) {
-		    					for (Evaluation eval : evals) {
-		    						record.addEvaluation(eval);
-		    					}
-		    				}
-		    				
-		    			}			
+//		    			}
+//		    				    			    			
+//		    		} else {
+//		    			
+////		    			if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
+//		    			
+//		    				//B-constraints are 0 to N
+//		        			//As above, in case EVAL hasn't been called yet, but no need to add to the handle
+//		    				Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+//									  leftTuple, 
+//									  factory );
+//		
+//		    				if (evals != null) {
+//		    					for (Evaluation eval : evals) {
+//		    						record.addEvaluation(eval);
+//		    					}
+//		    				}
+//		    				
+////		    			}			
 		    		}   
     		} else {
     			//EMPTY BETA CONSTRAINT!
@@ -233,6 +233,8 @@
  
         	//KEY MOVE, AND-ING THE PATTERN EVALS
     		mainRecord.addEvaluation(record);
+    		
+    		ImperfectRightTuple propRightTuple = new ImperfectRightTuple(factHandle,this,record);
         	
         	
         	System.out.println("Situation at join eval"+mainRecord.expand());        		        		        		        	
@@ -248,7 +250,7 @@
         			System.out.println("Situation is "+mainRecord.expand());
         			
         				mainRecord.setLeftTuple(leftTuple);
-        				mainRecord.setRightTuple(rightTuple);
+        				mainRecord.setRightTuple(propRightTuple);
         				mainRecord.setFactory(factory);
         				mainRecord.setPropagationContext(context);
         				mainRecord.setWorkingMemory(workingMemory);
@@ -259,7 +261,7 @@
         		case IFilterStrategy.PASS : 
         			System.out.println("Beta PASS at assertTuple: propagate record");
         			this.sink.propagateAssertLeftTuple( leftTuple,
-                            rightTuple,
+                            propRightTuple,
                             context,
                             workingMemory,
                             factory,
@@ -343,12 +345,13 @@
     public void assertObject(ImperfectFactHandle factHandle,
 			PropagationContext context,
 			InternalWorkingMemory workingMemory, IDegreeFactory factory,
-			EvalRecord record) {
+			EvalRecord initialRecord) {
     	
         final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
 
+        
         ImperfectRightTuple rightTuple = new ImperfectRightTuple( factHandle,
-                                                this, record );
+                                                this, initialRecord );
 
         if ( !behavior.assertRightTuple( memory.getBehaviorContext(),
                                          rightTuple,
@@ -373,8 +376,10 @@
         	
         	
         	EvalRecord mainRecord = leftTuple.getRecord().clone();
+        	EvalRecord record = initialRecord.clone();
         	
         	
+        	
         	Collection<Evaluation> storedEvals = this.getGammaMemory().retrieve(new ArgList(leftTuple.toObjectArray(),factHandle.getObject()));
     		if (storedEvals != null) {
     			record.addEvaluations(storedEvals);
@@ -386,10 +391,11 @@
         	
         	//Call internal evaluator, if not done before
     		ConstraintKey[] keys = this.constraints.getConstraintKeys();
+    		Evaluation[] evals = null;
     		if (keys != null) {
-		    		Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
-		    		if (evalTest == null) {
-		    			Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+//		    		Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
+//		    		if (evalTest == null) {
+		    			evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
 		                        													  leftTuple, 
 		                        													  factory );
 		    			//B-constraints are 0 to N
@@ -403,30 +409,34 @@
 		    				}
 		    			}
 		    				    			    			
-		    		} else {
-		    			
-		    			if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
-		    			
-		    				//B-constraints are 0 to N
-		        			//As above, in case EVAL hasn't been called yet, but no need to add to the handle
-		    				Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
-									  leftTuple, 
-									  factory );
-		
-		    				if (evals != null) {
-		    					for (Evaluation eval : evals) {
-		    						record.addEvaluation(eval);
-		    					}
-		    				}
-		    				
-		    			}			
-		    		}   
+////		    		} else {
+//		    			
+//		    			//if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
+//		    			
+//		    				//B-constraints are 0 to N
+//		        			//As above, in case EVAL hasn't been called yet, but no need to add to the handle
+//		    				Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+//									  leftTuple, 
+//									  factory );
+//		
+//		    				if (evals != null) {
+//		    					for (Evaluation eval : evals) {
+//		    						record.addEvaluation(eval);
+//		    					}
+//		    				}
+//		    				
+//		    			//} 
+//		    			
+//		    			
+//		    		}   
     		} else {
     			//EMPTY BETA CONSTRAINT!
     		}
  
         	//KEY MOVE, AND-ING THE PATTERN EVALS
     		mainRecord.addEvaluation(record);
+    		
+    		ImperfectRightTuple propRightTuple = new ImperfectRightTuple(factHandle,this,record);
         	
         	
         	System.out.println("Situation at join eval"+mainRecord.expand());        		        		        		        	
@@ -441,7 +451,7 @@
         			System.out.println("Situation is "+mainRecord.expand());
         			
         				mainRecord.setLeftTuple(leftTuple);
-        				mainRecord.setRightTuple(rightTuple);
+        				mainRecord.setRightTuple(propRightTuple);
         				mainRecord.setFactory(factory);
         				mainRecord.setPropagationContext(context);
         				mainRecord.setWorkingMemory(workingMemory);
@@ -452,7 +462,7 @@
         		case IFilterStrategy.PASS : 
         			System.out.println("Beta PASS at assertObjecf: propagate record");
         			this.sink.propagateAssertLeftTuple( leftTuple,
-                            rightTuple,
+                            propRightTuple,
                             context,
                             workingMemory,
                             factory,
@@ -478,7 +488,14 @@
     
     
 	public void update(Observable watcher, Object info) {
-		EvalRecord record = (EvalRecord) watcher;
+		
+		EvalRecord record = null;
+		if (info instanceof EvalRecord)
+			record = (EvalRecord) info;
+		
+		if (record == null) 
+			return;
+		
 		System.out.println("**************************************************************UPDATE @JOIN NODE");
 		switch (this.filterStrat.doTry(record)) {
 		case IFilterStrategy.DROP : 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -406,6 +406,8 @@
 
     public boolean equals(final Object object) {
         // we know the object is never null and always of the  type ReteTuple    
+    	if (object == null || !(object instanceof LeftTuple))
+    		return false;
         return equals( (LeftTuple) object );
     }
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,19 +1,25 @@
 package org.drools.reteoo;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Observable;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.common.BetaConstraints;
 import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.ImperfectFactHandle;
 import org.drools.common.ImplicationBetaConstraint;
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.reteoo.filters.IFilterStrategy;
 import org.drools.rule.Behavior;
+import org.drools.rule.ContextEntry;
 import org.drools.spi.PropagationContext;
 
 public class ModusPonensNode extends JoinNode {
@@ -79,11 +85,12 @@
         
             EvalRecord premiseRecord = leftTuple.getRecord();
         	            
-            Evaluation implEval = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+            ContextEntry adHocCtx = new MPContextEntry(leftTuple);
+            Evaluation implEval = this.constraints.isSatisfiedCachedRight( new ContextEntry[] {adHocCtx},
 					  leftTuple, 
 					  factory )[0];
         	
-            ArgList args = new ArgList(leftTuple.toObjectArray());
+            ArgList args = leftTuple.getArgList();
         	Collection<Evaluation> storedEvals = this.getGammaMemory().retrieve(args);
         	    		    		      
     		if (storedEvals != null) {
@@ -93,7 +100,7 @@
     		
     		
     		
-        	EvalRecord mpRecord = new EvalRecord(this.id,factory.getModusPonensOp(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        	EvalRecord mpRecord = new EvalRecord(this.id,factory.getModusPonensOp(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
         		Evaluation core = premiseRecord.getOperands().iterator().next();
         		core.deleteObserver(premiseRecord);
         	mpRecord.addEvaluation(core);        		
@@ -109,15 +116,28 @@
         			System.out.println("HOLD RULES @MP NODE"+this.getId());
         			System.out.println("Situation is "+mpRecord.expand());
         			
+        			if (mpRecord.getLeftTuple() == null || ! mpRecord.getLeftTuple().equals(leftTuple))
+        				mpRecord.addObserver(this);
+        			
         				mpRecord.setLeftTuple(leftTuple);        				
         				mpRecord.setFactory(factory);
         				mpRecord.setPropagationContext(context);
         				mpRecord.setWorkingMemory(workingMemory);
-					mpRecord.addObserver(this);	
+						
         			
         			break;
 			
         		case IFilterStrategy.PASS : 
+        			//IN CASE, RULES ARE RECALLED ANYWAY!!!
+        			if (mpRecord.getLeftTuple() == null || ! mpRecord.getLeftTuple().equals(leftTuple))
+        				mpRecord.addObserver(this);
+        			
+        				mpRecord.setLeftTuple(leftTuple);        				
+        				mpRecord.setFactory(factory);
+        				mpRecord.setPropagationContext(context);
+        				mpRecord.setWorkingMemory(workingMemory);
+        			
+        			        			
         			this.sink.propagateAssertLeftTuple( leftTuple,                            
                             context,
                             workingMemory,
@@ -141,6 +161,63 @@
 	
 	
 	
+	public void update(Observable watcher, Object info) {
+		
+		EvalRecord record = null;
+		if (info instanceof EvalRecord)
+			record = (EvalRecord) info;
+		
+		if (record == null) 
+			return;
+		
+		System.out.println("**************************************************************UPDATE @MP NODE");
+		switch (this.filterStrat.doTry(record)) {
+		case IFilterStrategy.DROP : 
+			record.deleteObserver(this);
+			return;
+		
+		case IFilterStrategy.HOLD : 
+			//do nothing
+			return;
+		
+		case IFilterStrategy.PASS :
+			//go on
+			//record.deleteObserver(this);
+			//throw new RuntimeException("Awakened objeect");
+			//TODO
+			if (record.getRightTuple() != null)
+				this.sink.propagateAssertLeftTuple( record.getLeftTuple(),
+						record.getRightTuple(),
+						record.getPropagationContext(),
+						record.getWorkingMemory(),
+						record.getFactory(),
+						record,
+						this.tupleMemoryEnabled  );
+			else
+				this.sink.propagateAssertLeftTuple( record.getLeftTuple(),						
+						record.getPropagationContext(),
+						record.getWorkingMemory(),
+						record.getFactory(),
+						record,
+						this.tupleMemoryEnabled  );
+			//break;
+		default : return;	
+		
+		}
+	
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
 	public void networkUpdated() {
         //this.rightInput.networkUpdated();
         this.leftInput.networkUpdated();
@@ -148,7 +225,63 @@
 	
 	
 	
+	public static class MPContextEntry implements ContextEntry {
+		
+		
+		private ImperfectLeftTuple leftTuple;
+		
+		public MPContextEntry(ImperfectLeftTuple lt) {
+			this.leftTuple = lt;
+		}
+		
+		public ImperfectLeftTuple getLeftTuple() {
+			return leftTuple;
+		}
+
+		public ContextEntry getNext() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public void resetFactHandle() {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void resetTuple() {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void setNext(ContextEntry entry) {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void updateFromFactHandle(InternalWorkingMemory workingMemory,
+				InternalFactHandle handle) {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void updateFromTuple(InternalWorkingMemory workingMemory,
+				LeftTuple tuple) {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void readExternal(ObjectInput arg0) throws IOException,
+				ClassNotFoundException {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void writeExternal(ObjectOutput arg0) throws IOException {
+			// TODO Auto-generated method stub
+			
+		}
+		
+	}
 	
-	
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -514,7 +514,8 @@
     
     
     public ConstraintKey getConstraintKey() {
-    	return new ConstraintKey("class","==",((ClassObjectType) this.objectType).getClassName() );
+    	String cName = ((ClassObjectType) this.objectType).getClassName();
+    	return new ConstraintKey("class","==",cName);
     }
     
     
@@ -534,11 +535,17 @@
 		
 		Evaluation eval = factHandle.getPropertyDegree(key); 
 		if (eval == null) {
-			eval = this.template.spawn(factory.True()); 				
+			eval = this.template.spawn(factory.True(),new ArgList(factHandle.getObject())); 				
 			factHandle.addPropertyDegree(eval);
 		}						
 		record.addEvaluation(eval);
 		
+		
+		if (factHandle instanceof InitialFactHandle)
+			record = null;
+		
+		
+		
         if ( this.objectMemoryEnabled ) {
             final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
             memory.add( factHandle,

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,9 +1,12 @@
 package org.drools.reteoo;
 
 import java.util.Collection;
+import java.util.LinkedList;
 import java.util.Observable;
 import java.util.Vector;
 
+import org.drools.FactHandle;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.util.Iterator;
 
 public class ObservableRightTupleMemoryWrapper extends Observable 
@@ -13,18 +16,22 @@
 	private RightTupleMemory memory;
 	
 	public ObservableRightTupleMemoryWrapper(RightTupleMemory wrapped) {
-		this.memory = wrapped;
+		this.memory = wrapped;	
 	}
 	
 
-	public EvalIterator getIterator() {
+	public EvalIterator getEvalIterator() {
 		return new EvalIterator(memory.iterator());
 	}
 	
+	public HandleIterator getHandleIterator() {
+		return new HandleIterator(memory.iterator());
+	}
+	
 
-	public Collection<Evaluation> getArgs() {
-		Vector<Evaluation> ans = new Vector<Evaluation>(memory.size());
-		EvalIterator iter = this.getIterator();
+	public LinkedList<Evaluation> getEvaluations() {
+		LinkedList<Evaluation> ans = new LinkedList<Evaluation>();
+		EvalIterator iter = this.getEvalIterator();
 			while (iter.hasNext()) {
 				ans.add(iter.next());
 			}
@@ -32,7 +39,17 @@
 		return ans;
 	}
 	
+	public LinkedList<FactHandle> getHandles() {
+		LinkedList<FactHandle> ans = new LinkedList<FactHandle>();
+		HandleIterator iter = this.getHandleIterator();
+			while (iter.hasNext()) {
+				ans.add(iter.next());
+			}
+		
+		return ans;
+	}
 	
+	
 	public void add(RightTuple rightTuple) {
 		memory.add(rightTuple);
 		this.setChanged();
@@ -71,6 +88,32 @@
 	}
 	
 	
+	
+	class HandleIterator implements java.util.Iterator<FactHandle> {
+
+		private Iterator iterator;
+		
+		public HandleIterator(Iterator iter) {
+			this.iterator = iter;
+		}
+		
+		public boolean hasNext() {
+			return iterator.hasNext();
+		}
+
+		public FactHandle next() {
+			return ((ImperfectRightTuple) iterator.next()).getFactHandle(); 
+		}
+
+		public void remove() {
+			
+		}
+		
+	}
+
+	
+	
+	
 	class EvalIterator implements java.util.Iterator<Evaluation> {
 
 		private Iterator iterator;
@@ -93,4 +136,5 @@
 		
 	}
 
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -49,7 +49,7 @@
 													getArity(),
 													operator,
 													mergeStrat,
-													nullStrat
+													nullStrat												
 													);
 					
 		return template;

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -2,7 +2,7 @@
 
 import org.drools.util.Iterator;
 
-public interface RightTupleMemory extends IOperandSet {
+public interface RightTupleMemory {
     public RightTuple getFirst(LeftTuple leftTuple);
 
     public RightTuple getLast(LeftTuple leftTuple);

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -4,56 +4,116 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.Observable;
 import java.util.Observer;
 import java.util.Set;
 import java.util.Vector;
 
+import org.drools.FactHandle;
+import org.drools.RuntimeDroolsException;
+import org.drools.common.BetaConstraints;
+import org.drools.common.EmptyBetaConstraints;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.TupleStartEqualsConstraint;
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
+import org.drools.spi.PropagationContext;
 
 public class SetCompositeEvaluation extends CompositeEvaluation {
 
 	//IOperandSet args;
 	
 	public SetCompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			IDegreeCombiner operator, IOperandSet args,
-			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
-		super(id,key,deps,mergeStrat,nullStrat);
+			IDegreeCombiner operator, OperandSet opSet,
+			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat,
+			BetaConstraints joinConstraints) {
+		super(id,key,deps,mergeStrat,nullStrat, new ArgList());
 		
 		setOperator(operator);
 		
-		if (args != null) {
-			this.operands = new Vector<Evaluation>(args.size());
+		if (opSet != null && opSet.size() > 0) {
+			this.operands = new Vector<Evaluation>(Math.max(1,opSet.size()),1);
 			
-			int j = 0;
-			for (Evaluation eval : args.getArgs())
-				setOperand(j++,eval);
+			LinkedList<Evaluation> evals = opSet.getEvaluations();
+			LinkedList<FactHandle> handles = opSet.getHandles();
+			for (int j = 0; j < opSet.size(); j++) {
+				
+								
+				EvalRecord record = ((EvalRecord) evals.get(j)).clone();
+				
+				
+				if (! (joinConstraints instanceof EmptyBetaConstraints)) {			
+					Evaluation[] newEvals = joinConstraints.isSatisfiedCachedLeft(opSet.getContext(), (InternalFactHandle) handles.get(j), opSet.getFactory());
+					for (Evaluation newEv : newEvals) {
+						if (! newEv.getKey().toString().equals("starts(tuple,...)"))
+							record.addEvaluation(newEv);
+					}
+				}
+				
+				
+				setOperand(j,record);
+			}
 			
+			combine();			
+			
 		} else {
+			/*
+			if (! (joinConstraints instanceof EmptyBetaConstraints)) {			
+				Evaluation[] newEvals = joinConstraints.isSatisfiedCachedLeft(opSet.getContext(), (InternalFactHandle) handles.get(j), opSet.getFactory());
+				for (Evaluation newEv : newEvals) {
+					if (! newEv.getKey().toString().equals("starts(tuple,...)"))
+						record.addEvaluation(newEv);
+				}
+			}
+			*/
 			this.operands = new Vector<Evaluation>(0);
+			combine();
 		}
 									
-		combine();			
 		
+		
 		System.out.println("Created setCE \n "+this.toString());
 	}
 	
 	
+	
+
+
 	public void update(Observable o, Object arg) {
 		System.out.println("UPDATE HAS BEEN CALLED ON SETVAL by "+ o.toString());
 		
-		if (arg instanceof ImperfectRightTuple) {
-			ImperfectRightTuple impRT = (ImperfectRightTuple) arg;
-			if (! this.operands.contains(impRT.getRecord()))
-				this.operands.add(impRT.getRecord());
+		if (arg instanceof EvalRecord) {
+			Evaluation eval = (Evaluation) arg;
+			
+			System.out.println(eval.expand());
+			
+			
+			if (! this.operands.contains(eval)) {
+				//this.operands.add(impRT.getRecord());
+					
+				setOperand(this.operands.size(), eval);
+				System.out.println(eval.expand());
+				
+				//Just to notify the new arg...
+				setChanged();
+				this.notifyObservers(eval.getArgs());
+			}
+			
+			//
+			
+			
+			System.out.println(eval.expand());
 			combine();
 //			setChanged();
 //			this.notifyObservers();			
+		} else if (arg instanceof ArgList) {
+			this.getArgs().merge((ArgList) arg);
 		} else {
-			
+			throw new RuntimeDroolsException("Only Records & Args accepted by quantifiers, so far. received "+arg.getClass());
 					
 		}
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -115,7 +115,7 @@
 			InternalWorkingMemory workingMemory, IDegreeFactory factory,
 			EvalRecord record, boolean leftTupleMemoryEnabled) {
     	
-    	EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+    	EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
     		masterRecord.addEvaluation(record);
     		
 //    		System.out.println("--------------------------------------");

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -100,9 +100,11 @@
     /** the calculate temporal distance matrix */
     private TemporalDependencyMatrix         temporal;
     
+    private boolean							 negated;
     
     
     
+    
     private Map<ConstraintKey,Set<String>> dependencies;
     
     
@@ -135,6 +137,8 @@
         this.nodes = new LinkedList<BaseNode>();
 
         this.partitionId = null;
+        
+        this.negated = false;
     }
 
     /**
@@ -447,8 +451,22 @@
 
     
     
+    public boolean isNegated() {
+    	return negated;
+    }
     
+    /**
+     * Changes negation state
+     * @return 	the new state
+     */
+    public boolean toggleNegated() {
+    	this.negated = ! this.negated;
+    	return this.negated;
+    }
     
+    
+    
+    
 	/**
 	 * @param dependencies the dependencies to set
 	 */

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -7,12 +7,15 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.InitialFact;
 import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassObjectType;
 import org.drools.common.BetaConstraints;
 import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.TupleStartEqualsConstraint;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
 import org.drools.reteoo.AndOperatorInstaller;
 import org.drools.reteoo.ExistsNode;
 import org.drools.reteoo.ImperfectExistsNode;
@@ -27,7 +30,12 @@
 import org.drools.reteoo.RightInputAdapterNode;
 import org.drools.rule.Behavior;
 import org.drools.rule.GroupElement;
+import org.drools.rule.Pattern;
 import org.drools.rule.RuleConditionElement;
+import org.drools.spi.ObjectType;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.LinkedListNode;
 
 public class ImperfectGroupElementBuilder extends GroupElementBuilder implements
 		ReteooComponentBuilder {
@@ -72,6 +80,19 @@
 
         	
         	
+        	IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
+            
+            IDegreeCombiner operator;
+            if (context.isNegated()) {
+            	operator = factory.getNegationOperator();
+            		((NegationOperator) operator).setOperator(factory.getAndOperator());
+            	context.toggleNegated();	
+            	
+            } else {
+            	operator = factory.getAndOperator();
+            }
+        	
+        	
             final GroupElement ge = (GroupElement) rce;
 
             // iterate over each child and build it
@@ -117,17 +138,26 @@
                 }
             }
             
-            
+            int arity = ge.getChildren().size();
+            	Object firstChild = ge.getChildren().get(0);
+            	if (firstChild instanceof Pattern) {
+            		Pattern pat = (Pattern) firstChild;
+            		if (pat.getObjectType().isAssignableFrom(new ClassObjectType(InitialFact.class))) 
+            			arity--;
+            	}
+//            	if (firstChild.isPatternScopeDelimiter())
+//            		;
+            		
             OperatorInstaller instNode = new AndOperatorInstaller(
 														context.getTupleSource(),
-														ge.getChildren().size(),
+														arity,
 														context.getNextId(),
 														context.getPartitionId(),
 														context.getRuleBase().getConfiguration().isMultithreadEvaluation());
-            IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
             
-            instNode.buildEvaluationTemplate(factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
             
+            instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+            
             context.setTupleSource((LeftTupleSource) utils.attachNode(
             							context,
             							instNode
@@ -165,6 +195,18 @@
                  final BuildUtils utils,
                  final RuleConditionElement rce) {
 
+    		 IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
+
+    		 IDegreeCombiner operator;
+             if (context.isNegated()) {
+             	operator = factory.getNegationOperator();
+             		((NegationOperator) operator).setOperator(factory.getOrOperator());
+             	context.toggleNegated();	
+             	
+             } else {
+             	operator = factory.getOrOperator();
+             }
+    		 
 	
     		 final GroupElement ge = (GroupElement) rce;
 
@@ -218,10 +260,9 @@
 						context.getPartitionId(),
 						context.getRuleBase().getConfiguration().isMultithreadEvaluation());
     		 
-    		 IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
-
-    		 instNode.buildEvaluationTemplate(factory.getOrOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
     		 
+    		 instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+    		 
     		 context.setTupleSource((LeftTupleSource) utils.attachNode(
 						context,
 						instNode
@@ -252,80 +293,41 @@
         implements
         ReteooComponentBuilder {
 
-        /**
-         * @inheritDoc
-         * 
-         * Not must verify what is the class of its child:
-         * 
-         * If it is a pattern, a simple NotNode is added to the rulebase
-         * If it is a group element, than a subnetwork must be created
-         */
-        public void build(final BuildContext context,
-                          final BuildUtils utils,
-                          final RuleConditionElement rce) {
-            final GroupElement not = (GroupElement) rce;
+    	 public void build(final BuildContext context,
+                 final BuildUtils utils,
+                 final RuleConditionElement rce) {
+    		 final GroupElement not = (GroupElement) rce;
 
-            // NOT must save some context info to restore it later
-            final int currentPatternIndex = context.getCurrentPatternOffset();
-            final LeftTupleSource tupleSource = context.getTupleSource();
+    		 // 	get child
+    		 final RuleConditionElement child = (RuleConditionElement) not.getChildren().get( 0 );
 
-            // get child
-            final RuleConditionElement child = (RuleConditionElement) not.getChildren().get( 0 );
+    		 // 	set negation. Multiple cascaded negation will be toggled in chain
+    		 context.toggleNegated();
+    		 
+    		 // 	get builder for child
+    		 final ReteooComponentBuilder builder = utils.getBuilderFor( child );
 
-            // get builder for child
-            final ReteooComponentBuilder builder = utils.getBuilderFor( child );
+    		 // 		builds the child
+    		 builder.build( context,
+    				 utils,
+    				 child );
+    		     
+    		 
+    		 
+    	 }
 
-            // builds the child
-            builder.build( context,
-                           utils,
-                           child );
+    	 /**
+    	  * @inheritDoc
+    	  */
+    	 public boolean requiresLeftActivation(final BuildUtils utils,
+                                     final RuleConditionElement rce) {
+    		 final GroupElement not = (GroupElement) rce;
 
-            // if it is a subnetwork
-            if ( context.getObjectSource() == null && context.getTupleSource() != null ) {
+    		 // 	get child
+    		 final RuleConditionElement child = (RuleConditionElement) not.getChildren().get(0);
+    		 return utils.getBuilderFor(child).requiresLeftActivation(utils, child);
 
-                // attach right input adapter node to convert tuple source into an object source
-                context.setObjectSource( (ObjectSource) utils.attachNode( context,
-                                                                          new RightInputAdapterNode( context.getNextId(),
-                                                                                                     context.getTupleSource(),
-                                                                                                     context ) ) );
-
-                // restore tuple source from before the start of the sub network
-                context.setTupleSource( tupleSource );
-
-                // create a tuple start equals constraint and set it in the context
-                final TupleStartEqualsConstraint constraint = TupleStartEqualsConstraint.getInstance();
-                final List predicates = new ArrayList();
-                predicates.add( constraint );
-                context.setBetaconstraints( predicates );
-
-            }
-
-            final BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
-                                                                                    context.getBetaconstraints(),
-                                                                                    false );
-            Behavior[] behaviors = createBehaviorArray( context );
-
-            // then attach the NOT node. It will work both as a simple not node
-            // or as subnetwork join node as the context was set appropriatelly
-            // in each case
-            context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
-                                                                        new NotNode( context.getNextId(),
-                                                                                     context.getTupleSource(),
-                                                                                     context.getObjectSource(),
-                                                                                     betaConstraints,
-                                                                                     behaviors,
-                                                                                     context ) ) );
-            context.setBetaconstraints( null );
-            context.setObjectSource( null );
-
-            // restore pattern index
-            context.setCurrentPatternOffset( currentPatternIndex );
-        }
-
-        public boolean requiresLeftActivation(final BuildUtils utils,
-                                              final RuleConditionElement rce) {
-            return true;
-        }
+    	 }
     }
 
     private static class ImperfectExistsBuilder
@@ -343,6 +345,20 @@
         public void build(final BuildContext context,
                           final BuildUtils utils,
                           final RuleConditionElement rce) {
+        	
+        	IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
+            
+            IDegreeCombiner operator;
+            if (context.isNegated()) {
+            	operator = factory.getNegationOperator();
+            		((NegationOperator) operator).setOperator(factory.getExistsOperator());
+            	context.toggleNegated();	
+            	
+            } else {
+            	operator = factory.getExistsOperator();
+            }
+        	
+        	
             final GroupElement exists = (GroupElement) rce;
 
             // EXISTS must save some context info to restore it later
@@ -380,22 +396,32 @@
 
             }
 
-            final BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
+            BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
                                                                                     context.getBetaconstraints(),            																		
                                                                                     false );
+                                   
+            
 
             Behavior[] behaviors = createBehaviorArray( context );
 
             // then attach the EXISTS node. It will work both as a simple exists node
             // or as subnetwork join node as the context was set appropriatelly
             // in each case
+            
+            
+            
+            
+            ImperfectExistsNode	exNode = new ImperfectExistsNode( context.getNextId(),
+                    context.getTupleSource(),
+                    context.getObjectSource(),
+                    betaConstraints,
+                    behaviors,
+                    context );
+            
+            exNode.buildEvaluationTemplate(operator,context.getRule().getDependencies(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+            
             context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
-                                                                        new ImperfectExistsNode( context.getNextId(),
-                                                                                        context.getTupleSource(),
-                                                                                        context.getObjectSource(),
-                                                                                        betaConstraints,
-                                                                                        behaviors,
-                                                                                        context ) ) );
+                                                                         exNode) );
             context.setBetaconstraints( null );
             context.setObjectSource( null );
 
@@ -408,7 +434,8 @@
          */
         public boolean requiresLeftActivation(final BuildUtils utils,
                                               final RuleConditionElement rce) {
-            return true;
+        	
+        	 return true;
         }
     }
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -50,7 +50,7 @@
         this.getUtils().addBuilder( Accumulate.class,
                                new AccumulateBuilder() );
         this.getUtils().addBuilder( Forall.class,
-                               new ForallBuilder() );
+                               new ImperfectForallBuilder() );
         this.getUtils().addBuilder( EntryPoint.class,
                                new EntryPointBuilder() );
     }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -29,8 +29,10 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.AlphaNode;
 import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.ImperfectRuleBase;
 import org.drools.reteoo.ObjectSource;
 import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.PatternNegator;
 import org.drools.reteoo.PropagationQueuingNode;
 import org.drools.rule.Behavior;
 import org.drools.rule.CompositeMaxDuration;
@@ -299,6 +301,23 @@
                                                                                      context ) ) );
         }
 
+        if (context.isNegated()
+        		
+        		//&&
+        		// Has to be imperfect
+        		//context.getRuleBase() instanceof ImperfectRuleBase
+        		) {
+        	
+        	context.toggleNegated();
+        	
+        	context.setObjectSource( (ObjectSource) utils.attachNode(context,         			
+        															 new PatternNegator(context.getNextId(),
+        																	 context.getObjectSource(),
+        																	 context)));
+        	
+        	
+        }
+        
         // now restore back to original values
         context.setObjectTypeNodeMemoryEnabled( objectMemory );
         context.setAlphaNodeMemoryAllowed( alphaMemory );

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -30,6 +30,7 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
@@ -133,7 +134,7 @@
     												workingMemory,
     												context,
     												factory);
-    	return template.spawn(deg);
+    	return template.spawn(deg,new ArgList(handle.getObject()));
 	}
 
     public String toString() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -265,7 +265,8 @@
     
 	public ConstraintKey getConstraintKey() {
 		if (singletonKey == null) {			
-			singletonKey = new ConstraintKey(((ClassFieldReader) this.readAccessor).getClassName()+"."+((ClassFieldReader) this.readAccessor).getFieldName(),this.getEvaluator().toString(),this.getField().toString());
+			String cName = ((ClassFieldReader) this.readAccessor).getClassName();			
+			singletonKey = new ConstraintKey(cName + "."+((ClassFieldReader) this.readAccessor).getFieldName(),this.getEvaluator().toString(),this.getField().toString());
 		}
 		return singletonKey;
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -13,10 +13,12 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.CompositeEvaluationTemplate;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.spi.AcceptsReadAccessor;
@@ -120,7 +122,7 @@
 											 workingMemory, 
 											 context, 
 											 factory);			
-		return getTemplate().spawn(deg);
+		return getTemplate().spawn(deg,new ArgList(handle.getObject()));
 	}
 
     public ContextEntry createContextEntry() {
@@ -136,7 +138,7 @@
     public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
     	return this.getTemplate().spawn(this.restrictions.isSatisfiedCachedLeft( context,
-                handle, factory ));
+                handle, factory ),new ArgList(handle.getObject()));
 	}
     
     public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -148,7 +150,8 @@
     public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
     	return this.getTemplate().spawn(this.restrictions.isSatisfiedCachedRight( tuple,
-                context, factory ));
+                context, factory ),
+                ((ImperfectLeftTuple) tuple).getArgList());
 	}
 
     public Object clone() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -198,6 +198,11 @@
     public List getConstraints() {
         return Collections.unmodifiableList( this.constraints );
     }
+    
+    public void dropLastConstraint() {    	
+    	if (this.constraints.size() > 0)
+    		this.constraints.remove(this.constraints.size()-1);
+    }
 
     public void addConstraint(final Constraint constraint) {
         if ( this.constraints == Collections.EMPTY_LIST ) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -32,8 +32,10 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.spi.CompiledInvoker;
 import org.drools.spi.InternalReadAccessor;
@@ -291,7 +293,7 @@
             final ContextEntry ctx, IDegreeFactory factory) {
     	
     	IDegree deg = factory.fromBoolean(this.isAllowed(handle, workingMemory, ctx));
-    	return getTemplate().spawn(deg);
+    	return getTemplate().spawn(deg, new ArgList(handle.getObject()));
 	}
         
 
@@ -327,7 +329,7 @@
     
     public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return this.getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedLeft(context, handle)));
+		return this.getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedLeft(context, handle)), new ArgList(handle.getObject()));
 	}
 
 
@@ -349,7 +351,8 @@
     
     public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedRight(tuple, context)));
+		return getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedRight(tuple, context)),
+				((ImperfectLeftTuple) tuple).getArgList());
 	}
 
     public Object clone() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -28,8 +28,10 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
 import org.drools.runtime.rule.Evaluator;
@@ -157,7 +159,7 @@
                                                workingMemory,
                                                context,
                                                factory);
-            return getTemplate().spawn(deg);
+            return getTemplate().spawn(deg,new ArgList(handle.getObject()));
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
                                               e );            
@@ -189,7 +191,8 @@
                                                 ctx.getTuple(),
                                                 ctx.getWorkingMemory(),
                                                 ctx,
-                                                factory));
+                                                factory),
+                                                new ArgList(handle.getObject()));
          } catch ( final Exception e ) {
              throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
                                                e );
@@ -222,7 +225,8 @@
                                                tuple,
                                                ctx.getWorkingMemory(),
                                                ctx,
-                                               factory));
+                                               factory),
+                                               ((ImperfectLeftTuple) tuple).getArgList());
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
                                               e );

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -27,9 +27,13 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.ImperfectLeftTuple;
 import org.drools.reteoo.LeftTuple;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Evaluator;
 import org.drools.spi.InternalReadAccessor;
@@ -131,21 +135,33 @@
                 workingMemory,
                 context,
                 factory);
-    	return getTemplate().spawn(deg);
+    	return getTemplate().spawn(deg,new ArgList(handle.getObject()));
 	}
 
 	public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
+		
+		//merge to ensure uniqueness
+		ArgList args = ((ImperfectLeftTuple) ((VariableContextEntry) context).getTuple()).getArgList();
+		args.merge(handle.getObject());
+		
 		return this.getTemplate().spawn(this.restriction.isSatisfiedCachedLeft( context,
                 handle,
-                factory));
+                factory),
+                args);
 	}
 
 	public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
+		
+		//merge to ensure uniqueness
+		ArgList args = ((ImperfectLeftTuple) tuple).getArgList();
+			args.merge(((VariableContextEntry) context).getObject());
+						
 		return this.getTemplate().spawn(this.restriction.isSatisfiedCachedRight( tuple,
-                context, 
-                factory));
+                										context, 
+                										factory),
+                										args);
 	}
     
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -9,6 +9,7 @@
 import java.util.Collection;
 import java.util.LinkedList;
 
+import org.drools.FactHandle;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.ImperfectRightTuple;
 import org.drools.reteoo.LeftTuple;
@@ -375,7 +376,7 @@
 
     
     
-    public Collection<Evaluation> getArgs() {
+    public LinkedList<Evaluation> getEvaluations() {
 		LinkedList<Evaluation> ans = new LinkedList<Evaluation>();
 		Iterator iter = this.iterator();
 		while (iter.hasNext()) {
@@ -385,4 +386,17 @@
 		}
 		return ans;
 	}
+    
+    
+    public LinkedList<FactHandle> getHandles() {
+		LinkedList<FactHandle> ans = new LinkedList<FactHandle>();
+		Iterator iter = this.iterator();
+		while (iter.hasNext()) {
+			RightTuple rt = (RightTuple) iter.next();
+			if (rt instanceof ImperfectRightTuple)
+				ans.add(((ImperfectRightTuple) rt).getFactHandle());
+		}
+		return ans;
+	}
+    
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -6,6 +6,7 @@
 import java.util.Collection;
 import java.util.LinkedList;
 
+import org.drools.FactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.ImperfectRightTuple;
@@ -216,7 +217,7 @@
         return builder.toString();
     }
 
-	public Collection<Evaluation> getArgs() {
+	public LinkedList<Evaluation> getEvaluations() {
 		LinkedList<Evaluation> ans = new LinkedList<Evaluation>();
 		Iterator iter = this.iterator();
 		while (iter.hasNext()) {
@@ -226,4 +227,17 @@
 		}
 		return ans;
 	}
+
+	public LinkedList<FactHandle> getHandles() {
+		LinkedList<FactHandle> ans = new LinkedList<FactHandle>();
+		Iterator iter = this.iterator();
+		while (iter.hasNext()) {
+			RightTuple rt = (RightTuple) iter.next();
+			if (rt instanceof ImperfectRightTuple)
+				ans.add(((ImperfectRightTuple) rt).getFactHandle());
+		}
+		return ans;
+	}
+	
+	
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath	2009-04-25 02:31:25 UTC (rev 26251)
@@ -3,8 +3,8 @@
 	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
 	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
 	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
-	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/rules"/>
 	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+	<classpathentry kind="src" path="src/main/rules"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
 	<classpathentry kind="output" path="target/classes"/>

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -168,7 +168,7 @@
 		}
 		
 		public int hashCode() {
-			return this.message.hashCode()+this.status;
+			return 10+this.message.hashCode()+this.status;
 		}
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -41,6 +41,10 @@
 			return temperature.getEvaluator(opId);
 		}
 		
+		
+		public int hashCode() {
+			return 47;
+		}
 
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -238,6 +238,8 @@
 		
 		public boolean equals(Object other) {
 			if (other == null) return false;
+			if (! (other instanceof Person))
+				return false;
 			Person p = (Person) other;
 			if (p == null) return false;
 			return this.name.equals(p.name);
@@ -299,6 +301,7 @@
 		
 		public boolean equals(Object other) {
 			if (other == null) return false;
+			if (! (other instanceof Book)) return false;
 			Book b = (Book) other;
 			if (b == null) return false;
 			return this.title.equals(b.title);

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,8 +1,10 @@
 package org.drools.examples.chance;
 
+import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileWriter;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -71,45 +73,59 @@
 		final StatefulKnowledgeSession ksession = kbase
 				.newStatefulKnowledgeSession();
 		
+		
+		
 //	
 		FileWriter writer = new FileWriter("testQuant.log");
 		ksession.setGlobal("writer", writer);
 		
+		PrintStream outFile = new PrintStream("testQuant.out"); 
+		System.setOut(outFile);
 		
+		
 		ksession.fireAllRules();
 		
+		System.out.println("\n\n\n\n\n\n no msg in ********************************************************\n\n\n\n\n\n\n");
 		
 		
 		final Message message = new Message();		
-		message.setStatus(0);		
+		message.setStatus(0);
+		message.setMessage("M0");
 			ksession.insert(message);
 			
 		ksession.fireAllRules();
 		
 		
-		System.out.println("\n\n\n\n\n\n **********************************************************\n\n\n\n\n\n\n");
+		System.out.println("\n\n\n\n\n\n rigth msg in **********************************************************\n\n\n\n\n\n\n");
 		
 		Message message1 = new Message();		
-		message1.setStatus(1);		
+		message1.setStatus(1);
+		message1.setMessage("M1");
 			ksession.insert(message1);
 			
-			System.out.println("\n\n\n\n\n\n **********************************************************\n\n\n\n\n\n\n");
-		
+		System.out.println("\n\n\n\n\n\n msg 1 in**********************************************************\n\n\n\n\n\n\n");
+
+		ksession.fireAllRules();
+
+			
+			
 		Message message2 = new Message();		
 		message2.setStatus(2);		
+		message2.setMessage("M2");
 			ksession.insert(message2);
 		
 		ksession.fireAllRules();
 		
-
+		System.out.println("\n\n\n\n\n\n msg 2 in**********************************************************\n\n\n\n\n\n\n");
 		
 		
-	
+//	
 		
 		
 		
 		
 		writer.close();
+		outFile.close();
 //		logger.close();
 
 		ksession.dispose();
@@ -170,7 +186,7 @@
 		
 		public int hashCode() {
 			//return this.message.hashCode()+this.status;
-			return this.status;
+			return this.status*11+3;
 		}
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl	2009-04-25 02:31:25 UTC (rev 26251)
@@ -9,11 +9,19 @@
 
 rule "TestOpDegs"	
 	when
-		(Message(status random[] 0 && status random[] 1)
+		
+		(Message( status == 0 && status == 1 )
 		or 
-		Message(status random[] 2))
-		and
-		Message(status random[] 3)
+		Message(status not random[] 2))
+		
+		
+		not (Message(status random[] 3)
+			and
+			Message(status random[] 4)
+			)
+				
+		Message(status random[] 5)
+		
 									
 	then
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl	2009-04-25 02:31:25 UTC (rev 26251)
@@ -7,15 +7,231 @@
 
 global FileWriter writer;
 
-rule "Test Exist"	
+/*
+//Check that join works properly
+rule "Test Join"	
 	when
-		exists(
-			m: Message(status == 0)
+		
+			m: Message(status == 0)			
+			n : Message(status == 1)					
+	then
+		writer.write("\n\n Tested couple "+m.getMessage() + " " + n.getMessage() +"\n");
+		writer.write("Simple Join check "+drools.getConsequenceDegree()+"\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree()+"\n");	
+end
+*/
+
+
+
+/*
+//check also GE joins with bindings
+rule "Test Join 2"	
+	when
+		
+					m : Message( status == 1)
+					and			
+					p : Message( this == m, status == 1)						
+		
+	then
+		writer.write(m.getMessage() + "  " + p.getMessage());
+		writer.write("Self-Join check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+		System.out.println(m.getMessage() + "  " + p.getMessage());	
+end
+*/
+
+
+/*
+//check also GE joins with bindings
+rule "Test Join 2bis"	
+	when
+		
+					m : Message()								
+					p : Message( this == m, status > -1)
+				 	q : Message( this == m, status < 2)						
+		
+	then
+		writer.write(m.getMessage() + "  " + p.getMessage() + q.getMessage() + "\n");
+		writer.write("Self-Join check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+		System.out.println(m.getMessage() + "  " + p.getMessage());	
+end
+*/
+
+
+
+/*
+//Test exist quantifier
+rule "Test Exist 3"	
+	when
+		exists (				   
+				   Message( status == 1)							
+		)
+	then
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
 			
+end
+*/
+
+
+/*
+// Test quantifier with GEs
+rule "Test Exist 4"	
+	when
+		exists (
+				   Message( status == 0 )
+				   and 
+				   Message( status == 1)							
 		)
 	then
-		writer.write("Existential check "+drools.getConsequenceDegree()+"\n");
-		System.out.println("Existential check "+drools.getConsequenceDegree()+"\n");	
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());			
 end
 
+*/
 
+
+
+
+/*
+// Test external variable binding
+rule "Test Exist 5"	
+	when
+		$m : Message($s : status == 0)
+		exists ( Message(status > $s) )
+	then
+		writer.write("\n\n Conditional join with existence\n");
+		writer.write("\t Rule triggered for " + $m.getMessage() + "\n");
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+			
+end
+*/
+
+
+
+/*
+//Test simple forall using exist
+rule "Test Exist 6"	
+	when
+		not ( 
+			exists (
+				   	not ( Message( status random[] 0 )
+				   							
+		) ) )
+	then
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+			
+end
+*/
+
+
+
+
+
+/*
+rule "Test Exist 7"	
+	when
+		forall (
+					Message( status < 1 )					
+		)
+	then
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+			
+end
+*/
+
+
+/*
+rule "Test Exist 7bis"	
+	when
+		Message( status == 2 )
+		forall (
+					Message( status < 3 )					
+		)
+	then
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+			
+end
+*/
+
+
+
+
+rule "Test Exist 8"	
+	when
+		Message( status == 1)
+		forall (
+					m : Message()
+					Message( this == m , status <= 1)
+					Message( this == m , status > -1)					
+		)
+	then
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+			
+end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+//Complex nesting and conversion
+rule "Test Exist 8"	
+	when
+		not ( exists (
+						m : Message()
+						and
+						not (
+							exists (
+								Message( this == m , status <= 1)	
+								and
+								Message( this == m , status > -2)							
+							)
+						)
+					)					
+		)
+	then
+		
+		writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+		System.out.println("Existential check "+drools.getConsequenceDegree());
+			
+end
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Modified: labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt	2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt	2009-04-25 02:31:25 UTC (rev 26251)
@@ -1 +1 @@
-5.0.0.SNAPSHOT 26142:26163M
\ No newline at end of file
+5.0.0.SNAPSHOT 26142:26190M
\ No newline at end of file




More information about the jboss-svn-commits mailing list