[jboss-svn-commits] JBL Code SVN: r26123 - in labs/jbossrules/branches/DroolsChance: drools-api/src/main/java/org/drools/degrees and 27 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Apr 17 13:02:02 EDT 2009


Author: dsotty
Date: 2009-04-17 13:02:02 -0400 (Fri, 17 Apr 2009)
New Revision: 26123

Added:
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/Degree.java
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/IDegree.java
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/SimpleDegree.java
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/
   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-api/src/main/java/org/drools/rule/
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/spi/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Fan.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest0.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest1.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Room.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/SpeedDomain.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/TemperatureDomain.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Test.java
   labs/jbossrules/branches/DroolsChance/drools-chance/src/main/resources/
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.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/reteoo/ModusPonensNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/AlwaysPassFilterStrategy.java
Modified:
   labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java
   labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java
   labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java
   labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java
   labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/BaseDescr.java
   labs/jbossrules/branches/DroolsChance/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
   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/BetaConstraints.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.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/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/NamedEntryPoint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.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/IDegreeCombiner.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMergeStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.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/impl/StatefulKnowledgeSessionImpl.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.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/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/GammaMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/IGammaNode.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/JoinNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.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/ReteooRuleBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/FuzzyFilterStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.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/OrConstraint.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/rule/VariableRestriction.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
   labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt
   labs/jbossrules/branches/DroolsChance/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java
Log:
Treed Record + Beta Synch + Modus Ponens + Exceptions + Many BugFixes

Added: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/Degree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/Degree.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/Degree.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,8 @@
+package org.drools.degrees;
+
+public abstract class Degree implements IDegree {
+		
+	public abstract boolean toBoolean();
+	
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/IDegree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/IDegree.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/IDegree.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,10 @@
+package org.drools.degrees;
+
+public interface IDegree {
+		
+	
+	public boolean toBoolean();
+	
+	public SimpleDegree getDegree();
+	
+}

Added: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/SimpleDegree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/SimpleDegree.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/degrees/SimpleDegree.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,65 @@
+package org.drools.degrees;
+
+public class SimpleDegree extends Degree {
+	
+	private float value;
+
+	/**
+	 * @param degree the degree to set
+	 */
+	public void setValue(float value) {
+		this.value = value;
+	}
+
+	/**
+	 * @return the degree
+	 */
+	public float getValue() {
+		return value;
+	}
+
+	
+	
+	public boolean equals(Object other) {
+		if (other == null) return false;
+		if (! (other instanceof SimpleDegree)) return false;
+		return this.value == ((SimpleDegree) other).value;
+	}
+	
+	
+	
+	public static IDegree TRUE() {
+		return new SimpleDegree(1);
+	}
+	
+	public static IDegree FALSE() {
+		return new SimpleDegree(0);
+	}
+	
+	public static IDegree UNKNOWN() {
+		return null;
+	}
+	
+	
+	
+	public SimpleDegree(float degree) {
+		this.value = degree;
+	}
+	
+	
+	
+	
+	public boolean toBoolean() {		
+		return value > 0.5;
+	}
+
+	public SimpleDegree getDegree() {
+		return this;
+	}
+
+	
+	public String toString() {
+		return ""+value;
+	}
+	
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,95 @@
+package org.drools.reteoo;
+
+public class ArgList {
+	
+	private Object[] args;
+	
+	private boolean isPersistent = false;
+	
+	public ArgList(Object[] args) {
+		this.args = args;
+		for (int j = 0; j < args.length; j++)
+			if (args[j] instanceof Jolly)
+				isPersistent = true;
+	}
+	
+	public ArgList(Object arg) {
+		this.args = new Object[] {arg};
+		if (arg instanceof Jolly)
+			isPersistent = true;
+	}
+	
+	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;
+	}
+	
+	
+	
+	
+	public Object getObject() {
+		return args[args.length-1];
+	}
+	
+
+	
+	
+	
+	
+	
+	public int hashCode() {
+		int ans = 2131;
+		for (int j = 0; j < args.length; j++)
+			ans ^= args[j].hashCode();
+		return ans;
+	}
+	
+	public boolean equals(Object other) {
+		if (other == null) return false;
+		if (other == this) return true;
+		
+		ArgList otherArgs = (ArgList) other;
+		
+		if (otherArgs != null) {
+			if (this.args.length != otherArgs.args.length)
+				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) {
+						ans = ans && true;
+					} else {
+						ans = ans && this.args[j].equals(otherArgs.args[j]);
+					}
+				}
+								
+			return ans;
+		} else {
+			return false;
+		}
+			
+		
+	}
+
+	public boolean isPersistent() {
+		return isPersistent;
+	}
+	
+	
+	
+	
+	public static class Jolly {
+		
+		public Jolly() {
+			
+		}
+	}
+	
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,65 @@
+package org.drools.reteoo;
+
+
+public class ConstraintKey {
+	
+	protected String key;
+
+	
+	public ConstraintKey(String field, String op, String value) {
+		this.key = op+"("+field+","+value+")";	
+	}
+	
+	public ConstraintKey(String op,ConstraintKey[] args) {
+		this.key = op+"(";
+			for (int j = 0; j < args.length; j++) {
+				this.key += args[j].toString();
+				if (j != args.length -1)
+					this.key += ",";
+			}
+				
+		this.key += ")";	
+	}
+	
+	
+	
+
+	public ConstraintKey(String op, String arg) {
+		this.key = op+"("+arg+")";
+	}
+
+	public ConstraintKey(String key) {
+		this.key = key;
+	}
+
+	/**
+	 * @return the key
+	 */
+	public String toString() {
+		return key;
+	}
+
+	
+	
+	public boolean equals(Object other) {
+		if (other == null) return false;
+		if (other instanceof ConstraintKey)
+			return this.key.equals(((ConstraintKey) other).key);
+		else 
+			return false;		
+	}
+	
+	public int hashCode() {
+		return key.hashCode();
+	}
+
+//	/**
+//	 * @param constr the constr to set
+//	 */
+//	public void setConstr(Constraint constr) {
+//		this.constr = constr;
+//	}
+
+
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,24 @@
+package org.drools.reteoo;
+
+public class DynamicConstraintKey extends ConstraintKey {
+
+	public DynamicConstraintKey(String op) {
+		super(op, "");
+	}
+
+	
+	public void addArg(ConstraintKey arg) {
+		
+		
+		StringBuilder sb = new StringBuilder(this.key.substring(0,this.key.length()-1));
+		if (key.indexOf("()") == -1)
+			sb.append(',');
+		sb.append(arg.key);
+		sb.append(')');
+		
+		this.key = sb.toString();
+		
+		System.out.println("KEY EXPANDED "+arg+" into "+key);
+	}
+
+}

Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -2,6 +2,7 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.ArgList;
 
 
 /**
@@ -63,7 +64,7 @@
     
     
     
-    void inject(String ruleName, Object object, ConstraintKey key, IDegree degree);
+    void inject(String ruleName, ArgList args, ConstraintKey key, IDegree degree);
     
     
 

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Fan.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Fan.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Fan.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,65 @@
+package org.drools.examples;
+
+import org.drools.degrees.IDegree;
+import org.drools.fuzzy.evaluators.IDynamicEvaluable;
+import org.drools.spi.Evaluator;
+
+
+public class Fan implements IDynamicEvaluable {
+	
+	private SpeedDomain speed = new SpeedDomain();
+	
+	private float price = 100.0f;
+	
+	public float getPrice() {
+		return price;
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	public boolean equals(Object other) {
+		return (other != null && other instanceof Fan);
+	}
+		
+	public int hashCode() {
+		return 37;
+	}
+	
+	
+	public Fan() {
+		
+	}
+
+	/**
+	 * @param speed the speed to set
+	 */
+	public void setSpeed(Double speed) {
+		this.speed.setValue(speed);
+	}
+	
+	public void setSpeed(String set, IDegree deg) {
+		this.speed.setValue(set,deg);
+	}
+	
+	
+	/**
+	 * @return the speed
+	 */
+	public Double getSpeed() {
+		return speed.getValue();
+	}
+
+	
+	public Evaluator getPred(String opId) {
+		return speed.getEvaluator(opId);
+	}
+	
+	
+}
\ No newline at end of file

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest0.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest0.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest0.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,188 @@
+package org.drools.examples;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.drools.FactHandle;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBaseConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceConfiguration;
+import org.drools.builder.ResourceType;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.definition.KnowledgePackage;
+import org.drools.event.rule.DebugAgendaEventListener;
+import org.drools.event.rule.DebugWorkingMemoryEventListener;
+import org.drools.io.ResourceFactory;
+import org.drools.logger.KnowledgeRuntimeLogger;
+import org.drools.logger.KnowledgeRuntimeLoggerFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+
+public class FuzzyTest0 {
+
+	
+	public static final void main(final String[] args) throws Exception {
+		
+		
+		Properties props = new Properties();
+		props.load(new FileInputStream("src/fuzzyTest.packagebuilder.conf"));
+			KnowledgeBuilderConfiguration conf = new PackageBuilderConfiguration(props);
+				conf.setProperty("drools.assertBehaviour","equality");
+				
+		
+		
+		final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
+				.newKnowledgeBuilder(conf);
+
+		
+		
+
+		//EXAMPLE 1
+		kbuilder.add(ResourceFactory.newClassPathResource("FuzzyTest0.drl",
+				FuzzyTest0.class), ResourceType.DRL );
+		
+	
+		// Check the builder for errors
+		if (kbuilder.hasErrors()) {
+			System.out.println(kbuilder.getErrors().toString());
+			throw new RuntimeException("Unable to compile \"Fyzzytest.drl\".");
+		}
+
+		// get the compiled packages (which are serializable)
+		final Collection<KnowledgePackage> pkgs = kbuilder
+				.getKnowledgePackages();
+
+		
+		
+		RuleBaseConfiguration rbconf = new RuleBaseConfiguration(props);
+				rbconf.setProperty("drools.assertBehaviour","equality");
+				//rbconf.setProperty("drools.imperfect.factory", "org.drools.degrees.factory.SimpleDegreeFactory");
+		
+		// add the packages to a knowledgebase (deploy the knowledge packages).
+		final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(rbconf);
+		kbase.addKnowledgePackages(pkgs);
+
+		
+		
+		final StatefulKnowledgeSession ksession = kbase
+				.newStatefulKnowledgeSession();
+		
+		FileWriter writer = new FileWriter("fuzzyTest0.log");
+		ksession.setGlobal("writer", writer);
+		
+		Room r = new Room(27.5f);
+		
+		ksession.insert(r);				
+		ksession.fireAllRules();
+		
+		writer.close();
+
+//		ksession.addEventListener(new DebugAgendaEventListener());
+//		ksession.addEventListener(new DebugWorkingMemoryEventListener());
+
+		// setup the audit logging
+//	KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory
+//				.newFileLogger(ksession, "log/helloworld");
+
+//		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+		
+		
+		
+		
+
+//		logger.close();
+
+		ksession.dispose();
+	}
+
+	public static class Message {
+		public static final int HELLO = 0;
+		public static final int GOODBYE = 1;
+		public static final int FUFF = 3;
+
+		public String message = "";
+
+		private int status;
+
+		public Message() {
+
+		}
+
+		public String getMessage() {
+			return this.message;
+		}
+
+		public void setMessage(final String message) {
+			this.message = message;
+		}
+
+		public int getStatus() {
+			return this.status;
+		}
+
+		public void setStatus(final int status) {
+			this.status = status;
+		} 
+
+		public static Message doSomething(Message message) {
+			return message;
+		}
+
+		public boolean isSomething(String msg, List<Object> list) {
+			list.add(this);
+			return this.message.equals(msg);
+		}
+		
+		public boolean equals(Object other) {
+			if (other == null) return false;
+			if (other instanceof Message) {
+				Message o = (Message) other;
+				return o.message.equals(this.message) && o.status == this.status;
+			}
+			return false;
+		
+		}
+		
+		public int hashCode() {
+			return this.message.hashCode()+this.status;
+		}
+	}
+
+	
+	
+	
+	
+	
+		
+		
+			
+			
+		
+
+	
+	
+}

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest1.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest1.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/FuzzyTest1.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,188 @@
+package org.drools.examples;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.drools.FactHandle;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBaseConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceConfiguration;
+import org.drools.builder.ResourceType;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.definition.KnowledgePackage;
+import org.drools.event.rule.DebugAgendaEventListener;
+import org.drools.event.rule.DebugWorkingMemoryEventListener;
+import org.drools.io.ResourceFactory;
+import org.drools.logger.KnowledgeRuntimeLogger;
+import org.drools.logger.KnowledgeRuntimeLoggerFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+
+public class FuzzyTest1 {
+
+	
+	public static final void main(final String[] args) throws Exception {
+		
+		
+		Properties props = new Properties();
+		props.load(new FileInputStream("src/fuzzyTest.packagebuilder.conf"));
+			KnowledgeBuilderConfiguration conf = new PackageBuilderConfiguration(props);
+				conf.setProperty("drools.assertBehaviour","equality");
+				
+		
+		
+		final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
+				.newKnowledgeBuilder(conf);
+
+		
+		
+
+		//EXAMPLE 1
+		kbuilder.add(ResourceFactory.newClassPathResource("FuzzyTest1.drl",
+				FuzzyTest1.class), ResourceType.DRL );
+		
+		//EXAMPLE 2
+//		kbuilder.add(ResourceFactory.newClassPathResource("FuzzyTest0.drl",
+//				FuzzyTest.class), ResourceType.DRL );
+
+		// Check the builder for errors
+		if (kbuilder.hasErrors()) {
+			System.out.println(kbuilder.getErrors().toString());
+			throw new RuntimeException("Unable to compile \"Fyzzytest.drl\".");
+		}
+
+		// get the compiled packages (which are serializable)
+		final Collection<KnowledgePackage> pkgs = kbuilder
+				.getKnowledgePackages();
+
+		
+		
+		RuleBaseConfiguration rbconf = new RuleBaseConfiguration(props);
+				rbconf.setProperty("drools.assertBehaviour","equality");
+		
+		// add the packages to a knowledgebase (deploy the knowledge packages).
+		final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(rbconf);
+		kbase.addKnowledgePackages(pkgs);
+
+		
+		
+		final StatefulKnowledgeSession ksession = kbase
+				.newStatefulKnowledgeSession();
+		
+		FileWriter writer = new FileWriter("fuzzyTest1.log");
+		ksession.setGlobal("writer", writer);
+		
+		Room r = new Room(27.5f);
+		Fan f = new Fan();
+		
+		ksession.insert(f);
+		ksession.insert(r);				
+		ksession.fireAllRules();
+		
+
+//		
+//		
+		writer.write("\n\n\n\nULTIMATE ANSWER : FAN speed is "+f.getSpeed()+"\n\n");
+		
+		writer.close();
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+		
+		
+		
+		
+
+//		logger.close();
+
+		ksession.dispose();
+	}
+
+	public static class Message {
+		public static final int HELLO = 0;
+		public static final int GOODBYE = 1;
+		public static final int FUFF = 3;
+
+		public String message = "";
+
+		private int status;
+
+		public Message() {
+
+		}
+
+		public String getMessage() {
+			return this.message;
+		}
+
+		public void setMessage(final String message) {
+			this.message = message;
+		}
+
+		public int getStatus() {
+			return this.status;
+		}
+
+		public void setStatus(final int status) {
+			this.status = status;
+		} 
+
+		public static Message doSomething(Message message) {
+			return message;
+		}
+
+		public boolean isSomething(String msg, List<Object> list) {
+			list.add(this);
+			return this.message.equals(msg);
+		}
+		
+		public boolean equals(Object other) {
+			if (other == null) return false;
+			if (other instanceof Message) {
+				Message o = (Message) other;
+				return o.message.equals(this.message) && o.status == this.status;
+			}
+			return false;
+		
+		}
+		
+		public int hashCode() {
+			return this.message.hashCode()+this.status;
+		}
+	}
+
+	
+	
+	
+	
+	
+		
+		
+			
+			
+		
+
+	
+	
+}

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Room.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Room.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Room.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,46 @@
+package org.drools.examples;
+
+import org.drools.fuzzy.RealDomain;
+import org.drools.fuzzy.evaluators.IDynamicEvaluable;
+import org.drools.spi.Evaluator;
+
+
+public class Room implements IDynamicEvaluable{
+	
+		private TemperatureDomain temperature = new TemperatureDomain();
+
+		
+		
+		public Room(double temp) {
+			this.setTemperature(temp);
+		}
+		
+
+		/**
+		 * @param temperature the temperature to set
+		 */
+		public void setTemperature(Double temperature) {
+			this.temperature.setValue(temperature);
+		}
+
+		/**
+		 * @return the temperature
+		 */
+		public Double getTemperature() {
+			return temperature.getValue();
+		}
+		
+		
+		public Evaluator getHot() {
+			return temperature.getEvaluator(TemperatureDomain.HOT);
+		}
+
+
+		
+		public Evaluator getPred(String opId) {
+			return temperature.getEvaluator(opId);
+		}
+		
+
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/SpeedDomain.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/SpeedDomain.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/SpeedDomain.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,95 @@
+package org.drools.examples;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.base.evaluators.Operator;
+import org.drools.fuzzy.FuzzySet;
+import org.drools.fuzzy.NumericDomainFuzzySet;
+import org.drools.fuzzy.RealDomain;
+import org.drools.fuzzy.evaluators.FuzzyNumericEvaluator;
+import org.drools.fuzzy.evaluators.membership.TriangleMembership;
+import org.drools.spi.Evaluator;
+
+
+public class SpeedDomain extends RealDomain {
+	
+	
+	public static final String STOP = "stop";
+	public static final String SLOW = "slow";
+	public static final String FAST = "fast";
+	
+		
+	
+			
+	public static final Operator   stopOp         = Operator.addOperatorToRegistry( SpeedDomain.STOP,false );
+	public static final Operator   notStopOp      = Operator.addOperatorToRegistry( SpeedDomain.STOP,true );
+	
+	public static final Operator   slowOp         = Operator.addOperatorToRegistry( SpeedDomain.SLOW,false );
+	public static final Operator   notSlowOp      = Operator.addOperatorToRegistry( SpeedDomain.SLOW,true );
+	
+	public static final Operator   fastOp         = Operator.addOperatorToRegistry( SpeedDomain.FAST,false );
+	public static final Operator   notFastOp      = Operator.addOperatorToRegistry( SpeedDomain.FAST,true );
+	
+	protected static String[]  SUPPORTED_IDS	= { stopOp.getOperatorString(),
+													 slowOp.getOperatorString(),
+													 fastOp.getOperatorString(),
+
+		};
+
+	
+	public SpeedDomain() {		
+		this.addGranule(new NumericDomainFuzzySet(STOP,
+				new FuzzyNumericEvaluator(
+						stopOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 0, 50"
+						)
+			));
+		this.addGranule(new NumericDomainFuzzySet(SLOW,
+				new FuzzyNumericEvaluator(
+						slowOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 50, 50"
+						)
+			));
+		this.addGranule(new NumericDomainFuzzySet(FAST,
+				new FuzzyNumericEvaluator(
+						fastOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 100, 50"
+						)
+			));	
+	}
+	
+	
+	public String[] getEvaluatorIds() {
+		return SUPPORTED_IDS;
+	}
+
+
+	
+
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/TemperatureDomain.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/TemperatureDomain.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/TemperatureDomain.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,107 @@
+package org.drools.examples;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.base.evaluators.Operator;
+import org.drools.fuzzy.FuzzySet;
+import org.drools.fuzzy.NumericDomainFuzzySet;
+import org.drools.fuzzy.RealDomain;
+import org.drools.fuzzy.evaluators.FuzzyNumericEvaluator;
+import org.drools.fuzzy.evaluators.membership.TriangleMembership;
+import org.drools.spi.Evaluator;
+
+
+public class TemperatureDomain extends RealDomain {
+	
+	
+	public static final String COLD = "cold";
+	public static final String COOL = "cool";
+	public static final String WARM = "warm";
+	public static final String HOT = "hot";
+		
+	
+			
+	public static final Operator   coldOp         = Operator.addOperatorToRegistry( TemperatureDomain.COLD,false );
+	public static final Operator   notColdOp      = Operator.addOperatorToRegistry( TemperatureDomain.COLD,true );
+	
+	public static final Operator   coolOp         = Operator.addOperatorToRegistry( TemperatureDomain.COOL,false );
+	public static final Operator   notCoolOp      = Operator.addOperatorToRegistry( TemperatureDomain.COOL,true );
+	
+	public static final Operator   warmOp         = Operator.addOperatorToRegistry( TemperatureDomain.WARM,false );
+	public static final Operator   notWarmOp      = Operator.addOperatorToRegistry( TemperatureDomain.WARM,true );
+	
+	public static final Operator   hotOp         = Operator.addOperatorToRegistry( TemperatureDomain.HOT,false );
+	public static final Operator   notHotOp      = Operator.addOperatorToRegistry( TemperatureDomain.HOT,true );
+
+	protected static String[]  SUPPORTED_IDS	= { coldOp.getOperatorString(),
+													 coolOp.getOperatorString(),
+													 warmOp.getOperatorString(),
+													 hotOp.getOperatorString(),
+		};
+
+	
+	public TemperatureDomain() {		
+		this.addGranule(new NumericDomainFuzzySet(COLD,
+				new FuzzyNumericEvaluator(
+						coldOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 0, 10"
+						)
+			));
+		this.addGranule(new NumericDomainFuzzySet(COOL,
+				new FuzzyNumericEvaluator(
+						coolOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 10, 10"
+						)
+			));
+		this.addGranule(new NumericDomainFuzzySet(WARM,
+				new FuzzyNumericEvaluator(
+						warmOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 20, 10"
+						)
+			));
+		this.addGranule(new NumericDomainFuzzySet(HOT,
+				new FuzzyNumericEvaluator(
+						hotOp,
+						ValueType.DOUBLE_TYPE,
+						false,
+						"org.drools.fuzzy.evaluators.membership.TriangleMembership, 30, 10"
+						)
+			));
+		
+	}
+	
+	
+	public String[] getEvaluatorIds() {
+		return SUPPORTED_IDS;
+	}
+
+
+	
+
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Test.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Test.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-chance/src/main/java/org/drools/examples/Test.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,353 @@
+package org.drools.examples;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.drools.FactHandle;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBaseConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.definition.KnowledgePackage;
+import org.drools.event.rule.DebugAgendaEventListener;
+import org.drools.event.rule.DebugWorkingMemoryEventListener;
+import org.drools.io.ResourceFactory;
+import org.drools.logger.KnowledgeRuntimeLogger;
+import org.drools.logger.KnowledgeRuntimeLoggerFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+
+public class Test {
+
+	public static final void main(final String[] args) throws Exception {
+		
+
+		
+		// this will parse and compile in one step
+		
+//		kbuilder.add(ResourceFactory.newFileResource(new File("/home/davide/Projects/Eclipse_Drools/Test/target/classes/org/drools/examples/HelloWorld.drl")), ResourceType.DRL);
+		
+		Properties props = new Properties();
+		props.load(new FileInputStream("src/test.packagebuilder.conf"));
+			KnowledgeBuilderConfiguration conf = new PackageBuilderConfiguration(props);
+				conf.setProperty("drools.assertBehaviour","equality");
+				
+		final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
+				.newKnowledgeBuilder(conf);
+		
+		
+		kbuilder.add(ResourceFactory.newClassPathResource("HelloWorld.drl",
+				Test.class), ResourceType.DRL);
+
+		// Check the builder for errors
+		if (kbuilder.hasErrors()) {
+			System.out.println(kbuilder.getErrors().toString());
+			throw new RuntimeException("Unable to compile \"HelloWorld.drl\".");
+		}
+
+		// get the compiled packages (which are serializable)
+		final Collection<KnowledgePackage> pkgs = kbuilder
+				.getKnowledgePackages();
+
+		
+		RuleBaseConfiguration rbconf = new RuleBaseConfiguration(props);
+			rbconf.setProperty("drools.assertBehaviour","equality");
+		// add the packages to a knowledgebase (deploy the knowledge packages).
+		final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(rbconf);
+		kbase.addKnowledgePackages(pkgs);
+
+		final StatefulKnowledgeSession ksession = kbase
+				.newStatefulKnowledgeSession();
+		
+//	
+		FileWriter writer = new FileWriter("test.log");
+		ksession.setGlobal("writer", writer);
+		
+		
+		//Start the session
+		// Will say something about next message
+		ksession.insert(new Trigger());
+		
+		// Message is empty, only has status
+		// Message content comes from previous rule
+		final Message message = new Message();		
+		message.setStatus(Message.HELLO);
+		
+		ksession.insert(message);							
+		ksession.fireAllRules();
+
+		// book has no a-priori known owner
+		// Info on BETA constraint comes from previous rule
+		Person pers = new Person("davide",27);
+		Book book = new Book("Drools Manual",null);
+					
+		ksession.insert(pers);
+		ksession.insert(book);				
+		ksession.fireAllRules();
+//	
+		
+		//NO WAY to do these exercises
+		Exercise x1 = new Exercise("Maths");
+		ksession.insert(x1);
+		ksession.fireAllRules();
+		
+		Exercise x2 = new Exercise("Geometry");
+		ksession.insert(x2);
+		ksession.fireAllRules();
+		
+		// THIS one is an EXCEPTION
+		Exercise x3 = new Exercise("Rule Programming");
+		ksession.insert(x3);
+		ksession.fireAllRules();
+		
+		
+		writer.close();
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+		
+		
+		
+		
+
+//		logger.close();
+
+		ksession.dispose();
+	}
+
+	public static class Message {
+		public static final int HELLO = 0;
+		public static final int GOODBYE = 1;
+		public static final int IDK = 3;
+
+		public String message = "";
+
+		private int status;
+
+		public Message() {
+
+		}
+		
+		public Message(int status) {
+			this.status = status;
+		}
+
+		public String getMessage() {
+			return this.message;
+		}
+
+		public void setMessage(final String message) {
+			this.message = message;
+		}
+
+		public int getStatus() {
+			return this.status;
+		}
+
+		public void setStatus(final int status) {
+			this.status = status;
+		}
+
+		public static Message doSomething(Message message) {
+			return message;
+		}
+
+		public boolean isSomething(String msg, List<Object> list) {
+			list.add(this);
+			return this.message.equals(msg);
+		}
+		
+		public boolean equals(Object other) {
+			if (other == null) return false;
+			if (other instanceof Message) {
+				Message o = (Message) other;
+				//return o.message.equals(this.message) && o.status == this.status;
+				return o.status == this.status;
+			}
+			return false;
+		
+		}
+		
+		public int hashCode() {
+			//return this.message.hashCode()+this.status;
+			return this.status;
+		}
+	}
+
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	public static class Person {
+
+		private String name;
+		private int age;
+		/**
+		 * @param name the name to set
+		 */
+		public void setName(String name) {
+			this.name = name;
+		}
+		/**
+		 * @return the name
+		 */
+		public String getName() {
+			return name;
+		}
+		/**
+		 * @param age the age to set
+		 */
+		public void setAge(int age) {
+			this.age = age;
+		}
+		/**
+		 * @return the age
+		 */
+		public int getAge() {
+			return age;
+		}
+		
+		public Person(String name, int age) {
+			this.name = name;
+			this.age = age;
+		}
+		
+		public boolean equals(Object other) {
+			if (other == null) return false;
+			Person p = (Person) other;
+			if (p == null) return false;
+			return this.name.equals(p.name);
+		}
+		
+		public int hashCode() {
+			return name.hashCode();
+		}
+	
+	
+		
+	}
+	
+	
+	
+	public static class Book {
+		
+		private String title;
+		private Person owner;
+	
+		
+		public Book() {
+		}
+		
+		
+		public Book(String t, Person p) {
+			setTitle(t);
+			setOwner(p);
+		}
+
+		/**
+		 * @param title the title to set
+		 */
+		public void setTitle(String title) {
+			this.title = title;
+		}
+
+		/**
+		 * @return the title
+		 */
+		public String getTitle() {
+			return title;
+		}
+
+		/**
+		 * @param owner the owner to set
+		 */
+		public void setOwner(Person owner) {
+			this.owner = owner;
+		}
+
+		/**
+		 * @return the owner
+		 */
+		public Person getOwner() {
+			return owner;
+		}
+		
+		
+		public boolean equals(Object other) {
+			if (other == null) return false;
+			Book b = (Book) other;
+			if (b == null) return false;
+			return this.title.equals(b.title);
+		}
+		
+		public int hashCode() {
+			return title.hashCode();
+		}
+
+		
+
+		
+		
+	}
+	
+	public static class Trigger {
+		
+	}
+	
+	
+	public static class Exercise {
+		
+		private String topic;
+		public String getTopic() {
+			return topic;
+		}
+		
+		public Exercise(String top) {
+			topic = top;
+		}
+		
+		public int hashCode() {
+			return topic.hashCode();
+			
+		}
+		
+		
+		
+		public boolean equals(Object other) {
+			if (other == null) return false;
+			if (other == this) return true;
+			
+			
+			if (other instanceof Exercise)
+				return getTopic().equals(((Exercise) other).getTopic()); 
+			else 
+				return false;
+		}
+		
+	}
+	
+}

Modified: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -236,6 +236,12 @@
                 parser.enableEditorInterface();
             }
             DroolsTree resultTree = (DroolsTree) parser.compilation_unit().getTree();
+            
+            System.out.println(this.getClass().toString() + " HACKED TO GET DROOLSTREE");
+           //System.out.println((((DroolsTree) resultTree.getChild(9)).toIndentedStringTree()));
+//            
+            
+            
             editorSentences = parser.getEditorInterface();
             makeErrorList( parser );
             if ( isEditor || !this.hasErrors() ) {

Modified: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -1564,19 +1564,28 @@
     		
     		int idx = cons.indexOf("inject");
     		while (idx != -1) {
+    			
     			int endIdx = cons.indexOf(';', idx);
+    			if (idx < 10 || (cons.charAt(idx-8) != '/' && cons.charAt(idx-9) != '/')) {
+    				
     			
-    			StringTokenizer tok = new StringTokenizer(cons.substring(idx,endIdx),",)");
-    			tok.nextToken();
-    			ConstraintKey ck = new ConstraintKey(tok.nextToken().replaceAll("\"", ""),tok.nextToken().replaceAll("\"", ""),tok.nextToken().replaceAll("\"", ""));    			
+    				StringTokenizer tok = new StringTokenizer(cons.substring(idx,endIdx),",)");
+    				tok.nextToken();
+    				ConstraintKey ck = null;
+    				if (tok.countTokens() >= 3)
+    					 ck = new ConstraintKey(tok.nextToken().replaceAll("\"", ""),
+    							tok.nextToken().replaceAll("\"", ""),
+    							tok.nextToken().replaceAll("\"", ""));
+    				else 
+    					ck = new ConstraintKey(tok.nextToken().replaceAll("\"", ""));
     			
-    			Set<String> deps = ans.get(ck);
-    			if (deps == null) {
-    				deps = new HashSet<String>();
-    				ans.put(ck,deps);
+    				Set<String> deps = ans.get(ck);
+    				if (deps == null) {
+    					deps = new HashSet<String>();
+    					ans.put(ck,deps);
+    				}
+    					deps.add(r.getName());
     			}
-    			deps.add(r.getName());
-    				
     		
     			idx = cons.indexOf("inject",endIdx);
     		}

Modified: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -385,6 +385,8 @@
     // $ANTLR start "statement"
     // src/main/resources/org/drools/lang/DescrBuilderTree.g:66:1: statement : (a= rule_attribute | fi= function_import_statement | is= import_statement | gl= global | fn= function | tp= template | rl= rule | qr= query | td= type_declaration );
     public final void statement() throws RecognitionException {
+    	    	
+    	
         AttributeDescr a = null;
 
         FunctionImportDescr fi = null;
@@ -548,7 +550,12 @@
                     // src/main/resources/org/drools/lang/DescrBuilderTree.g:79:4: rl= rule
                     {
                     pushFollow(FOLLOW_rule_in_statement185);
+                    
+                    System.out.println(this.getClass()+" HACKED statement() calls rule ");
                     rl=rule();
+                    
+                    
+                    System.out.println(this.getClass()+".statement() "+rl.ruleDescr.toString());
 
                     state._fsp--;
 

Modified: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -100,4 +100,40 @@
 	public void setEditorElementType(DroolsEditorType editorElementType) {
 		this.editorElementType = editorElementType;
 	}
+	
+	
+	
+	public String toIndentedStringTree() {
+		String ts = new String(this.toStringTree());
+		
+//		System.out.println(this.toStringTree().hashCode());
+//		System.out.println(ts.hashCode());
+//		System.out.println(ts == this.toStringTree());
+		
+		ts = ts.substring(0, ts.indexOf("then"));
+		StringBuilder sb = new StringBuilder();
+		int dep = 0;
+		for (int j = 0; j < ts.length(); j++) {			
+			if (ts.charAt(j) == '(') {
+				dep++;
+				
+				sb.append("\n");
+				for (int k = 0; k < dep; k++)
+					sb.append("\t");
+				sb.append(ts.charAt(j));
+				
+			} else
+			if (ts.charAt(j) == ')') {				
+				sb.append("\n");
+				for (int k = 0; k < dep; k++)
+					sb.append("\t");
+				sb.append(ts.charAt(j));
+				dep--;				
+			} else {
+				sb.append(ts.charAt(j));
+			}
+		}
+	
+		return sb.toString();
+	}
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/BaseDescr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/BaseDescr.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/BaseDescr.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -36,7 +36,19 @@
     private int               endLine          = -1;
     private int               endColumn        = -1;
     private String            text             = "";
-
+    private int				  id			   = -1;
+    
+    
+  
+    
+    public int getId() {
+    	return id;
+    }
+    
+    public void setId(int newId) {
+    	id = newId;
+    }
+    
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         startCharacter  = in.readInt();
         endCharacter  = in.readInt();

Modified: labs/jbossrules/branches/DroolsChance/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -41,6 +41,7 @@
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.event.SignalManager;
 import org.drools.process.instance.timer.TimerManager;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.LIANodePropagation;
 import org.drools.reteoo.PartitionTaskManager;
@@ -544,7 +545,7 @@
     }
 
 
-	public void inject(String premise, Object object,
+	public void inject(String premise, ArgList args,
 			ConstraintKey key, IDegree degree) {
 		// TODO Auto-generated method stub
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -133,6 +133,8 @@
     private String                         executorService;
     private String                         consequenceExceptionHandler;
     private String                         ruleBaseUpdateHandler;
+    
+    
 
     private EventProcessingMode            eventProcessingMode;
 
@@ -151,6 +153,8 @@
     private ProcessInstanceFactoryRegistry processInstanceFactoryRegistry;
     private NodeInstanceFactoryRegistry    processNodeInstanceFactoryRegistry;
 
+    private String						   imperfectFactoryName;
+    
     private transient ClassLoader          classLoader;
 
     public void writeExternal(ObjectOutput out) throws IOException {
@@ -177,6 +181,7 @@
         out.writeBoolean( multithread );
         out.writeInt( maxThreads );
         out.writeObject( eventProcessingMode );
+        out.writeObject(imperfectFactoryName);
     }
 
     public void readExternal(ObjectInput in) throws IOException,
@@ -204,6 +209,7 @@
         multithread = in.readBoolean();
         maxThreads = in.readInt();
         eventProcessingMode = (EventProcessingMode) in.readObject();
+        imperfectFactoryName = (String) in.readObject();
     }
 
     /**
@@ -342,12 +348,22 @@
             return Integer.toString( getMaxThreads() );
         } else if ( name.equals( "drools.eventProcessingMode" ) ) {
             return getEventProcessingMode().toExternalForm();
+        } else if ( name.equals( "drools.imperfect.factory" ) ) {
+            return getFactoryName();
         }
 
         return null;
     }
 
-    /**
+    private String getFactoryName() {
+		return imperfectFactoryName;
+	}
+    
+    private void setFactoryName(String fName) {
+		imperfectFactoryName = fName;
+	}
+
+	/**
      * A constructor that sets the classloader to be used as the parent classloader
      * of this rule base classloaders, and the properties to be used
      * as base configuration options
@@ -435,6 +451,8 @@
                                                                              "-1" ) ) );
         setEventProcessingMode( EventProcessingMode.determineAssertBehaviour( this.chainedProperties.getProperty( "drools.eventProcessingMode",
                                                                                                                   "cloud" ) ) );
+        
+        setFactoryName(this.chainedProperties.getProperty("drools.imperfect.factory", "org.drools.degrees.factory.SimpleDegreeFactory"));
     }
 
     /**

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,47 @@
+/**
+ * 
+ */
+package org.drools.base;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ImperfectRuleBase;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
+
+
+/**
+ * BaseUncertainEvaluator implements the uncertain evaluators
+ * by calling the crisp ones and then converting the boolean
+ * result into the used truth degree
+ * 
+ * @author sotty
+ *
+ */
+public abstract class BaseImperfectEvaluator extends BaseEvaluator  {
+
+	
+	public BaseImperfectEvaluator(final ValueType type, final Operator operator) {
+		super(type,operator);
+	}
+	
+	
+	protected IDegreeFactory getFactory(WorkingMemory workingMemory) {
+		ImperfectRuleBase irb = (ImperfectRuleBase) workingMemory.getRuleBase();
+		if (irb == null) 
+			throw new RuntimeDroolsException(this.getClass()+ " Abstract BaseUncertainEvaluator : trying to use uncertain evaluators with crisp rule base");
+		return irb.getDegreeFactory();
+	}
+	
+	
+	
+	
+
+	
+
+}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -27,6 +27,7 @@
 import org.drools.common.InternalWorkingMemoryActions;
 import org.drools.degrees.IDegree;
 import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.ReteooStatefulSession;
@@ -289,14 +290,43 @@
     	this.consequenceDegree = deg;
     }
     
-    public void inject(Object object, String field, String op, String value) {
+    public void inject(ArgList args, String field, String op, String value) {
     	System.out.println(this.getClass()+" : KH injects a rule for degree "+getConsequenceDegree());
-    	workingMemory.inject(this.getRule().getName(), object, new ConstraintKey(field,op,value),getConsequenceDegree());    	
+    	workingMemory.inject(this.getRule().getName(), 
+    					     args,
+    					     new ConstraintKey(field,op,value),
+    					     getConsequenceDegree());    	
     }
     
+    
+    
     public IDegree getConsequenceDegree() {
     	return consequenceDegree;    
     }
+
+	public void inject(Object arg, String field, String op, String value) {
+		this.inject(new ArgList(arg), field, op, value);
+	}
+
+	public void inject(Object[] args, String field, String op, String value) {
+		this.inject(new ArgList(args), field, op, value);
+		
+	}
+
+	public void inject(Object arg, String key) {
+		workingMemory.inject(this.getRule().getName(), 
+							 new ArgList(arg), 
+							 new ConstraintKey(key),
+							 getConsequenceDegree());
+		
+	}
+
+	public void inject(Object[] args, String key) {
+		workingMemory.inject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 new ConstraintKey(key),
+				 getConsequenceDegree());		
+	}
     
     
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -23,6 +23,7 @@
 import org.drools.common.InternalWorkingMemoryActions;
 import org.drools.degrees.IDegree;
 import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.ReteooStatefulSession;
@@ -211,7 +212,7 @@
     
     
     
-	public void inject(Object object, String field, String op, String value) {
+	public void inject(ArgList args, String field, String op, String value) {
 		// TODO Auto-generated method stub
 		
 	}
@@ -225,4 +226,23 @@
 		// TODO Auto-generated method stub
 		
 	}
+
+	public void inject(Object arg, String field, String op, String value) {
+		this.inject(new ArgList(arg), field, op, value);
+	}
+
+	public void inject(Object[] args, String field, String op, String value) {
+		this.inject(new ArgList(args), field, op, value);
+		
+	}
+
+	public void inject(Object arg, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void inject(Object[] args, String key) {
+		// TODO Auto-generated method stub
+		
+	}
 }

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -74,6 +74,7 @@
 import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.event.SignalManager;
 import org.drools.process.instance.timer.TimerManager;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.Evaluation;
@@ -1945,8 +1946,8 @@
     
     
     
-    public void inject(String ruleName, Object object, ConstraintKey key, IDegree degree) {
-    	Object factHandle = this.getObjectStore().getHandleForObject(object);
+    public void inject(String ruleName, ArgList args, ConstraintKey key, IDegree degree) {
+    	Object factHandle = this.getObjectStore().getHandleForObject(args.getObject());
     	    	
     	IGammaNode node = this.ruleBase.getRete().getNode(key);
     	
@@ -1954,7 +1955,7 @@
     		//Object does not exist, YET
     		//Prepare eval to be collected...    	
     		if (node != null)
-    			node.storeEvaluation(object, prepareEval(ruleName,object,key,degree,node));
+    			node.storeEvaluation(args, prepareEval(ruleName,args,key,degree,node));
     	} else {
     		if (factHandle instanceof ImperfectFactHandle) {
     			
@@ -1965,18 +1966,21 @@
     			if (eval == null && node != null) {    				    				
     				// Object exsits, but its prop hasn't been evaluated yet
     				// Prepare eval to be collected at the node...
-    				node.storeEvaluation(object,prepareEval(ruleName,object,key,degree,node));
+    				node.storeEvaluation(args,prepareEval(ruleName,args,key,degree,node));
     				    				    				
-    			} else {
+    			} else if (eval != null) {
     				// Object exists and has already been eval'ed
     				// Add new degree to evaluation
-    				//TODO: 1 should be confidence!
+    				//TODO: 1 should be confidence!    				
     				eval.addDegree(ruleName, degree,1);
     				//Notification is implicit in the record...
+    			} else if (node == null) {
+    				System.out.println("Warning - injected USELESS eval");
+    				//throw new RuntimeDroolsException("Injected useless fact - check the key "+key);
     			}
     			
     		} else {
-    			throw new RuntimeException("Tried to inject a crisp fact!!");
+    			throw new RuntimeDroolsException("Tried to inject a crisp fact!!");
     		}    		
     	}
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/BetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -1,13 +1,20 @@
 package org.drools.common;
 
 import java.io.Externalizable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.util.LinkedList;
 
@@ -31,10 +38,10 @@
     public boolean isAllowedCachedRight(ContextEntry[] context,
                                         LeftTuple tuple);
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+    public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
             InternalFactHandle handle, IDegreeFactory factory);
 
-    public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+    public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
              LeftTuple tuple, IDegreeFactory factory);
 
     public LinkedList getConstraints();
@@ -51,6 +58,12 @@
 
     public void resetFactHandle(final ContextEntry[] context);
     
-    public ConstraintKey getConstraintKey();
+    public ConstraintKey[] getConstraintKeys();
+    
+    public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory);
 
+	public Collection<ConstraintKey> getAllConstraintKeys();
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key);
+
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -20,8 +20,13 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
@@ -29,9 +34,12 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleMemory;
 import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
@@ -57,6 +65,8 @@
     private LinkedList  constraints;
 
     private int               indexed;
+    
+    private EvaluationTemplate[] 	template;
 
     public DefaultBetaConstraints() {
 
@@ -192,22 +202,23 @@
         return true;
     }
 
-    public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+    public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
     	// skip the indexed constraints
         LinkedListEntry entry = (LinkedListEntry) findNode( this.indexed+1 );
-        java.util.LinkedList<IDegree> degs = new java.util.LinkedList<IDegree>();
+                
+        Evaluation[] ans = new Evaluation[constraints.size()];
         
-        int i = 1;
+        int i = 0;
         while ( entry != null ) {
-            IDegree deg = ((BetaNodeFieldConstraint) entry.getObject()).isSatisfiedCachedLeft( context[this.indexed + i],
-                                                                                     handle, factory );
-            degs.add(deg);
+            ans[i] = ((BetaNodeFieldConstraint) entry.getObject()).isSatisfiedCachedLeft( context[this.indexed + i],
+                                                                                     handle, factory );            
             entry = (LinkedListEntry) entry.getNext();
             i++;
         }
         
-        return factory.getAndOperator().eval(degs);
+                
+        return ans;
         
 	}
 	
@@ -232,23 +243,26 @@
         return true;
     }
     
-    public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+    public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) {
+    	
     	LinkedListEntry entry = (LinkedListEntry) findNode( this.indexed+1 );
-        java.util.LinkedList<IDegree> degs = new java.util.LinkedList<IDegree>();
         
-        int i = 1;
+        Evaluation[] ans = new Evaluation[constraints.size()];
+        
+        int i = 0;
         while ( entry != null ) {
-            IDegree deg = ((BetaNodeFieldConstraint) entry.getObject()).isSatisfiedCachedRight(tuple, 
-            																		 context[this.indexed + i],
-                                                                                     factory );
-            degs.add(deg);
+            ans[i] = ((BetaNodeFieldConstraint) entry.getObject()).isSatisfiedCachedRight(tuple, 
+					 context[this.indexed + i],
+                     factory );            
             entry = (LinkedListEntry) entry.getNext();
             i++;
         }
         
-        return factory.getAndOperator().eval(degs);
-	}
+                
+        return ans;        
+    	
+   	}
 
     public boolean isIndexed() {
         // false if -1
@@ -348,10 +362,10 @@
     }
     
     
-    private ConstraintKey singletonKey = null;
+    private ConstraintKey[] singletonKeys = null;
     
-	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null) {
+	public ConstraintKey[] getConstraintKeys() {
+		if (singletonKeys == null) {
 			int N = this.constraints.size();			
 			ConstraintKey[] cks = new ConstraintKey[N];
 			LinkedListEntry entry = (LinkedListEntry) this.constraints.getFirst();
@@ -360,10 +374,46 @@
 				cks[j++] = ((BetaNodeFieldConstraint) entry.getObject()).getConstraintKey();
 			}
 							
-			singletonKey = new ConstraintKey("and",cks);
+			singletonKeys = cks;
 		}
-		return singletonKey;
+		return singletonKeys;
 	}
 	
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {		 
+		 int N = this.constraints.size();
+		 org.drools.util.Iterator iter = this.constraints.iterator();
+		 template = new EvaluationTemplate[N];
+		 
+		 for (int j = 0; j < N; j++) {			 			 				
+			 template[j] = ((BetaNodeFieldConstraint) iter.next()).buildEvaluationTemplate(id, dependencies, factory);							 	
+		 }
+	   	return template;
+	}
 	
+	
+	public Collection<ConstraintKey> getAllConstraintKeys() {
+		Collection<ConstraintKey> ans = new HashSet<ConstraintKey>();
+		
+		org.drools.util.Iterator iter = this.constraints.iterator();
+		for (int j = 0; j < this.constraints.size(); j++) {
+			ans.addAll(((BetaConstraints) iter.next()).getAllConstraintKeys());
+		}
+		
+		return ans;
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		EvaluationTemplate ans;
+		
+		org.drools.util.Iterator iter = this.constraints.iterator();
+		for (int j = 0; j < this.constraints.size(); j++) {
+			ans = ((BetaConstraints) iter.next()).getEvalTemplate(key);
+			if (ans != null)
+				return ans;
+		}
+		
+		return null;
+	}
+	
+	
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -20,7 +20,12 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
@@ -28,9 +33,12 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleMemory;
 import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
@@ -56,6 +64,10 @@
 
     private boolean                       indexed0;
     private boolean                       indexed1;
+    
+   
+    
+    private EvaluationTemplate[] 	template;
 
     public DoubleBetaConstraints() {
 
@@ -176,24 +188,22 @@
                                                                                                                                             handle ));
     }
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+    public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-    	IDegree[] degs = new IDegree[2];
-    	degs[0] = this.constraint0.isSatisfiedCachedLeft(context[0], handle, factory);
-    	degs[1] = this.constraint1.isSatisfiedCachedLeft(context[1], handle, factory);
-    	
-    	return factory.getAndOperator().eval(degs);
 		
+		return new Evaluation[] {
+				this.constraint0.isSatisfiedCachedLeft(context[0], handle, factory),
+				this.constraint1.isSatisfiedCachedLeft(context[1], handle, factory)						
+		};
 	}
-	
-    
-    public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+
+	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) {
-    	IDegree[] degs = new IDegree[2];
-		degs[0] = this.constraint0.isSatisfiedCachedRight(tuple, context[0], factory);
-		degs[1] = this.constraint0.isSatisfiedCachedRight(tuple, context[1], factory);
 		
-    	return factory.getAndOperator().eval(degs);
+		return new Evaluation[] {
+				this.constraint0.isSatisfiedCachedRight(tuple, context[0], factory),
+				this.constraint1.isSatisfiedCachedRight(tuple, context[1], factory)
+		};
 	}
 
 
@@ -325,14 +335,41 @@
     }
     
     
+    private ConstraintKey[] singletonKeys = null;
     
-    private ConstraintKey singletonKey = null;
-    
-	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null) {				
-			singletonKey = new ConstraintKey("and",new ConstraintKey[] {constraint0.getConstraintKey(),constraint1.getConstraintKey()});
+	public ConstraintKey[] getConstraintKeys() {
+		if (singletonKeys == null) {				
+			singletonKeys = new ConstraintKey[2]; 
+			singletonKeys[0] = constraint0.getConstraintKey();
+			singletonKeys[1] = constraint1.getConstraintKey();
+			
 		}
-		return singletonKey;
+		return singletonKeys;
 	}
 	
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {		 
+		 template = new EvaluationTemplate[2];
+		 		
+		 	template[0] = constraint0.buildEvaluationTemplate(id, dependencies, factory);
+		 	template[1] = constraint1.buildEvaluationTemplate(id, dependencies, factory);
+				 		 
+	   	return template;
+	}
+	
+	
+	public Collection<ConstraintKey> getAllConstraintKeys() {
+		Collection<ConstraintKey> ans = new HashSet<ConstraintKey>();
+			ans.addAll(constraint0.getAllConstraintKeys());
+			ans.addAll(constraint1.getAllConstraintKeys());
+		return ans;
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		EvaluationTemplate ans;
+			ans = constraint0.getEvalTemplate(key);
+			if (ans == null)
+				ans = constraint1.getEvalTemplate(key);
+		return ans;
+	}
+	
 }
\ No newline at end of file

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -19,13 +19,20 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.util.LeftTupleList;
 import org.drools.util.LinkedList;
@@ -146,23 +153,33 @@
         return EMPTY;
     }
 
-	public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return factory.True();
+		return null;
 	}
 
-	public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) { 
-		return factory.True();
+		return null;
 	}
 	
-	private ConstraintKey singletonKey = null;
+	private ConstraintKey[] singletonKeys = null;
     
-	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null) {				
-			singletonKey = new ConstraintKey("and",new ConstraintKey[] {});
-		}
-		return singletonKey;
+	public ConstraintKey[] getConstraintKeys() {
+		return singletonKeys;
 	}
 
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		 
+	   	return null;
+	}
+
+	public Collection<ConstraintKey> getAllConstraintKeys() {		
+		return Collections.emptySet();
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		return null;
+	}
+	
 }
\ No newline at end of file

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,61 @@
+package org.drools.common;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+
+public class ImperfectFactHandle extends DefaultFactHandle {
+	
+	
+	private Map<ConstraintKey, Evaluation> properties = null;
+	
+	public Evaluation getPropertyDegree(ConstraintKey key) {
+		return properties.get(key);
+	}
+	
+	public void addPropertyDegree(Evaluation eval) {
+		properties.put(eval.getKey(),eval);
+	}
+	
+	public void addPropertyDegrees(Collection<Evaluation> storedEvals) {
+		for (Evaluation eval : storedEvals)
+			addPropertyDegree(eval);
+		
+	}
+
+	
+	
+	
+	
+	public ImperfectFactHandle() {
+		 properties = new HashMap<ConstraintKey, Evaluation>();
+    }
+
+    public ImperfectFactHandle(final int id,
+                             final Object object) {
+        this( id,
+              object,
+              id );
+        properties = new HashMap<ConstraintKey, Evaluation>();
+    }
+
+    /**
+     * Construct.
+     *
+     * @param id
+     *            Handle id.
+     */
+    public ImperfectFactHandle(final int id,
+                             final Object object,
+                             final long recency) {
+        super(id,object,recency);
+        properties = new HashMap<ConstraintKey, Evaluation>();
+    	System.out.println(this.getClass().getName() + ": hacked fact handle to hold object "+object);
+
+    }
+
+	
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,250 @@
+package org.drools.common;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import org.drools.RuleBaseConfiguration;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.SingleEvaluationTemplate;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.rule.ContextEntry;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LinkedList;
+import org.drools.util.RightTupleList;
+
+public class ImplicationBetaConstraint implements BetaConstraints {
+
+	
+    /**
+     *
+     */
+    private static final long serialVersionUID = 400L;
+    
+    
+    private IDegree priorDegree;
+
+    public ImplicationBetaConstraint(IDegreeFactory factory,
+    								 IDegree priorDegree, 
+    								 BuildContext context) {
+    	
+    	this.priorDegree = priorDegree;
+//    	singletonKeys = new ConstraintKey[] {new ConstraintKey(
+//    											factory.getModusPonensOp().getName(),
+//    											context.getRule().getName())};
+    	
+    	singletonKeys = new ConstraintKey[] {new ConstraintKey(context.getRule().getName())};
+//				factory.getModusPonensOp().getName(),
+//				context.getRule().getName())};
+    	
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+    	//TODO: Implement...
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+    	//TODO: Implement...
+    	
+    }
+    
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
+     */
+    public void updateFromTuple(final ContextEntry[] context,
+                                final InternalWorkingMemory workingMemory,
+                                final LeftTuple tuple) {
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromFactHandle(org.drools.common.InternalFactHandle)
+     */
+    public void updateFromFactHandle(final ContextEntry[] context,
+                                     final InternalWorkingMemory workingMemory,
+                                     final InternalFactHandle handle) {
+    }
+
+    
+    public void resetTuple(final ContextEntry[] context) {
+    	
+    }
+
+    public void resetFactHandle(final ContextEntry[] context) {
+    	
+    }
+
+    
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
+     */
+    public boolean isAllowedCachedLeft(final ContextEntry[] context,
+                                       final InternalFactHandle handle) {
+        return priorDegree.toBoolean();
+    }
+
+    
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedRight(org.drools.reteoo.ReteTuple)
+     */
+    public boolean isAllowedCachedRight(final ContextEntry[] context,
+                                        final LeftTuple tuple) {
+        return priorDegree.toBoolean();
+    }
+
+    public boolean isIndexed() {
+        return false;
+    }
+
+    public int getIndexCount() {
+        return 0;
+    }
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+    public BetaMemory createBetaMemory(final RuleBaseConfiguration config) {
+        final BetaMemory memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+                                                  new RightTupleList(),
+                                                  this.createContext() );
+
+        return memory;
+    }
+
+    public int hashCode() {
+        return singletonKeys[0].hashCode() ^ priorDegree.hashCode();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#getConstraints()
+     */
+    public LinkedList getConstraints() {
+        final LinkedList list = new LinkedList();
+        return list;
+    }
+
+    
+    
+    /**
+     * Determine if another object is equal to this.
+     *
+     * @param object
+     *            The object to test.
+     *
+     * @return <code>true</code> if <code>object</code> is equal to this,
+     *         otherwise <code>false</code>.
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if (object == null) 
+        	return false;
+        if (! (object instanceof ImplicationBetaConstraint))
+        	return false;
+        
+        ImplicationBetaConstraint otherIBC = (ImplicationBetaConstraint) object;
+        return this.singletonKeys[0].equals(otherIBC.singletonKeys[0])
+        		&& this.priorDegree.equals(otherIBC.priorDegree);
+    }
+
+    
+    
+    
+    public ContextEntry[] createContext() {
+        return new ContextEntry[0];
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+	public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
+			InternalFactHandle handle, IDegreeFactory factory) {
+		Evaluation eval = template[0].spawn(factory.Unknown());
+			eval.addDegree(Evaluation.PRIOR, this.priorDegree, 1);
+		return new Evaluation[] {eval};
+	}
+
+	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
+			LeftTuple tuple, IDegreeFactory factory) { 
+		Evaluation eval = template[0].spawn(factory.Unknown());
+			eval.addDegree(Evaluation.PRIOR, this.priorDegree, 1);
+		return new Evaluation[] {eval};
+	}
+	
+	
+	
+	
+	
+	
+	private EvaluationTemplate[] template ;
+	
+	private ConstraintKey[] singletonKeys = null;
+    
+	public ConstraintKey[] getConstraintKeys() {		 
+		return singletonKeys;
+	}
+
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new EvaluationTemplate[1];
+			template[0] = new SingleEvaluationTemplate(id,singletonKeys[0],dependencies.get(singletonKeys[0]),factory.getMergeStrategy(),factory.getNullHandlingStrategy());			
+		return template;
+	}
+
+	
+	public Collection<ConstraintKey> getAllConstraintKeys() {
+		Vector<ConstraintKey> ans = new Vector<ConstraintKey>(1);
+			ans.add(singletonKeys[0]);
+		return ans;		  		
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		if (template[0].getConstraintKey().equals(key))
+			return template[0];
+		return null;
+	}
+
+
+
+	public void setPriorDegree(IDegree buildDegree) {
+		priorDegree = buildDegree;		
+	}
+
+
+
+
+
+
+
+	
+}
\ No newline at end of file

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -21,12 +21,16 @@
 import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.Declaration;
 import org.drools.rule.Pattern;
@@ -93,9 +97,9 @@
         return ((InstanceEqualsConstraintContextEntry) context).left == handle.getObject();
     }
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return factory.fromBoolean(isAllowedCachedLeft(context, handle));
+		return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
 	}
 
     public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -103,9 +107,9 @@
         return tuple.get( this.otherPattern.getOffset() ).getObject() == ((InstanceEqualsConstraintContextEntry) context).right;
     }
     
-	public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+	public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return factory.fromBoolean(isAllowedCachedRight(tuple, context));
+		return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
 	}
 
 
@@ -201,6 +205,8 @@
 
     private ConstraintKey singletonKey = null;
     
+    private EvaluationTemplate template;
+    
 	public ConstraintKey getConstraintKey() {
 		if (singletonKey == null) {				
 			singletonKey = new ConstraintKey("this","equals","other");
@@ -211,12 +217,23 @@
 	public Collection<ConstraintKey> getAllConstraintKeys() {
 		Collection<ConstraintKey> ans = new LinkedList<ConstraintKey>();
 			ans.add(getConstraintKey());
-	return ans;
+		return ans;
 	}
 
 	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
-		// TODO Auto-generated method stub
+		if (this.template.getConstraintKey().equals(key))
+			return template;
 		return null;
 	}
 
+	public EvaluationTemplate buildEvaluationTemplate(int id,
+			Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new SingleEvaluationTemplate(id,
+												this.getConstraintKey(),
+												dependencies.get(this.getConstraintKey()),
+												factory.getMergeStrategy(),
+												factory.getNullHandlingStrategy());
+		return template;
+	}
+
 }

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -21,12 +21,16 @@
 import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.Declaration;
 import org.drools.rule.Pattern;
@@ -92,9 +96,9 @@
         return ((InstanceNotEqualsConstraintContextEntry) context).left != handle.getObject();
     }
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return factory.fromBoolean(isAllowedCachedLeft(context, handle));
+		return getTemplate().spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
 	}
 
 	
@@ -104,9 +108,9 @@
         return tuple.get( this.otherPattern.getOffset() ).getObject() != ((InstanceNotEqualsConstraintContextEntry) context).right;
     }
     
-    public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+    public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return factory.fromBoolean(isAllowedCachedRight(tuple, context));
+		return getTemplate().spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
 	}
 
     public String toString() {
@@ -200,6 +204,8 @@
     
 
     private ConstraintKey singletonKey = null;
+
+	private EvaluationTemplate template;
     
 	public ConstraintKey getConstraintKey() {
 		if (singletonKey == null) {			
@@ -214,10 +220,27 @@
 	return ans;
 	}
 
+	
+	public EvaluationTemplate getTemplate() {
+		return null;
+	}
+	
 	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
-		// TODO Auto-generated method stub
+		if (this.template.getConstraintKey().equals(key))
+			return template;
 		return null;
 	}
+
+	public EvaluationTemplate buildEvaluationTemplate(int id,
+			Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new SingleEvaluationTemplate(id,
+												this.getConstraintKey(),
+												dependencies.get(this.getConstraintKey()),
+												factory.getMergeStrategy(),
+												factory.getNullHandlingStrategy());
+		return template;
+	}
+
 	
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -13,6 +13,7 @@
 import org.drools.WorkingMemoryEntryPoint;
 import org.drools.RuleBaseConfiguration.AssertBehaviour;
 import org.drools.degrees.IDegree;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.Evaluation;
@@ -487,7 +488,7 @@
     }
 
 	
-	public void inject(String premise, Object object,
+	public void inject(String premise, ArgList args,
 			ConstraintKey key, IDegree degree) {
 		// TODO Auto-generated method stub
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -20,7 +20,12 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
@@ -28,9 +33,12 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleMemory;
 import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
@@ -60,6 +68,8 @@
     private boolean                       indexed1;
     private boolean                       indexed2;
     private boolean                       indexed3;
+    
+    private EvaluationTemplate[] 	template;
 
     public QuadroupleBetaConstraints() {
     }
@@ -414,36 +424,76 @@
         return new ContextEntry[]{this.constraint0.createContextEntry(), this.constraint1.createContextEntry(), this.constraint2.createContextEntry(), this.constraint3.createContextEntry()};
     }
 
-	public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+    public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		IDegree[] degs = new IDegree[4];
-		degs[0] = this.constraint0.isSatisfiedCachedLeft(context[0], handle, factory);
-    	degs[1] = this.constraint1.isSatisfiedCachedLeft(context[1], handle, factory);
-    	degs[2] = this.constraint1.isSatisfiedCachedLeft(context[2], handle, factory);
-    	degs[3] = this.constraint1.isSatisfiedCachedLeft(context[3], handle, factory);
-    	
-    	return factory.getAndOperator().eval(degs);
+		
+		return new Evaluation[] {
+				this.constraint0.isSatisfiedCachedLeft(context[0], handle, factory),
+				this.constraint1.isSatisfiedCachedLeft(context[1], handle, factory),
+				this.constraint2.isSatisfiedCachedLeft(context[2], handle, factory),
+				this.constraint3.isSatisfiedCachedLeft(context[3], handle, factory)
+		};
 	}
 
-	public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) {
 		
-		IDegree[] degs = new IDegree[4];
-		degs[0] = this.constraint0.isSatisfiedCachedRight(tuple, context[0], factory);
-		degs[1] = this.constraint0.isSatisfiedCachedRight(tuple, context[1], factory);
-		degs[2] = this.constraint0.isSatisfiedCachedRight(tuple, context[2], factory);
-		degs[3] = this.constraint0.isSatisfiedCachedRight(tuple, context[3], factory);
-    	
-    	return factory.getAndOperator().eval(degs);
+		return new Evaluation[] {
+				this.constraint0.isSatisfiedCachedRight(tuple, context[0], factory),
+				this.constraint1.isSatisfiedCachedRight(tuple, context[1], factory),
+				this.constraint2.isSatisfiedCachedRight(tuple, context[2], factory),
+				this.constraint3.isSatisfiedCachedRight(tuple, context[3], factory)
+		};
 	}
-
-	private ConstraintKey singletonKey = null;
+	
+	
+	
+	
+	private ConstraintKey[] singletonKeys = null;
     
-	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null) {				
-			singletonKey = new ConstraintKey("and",new ConstraintKey[] {constraint0.getConstraintKey(),constraint1.getConstraintKey(),constraint2.getConstraintKey(),constraint3.getConstraintKey()});
+	public ConstraintKey[] getConstraintKeys() {
+		if (singletonKeys == null) {				
+			singletonKeys = new ConstraintKey[4]; 
+			singletonKeys[0] = constraint0.getConstraintKey();
+			singletonKeys[1] = constraint1.getConstraintKey();
+			singletonKeys[2] = constraint2.getConstraintKey();
+			singletonKeys[3] = constraint3.getConstraintKey();
+					
 		}
-		return singletonKey;
+		return singletonKeys;
 	}
 	
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new EvaluationTemplate[4];
+ 		
+	 	template[0] = constraint0.buildEvaluationTemplate(id, dependencies, factory);
+	 	template[1] = constraint1.buildEvaluationTemplate(id, dependencies, factory);
+	 	template[2] = constraint2.buildEvaluationTemplate(id, dependencies, factory);
+	 	template[3] = constraint3.buildEvaluationTemplate(id, dependencies, factory);
+			 		 
+	 	return template;
+	}
+
+	public Collection<ConstraintKey> getAllConstraintKeys() {
+		Collection<ConstraintKey> ans = new HashSet<ConstraintKey>();
+			ans.addAll(constraint0.getAllConstraintKeys());
+			ans.addAll(constraint1.getAllConstraintKeys());
+			ans.addAll(constraint2.getAllConstraintKeys());
+			ans.addAll(constraint3.getAllConstraintKeys());
+		return ans;
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		EvaluationTemplate ans;
+			ans = constraint0.getEvalTemplate(key);
+			if (ans == null)
+				ans = constraint1.getEvalTemplate(key);
+			if (ans == null)
+				ans = constraint2.getEvalTemplate(key);
+			if (ans == null)
+				ans = constraint3.getEvalTemplate(key);
+		return ans;
+	}
+	
+	
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -18,6 +18,10 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
@@ -25,9 +29,12 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleMemory;
 import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
@@ -48,11 +55,13 @@
      */
     private static final long             serialVersionUID = 400L;
 
-    private BetaNodeFieldConstraint constraint;
+    private BetaNodeFieldConstraint 	  constraint;
 
     private boolean                       indexed;
 
     private RuleBaseConfiguration         conf;
+    
+    private EvaluationTemplate[]		  template;
 
     public SingleBetaConstraints() {
 
@@ -239,26 +248,45 @@
         context[0].resetTuple();
     }
 
-	public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return this.constraint.isSatisfiedCachedLeft( context[0],
-                handle, factory );
+		
+		return new Evaluation[] { this.constraint.isSatisfiedCachedLeft( context[0],
+                handle, factory ) };		
 	}
 
-	public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) {
-		return this.constraint.isSatisfiedCachedRight(tuple, context[0], factory);
+		return new Evaluation[] { this.constraint.isSatisfiedCachedRight(tuple, context[0], factory) };		
 	}
 
 	
-	private ConstraintKey singletonKey = null;
+	private ConstraintKey[] singletonKeys = null;
     
-	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null) {				
-			singletonKey = new ConstraintKey("and",new ConstraintKey[] {constraint.getConstraintKey()});
+	public ConstraintKey[] getConstraintKeys() {
+		if (singletonKeys == null) {				
+			singletonKeys = new ConstraintKey[1]; 
+			singletonKeys[0] = constraint.getConstraintKey();		
+					
 		}
-		return singletonKey;
+		return singletonKeys;
 	}
 	
 	
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new EvaluationTemplate[1];
+		 
+	   	template[0] = this.constraint.buildEvaluationTemplate(id, dependencies, factory);
+	   	
+	   	return template;
+	}
+
+	public Collection<ConstraintKey> getAllConstraintKeys() {
+		return this.constraint.getAllConstraintKeys();
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		return this.constraint.getEvalTemplate(key);
+	}
+	
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -20,7 +20,12 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
@@ -28,9 +33,12 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleMemory;
 import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
@@ -58,6 +66,8 @@
     private boolean                       indexed0;
     private boolean                       indexed1;
     private boolean                       indexed2;
+    
+    private EvaluationTemplate[] 	template;
 
     public TripleBetaConstraints() {
     }
@@ -355,37 +365,67 @@
         return new ContextEntry[]{this.constraint0.createContextEntry(), this.constraint1.createContextEntry(), this.constraint2.createContextEntry()};
     }
 
-	public IDegree isSatisfiedCachedLeft(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
 			InternalFactHandle handle, IDegreeFactory factory) {
 		
-		IDegree[] degs = new IDegree[3];
-		degs[0] = this.constraint0.isSatisfiedCachedLeft(context[0], handle, factory);
-    	degs[1] = this.constraint1.isSatisfiedCachedLeft(context[1], handle, factory);
-    	degs[2] = this.constraint1.isSatisfiedCachedLeft(context[2], handle, factory);
-    	
-    	return factory.getAndOperator().eval(degs);
+		return new Evaluation[] {
+				this.constraint0.isSatisfiedCachedLeft(context[0], handle, factory),
+				this.constraint1.isSatisfiedCachedLeft(context[1], handle, factory),
+				this.constraint2.isSatisfiedCachedLeft(context[2], handle, factory)		
+		};
 	}
 
-	public IDegree isSatisfiedCachedRight(ContextEntry[] context,
+	public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
 			LeftTuple tuple, IDegreeFactory factory) {
-		IDegree[] degs = new IDegree[3];
-		degs[0] = this.constraint0.isSatisfiedCachedRight(tuple, context[0], factory);
-		degs[1] = this.constraint0.isSatisfiedCachedRight(tuple, context[1], factory);
-		degs[2] = this.constraint0.isSatisfiedCachedRight(tuple, context[2], factory);
 		
-    	
-    	return factory.getAndOperator().eval(degs);
+		return new Evaluation[] {
+				this.constraint0.isSatisfiedCachedRight(tuple, context[0], factory),
+				this.constraint1.isSatisfiedCachedRight(tuple, context[1], factory),
+				this.constraint2.isSatisfiedCachedRight(tuple, context[2], factory)
+		};
 	}
 
 	
-	private ConstraintKey singletonKey = null;
+	private ConstraintKey[] singletonKeys = null;
     
-	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null) {				
-			singletonKey = new ConstraintKey("and",new ConstraintKey[] {constraint0.getConstraintKey(),constraint1.getConstraintKey(),constraint2.getConstraintKey()});
+	public ConstraintKey[] getConstraintKeys() {
+		if (singletonKeys == null) {				
+			singletonKeys = new ConstraintKey[3]; 
+			singletonKeys[0] = constraint0.getConstraintKey();
+			singletonKeys[1] = constraint1.getConstraintKey();
+			singletonKeys[2] = constraint2.getConstraintKey();
+			
 		}
-		return singletonKey;
+		return singletonKeys;
 	}
 	
+	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new EvaluationTemplate[3];
+ 		
+	 	template[0] = constraint0.buildEvaluationTemplate(id, dependencies, factory);
+	 	template[1] = constraint1.buildEvaluationTemplate(id, dependencies, factory);
+	 	template[2] = constraint2.buildEvaluationTemplate(id, dependencies, factory);
+			 		 
+	 	return template;
+	}
 	
+	
+	public Collection<ConstraintKey> getAllConstraintKeys() {
+		Collection<ConstraintKey> ans = new HashSet<ConstraintKey>();
+			ans.addAll(constraint0.getAllConstraintKeys());
+			ans.addAll(constraint1.getAllConstraintKeys());
+			ans.addAll(constraint2.getAllConstraintKeys());	
+		return ans;
+	}
+
+	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		EvaluationTemplate ans;
+			ans = constraint0.getEvalTemplate(key);
+			if (ans == null)
+				ans = constraint1.getEvalTemplate(key);
+			if (ans == null)
+				ans = constraint2.getEvalTemplate(key);		
+		return ans;
+	}
+	
 }
\ No newline at end of file

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -21,12 +21,16 @@
 import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.SingleEvaluationTemplate;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.Declaration;
 import org.drools.spi.BetaNodeFieldConstraint;
@@ -102,9 +106,9 @@
         return ((TupleStartEqualsConstraintContextEntry) context).left.equals( tuple );
     }
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return factory.fromBoolean(isAllowedCachedLeft(context, handle));
+		return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
 	}
     
 
@@ -113,9 +117,9 @@
         return tuple.equals( ((TupleStartEqualsConstraintContextEntry) context).right.getSubTuple( tuple.size() ) );
     }
 
-    public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+    public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return factory.fromBoolean(isAllowedCachedRight(tuple, context));
+		return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
 	}
     
     public String toString() {
@@ -203,6 +207,8 @@
     }
 
     private ConstraintKey singletonKey = null;
+
+	private EvaluationTemplate template;
     
 	public ConstraintKey getConstraintKey() {
 		if (singletonKey == null)
@@ -217,9 +223,20 @@
 	}
 	
 	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
-		// TODO Auto-generated method stub
+		if (this.template.getConstraintKey().equals(key))
+			return template;
 		return null;
 	}
 
+	public EvaluationTemplate buildEvaluationTemplate(int id,
+			Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+		template = new SingleEvaluationTemplate(id,
+												this.getConstraintKey(),
+												dependencies.get(this.getConstraintKey()),
+												factory.getMergeStrategy(),
+												factory.getNullHandlingStrategy());
+		return template;
+	}
+
 	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -30,4 +30,6 @@
  
     public IDegree eval(Collection<? extends IDegree> args);
     
+    public String getName();
+    
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -39,6 +39,10 @@
 		// TODO Auto-generated method stub
 		return null;
 	}
+
+	public String getName() {
+		return "avg";
+	}
 	
 	
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -25,4 +25,8 @@
 		return null;
 	}
 
+	public String getName() {
+		return "dotAnd";
+	}
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -22,4 +22,11 @@
 		return null;
 	}
 
+
+	public String getName() {
+		return "distEquiv";
+	}
+	
+	
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -25,4 +25,8 @@
 		return null;
 	}
 
+	public String getName() {
+		return "maxOr";
+	}
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMergeStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMergeStrategy.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMergeStrategy.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -31,4 +31,8 @@
 		return null;
 	}
 
+	public String getName() {
+		return "max";
+	}
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -24,4 +24,8 @@
 		return null;
 	}
 
+	public String getName() {
+		return "minAnd";		
+	}
+
 }

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -17,4 +17,8 @@
 
 	}
 
+	public String getName() {
+		return "not";
+	}
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -51,6 +51,7 @@
 import org.drools.event.rule.impl.ObjectInsertedEventImpl;
 import org.drools.event.rule.impl.ObjectRetractedEventImpl;
 import org.drools.event.rule.impl.ObjectUpdatedEventImpl;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.ReteooWorkingMemory;
@@ -666,7 +667,7 @@
     
     
     
-	public void inject(String rule, Object object, ConstraintKey key,
+	public void inject(String rule, ArgList args, ConstraintKey key,
 			IDegree degree) {
 		// TODO Auto-generated method stub
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -50,6 +50,7 @@
 import org.drools.process.command.StartProcessCommand;
 import org.drools.process.command.UnregisterExitPointCommand;
 import org.drools.process.command.UpdateCommand;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.ConstraintKey;
 import org.drools.reteoo.Evaluation;
 import org.drools.reteoo.ReteooWorkingMemory;
@@ -390,7 +391,7 @@
 
 	
 
-	public void inject(String premise, Object object, ConstraintKey key,
+	public void inject(String premise, ArgList args, ConstraintKey key,
 			IDegree degree) {
 		// TODO Auto-generated method stub
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -204,7 +204,7 @@
 		System.out.println("--------------     Passing by alpha" + id);
 
 		//Collect any provided info
-		Collection<Evaluation> storedEvals = this.gammaMemory.retrieve(factHandle.getObject());
+		Collection<Evaluation> storedEvals = this.gammaMemory.retrieve(new ArgList(factHandle.getObject()));
 		if (storedEvals != null) {
 			record.addEvaluations(storedEvals);
 			factHandle.addPropertyDegrees(storedEvals);
@@ -220,13 +220,14 @@
 					memory.context,
 					factory
                 	);	
-			Collection<Evaluation> useless = eval.getEvalTree(); 
+			 
+			
 			for (Evaluation subEval : eval.getEvalTree()) {
 				factHandle.addPropertyDegree(subEval);
-				record.addEvaluation(subEval);
 			}
-				
+			record.addEvaluation(eval);	
 			
+			
 		} else {
 			if (eval.getDegreeBit(Evaluation.EVAL) == null) {
 				Evaluation localEval = this.constraint.isSatisfied(factHandle,
@@ -238,17 +239,18 @@
 			}			
 		}   
 		 
-		//IMPORTANT: LAST ADDITION IS MAIN NOW
+		System.out.println("Alpha evaluation trial "+record.expand());
 		
-		System.out.println("Answer is given by " + record.getMainEval().toString()+ " info : " +record.getMainEval().getInfoRate());
 		//Merge is automatical, so now we decide what to do
-		switch (this.filterStrat.doTry(record.getMainEval())) {
+		switch (this.filterStrat.doTry(record)) {
 			case IFilterStrategy.DROP : 
 				//time to die
+				System.out.println("Alpha FAIL : DROP record");
 				return;
 			
 			case IFilterStrategy.HOLD : 
-				System.out.println("WARNING::::::::::::::::::::::::::: OBJECT HELD AT NODE "+this.constraint.getConstraintKey());
+				System.out.println("WARNING::::::::::::::::::::::::::: OBJECT HELD AT ALPHA NODE "+this.constraint.getConstraintKey());
+				System.out.println("Situation is "+record.expand());
 					record.setFactHandle(factHandle);
 					record.setFactory(factory);
 					record.setPropagationContext(propagationContext);
@@ -273,8 +275,8 @@
 	
 	public void update(Observable watcher, Object info) {
 		EvalRecord record = (EvalRecord) watcher;
-System.out.println("**************************************************************UPDATE");
-		switch (this.filterStrat.doTry(record.getMainEval())) {
+System.out.println("**************************************************************UPDATE @ALPHA NODE");
+		switch (this.filterStrat.doTry(record)) {
 		case IFilterStrategy.DROP : 
 			record.deleteObserver(this);
 			return;
@@ -564,13 +566,12 @@
 	
 	
 
-	public Collection<Evaluation> getStoredEvals(Object o) {
-		// TODO Auto-generated method stub
-		return null;
+	public Collection<Evaluation> getStoredEvals(ArgList args) {
+		return this.gammaMemory.retrieve(args);
 	}
 
-	public void storeEvaluation(Object object, Evaluation prepareEval) {
-		this.gammaMemory.store(object, prepareEval);
+	public void storeEvaluation(ArgList args, Evaluation prepareEval) {
+		this.gammaMemory.store(args, prepareEval);
 	}
 
 	

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -15,17 +15,19 @@
 public class CompositeEvaluation extends Evaluation implements Observer {
 
 	private IDegreeCombiner operator;
-	private Evaluation[] operands;
+	protected Evaluation[] operands;
 	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);
 		
-		this.operands = new Evaluation[evalDegrees.length];
-			for (int j = 0; j < evalDegrees.length; j++) {
-				setOperand(j,evalDegrees[j]);
-			}
+		if (evalDegrees != null) {
+			this.operands = new Evaluation[evalDegrees.length];
+				for (int j = 0; j < evalDegrees.length; j++) {
+					setOperand(j,evalDegrees[j]);
+				}
+		}
 	
 		this.operator = operator;
 		
@@ -34,26 +36,29 @@
 	
 
 
-	public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			Map<ConstraintKey, EvaluationTemplate> children,
-			IDegreeCombiner operator, IMergeStrategy mergeStrat,
-			INullHandlingStrategy nullStrat) {
-		
-		super(id,key,deps,mergeStrat,nullStrat);
-		
-		this.operands = new Evaluation[children.size()];
-			int j = 0;
-			for (EvaluationTemplate temp : children.values()) {
-				setOperand(j++,temp.spawn());
-			}
-	
-		this.operator = operator;
-		
-		this.combine();
-		
-	}
+//	public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
+//			Map<ConstraintKey, EvaluationTemplate> children,
+//			IDegreeCombiner operator, IMergeStrategy mergeStrat,
+//			INullHandlingStrategy nullStrat) {
+//		
+//		super(id,key,deps,mergeStrat,nullStrat);
+//		
+//		this.operands = new Evaluation[children.size()];
+//			int j = 0;
+//			for (EvaluationTemplate temp : children.values()) {
+//				setOperand(j++,temp.spawn());
+//			}
+//	
+//		this.operator = operator;
+//		
+//		this.combine();
+//		
+//	}
 
 	protected void combine() {
+		if (operands == null)
+			return;
+		
 		int N = operands.length;
 		IDegree[] args = new IDegree[N];
 		
@@ -130,9 +135,29 @@
 		combine();		
 	}
 	
+	protected IDegreeCombiner getOperator() {
+		return operator;
+	}
 	
 	
 	
+
 	
-
+	public String toStringTree(int depth) {
+		StringBuilder sb = new StringBuilder();
+		
+//		if (depth > 0)
+//			sb.append(this.toString());
+		if (getOperands() != null) {
+			for (Evaluation eval : getOperands()) {
+				for (int j = 0; j <= depth; j++)
+					sb.append("\t");
+				sb.append(eval.toString()+"\n");
+				if (eval instanceof CompositeEvaluation)
+					sb.append(((CompositeEvaluation) eval).toStringTree(depth+1));			
+			}
+		}
+		return sb.toString();
+	}
+	
 }

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -49,12 +49,17 @@
 	}
 	
 	public Evaluation spawn() {
-		return new CompositeEvaluation(id,key,deps,children,operator,mergeStrat,nullStrat);
+		return new CompositeEvaluation(id,key,deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat);
 	}
 	
 	
+	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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -94,8 +94,11 @@
 			boolean leftTupleMemoryEnabled) {
 
     	for( LeftTupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
+    		
+    		EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy()); 
+        		masterRecord.addEvaluation(record);
             doPropagateAssertLeftTuple( context, workingMemory, factory, sink,
-                                        new ImperfectLeftTuple( factHandle, sink, leftTupleMemoryEnabled, record ) );
+                                        new ImperfectLeftTuple( factHandle, sink, leftTupleMemoryEnabled, masterRecord ) );
         }
 		
 	}

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -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();				
+				EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());				
 				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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.Collections;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
@@ -72,6 +73,8 @@
 
     private LeftTupleSinkNode previousTupleSinkNode;
     private LeftTupleSinkNode nextTupleSinkNode;
+    
+    private EvaluationTemplate	template;
 
     // ------------------------------------------------------------
     // Constructors
@@ -99,6 +102,7 @@
         this.condition = eval;
         this.tupleSource = tupleSource;
         this.tupleMemoryEnabled = context.isTupleMemoryEnabled();
+                
     }
 
     public void readExternal(ObjectInput in) throws IOException,
@@ -197,7 +201,8 @@
     
     
     
-    
+    //TODO: Do for good
+    //@FIXME : Not Implemented
     public void assertLeftTuple(ImperfectLeftTuple leftTuple,
 			PropagationContext context, InternalWorkingMemory workingMemory,
 			IDegreeFactory factory) {
@@ -211,7 +216,9 @@
 
         EvalRecord record = leftTuple.getRecord();
         ConstraintKey key = new ConstraintKey("eval",this.condition.getEvalExpression().toString());
-        Evaluation eval = new Evaluation(this.getId(),ans,key,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        EvaluationTemplate templ = new SingleEvaluationTemplate(this.getId(),key,Collections.EMPTY_SET,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        
+        Evaluation eval = templ.spawn(ans);
         record.addEvaluation(eval);
         
         //TODO: Imperfect strategy here!
@@ -228,7 +235,7 @@
                                                 this.tupleMemoryEnabled );
         //}
 
-		
+    	 
 	}
 
     public void retractLeftTuple(final LeftTuple leftTuple,

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -1,6 +1,7 @@
 package org.drools.reteoo;
 
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -8,26 +9,33 @@
 import java.util.Map;
 import java.util.Observable;
 import java.util.Observer;
+import java.util.Set;
+import java.util.Vector;
 
 
 import org.drools.common.ImperfectFactHandle;
 import org.drools.common.InternalWorkingMemory;
 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 EvalRecord extends Observable implements Observer {
+public class EvalRecord extends CompositeEvaluation implements Observer {
 	
 	
 	private Map<ConstraintKey, Evaluation> 		evalMap;
-	private ConstraintKey 						mainKey;
+	//private ConstraintKey 						mainKey;
 	
-	private IDegree 							overallDegree;
+	// private IDegree 							overallDegree;
 	
 	
 	
 	
 	private ImperfectFactHandle 				factHandle;
+	private ImperfectLeftTuple					leftTuple;
+	private ImperfectRightTuple					rightTuple;
     private PropagationContext					propagationContext;
     private InternalWorkingMemory 				workingMemory;
     private IDegreeFactory						factory;
@@ -35,11 +43,16 @@
 	
 	
 	
+//    public EvalRecord() {			
+//		mainKey = null;
+//		evalMap = new HashMap<ConstraintKey, Evaluation>();
+//	}
 	
-	
 		
-	public EvalRecord() {
-		mainKey = null;
+	public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat) {
+		super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat);
+		
+		//mainKey = null;
 		evalMap = new HashMap<ConstraintKey, Evaluation>();
 	}
 	
@@ -75,27 +88,56 @@
 		return prevEval;
 	}
 	
+	
+	
+	
+	
+	
+	
 	public void addEvaluation(Evaluation eval) {
 		
+		boolean newEval = ! this.evalMap.containsKey(eval.getKey());
 		
-		Evaluation addedEval = insert(eval);							
+		Evaluation addedEval = insert(eval);		
 		
+		if (newEval) {
+			if (operands == null) {
+				operands = new Evaluation[1];
+				operands[0] = addedEval;
+			} else {
+				int N = operands.length;
+				Evaluation[] temp = new Evaluation[N+1]; 
+				for (int j = 0; j < N; j++)
+					temp[j] = operands[j];
+				
+				operands = temp;
+				
+				operands[N] = addedEval;
+			}
+		}
 		
-		if (mainKey != null && mainKey.equals(addedEval.getKey()) /*&& ! prevEval.getDegree().equals(overallDegree)*/) {
-			mainKey = addedEval.getKey();
-			overallDegree = addedEval.getDegree();
-			this.setChanged();
-			this.notifyObservers(null);
-		} else {
-			mainKey = addedEval.getKey();
-			overallDegree = addedEval.getDegree();
-		}
+		((DynamicConstraintKey) this.getKey()).addArg(eval.getKey());
+		
+		combine();
+		this.setChanged();
+		this.notifyObservers(null);
+		
+//		if (mainKey != null && mainKey.equals(addedEval.getKey()) /*&& ! prevEval.getDegree().equals(overallDegree)*/) {
+//			mainKey = addedEval.getKey();
+//			overallDegree = addedEval.getDegree();
+//			this.setChanged();
+//			this.notifyObservers(null);
+//		} else {
+//			mainKey = addedEval.getKey();
+//			overallDegree = addedEval.getDegree();
+//		}
 				
 	}
 	
 	
 	public void addEvaluations(EvalRecord other) {				
-		for (Evaluation eval : other.getEvaluations())
+		//for (Evaluation eval : other.getEvaluations())
+		for (Evaluation eval : other.getOperands())
 			this.addEvaluation(eval);
 	}
 	
@@ -105,34 +147,33 @@
 	}
 	
 	
-	public IDegree getOverallDegree() {
-		//return getMainEval().getDegree();
-		return overallDegree;
-	}
 	
+	
 	public EvalRecord clone() {
 		
-		EvalRecord ans = new EvalRecord();
-		ans.addEvaluations(this.getEvaluations());
+		EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat());
+		ans.addEvaluations(this);
 		
 		return ans;
 	}
 	
 	
-	public Evaluation getMainEval() {
-		return evalMap.get(mainKey);
-	}
+	
+//	public Evaluation getMainEval() {
+//		//return evalMap.get(mainKey);
+//		return this;
+//	}
 
 	
 	
-	public void update(Observable obsEval, Object newDeg) {
-		Evaluation eval = (Evaluation) obsEval;
-		if (eval.getKey().equals(mainKey)) {
-			overallDegree = eval.getDegree();
-			this.setChanged();
-			this.notifyObservers(null);
-		}		
-	}
+//	public void update(Observable obsEval, Object newDeg) {
+//		Evaluation eval = (Evaluation) obsEval;
+//		if (eval.getKey().equals(mainKey)) {
+//			overallDegree = eval.getDegree();
+//			this.setChanged();
+//			this.notifyObservers(null);
+//		}		
+//	}
 	
 	
 	
@@ -141,18 +182,28 @@
 	
 	
 	
-	public String toString() {
-		StringBuilder sb = new StringBuilder("Eval Record: \n");
-		for (Evaluation ev : getEvaluations())
-			sb.append(ev.toString()+"\n");
-		sb.append("\n");
+	public String expand() {
+		StringBuilder sb = new StringBuilder("Eval Record :"+this.getInfoRate()+"\n");
+//		
+		
+		sb.append("AND{\n");
+		if (getOperands() != null)
+			for (Evaluation ev : getOperands())
+				sb.append(ev.toString()+"\n");
+		sb.append("}\n\n");
+		
+		sb.append(toString()+"\n");
+		sb.append(toStringTree(0));
+		
 		return sb.toString();
+		
 	}
 
 	
 	
 	
 	
+	
 	/**
 	 * @param factHandle the factHandle to set
 	 */
@@ -209,5 +260,35 @@
 		return factory;
 	}
 
+	/**
+	 * @param leftTuple the leftTuple to set
+	 */
+	public void setLeftTuple(ImperfectLeftTuple leftTuple) {
+		this.leftTuple = leftTuple;
+	}
+
+	/**
+	 * @return the leftTuple
+	 */
+	public ImperfectLeftTuple getLeftTuple() {
+		return leftTuple;
+	}
+
+	/**
+	 * @param rightTuple the rightTuple to set
+	 */
+	public void setRightTuple(ImperfectRightTuple rightTuple) {
+		this.rightTuple = rightTuple;
+	}
+
+	/**
+	 * @return the rightTuple
+	 */
+	public ImperfectRightTuple getRightTuple() {
+		return rightTuple;
+	}
+
 	
+	
+	
 }

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -67,19 +67,19 @@
 	}
 	
 	
-	/**
-	 * TODO : remove it and its dependencies
-	 * @param id
-	 * @param evalDeg
-	 * @param key
-	 * 
-	 * @deprecated
-	 */	
-	public Evaluation(int id, IDegree evalDeg, ConstraintKey key, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
-		this(id,key, new HashSet<String>(),mergeStrat,nullStrat);
-		
-		this.addDegree(Evaluation.EVAL,evalDeg,1);
-	}
+//	/**
+//	 * TODO : remove it and its dependencies
+//	 * @param id
+//	 * @param evalDeg
+//	 * @param key
+//	 * 
+//	 * @deprecated
+//	 */	
+//	public Evaluation(int id, IDegree evalDeg, ConstraintKey key, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+//		this(id,key, new HashSet<String>(),mergeStrat,nullStrat);
+//		
+//		this.addDegree(Evaluation.EVAL,evalDeg,1);
+//	}
 	
 	
 
@@ -98,12 +98,9 @@
 		boolean newContrib = false;
 		
 		for (String source : moreDegrees.keySet()) {
-			System.out.println("Added degrees for source "+ source + "+1");
+			System.out.println("Trying to merge degrees for source "+ source + "+1");
 			IDegree evalDeg = moreDegrees.get(source);
-			if (evalDeg == null) {
-				newContrib = newContrib || clearDegree(source);			
-			} else {
-			
+			if (evalDeg != null) {						
 							
 				confidence.put(source, conf.get(source));
 				
@@ -207,12 +204,15 @@
 	
 	
 	public String toString() {
-		return "("+this.nodeId + ")" + this.key+ " : " + this.aggDegree.toString();
+		return "("+this.nodeId + ")" + this.key+ " : " + this.aggDegree +" "+ this.getBitS();
 	}
 	
 	
+	
 
+	
 
+
 	/**
 	 * @param id the id to set
 	 */
@@ -273,13 +273,19 @@
 		StringBuilder sb = new StringBuilder("[");
 		for (String s : degrees.keySet()) {
 			if (degrees.get(s) != null)
-				sb.append(s+",");
+				sb.append(s+" " + this.degrees.get(s) +",");
 		}
 		return sb.append("]").toString();
 	}
 
 	
 	
+	protected IMergeStrategy getMergeStrat() {
+		return mergeStrat;
+	}
+	protected INullHandlingStrategy getNullHandlingStrat() {
+		return nullStrat;
+	}
 	
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -7,17 +7,24 @@
 
 public class GammaMemory {
 
-	private Map<Object, Collection<Evaluation>> store;
+	private Map<ArgList, Collection<Evaluation>> store;
 	
 	public GammaMemory() {
-		store = new HashMap<Object, Collection<Evaluation>>();
+		store = new HashMap<ArgList, Collection<Evaluation>>();
 	}
 	
-	public Collection<Evaluation> retrieve(Object o) {
-		return this.store.remove(o);		
+	public Collection<Evaluation> retrieve(ArgList o) {
+		if (o.isPersistent())
+			return this.store.get(o);
+		else
+			return this.store.remove(o);		
 	}
 	
-	public void store(Object o, Evaluation eval) {
+	public Collection<ArgList> getKeys() {
+		return store.keySet();
+	}
+	
+	public void store(ArgList o, Evaluation eval) {
 		Collection<Evaluation> coll = store.get(o);
 		if (coll == null) {
 			coll = new LinkedList<Evaluation>();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/IGammaNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/IGammaNode.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/IGammaNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -6,9 +6,9 @@
 
 	EvaluationTemplate getEvaluationTemplate(ConstraintKey key);
 
-	void storeEvaluation(Object object, Evaluation prepareEval);
+	void storeEvaluation(ArgList args, Evaluation prepareEval);
 	
 	
-	public Collection<Evaluation> getStoredEvals(Object o);
+	public Collection<Evaluation> getStoredEvals(ArgList args);
 
 }

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -70,27 +70,45 @@
                           final RuleBaseConfiguration config,
                           final FactHandleFactory factHandleFactory
                           ) {
-        this( id,
+        super( id,
                config,
-               factHandleFactory,
-               new SimpleFuzzyDegreeFactory());               
+               factHandleFactory
+               );               
+        
+        String factoryName = config.getProperty("drools.imperfect.factory");        
+        IDegreeFactory factory = null;
+        try {
+			factory = (IDegreeFactory) Class.forName(factoryName).newInstance();
+			System.out.println("Created instance of "+factoryName);
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+        
+        setDegreeFactory(factory);
     }
     
-    /**
-     * Construct.
-     *
-     * @param id
-     *            The rete network.
-     */
-    public ImperfectRuleBase(final String id,
-                          final RuleBaseConfiguration config,
-                          final FactHandleFactory factHandleFactory,
-                          final IDegreeFactory degreeFactory) {
-        super( id,
-               config,
-               factHandleFactory );       
-        this.degreeFactory = degreeFactory;
-    }
+//    /**
+//     * Construct.
+//     *
+//     * @param id
+//     *            The rete network.
+//     */
+//    public ImperfectRuleBase(final String id,
+//                          final RuleBaseConfiguration config,
+//                          final FactHandleFactory factHandleFactory,
+//                          final IDegreeFactory degreeFactory) {
+//        super( id,
+//               config,
+//               factHandleFactory );       
+//        this.degreeFactory = degreeFactory;
+//    }
 
 	/**
 	 * @param degreeFactory the degreeFactory to set

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -16,6 +16,10 @@
  * limitations under the License.
  */
 
+import java.util.Collection;
+import java.util.Observable;
+import java.util.Observer;
+
 import org.drools.common.BetaConstraints;
 import org.drools.common.ImperfectFactHandle;
 import org.drools.common.InternalFactHandle;
@@ -54,7 +58,7 @@
  * @author <a href="mailto:bob at werken.com">Bob McWhirter</a>
  *
  */
-public class JoinNode extends BetaNode {
+public class JoinNode extends BetaNode implements IGammaNode, Observer {
     // ------------------------------------------------------------
     // Instance methods
     // ------------------------------------------------------------    
@@ -64,6 +68,12 @@
      */
     private static final long serialVersionUID = 400L;    
 
+    
+    private GammaMemory 		gammaMemory;
+    
+    
+    
+    
     public JoinNode() {
 
     }
@@ -83,12 +93,23 @@
                behaviors );
         tupleMemoryEnabled = context.isTupleMemoryEnabled();
         
+        this.gammaMemory = new GammaMemory();
+        
         InternalRuleBase ruleBase = context.getRuleBase();
         if (ruleBase instanceof ImperfectRuleBase) {
         	IDegreeFactory factory = ((ImperfectRuleBase) ruleBase).getDegreeFactory();
         	this.filterStrat = factory.getDefaultStrategy();
+        	
+        	this.constraints.buildEvaluationTemplates(this.id,context.getRule().getDependencies(), factory);
+        	
+        	Collection<ConstraintKey> keys = this.constraints.getAllConstraintKeys();
+        	for (ConstraintKey key : keys)
+        		context.getRuleBase().getRete().indexGammaNode(key,this);
         }
         System.out.println(this.getClass().getName() + "(id "+id+") constructor hacked to add filter strategy");
+        
+             
+        
 
     }
 
@@ -152,38 +173,102 @@
                                           workingMemory,
                                           leftTuple );
         for ( ImperfectRightTuple rightTuple = (ImperfectRightTuple) memory.getRightTupleMemory().getFirst( leftTuple ); rightTuple != null; rightTuple = (ImperfectRightTuple) rightTuple.getNext() ) {
-            final InternalFactHandle handle = rightTuple.getFactHandle();
             
-            //TODO : Imperfect beta constraint
-            IDegree ans = this.constraints.isSatisfiedCachedLeft( memory.getContext(), handle,factory );
-            
-            EvalRecord record = new EvalRecord();
-            ConstraintKey key = this.constraints.getConstraintKey();
-            Evaluation eval = new Evaluation(this.getId(),ans,key,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
-            record.addEvaluation(eval);
-            	record.addEvaluations(leftTuple.getRecord());
-            	record.addEvaluations(rightTuple.getRecord());
-            
-            
-            switch (this.filterStrat.doTry(record.getMainEval())) {
-    		case IFilterStrategy.DROP : return;
+        	final ImperfectFactHandle factHandle = (ImperfectFactHandle) rightTuple.getFactHandle();
+        	EvalRecord record = rightTuple.getRecord();
+                       
+            EvalRecord mainRecord = leftTuple.getRecord().clone();
+        	
+        	
+        	Collection<Evaluation> storedEvals = this.gammaMemory.retrieve(new ArgList(leftTuple.toObjectArray(),factHandle.getObject()));
+    		if (storedEvals != null) {
+    			record.addEvaluations(storedEvals);
+    			factHandle.addPropertyDegrees(storedEvals);
+    		}
+    		
+    		
+        	
+        	
+        	//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[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+		                        													  leftTuple, 
+		                        													  factory );
+		    			//B-constraints are 0 to N
+		    			//Each is evaluated and, if it is the first time, added to the object's handle
+		    			if (evals != null) {
+		    				for (Evaluation eval : evals) {
+		    					for (Evaluation subEval : eval.getEvalTree()) {
+		    						factHandle.addPropertyDegree(subEval);
+		    					}
+		    					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 );
 		
-    		case IFilterStrategy.HOLD : //TODO: HOLD
-    			break;
-		
-    		case IFilterStrategy.PASS : 
-    			this.sink.propagateAssertLeftTuple( leftTuple,
-                        rightTuple,
-                        context,
-                        workingMemory,
-                        factory,
-                        record,
-                        this.tupleMemoryEnabled  );
+		    				if (evals != null) {
+		    					for (Evaluation eval : evals) {
+		    						record.addEvaluation(eval);
+		    					}
+		    				}
+		    				
+		    			}			
+		    		}   
+    		} else {
+    			//EMPTY BETA CONSTRAINT!
+    		}
+ 
+        	//KEY MOVE, AND-ING THE PATTERN EVALS
+    		mainRecord.addEvaluation(record);
+        	
+        	
+        	System.out.println("Situation at join eval"+mainRecord.expand());        		        		        		        	
+	        		        	        		        		        		        	
+        		
+        	switch (this.filterStrat.doTry(mainRecord)) {
+        		case IFilterStrategy.DROP : return;
+			
+        		case IFilterStrategy.HOLD : //TODO: HOLD
+        			System.out.println("HOLD RULES @JOIN NODE"+this.getId());
+        			System.out.println("Situation is "+mainRecord.expand());
+        			
+        				mainRecord.setLeftTuple(leftTuple);
+        				mainRecord.setRightTuple(rightTuple);
+        				mainRecord.setFactory(factory);
+        				mainRecord.setPropagationContext(context);
+        				mainRecord.setWorkingMemory(workingMemory);
+					mainRecord.addObserver(this);	
+        			
+        			break;
+			
+        		case IFilterStrategy.PASS : 
+        			this.sink.propagateAssertLeftTuple( leftTuple,
+                            rightTuple,
+                            context,
+                            workingMemory,
+                            factory,
+                            mainRecord,
+                            this.tupleMemoryEnabled  );
 
-    			break;
-    		default : return;			
-    	}
-            
+        			break;
+        		default : return;			
+        	}
+        	
+        			
+        
+                                                          
         }
 
         this.constraints.resetTuple( memory.getContext() );
@@ -280,21 +365,82 @@
                                                factHandle );
         int i = 0;
         for ( ImperfectLeftTuple leftTuple = (ImperfectLeftTuple) memory.getLeftTupleMemory().getFirst( rightTuple ); leftTuple != null; leftTuple = (ImperfectLeftTuple) leftTuple.getNext() ) {
-        	IDegree ans = this.constraints.isSatisfiedCachedRight( memory.getContext(),
-                                                        leftTuple, factory );
-        	ConstraintKey key = this.constraints.getConstraintKey();
         	
-        	EvalRecord clonedRecord = record.clone();        	
-        	Evaluation eval = new Evaluation(this.getId(),ans,key,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
-        	clonedRecord.addEvaluation(eval);
-        		clonedRecord.addEvaluations(leftTuple.getRecord());
         	
         	
+        	EvalRecord mainRecord = leftTuple.getRecord().clone();
         	
-        	switch (this.filterStrat.doTry(record.getMainEval())) {
+        	
+        	Collection<Evaluation> storedEvals = this.getGammaMemory().retrieve(new ArgList(leftTuple.toObjectArray(),factHandle.getObject()));
+    		if (storedEvals != null) {
+    			record.addEvaluations(storedEvals);
+    			factHandle.addPropertyDegrees(storedEvals);
+    		}
+    		
+    		
+        	
+        	
+        	//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[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+		                        													  leftTuple, 
+		                        													  factory );
+		    			//B-constraints are 0 to N
+		    			//Each is evaluated and, if it is the first time, added to the object's handle
+		    			if (evals != null) {
+		    				for (Evaluation eval : evals) {
+		    					for (Evaluation subEval : eval.getEvalTree()) {
+		    						factHandle.addPropertyDegree(subEval);
+		    					}
+		    					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);
+        	
+        	
+        	System.out.println("Situation at join eval"+mainRecord.expand());        		        		        		        	
+        		
+        	switch (this.filterStrat.doTry(mainRecord)) {
         		case IFilterStrategy.DROP : return;
 			
         		case IFilterStrategy.HOLD : //TODO: HOLD
+        			System.out.println("HOLD RULES @JOIN NODE"+this.getId());
+        			System.out.println("Situation is "+mainRecord.expand());
+        			
+        				mainRecord.setLeftTuple(leftTuple);
+        				mainRecord.setRightTuple(rightTuple);
+        				mainRecord.setFactory(factory);
+        				mainRecord.setPropagationContext(context);
+        				mainRecord.setWorkingMemory(workingMemory);
+        			mainRecord.addObserver(this);	
+        			
         			break;
 			
         		case IFilterStrategy.PASS : 
@@ -303,7 +449,7 @@
                             context,
                             workingMemory,
                             factory,
-                            clonedRecord,
+                            mainRecord,
                             this.tupleMemoryEnabled  );
 
         			break;
@@ -319,6 +465,59 @@
     
     
     
+    
+    
+    
+    
+    
+	public void update(Observable watcher, Object info) {
+		EvalRecord record = (EvalRecord) watcher;
+		System.out.println("**************************************************************UPDATE @JOIN 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;	
+		
+		}
+		
+		
+		// propagate
+	}
+    
+    
+	protected GammaMemory getGammaMemory() {
+		return this.gammaMemory;
+	}
+
+    
+    
     /**
      * Retract a FactHandleImpl. Iterates the referenced TupleMatches stored in
      * the handle's ObjectMatches retracting joined tuples.
@@ -413,6 +612,22 @@
         return "[JoinNode(" + this.getId() + ") - " + ((ObjectTypeNode) source).getObjectType() + "]";
     }
 
+    
+    
+    
+    public EvaluationTemplate getEvaluationTemplate(ConstraintKey key) {
+		return this.constraints.getEvalTemplate(key);
+	}
+
+
+	public Collection<Evaluation> getStoredEvals(ArgList args) {
+		return getGammaMemory().retrieve(args);
+	}
+
+	public void storeEvaluation(ArgList args, Evaluation prepareEval) {
+		getGammaMemory().store(args, prepareEval);
+	}
+
 	
 
 	

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,152 @@
+package org.drools.reteoo;
+
+import java.util.Collection;
+import java.util.Map;
+
+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.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.spi.PropagationContext;
+
+public class ModusPonensNode extends JoinNode {
+
+		
+	
+	public ModusPonensNode(final int id,
+            final LeftTupleSource leftInput,                
+            final Behavior[] behaviors,
+            IDegreeFactory factory,            
+            final BuildContext context) {				
+		super(id,
+			  leftInput,
+			  //new ImplicationObjectSource(),
+			  null,
+			  new ImplicationBetaConstraint(factory, factory.True(), context),
+			  behaviors,
+			  context);
+		
+		Map<String,String> ruleDetails = context.getRule().getMetaAttributes();
+		
+		String dstr = ruleDetails.get("degree");
+			if (dstr != null)
+				((ImplicationBetaConstraint) this.constraints).setPriorDegree(factory.buildDegree(Float.parseFloat(dstr)));
+																		
+		String fstr = ruleDetails.get("filterStrat");
+		try {
+			if (fstr != null) {
+				IFilterStrategy overrideStrat = (IFilterStrategy) Class.forName(fstr).newInstance();
+				if (overrideStrat != null)
+					filterStrat = overrideStrat;
+			}
+		} catch (Exception e) {
+			throw new RuntimeDroolsException(e);
+		}
+				
+		
+	}
+	
+	public void attach() {        
+        this.leftInput.addTupleSink( this );
+    }
+	
+	
+	
+	
+	
+	
+	
+	
+	public void assertLeftTuple(ImperfectLeftTuple leftTuple,
+			PropagationContext context, InternalWorkingMemory workingMemory,
+			IDegreeFactory factory) {
+    	
+    	final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
+        if ( this.tupleMemoryEnabled ) {
+            memory.getLeftTupleMemory().add( leftTuple );
+        }
+
+        
+        	    
+        
+            EvalRecord premiseRecord = leftTuple.getRecord().clone();
+        	            
+            Evaluation implEval = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+					  leftTuple, 
+					  factory )[0];
+        	
+            ArgList args = new ArgList(leftTuple.toObjectArray());
+        	Collection<Evaluation> storedEvals = this.getGammaMemory().retrieve(args);
+        	    		    		      
+    		if (storedEvals != null) {
+    			for (Evaluation e : storedEvals)
+    				implEval.merge(e);    			
+    		}
+    		
+    		
+    		
+        	EvalRecord mpRecord = new EvalRecord(this.id,factory.getModusPonensOp(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        	mpRecord.addEvaluation(premiseRecord);
+        	mpRecord.addEvaluation(implEval);
+        	
+        	
+        	        		        		        	        		        		        		        	
+        		
+        	switch (this.filterStrat.doTry(mpRecord)) {
+        		case IFilterStrategy.DROP : return;
+			
+        		case IFilterStrategy.HOLD : //TODO: HOLD
+        			System.out.println("HOLD RULES @MP NODE"+this.getId());
+        			System.out.println("Situation is "+mpRecord.expand());
+        			
+        				mpRecord.setLeftTuple(leftTuple);        				
+        				mpRecord.setFactory(factory);
+        				mpRecord.setPropagationContext(context);
+        				mpRecord.setWorkingMemory(workingMemory);
+					mpRecord.addObserver(this);	
+        			
+        			break;
+			
+        		case IFilterStrategy.PASS : 
+        			this.sink.propagateAssertLeftTuple( leftTuple,                            
+                            context,
+                            workingMemory,
+                            factory,
+                            mpRecord,
+                            this.tupleMemoryEnabled  );
+
+        			break;
+        		default : return;			
+        	}
+        	
+        			                                                                         
+
+        this.constraints.resetTuple( memory.getContext() );
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	public void networkUpdated() {
+        //this.rightInput.networkUpdated();
+        this.leftInput.networkUpdated();
+    }
+	
+	
+	
+	
+	
+
+}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -103,7 +103,8 @@
                             final LeftTupleSource source,
                             final Rule rule,
                             final GroupElement subrule,
-                            final BuildContext context) {
+                            final BuildContext context
+                            ) {
         super( id,
                context.getPartitionId(),
                context.getRuleBase().getConfiguration().isMultithreadEvaluation() );
@@ -177,10 +178,12 @@
 			IDegreeFactory factory) {
     	
     	EvalRecord record = tuple.getRecord();
+    	record.setNodeId(this.getId());
+    	
     	System.out.println(this.rule);
-    	System.out.println(""+this.hashCode() + record);
+    	System.out.println(""+this.hashCode() + record.expand());
     	
-    	IDegree degree = record.getOverallDegree();
+    	IDegree degree = record.getDegree();
     	
     	 // @FIXME
         final LeftTuple cloned = tuple;//new LeftTuple( tuple );

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -115,8 +115,17 @@
 			InternalWorkingMemory workingMemory, IDegreeFactory factory,
 			EvalRecord record, boolean leftTupleMemoryEnabled) {
     	
-    	doPropagateAssertLeftTuple( context, workingMemory, factory, record,
-                new ImperfectLeftTuple( factHandle, this.sink, leftTupleMemoryEnabled, record ) );
+    	EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+    		masterRecord.addEvaluation(record);
+    		
+//    		System.out.println("--------------------------------------");
+//    		System.out.println(record.expand());
+//    		System.out.println("--------------------------------------");
+//    		System.out.println(masterRecord.expand());
+//    		System.out.println("--------------------------------------");
+//    		if (1 == 1) throw new RuntimeException();
+    	doPropagateAssertLeftTuple( context, workingMemory, factory, masterRecord,
+                new ImperfectLeftTuple( factHandle, this.sink, leftTupleMemoryEnabled, masterRecord ) );
 		
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -20,16 +20,23 @@
 import java.util.List;
 
 import org.drools.InitialFact;
+import org.drools.RuleBase;
 import org.drools.RuleIntegrationException;
 import org.drools.RuleBaseConfiguration.EventProcessingMode;
 import org.drools.base.ClassObjectType;
 import org.drools.common.BaseNode;
+import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalRuleBase;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ImperfectRuleBase;
+import org.drools.reteoo.ModusPonensNode;
 import org.drools.reteoo.QueryTerminalNode;
 import org.drools.reteoo.ReteooBuilder;
 import org.drools.reteoo.RuleTerminalNode;
 import org.drools.reteoo.TerminalNode;
 import org.drools.rule.Accumulate;
+import org.drools.rule.Behavior;
 import org.drools.rule.Collect;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.EvalCondition;
@@ -155,26 +162,56 @@
                        subrule );
 
         TerminalNode terminal = null;
+        ModusPonensNode mpNode = null;
 
         if ( !(rule instanceof Query) ) {
-            terminal = new RuleTerminalNode( context.getNextId(),
-                                             context.getTupleSource(),
-                                             rule,
-                                             subrule,
-                                             context );
-        } else {
+        	
+            
+            RuleBase ruleBase = context.getRuleBase();
+        	if (ruleBase instanceof ImperfectRuleBase) {
+        		IDegreeFactory factory = ((ImperfectRuleBase) ruleBase).getDegreeFactory();
+        		
+        		
+        		mpNode = new ModusPonensNode(context.getNextId(),
+        				context.getTupleSource(),
+        				context.getBehaviors().toArray(new Behavior[context.getBehaviors().size()]),
+        				factory,        		
+        				context);
+        	}
+        	
+        	context.setTupleSource((ModusPonensNode) this.utils.attachNode(context, mpNode));
+            
+        	
+        	
+        	terminal = new RuleTerminalNode( context.getNextId(),
+                    context.getTupleSource(),
+                    rule,
+                    subrule,
+                    context );
+
+        } else {        	        	
+        	
             terminal = new QueryTerminalNode( context.getNextId(),
                                               context.getTupleSource(),
                                               rule,
                                               subrule,
                                               context );
         }
+        
+        
         if ( context.getWorkingMemories().length == 0 ) {
+        	        	
             ((BaseNode) terminal).attach();
+            
         } else {
+        	        	
             ((BaseNode) terminal).attach( context.getWorkingMemories() );
+            
         }
 
+        
+        
+        
         ((BaseNode) terminal).networkUpdated();
         
         // adds the terminal no to the list of nodes created/added by this sub-rule

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/AlwaysPassFilterStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/AlwaysPassFilterStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/AlwaysPassFilterStrategy.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -0,0 +1,30 @@
+package org.drools.reteoo.filters;
+
+import org.drools.reteoo.Evaluation;
+
+public class AlwaysPassFilterStrategy extends ImperfectFilterStrategy {
+
+	
+	private static AlwaysPassFilterStrategy singleton = null;
+	
+	public static AlwaysPassFilterStrategy getInstance() {
+		if (singleton == null)
+			singleton = new AlwaysPassFilterStrategy();
+		return singleton;
+	}
+	
+	
+	public AlwaysPassFilterStrategy() { }
+	
+	@Override
+	public int doTry(Evaluation eval) {
+		return PASS;
+		
+	}
+
+	@Override
+	public boolean isAllowed(Evaluation eval) {
+		return doTry(eval) == PASS;
+	}
+
+}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/FuzzyFilterStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/FuzzyFilterStrategy.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/FuzzyFilterStrategy.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -13,7 +13,7 @@
 		return singleton;
 	}
 	
-	protected FuzzyFilterStrategy() {
+	public FuzzyFilterStrategy() {
 		
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -14,7 +14,7 @@
 	}
 	
 	
-	protected SimpleFilterStrategy() { }
+	public SimpleFilterStrategy() { }
 	
 	@Override
 	public int doTry(Evaluation eval) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -108,7 +108,7 @@
         return true;
     }
 
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
     	
     	int N1 = this.alphaConstraints.length;
@@ -123,15 +123,12 @@
                                                       	factory);
     	for ( int i = 0; i < N2; i++ )
     		//TODO: Extend BetaConstraints as well..
-    		evals[N1+i] = new Evaluation(0, 
-    			this.betaConstraints[i].isSatisfiedCachedLeft(
+    		evals[N1+i] = this.betaConstraints[i].isSatisfiedCachedLeft(
     				((MultiFieldConstraintContextEntry) context).betas[i],
     				handle, 
-    				factory),
-    				null,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+    				factory);
     				
-
-    	return getTemplate().spawn(evals).getDegree();
+    	return getTemplate().spawn(evals);
     	
 	}
     
@@ -158,7 +155,7 @@
     }
     
     
-    public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+    public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
 		
     	int N1 = this.alphaConstraints.length;
@@ -173,16 +170,13 @@
                                                       	factory);
     	for ( int i = 0; i < N2; i++ )
     		//TODO: Extend Beta as well
-    		evals[N1+i] = new Evaluation(0,     			
+    		evals[N1+i] =  			
     			this.betaConstraints[i].isSatisfiedCachedRight(
     				tuple,
     				((MultiFieldConstraintContextEntry) context).betas[i],    				
-    				factory),
-    				
-    				null,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
-    				
+    				factory);    				
 
-    	return getTemplate().spawn(evals).getDegree();
+    	return getTemplate().spawn(evals);
     	
 	}
     

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -193,15 +193,16 @@
 	
 	
 	
-	 public EvaluationTemplate buildEvaluationTemplate(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
+	public EvaluationTemplate buildEvaluationTemplate(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
 		 Set<String> deps;
 		 if (dependencies == null)
 			 deps = Collections.emptySet();
 		 else 
 			 deps = dependencies.get(this.getConstraintKey());
-	    	this.template = new SingleEvaluationTemplate(id,this.getConstraintKey(),deps,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
-	    	return template;
-	    }
+		 
+	   	this.template = new SingleEvaluationTemplate(id,this.getConstraintKey(),deps,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+	   	return template;
+	}
 
 	public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
 		if (this.template.getConstraintKey().equals(key))

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -265,7 +265,7 @@
     
 	public ConstraintKey getConstraintKey() {
 		if (singletonKey == null) {			
-			singletonKey = new ConstraintKey(((ClassFieldReader) this.readAccessor).getFieldName(),this.getEvaluator().toString(),this.getField().toString());
+			singletonKey = new ConstraintKey(((ClassFieldReader) this.readAccessor).getClassName()+"."+((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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -133,10 +133,10 @@
                                                       handle );
     }
 
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-    	return this.restrictions.isSatisfiedCachedLeft( context,
-                handle, factory );
+    	return this.getTemplate().spawn(this.restrictions.isSatisfiedCachedLeft( context,
+                handle, factory ));
 	}
     
     public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -145,10 +145,10 @@
                                                        context );
     }
     
-    public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+    public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-    	return this.restrictions.isSatisfiedCachedRight( tuple,
-                context, factory );
+    	return this.getTemplate().spawn(this.restrictions.isSatisfiedCachedRight( tuple,
+                context, factory ));
 	}
 
     public Object clone() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -205,7 +205,7 @@
         return getTemplate().spawn(evals);
 	}
 
-	 public IDegree isSatisfiedCachedLeft(ContextEntry context,
+	 public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 				InternalFactHandle handle, IDegreeFactory factory) {
 	    	
 	    	int N1 = this.alphaConstraints.length;
@@ -220,19 +220,18 @@
 	                                                      	factory);
 	    	for ( int i = 0; i < N2; i++ )
 	    		//TODO : beta...
-	    		evals[N1+i] = new Evaluation(0, 
+	    		evals[N1+i] =  
 	    			this.betaConstraints[i].isSatisfiedCachedLeft(
 	    				((MultiFieldConstraintContextEntry) context).betas[i],
 	    				handle, 
-	    				factory)
-	    				, null,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+	    				factory);
 	    				
 
-	    	return getTemplate().spawn(evals).getDegree();
+	    	return getTemplate().spawn(evals);
 	    	
 		}
 
-	 public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+	 public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 				ContextEntry context, IDegreeFactory factory) {
 			
 	    	int N1 = this.alphaConstraints.length;
@@ -247,15 +246,14 @@
 	                                                      	factory);
 	    	for ( int i = 0; i < N2; i++ )
 	    		//TODO: beta...
-	    		evals[N1+i] = new Evaluation(0, 
+	    		evals[N1+i] =  
 	    			this.betaConstraints[i].isSatisfiedCachedRight(
 	    				tuple,
 	    				((MultiFieldConstraintContextEntry) context).betas[i],    				
-	    				factory),
-	    				null,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+	    				factory);
 	    				
 
-	    	return getTemplate().spawn(evals).getDegree();
+	    	return getTemplate().spawn(evals);
 	    	
 		}
 	 

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -49,8 +49,7 @@
  * @author etirelli
  */
 public class PredicateConstraint extends MutableTypeConstraint
-    implements
-    Restriction,
+    implements    
     Wireable,
     Externalizable {
 
@@ -326,9 +325,9 @@
         }
     }
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return factory.fromBoolean(this.isAllowedCachedLeft(context, handle));
+		return this.getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedLeft(context, handle)));
 	}
 
 
@@ -348,9 +347,9 @@
         }
     }
     
-    public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+    public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return factory.fromBoolean(this.isAllowedCachedRight(tuple, context));
+		return getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedRight(tuple, context)));
 	}
 
     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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -180,16 +180,16 @@
         }
     }
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
     	 try {
              final ReturnValueContextEntry ctx = (ReturnValueContextEntry) context;
-             return this.restriction.isSatisfied( this.readAccessor,
+             return getTemplate().spawn(this.restriction.isSatisfied( this.readAccessor,
                                                 handle,
                                                 ctx.getTuple(),
                                                 ctx.getWorkingMemory(),
                                                 ctx,
-                                                factory);
+                                                factory));
          } catch ( final Exception e ) {
              throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
                                                e );
@@ -213,16 +213,16 @@
     }
 
 
-	public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+	public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
         try {
             final ReturnValueContextEntry ctx = (ReturnValueContextEntry) context;
-            return this.restriction.isSatisfied( this.readAccessor,
+            return this.getTemplate().spawn(this.restriction.isSatisfied( this.readAccessor,
                                                ctx.getHandle(),
                                                tuple,
                                                ctx.getWorkingMemory(),
                                                ctx,
-                                               factory);
+                                               factory));
         } 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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -134,18 +134,18 @@
     	return getTemplate().spawn(deg);
 	}
 
-	public IDegree isSatisfiedCachedLeft(ContextEntry context,
+	public Evaluation isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-		return this.restriction.isSatisfiedCachedLeft( context,
+		return this.getTemplate().spawn(this.restriction.isSatisfiedCachedLeft( context,
                 handle,
-                factory);
+                factory));
 	}
 
-	public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+	public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
 			ContextEntry context, IDegreeFactory factory) {
-		return this.restriction.isSatisfiedCachedRight( tuple,
+		return this.getTemplate().spawn(this.restriction.isSatisfiedCachedRight( tuple,
                 context, 
-                factory);
+                factory));
 	}
     
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -23,6 +23,8 @@
 import java.util.Collection;
 import java.util.LinkedList;
 
+import org.drools.base.ClassFieldAccessor;
+import org.drools.base.ClassFieldReader;
 import org.drools.base.ValueType;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -635,8 +637,10 @@
     private ConstraintKey singletonKey = null;
     
 	public ConstraintKey getConstraintKey() {
-		if (singletonKey == null)
-			singletonKey = new ConstraintKey(readAccessor.toString(),evaluator.toString(),declaration.toString());
+		if (singletonKey == null) {
+			ClassFieldReader cfa = (ClassFieldReader) readAccessor;
+			singletonKey = new ConstraintKey(cfa.getClassName()+"."+cfa.getFieldName(),evaluator.toString(),declaration.getIdentifier());
+		}
 		return singletonKey;
 	}
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -16,9 +16,15 @@
  * limitations under the License.
  */
 
+import java.util.Map;
+import java.util.Set;
+
 import org.drools.common.InternalFactHandle;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ConstraintKey;
+import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.EvaluationTemplate;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.ContextEntry;
 
@@ -29,17 +35,19 @@
     public boolean isAllowedCachedLeft(ContextEntry context,
                                        InternalFactHandle handle);
     
-    public IDegree isSatisfiedCachedLeft(ContextEntry context,
+    public Evaluation isSatisfiedCachedLeft(ContextEntry context,
             							  InternalFactHandle handle,
             							  IDegreeFactory factory);
 
     public boolean isAllowedCachedRight(LeftTuple tuple,
              							ContextEntry context);
 
-    public IDegree isSatisfiedCachedRight(LeftTuple tuple,
+    public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
                                         ContextEntry context,
                                         IDegreeFactory factory);
 
     public ContextEntry createContextEntry();
+    
+    public EvaluationTemplate buildEvaluationTemplate(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory);
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -23,6 +23,7 @@
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.degrees.IDegree;
+import org.drools.reteoo.ArgList;
 import org.drools.reteoo.Evaluation;
 import org.drools.rule.Declaration;
 import org.drools.rule.Rule;
@@ -132,7 +133,13 @@
     
     public IDegree getConsequenceDegree();
     
-    public void inject(Object object, String field, String op, String value);
+    public void inject(Object arg, String field, String op, String value);
+    
+    public void inject(Object[] args, String field, String op, String value);
+    
+    public void inject(Object arg, String key);
+    
+    public void inject(Object[] args, String key);
 
     public void setConsequenceDegree(IDegree deg);
     

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-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt	2009-04-17 17:02:02 UTC (rev 26123)
@@ -1 +1 @@
-5.0.0.SNAPSHOT 25662M
\ No newline at end of file
+5.0.0.SNAPSHOT 25662:25943M
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java	2009-04-17 15:26:54 UTC (rev 26122)
+++ labs/jbossrules/branches/DroolsChance/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java	2009-04-17 17:02:02 UTC (rev 26123)
@@ -35,6 +35,7 @@
 import org.drools.spi.GlobalResolver;
 import org.drools.time.SessionClock;
 import org.drools.degrees.IDegree;
+import org.drools.reteoo.ArgList;
 
 public class ExternalSheetListenerTest extends TestCase {
 
@@ -442,7 +443,7 @@
 
 				
 
-				public void inject(String rule, Object object, ConstraintKey key, IDegree degree) {
+				public void inject(String rule, ArgList args, ConstraintKey key, IDegree degree) {
 					// TODO Auto-generated method stub
 					
 				}




More information about the jboss-svn-commits mailing list