[jboss-svn-commits] JBL Code SVN: r26251 - in labs/jbossrules/branches/DroolsChance: drools-core and 11 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Apr 24 22:31:25 EDT 2009
Author: dsotty
Date: 2009-04-24 22:31:25 -0400 (Fri, 24 Apr 2009)
New Revision: 26251
Modified:
labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java
labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java
labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java
labs/jbossrules/branches/DroolsChance/drools-core/.classpath
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl
labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl
labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt
Log:
quantifiers and args
Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ArgList.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,56 +1,118 @@
package org.drools.reteoo;
+import java.util.Collection;
+import java.util.LinkedList;
+
+import org.drools.InitialFact;
+
public class ArgList {
- private Object[] args;
+ private LinkedList<Object> args;
private boolean isPersistent = false;
+ public ArgList() {
+ args = new LinkedList<Object>();
+ }
+
public ArgList(Object[] args) {
- this.args = args;
- for (int j = 0; j < args.length; j++)
- if (args[j] instanceof Jolly)
- isPersistent = true;
+ this();
+ merge(args);
}
public ArgList(Object arg) {
- this.args = new Object[] {arg};
- if (arg instanceof Jolly)
- isPersistent = true;
+ this();
+ merge(arg);
}
public ArgList(Object[] args, Object arg) {
- this.args = new Object[args.length+1];
- for (int j = 0; j < args.length; j++) {
- if (args[j] instanceof Jolly)
- isPersistent = true;
- this.args[j] = args[j];
- }
- this.args[args.length] = arg;
- if (arg instanceof Jolly)
- isPersistent = true;
+ this();
+ merge(args);
+ merge(arg);
}
+ protected ArgList(Collection<Object> args) {
+ this();
+
+ merge(args);
+
+ }
+
+
public Object getObject() {
- return args[args.length-1];
+ return args.getLast();
}
-
+ public Object clone() {
+ ArgList ans = new ArgList(this.args);
+ return ans;
+ }
+ public int merge(Object[] more) {
+ int j = 0;
+ for (Object o : more) {
+ if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {
+ this.args.add(o);
+ j++;
+ }
+ }
+ return j;
+ }
+ public int merge(ArgList more) {
+ int j = 0;
+ for (Object o : more.args) {
+ if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {
+ this.args.add(o);
+ j++;
+ }
+ }
+ return j;
+ }
+ public int merge(Object o) {
+ if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {
+ this.args.add(o);
+ return 1;
+ }
+ return 0;
+ }
+
+
+ public int merge(Collection< ? extends Object> args) {
+ int j = 0;
+ for (Object o : args) {
+ if (o != null && ! this.args.contains(o) && ! (o instanceof InitialFact)) {
+ this.args.add(o);
+ j++;
+ }
+ }
+ return j;
+ }
+
+
+
+
+
+
+
+
public int hashCode() {
- int ans = 2131;
- for (int j = 0; j < args.length; j++)
- ans ^= args[j].hashCode();
+ int ans = 0;
+ for (int j = 0; j < args.size(); j++)
+ ans ^= args.get(j).hashCode();
return ans;
}
+
+
+
+
public boolean equals(Object other) {
if (other == null) return false;
if (other == this) return true;
@@ -58,15 +120,15 @@
ArgList otherArgs = (ArgList) other;
if (otherArgs != null) {
- if (this.args.length != otherArgs.args.length)
+ if (this.args.size() != otherArgs.args.size())
return false;
boolean ans = true;
- for (int j = 0; j < this.args.length; j++) {
- if (this.args[j] instanceof Jolly || otherArgs.args[j] instanceof Jolly) {
+ for (int j = 0; j < this.args.size(); j++) {
+ if (this.args.get(j) instanceof Jolly || otherArgs.args.get(j) instanceof Jolly) {
ans = ans && true;
} else {
- ans = ans && this.args[j].equals(otherArgs.args[j]);
+ ans = ans && this.args.get(j).equals(otherArgs.args.get(j));
}
}
@@ -82,14 +144,23 @@
return isPersistent;
}
+ public String toString() {
+ StringBuilder sb = new StringBuilder("L : ");
+ for (Object o : args) {
+ sb.append(o.getClass().getSimpleName()).append(" ").append(o.hashCode()).append("\t");
+ }
+ return sb.toString();
+ }
-
public static class Jolly {
public Jolly() {
}
}
+
+
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/ConstraintKey.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,6 +1,8 @@
package org.drools.reteoo;
+import com.sun.tools.xjc.model.CNonElement;
+
public class ConstraintKey {
protected String key;
@@ -22,7 +24,7 @@
}
-
+
protected String buildKey(String op, String arg) {
return op+"("+arg+")";
}
@@ -34,6 +36,11 @@
public ConstraintKey(String key) {
this.key = key;
}
+
+
+ public ConstraintKey cloneReplace(String oldK, String newK) {
+ return new ConstraintKey(key.replaceFirst(oldK, newK));
+ }
/**
* @return the key
@@ -46,8 +53,10 @@
public boolean equals(Object other) {
if (other == null) return false;
- if (other instanceof ConstraintKey)
- return this.key.equals(((ConstraintKey) other).key);
+ if (other instanceof ConstraintKey) {
+ ConstraintKey otherK = (ConstraintKey) other;
+ return this.key.equals(otherK.key);
+ }
else
return false;
}
Modified: labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-api/src/main/java/org/drools/reteoo/DynamicConstraintKey.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -8,6 +8,10 @@
super(op, "");
this.op = op;
}
+
+ public ConstraintKey cloneReplace(String oldK, String newK) {
+ return new DynamicConstraintKey(key.replaceFirst(oldK, newK));
+ }
public void reset() {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/.classpath
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/.classpath 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/.classpath 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="src" output="target/classes" path="src/main/java"/>
+ <classpathentry excluding="org/drools/reteoo/JoinNodeBackup.java" kind="src" output="target/classes" path="src/main/java"/>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1988,12 +1988,12 @@
return;
}
- private Evaluation prepareEval(String ruleName, Object object, ConstraintKey key,
+ private Evaluation prepareEval(String ruleName, ArgList args, ConstraintKey key,
IDegree degree, IGammaNode node) {
EvaluationTemplate templ = node.getEvaluationTemplate(key);
- return templ.spawn(ruleName,degree);
+ return templ.spawn(ruleName,degree, args);
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -155,12 +155,12 @@
public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
InternalFactHandle handle, IDegreeFactory factory) {
- return null;
+ return new Evaluation[0];
}
public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
LeftTuple tuple, IDegreeFactory factory) {
- return null;
+ return new Evaluation[0];
}
private ConstraintKey[] singletonKeys = null;
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -12,14 +12,18 @@
import org.drools.RuleBaseConfiguration;
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.BetaMemory;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.SingleEvaluationTemplate;
+import org.drools.reteoo.ModusPonensNode.MPContextEntry;
import org.drools.reteoo.builder.BuildContext;
import org.drools.rule.ContextEntry;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
import org.drools.util.LeftTupleList;
import org.drools.util.LinkedList;
import org.drools.util.RightTupleList;
@@ -190,14 +194,23 @@
public Evaluation[] isSatisfiedCachedLeft(ContextEntry[] context,
InternalFactHandle handle, IDegreeFactory factory) {
- Evaluation eval = template[0].spawn(factory.Unknown());
+
+ //merge to ensure uniqueness
+ ArgList args = ((MPContextEntry) context[0]).getLeftTuple().getArgList();
+// args.merge(handle.getObject());
+
+ Evaluation eval = template[0].spawn(factory.Unknown(),args);
eval.addDegree(Evaluation.PRIOR, this.priorDegree, 1,true);
return new Evaluation[] {eval};
}
public Evaluation[] isSatisfiedCachedRight(ContextEntry[] context,
- LeftTuple tuple, IDegreeFactory factory) {
- Evaluation eval = template[0].spawn(factory.Unknown());
+ LeftTuple tuple, IDegreeFactory factory) {
+
+ //ArgList args = ((ImperfectLeftTuple) tuple).getArgList();
+ ArgList args = new ArgList();
+
+ Evaluation eval = template[0].spawn(factory.Unknown(),args);
eval.addDegree(Evaluation.PRIOR, this.priorDegree, 1,true);
return new Evaluation[] {eval};
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -26,9 +26,11 @@
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.SingleEvaluationTemplate;
import org.drools.rule.ContextEntry;
@@ -99,7 +101,7 @@
public Evaluation isSatisfiedCachedLeft(ContextEntry context,
InternalFactHandle handle, IDegreeFactory factory) {
- return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
+ return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)),new ArgList(handle.getObject()));
}
public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -109,7 +111,7 @@
public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
ContextEntry context, IDegreeFactory factory) {
- return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
+ return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)),((ImperfectLeftTuple) tuple).getArgList());
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -26,9 +26,11 @@
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.SingleEvaluationTemplate;
import org.drools.rule.ContextEntry;
@@ -98,7 +100,7 @@
public Evaluation isSatisfiedCachedLeft(ContextEntry context,
InternalFactHandle handle, IDegreeFactory factory) {
- return getTemplate().spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
+ return getTemplate().spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)),new ArgList(handle.getObject()));
}
@@ -110,7 +112,7 @@
public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
ContextEntry context, IDegreeFactory factory) {
- return getTemplate().spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
+ return getTemplate().spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)),((ImperfectLeftTuple) tuple).getArgList());
}
public String toString() {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -26,9 +26,11 @@
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.SingleEvaluationTemplate;
import org.drools.rule.ContextEntry;
@@ -108,7 +110,7 @@
public Evaluation isSatisfiedCachedLeft(ContextEntry context,
InternalFactHandle handle, IDegreeFactory factory) {
- return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)));
+ return template.spawn(factory.fromBoolean(isAllowedCachedLeft(context, handle)), new ArgList(handle.getObject()));
}
@@ -119,7 +121,8 @@
public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
ContextEntry context, IDegreeFactory factory) {
- return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)));
+ return template.spawn(factory.fromBoolean(isAllowedCachedRight(tuple, context)),
+ ((ImperfectLeftTuple) tuple).getArgList());
}
public String toString() {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -6,27 +6,16 @@
import org.drools.degrees.IntervalDegree;
import org.drools.degrees.factory.IntervalDegreeFactory;
import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
-public class IntervalNegationOperator implements IDegreeCombiner {
+public class IntervalNegationOperator extends NegationOperator {
- public IDegree eval(IDegree[] args) {
- if (args == null || args.length == 0)
- return IntervalDegreeFactory.UNKNOWN;
-
- IntervalDegree arg = (IntervalDegree) args[0];
- return new IntervalDegree(arg.getUpp(),arg.getLow());
+
+ protected IDegree negate(IDegree arg) {
+ IntervalDegree iDeg = (IntervalDegree) arg;
+ return new IntervalDegree(iDeg.getPhi(),1-iDeg.getTau());
}
-
- public IDegree eval(Collection<? extends IDegree> args) {
- if (args == null || args.size() == 0)
- return IntervalDegreeFactory.UNKNOWN;
-
- IntervalDegree arg = (IntervalDegree) args.iterator().next();
- return new IntervalDegree(arg.getUpp(),arg.getLow());
- }
-
- public String getName() {
- return "i_not";
- }
-
+
+
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -5,20 +5,14 @@
import org.drools.degrees.IDegree;
import org.drools.degrees.SimpleDegree;
import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
-public class SimpleNot implements IDegreeCombiner {
+public class SimpleNot extends NegationOperator {
- public IDegree eval(IDegree[] args) {
- return new SimpleDegree(1-args[0].getDegree().getValue());
+ protected IDegree negate(IDegree arg) {
+ return new SimpleDegree(1-arg.getDegree().getValue());
}
- public IDegree eval(Collection<? extends IDegree> args) {
- return new SimpleDegree(1-args.iterator().next().getDegree().getValue());
+
- }
-
- public String getName() {
- return "not";
- }
-
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -51,6 +51,10 @@
public RightTupleMemory getRightTupleMemory() {
return this.rightTupleMemory;
}
+
+ public void setRightTupleMemory(RightTupleMemory newMem) {
+ this.rightTupleMemory = newMem;
+ }
public LeftTupleMemory getLeftTupleMemory() {
return this.leftTupleMemory;
@@ -77,4 +81,6 @@
public void setBehaviorContext(Object behaviorContext) {
this.behaviorContext = behaviorContext;
}
+
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -21,8 +21,8 @@
private float opRate;
public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
- Evaluation[] evalDegrees, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
- super(id,key,deps,mergeStrat,nullStrat);
+ Evaluation[] evalDegrees, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+ super(id,key,deps,mergeStrat,nullStrat, args);
if (evalDegrees != null) {
this.operands = new Vector<Evaluation>(evalDegrees.length);
@@ -30,7 +30,7 @@
setOperand(j,evalDegrees[j]);
}
} else {
- this.operands = new Vector<Evaluation>(0);
+ this.operands = new Vector<Evaluation>(1,1);
}
this.operator = operator;
@@ -41,10 +41,10 @@
protected CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
- IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
- super(id,key,deps,mergeStrat,nullStrat);
+ IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat,ArgList args) {
+ super(id,key,deps,mergeStrat,nullStrat, args);
- this.operands = new Vector<Evaluation>(0);
+ this.operands = new Vector<Evaluation>(1,1);
this.operator = null;
}
@@ -54,10 +54,10 @@
public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
- int arity, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
- super(id,key,deps,mergeStrat,nullStrat);
+ int arity, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+ super(id,key,deps,mergeStrat,nullStrat, args);
- this.operands = new Vector<Evaluation>(arity);
+ this.operands = new Vector<Evaluation>(arity,2);
this.operator = operator;
@@ -116,16 +116,23 @@
public void setOperand(int position, Evaluation operand) {
+ System.out.println(operand.expand());
+
+
if (operands.size() <= position) {
// Surely a new operand!
+
operands.setSize(position+1);
operand.addObserver(this);
+ System.out.println(operand.expand());
//operands.set(position,operand);
} else {
if (operands.get(position) != null && operands.get(position) != operand) {
+
System.out.println("SET OPERAND "+operand.getKey()+ "with " + operand.getBitS());
operands.get(position).deleteObserver(this);
+
operand.addObserver(this);
//operands.set(position,operand);
//combine();
@@ -134,10 +141,17 @@
// if (operands.get(position) != null)
// throw new RuntimeDroolsException("DD");
//operands.set(position,operand);
+ //this.setArgCode(this.getArgCode()^operands.get(position).getArgCode());
}
}
+
+
operands.set(position,operand);
+
+ this.getArgs().merge(operand.getArgs());
+
+ //this.setArgCode(this.getArgCode()^operand.getArgCode());
}
public Collection<Evaluation> getEvalTree() {
@@ -180,11 +194,21 @@
public void update(Observable o, Object arg) {
- System.out.println("\nUPDATE HAS BEEN CALLED ON COMBOVAL by" + o.toString());
- incInfo("EVAL",-getOpRate());
- combine();
+ System.out.println("\nUPDATE HAS BEEN CALLED ON COMBOVAL by" + o.toString()+ " " + getOpRate());
+ //incInfo("EVAL",-getOpRate());
- this.notifyObservers(this);
+ if (arg instanceof ArgList) {
+ int added = this.getArgs().merge((ArgList) arg);
+ if (added > 0) {
+ this.setChanged();
+ this.notifyObservers(arg);
+ }
+ } else {
+ boolean newContrib = combine();
+ }
+
+ //this.notifyObservers(this);
+
}
protected IDegreeCombiner getOperator() {
@@ -209,6 +233,8 @@
for (Evaluation eval : getOperands()) {
for (int j = 0; j <= depth; j++)
sb.append("\t");
+ if (eval == null)
+ System.out.println("NULL??");
sb.append(eval.toString()+"\n");
if (eval instanceof CompositeEvaluation)
sb.append(((CompositeEvaluation) eval).toStringTree(depth+1));
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -5,10 +5,13 @@
import java.util.Map;
import java.util.Set;
+import org.drools.common.BetaConstraints;
import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
import org.drools.degrees.operators.IDegreeCombiner;
import org.drools.degrees.operators.IMergeStrategy;
import org.drools.degrees.operators.INullHandlingStrategy;
+import org.drools.spi.PropagationContext;
public class CompositeEvaluationTemplate extends EvaluationTemplate {
@@ -45,29 +48,33 @@
public Evaluation spawn(Evaluation[] evalDegree) {
- return new CompositeEvaluation(id,key,deps,evalDegree,operator,mergeStrat,nullStrat);
+ return new CompositeEvaluation(id,key,deps,evalDegree,operator,mergeStrat,nullStrat,new ArgList());
}
- public Evaluation spawn() {
- return new CompositeEvaluation(id,key,deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat);
+ public Evaluation spawn(ArgList args) {
+ return new CompositeEvaluation(id,key,deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat,args);
}
public Evaluation spawn(int N) {
- return new CompositeEvaluation(id,key,deps,N,operator,mergeStrat,nullStrat);
+ return new CompositeEvaluation(id,key,deps,N,operator,mergeStrat,nullStrat,new ArgList());
}
- public Evaluation spawn(IOperandSet args) {
- return new SetCompositeEvaluation(id,key,deps,operator,args,mergeStrat,nullStrat);
+ public Evaluation spawn(OperandSet args, BetaConstraints joinConstraints) {
+ return new SetCompositeEvaluation(id,key,deps,operator,args,mergeStrat,nullStrat,joinConstraints);
}
protected IDegreeCombiner getOperator() {
return operator;
}
+
+
+
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -47,7 +47,7 @@
EvalRecord record, boolean leftTupleMemoryEnabled) {
for( LeftTupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
- ImperfectLeftTuple newLeftTuple = new ImperfectLeftTuple( leftTuple, rightTuple, sink, leftTupleMemoryEnabled,record);
+ ImperfectLeftTuple newLeftTuple = new ImperfectLeftTuple( leftTuple, rightTuple, sink, leftTupleMemoryEnabled,record.clone());
doPropagateAssertLeftTuple( context, workingMemory, factory, sink, newLeftTuple );
}
@@ -95,7 +95,7 @@
for( LeftTupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
- EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+ EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
masterRecord.addEvaluation(record);
doPropagateAssertLeftTuple( context, workingMemory, factory, sink,
new ImperfectLeftTuple( factHandle, sink, leftTupleMemoryEnabled, masterRecord ) );
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -400,7 +400,8 @@
if ( this.otherSinks != null ) {
// propagate others
for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
- doPropagateAssertObject( factHandle, context, workingMemory, factory, record.clone(), sink );
+ EvalRecord newRec = record.clone();
+ doPropagateAssertObject( factHandle, context, workingMemory, factory, newRec, sink );
}
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -331,7 +331,7 @@
for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
System.out.println(this.getClass() + " dispatching obj to node "+i);
- EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+ EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
cachedNodes[i].assertObject(handle,
context,
workingMemory,
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -219,7 +219,7 @@
ConstraintKey key = new ConstraintKey("eval",this.condition.getEvalExpression().toString());
EvaluationTemplate templ = new SingleEvaluationTemplate(this.getId(),key,Collections.EMPTY_SET,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
- Evaluation eval = templ.spawn(ans);
+ Evaluation eval = templ.spawn(ans,leftTuple.getArgList());
record.addEvaluation(eval);
//TODO: Imperfect strategy here!
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -25,9 +25,15 @@
public class EvalRecord extends CompositeEvaluation implements Observer {
+ public static final HashSet<ConstraintKey> blackList = new HashSet<ConstraintKey>();
+ {
+ blackList.add(new ConstraintKey("class","==","org.drools.InitialFact"));
+ }
+
public static final int INITIAL_ID = -99;
- private Map<ConstraintKey, Evaluation> evalMap;
+ //private Map<ConstraintKey, Evaluation> evalMap;
+ private Map<Evaluation,Evaluation> evalSet;
//private ConstraintKey mainKey;
// private IDegree overallDegree;
@@ -51,15 +57,16 @@
// }
- public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat) {
- super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat);
+ public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat, ArgList args) {
+ super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat, args);
//mainKey = null;
- evalMap = new HashMap<ConstraintKey, Evaluation>();
+ //evalMap = new HashMap<ConstraintKey, Evaluation>();
+ evalSet = new HashMap<Evaluation,Evaluation>();
}
public Collection<Evaluation> getEvaluations() {
- return evalMap.values();
+ return evalSet.values();
}
@@ -76,10 +83,12 @@
}
}
- Evaluation prevEval = evalMap.get(eval.getKey());
+ //Evaluation prevEval = evalMap.get(eval.getKey());
+ Evaluation prevEval = evalSet.get(eval);
if (prevEval == null) {
System.out.println(this.getClass()+" insert "+eval.toString());
- evalMap.put(eval.getKey(),eval);
+ //evalMap.put(eval.getKey(),eval);
+ evalSet.put(eval,eval);
prevEval = eval;
//eval.addObserver(this);
} else {
@@ -98,15 +107,20 @@
public void addEvaluation(Evaluation eval) {
- boolean newEval = ! this.evalMap.containsKey(eval.getKey());
+ if (eval == null || blackList.contains(eval.getKey()))
+ return;
+ //boolean newEval = ! this.evalMap.containsKey(eval.getKey());
+ boolean newEval = ! this.evalSet.containsKey(eval);
+
Evaluation addedEval = insert(eval);
if (newEval) {
if (operands == null) {
- operands = new Vector<Evaluation>(1);
+ //operands = new Vector<Evaluation>(1);
- operands.add(addedEval);
+ //operands.add(addedEval);
+ setOperand(0, addedEval );
} else {
/*
int N = operands.size();
@@ -119,8 +133,12 @@
operands.set(N,addedEval);
*/
- operands.add(addedEval);
+ //operands.add(addedEval);
+ setOperand(operands.size(),addedEval);
}
+ //this.setArgCode(this.getArgCode()^eval.getArgCode());
+ } else {
+
}
addedEval.deleteObserver(this);
@@ -128,9 +146,10 @@
((DynamicConstraintKey) this.getKey()).addArg(eval.getKey());
+
combine();
- this.setChanged();
- this.notifyObservers(null);
+// this.setChanged();
+// this.notifyObservers(null);
// if (mainKey != null && mainKey.equals(addedEval.getKey()) /*&& ! prevEval.getDegree().equals(overallDegree)*/) {
// mainKey = addedEval.getKey();
@@ -147,8 +166,12 @@
public void addEvaluations(EvalRecord other) {
//for (Evaluation eval : other.getEvaluations())
- for (Evaluation eval : other.getOperands())
+ for (Evaluation eval : other.getOperands()) {
this.addEvaluation(eval);
+
+
+ eval.deleteObserver(other);
+ }
}
public void addEvaluations(Collection<Evaluation> evals) {
@@ -161,7 +184,7 @@
public EvalRecord clone() {
- EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat());
+ EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat(), (ArgList) this.getArgs().clone());
ans.addEvaluations(this);
return ans;
@@ -193,13 +216,15 @@
public String expand() {
- StringBuilder sb = new StringBuilder("Eval Record :"+this.getInfoRate()+"\n");
+ StringBuilder sb = new StringBuilder("Eval Record info("+this.getInfoRate()+") for args " + getArgs().toString() + " \n");
//
sb.append("AND{\n");
if (getOperands() != null)
- for (Evaluation ev : getOperands())
+ for (Evaluation ev : getOperands()) {
+
sb.append(ev.toString()+"\n");
+ }
sb.append("}\n\n");
sb.append(toString()+"\n");
@@ -341,12 +366,13 @@
operator.combine();
- evalMap.put(operator.getKey(),operator);
+ //evalMap.put(operator.getKey(),operator);
+ evalSet.put(operator,operator);
operator.addObserver(this);
this.combine();
- this.setChanged();
- this.notifyObservers(null);
+// this.setChanged();
+// this.notifyObservers(null);
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -34,10 +34,12 @@
private IMergeStrategy mergeStrat;
private INullHandlingStrategy nullStrat;
+
+ private ArgList args;
- public Evaluation(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+ public Evaluation(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
if (deps == null)
deps = Collections.emptySet();
this.nodeId = id;
@@ -54,16 +56,18 @@
this.key = key;
this.nullStrat = nullStrat;
this.mergeStrat = mergeStrat;
+
+ this.args = args;
}
- public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
- this(id,key,deps,mergeStrat,nullStrat);
+ public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+ this(id,key,deps,mergeStrat,nullStrat,args);
this.addDegree(Evaluation.EVAL,evalDeg,1,true);
}
- public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, String source, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
- this(id,key,deps,mergeStrat,nullStrat);
+ public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, String source, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+ this(id,key,deps,mergeStrat,nullStrat,args);
this.addDegree(source,evalDeg,1,true);
}
@@ -120,9 +124,12 @@
}
}
if (newContrib) {
+// IDegree oldVal = aggDegree;
aggDegree = mergeDegrees();
- this.setChanged();
- this.notifyObservers();
+// if (! oldVal.equals(aggDegree)) {
+// this.setChanged();
+// this.notifyObservers(this);
+// }
}
@@ -132,6 +139,7 @@
public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean immediateUpdate) {
boolean newContrib = false;
boolean rateIncr = false;
+ Float prevConf;
if (evalDeg == null) {
/*
@@ -141,7 +149,8 @@
} else {
- Float prevConf = confidence.get(source);
+ prevConf = confidence.get(source);
+ System.out.println(prevConf);
confidence.put(source, wgt);
rateIncr = prevConf == null ? true : prevConf.floatValue() < wgt;
@@ -180,14 +189,14 @@
if (immediateUpdate && (newContrib || rateIncr)) {
this.setChanged();
- this.notifyObservers();
+ this.notifyObservers(this);
}
return (newContrib || rateIncr);
}
- protected void incInfo(String source, float delta) {
+ protected void setInfoRate(String source, float delta) {
confidence.put(source,new Float(delta));
}
@@ -211,7 +220,7 @@
boolean cleared = false;
if (getDegreeBit(source) != null) {
cleared = true;
- incInfo(source,-1);
+ setInfoRate(source,0);
}
this.degrees.put(source,null);
return cleared;
@@ -234,7 +243,7 @@
public String toString() {
- return "("+this.nodeId + ")" + this.key+ " : " + this.aggDegree +" "+ this.getBitS();
+ return "("+this.args.hashCode()+"@"+this.nodeId + ") : " + this.aggDegree + " " + this.key +" "+ this.getBitS();
}
public String expand() {
@@ -320,5 +329,25 @@
return nullStrat;
}
-
+
+
+ public int hashCode() {
+ return this.key.hashCode() ^ args.hashCode();
+ }
+
+ public boolean equals(Object other) {
+ if (other == null)
+ return false;
+ if (other instanceof Evaluation) {
+ Evaluation otherEv = (Evaluation) other;
+ return this.key.equals(otherEv.key) && this.args.equals(otherEv.args);
+ }
+ return false;
+ }
+
+ public ArgList getArgs() {
+ return args;
+ }
+
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -30,16 +30,16 @@
- public Evaluation spawn(IDegree evalDegree) {
- return new Evaluation(id,key,deps,evalDegree,mergeStrat,nullStrat);
+ public Evaluation spawn(IDegree evalDegree, ArgList args) {
+ return new Evaluation(id,key,deps,evalDegree,mergeStrat,nullStrat,args);
}
- public Evaluation spawn(String source, IDegree evalDegree) {
- return new Evaluation(id,key,deps,evalDegree,source,mergeStrat,nullStrat);
+ public Evaluation spawn(String source, IDegree evalDegree, ArgList args) {
+ return new Evaluation(id,key,deps,evalDegree,source,mergeStrat,nullStrat,args);
}
- public Evaluation spawn() {
- return new Evaluation(id,key,deps,null,mergeStrat,nullStrat);
+ public Evaluation spawn(ArgList args) {
+ return new Evaluation(id,key,deps,null,mergeStrat,nullStrat,args);
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,7 +1,9 @@
package org.drools.reteoo;
+import java.util.Map;
import java.util.Observable;
import java.util.Observer;
+import java.util.Set;
import org.drools.RuleBaseConfiguration;
import org.drools.RuntimeDroolsException;
@@ -10,6 +12,9 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.common.TupleStartEqualsConstraint;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.IMergeStrategy;
+import org.drools.degrees.operators.INullHandlingStrategy;
import org.drools.reteoo.builder.BuildContext;
import org.drools.reteoo.filters.IFilterStrategy;
import org.drools.rule.Behavior;
@@ -36,6 +41,8 @@
IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
this.filterStrat = factory.getDefaultStrategy();
+ this.constraints.buildEvaluationTemplates(this.id,context.getRule().getDependencies(), factory);
+
// ConstraintKey argKey = null;
// if (this.rightInput instanceof RightInputAdapterNode)
// argKey = ((RightInputAdapterNode) this.rightInput).getConstraintKeys()[0];
@@ -45,22 +52,37 @@
// throw new RuntimeDroolsException("Source of type"+rightInput.getClass()+ " temporarily not supported");
//ConstraintKey key = new ConstraintKey(factory.getExistsOperator().getName(),argKey.toString());
- ConstraintKey key = new DynamicConstraintKey(factory.getExistsOperator().getName());
- template = new CompositeEvaluationTemplate(this.getId(),
- key,
- context.getRule().getDependencies().get(key),
- 1,
- factory.getExistsOperator(),
- factory.getMergeStrategy(),
- factory.getNullHandlingStrategy());
+
}
+ public EvaluationTemplate buildEvaluationTemplate(IDegreeCombiner operator, Map<ConstraintKey,Set<String>> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+
+
+
+ ConstraintKey key = new DynamicConstraintKey(operator.getName());
+ template = new CompositeEvaluationTemplate(this.getId(),
+ key,
+ deps.get(key),
+ 1,
+ operator,
+ mergeStrat,
+ nullStrat);
+
+ return template;
+
+ }
+
+
+
+
public Object createMemory(final RuleBaseConfiguration config) {
- BetaMemory memory = new BetaMemory( new LeftTupleList(),
- new ObservableRightTupleMemoryWrapper(new RightTupleList()),
- new ContextEntry[0] );
+ BetaMemory memory = (BetaMemory) super.createMemory(config);
+
+ memory.setRightTupleMemory(
+ new ObservableRightTupleMemoryWrapper(memory.getRightTupleMemory()));
+
return memory;
}
@@ -84,7 +106,16 @@
return;
}
- memory.getRightTupleMemory().add( rightTuple );
+
+ this.constraints.updateFromFactHandle( memory.getContext(),
+ workingMemory,
+ factHandle );
+
+ memory.getRightTupleMemory().add( rightTuple );
+
+ this.constraints.resetFactHandle( memory.getContext() );
+
+
//will call notify on observers!
if ( !this.tupleMemoryEnabled ) {
@@ -134,26 +165,38 @@
IDegreeFactory factory) {
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
- RightTupleMemory rtMem = memory.getRightTupleMemory();
- ObservableRightTupleMemoryWrapper opSet = (ObservableRightTupleMemoryWrapper) rtMem;
+
+
+ RightTupleMemory rtMem = memory.getRightTupleMemory();
+ ObservableRightTupleMemoryWrapper wMemory = (ObservableRightTupleMemoryWrapper) rtMem;
+ OperandSet opSet = new OperandSet(leftTuple,wMemory,this.constraints,memory.getContext(),workingMemory,factory);
+
+
EvalRecord mainRecord = leftTuple.getRecord();
- SetCompositeEvaluation eval = (SetCompositeEvaluation) template.spawn(opSet);
- opSet.addObserver( eval);
+
+ this.constraints.updateFromTuple( memory.getContext(),
+ workingMemory,
+ leftTuple );
+
+ SetCompositeEvaluation eval = (SetCompositeEvaluation) template.spawn(opSet,this.constraints);
+
+ this.constraints.resetTuple( memory.getContext() );
+
+
+
+ opSet.addObserver( eval);
mainRecord.addEvaluation(eval);
-
-
-
-
+
System.out.println("Situation at EXISTS eval"+mainRecord.expand());
switch (this.filterStrat.doTry(mainRecord)) {
case IFilterStrategy.DROP :
- System.out.println("Exist FAIL at assertTuple: DROP record");
- return;
+// System.out.println("Exist FAIL at assertTuple: DROP record");
+// return;
case IFilterStrategy.HOLD : //TODO: HOLD
System.out.println("HOLD RULES @EXIST NODE"+this.getId());
@@ -197,15 +240,23 @@
System.out.println(this.getClass().toString() + " NOTIFIED OF CHANGE");
- EvalRecord mainRecord = (EvalRecord) o;
+ EvalRecord mainRecord = null;
+
+ if (arg instanceof EvalRecord)
+ mainRecord = (EvalRecord) arg;
+
+ if (mainRecord == null)
+ return;
+
+
System.out.println("Situation changed at EXISTS eval"+mainRecord.expand());
switch (this.filterStrat.doTry(mainRecord)) {
case IFilterStrategy.DROP :
- System.out.println("Exist FAIL at assertTuple: DROP record");
- return;
-
+// System.out.println("Exist FAIL at assertTuple: DROP record");
+// return;
+//
case IFilterStrategy.HOLD : //TODO: HOLD
System.out.println("HOLD RULES @EXIST NODE"+this.getId());
System.out.println("Situation is "+mainRecord.expand());
@@ -225,5 +276,17 @@
}
}
+
+
+
+
+
+
+
+
+ public String toString() {
+
+ return "[Imp_ExistsNode - " +this.constraints.toString() + "]";
+ }
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectLeftTuple.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -55,4 +55,9 @@
}
+ public ArgList getArgList() {
+ return new ArgList(this.toObjectArray());
+ }
+
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -142,7 +142,8 @@
EvalRecord record = new EvalRecord(EvalRecord.INITIAL_ID,
getDegreeFactory().getAndOperator(),
getDegreeFactory().getMergeStrategy(),
- getDegreeFactory().getNullHandlingStrategy());
+ getDegreeFactory().getNullHandlingStrategy(),
+ new ArgList(object));
getRete().assertObject( (ImperfectFactHandle) handle,
context,
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/InitialFactHandleDummyObject.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -19,4 +19,12 @@
public void writeExternal(ObjectOutput out) throws IOException {
}
+
+ public int hashCode() {
+ return -1;
+ }
+
+ public boolean equals(Object other) {
+ return other instanceof InitialFactHandleDummyObject;
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -176,7 +176,7 @@
for ( ImperfectRightTuple rightTuple = (ImperfectRightTuple) memory.getRightTupleMemory().getFirst( leftTuple ); rightTuple != null; rightTuple = (ImperfectRightTuple) rightTuple.getNext() ) {
final ImperfectFactHandle factHandle = (ImperfectFactHandle) rightTuple.getFactHandle();
- EvalRecord record = rightTuple.getRecord();
+ EvalRecord record = rightTuple.getRecord().clone();
EvalRecord mainRecord = leftTuple.getRecord().clone();
@@ -193,8 +193,8 @@
//Call internal evaluator, if not done before
ConstraintKey[] keys = this.constraints.getConstraintKeys();
if (keys != null) {
- Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
- if (evalTest == null) {
+// Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
+// if (evalTest == null) {
Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
leftTuple,
factory );
@@ -207,25 +207,25 @@
}
record.addEvaluation(eval);
}
- }
-
- } else {
-
- if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
-
- //B-constraints are 0 to N
- //As above, in case EVAL hasn't been called yet, but no need to add to the handle
- Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
- leftTuple,
- factory );
-
- if (evals != null) {
- for (Evaluation eval : evals) {
- record.addEvaluation(eval);
- }
- }
-
- }
+// }
+//
+// } else {
+//
+//// if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
+//
+// //B-constraints are 0 to N
+// //As above, in case EVAL hasn't been called yet, but no need to add to the handle
+// Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+// leftTuple,
+// factory );
+//
+// if (evals != null) {
+// for (Evaluation eval : evals) {
+// record.addEvaluation(eval);
+// }
+// }
+//
+//// }
}
} else {
//EMPTY BETA CONSTRAINT!
@@ -233,6 +233,8 @@
//KEY MOVE, AND-ING THE PATTERN EVALS
mainRecord.addEvaluation(record);
+
+ ImperfectRightTuple propRightTuple = new ImperfectRightTuple(factHandle,this,record);
System.out.println("Situation at join eval"+mainRecord.expand());
@@ -248,7 +250,7 @@
System.out.println("Situation is "+mainRecord.expand());
mainRecord.setLeftTuple(leftTuple);
- mainRecord.setRightTuple(rightTuple);
+ mainRecord.setRightTuple(propRightTuple);
mainRecord.setFactory(factory);
mainRecord.setPropagationContext(context);
mainRecord.setWorkingMemory(workingMemory);
@@ -259,7 +261,7 @@
case IFilterStrategy.PASS :
System.out.println("Beta PASS at assertTuple: propagate record");
this.sink.propagateAssertLeftTuple( leftTuple,
- rightTuple,
+ propRightTuple,
context,
workingMemory,
factory,
@@ -343,12 +345,13 @@
public void assertObject(ImperfectFactHandle factHandle,
PropagationContext context,
InternalWorkingMemory workingMemory, IDegreeFactory factory,
- EvalRecord record) {
+ EvalRecord initialRecord) {
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
ImperfectRightTuple rightTuple = new ImperfectRightTuple( factHandle,
- this, record );
+ this, initialRecord );
if ( !behavior.assertRightTuple( memory.getBehaviorContext(),
rightTuple,
@@ -373,8 +376,10 @@
EvalRecord mainRecord = leftTuple.getRecord().clone();
+ EvalRecord record = initialRecord.clone();
+
Collection<Evaluation> storedEvals = this.getGammaMemory().retrieve(new ArgList(leftTuple.toObjectArray(),factHandle.getObject()));
if (storedEvals != null) {
record.addEvaluations(storedEvals);
@@ -386,10 +391,11 @@
//Call internal evaluator, if not done before
ConstraintKey[] keys = this.constraints.getConstraintKeys();
+ Evaluation[] evals = null;
if (keys != null) {
- Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
- if (evalTest == null) {
- Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+// Evaluation evalTest = factHandle.getPropertyDegree(keys[0]);
+// if (evalTest == null) {
+ evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
leftTuple,
factory );
//B-constraints are 0 to N
@@ -403,30 +409,34 @@
}
}
- } else {
-
- if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
-
- //B-constraints are 0 to N
- //As above, in case EVAL hasn't been called yet, but no need to add to the handle
- Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
- leftTuple,
- factory );
-
- if (evals != null) {
- for (Evaluation eval : evals) {
- record.addEvaluation(eval);
- }
- }
-
- }
- }
+//// } else {
+//
+// //if (evalTest.getDegreeBit(Evaluation.EVAL) == null) {
+//
+// //B-constraints are 0 to N
+// //As above, in case EVAL hasn't been called yet, but no need to add to the handle
+// Evaluation[] evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+// leftTuple,
+// factory );
+//
+// if (evals != null) {
+// for (Evaluation eval : evals) {
+// record.addEvaluation(eval);
+// }
+// }
+//
+// //}
+//
+//
+// }
} else {
//EMPTY BETA CONSTRAINT!
}
//KEY MOVE, AND-ING THE PATTERN EVALS
mainRecord.addEvaluation(record);
+
+ ImperfectRightTuple propRightTuple = new ImperfectRightTuple(factHandle,this,record);
System.out.println("Situation at join eval"+mainRecord.expand());
@@ -441,7 +451,7 @@
System.out.println("Situation is "+mainRecord.expand());
mainRecord.setLeftTuple(leftTuple);
- mainRecord.setRightTuple(rightTuple);
+ mainRecord.setRightTuple(propRightTuple);
mainRecord.setFactory(factory);
mainRecord.setPropagationContext(context);
mainRecord.setWorkingMemory(workingMemory);
@@ -452,7 +462,7 @@
case IFilterStrategy.PASS :
System.out.println("Beta PASS at assertObjecf: propagate record");
this.sink.propagateAssertLeftTuple( leftTuple,
- rightTuple,
+ propRightTuple,
context,
workingMemory,
factory,
@@ -478,7 +488,14 @@
public void update(Observable watcher, Object info) {
- EvalRecord record = (EvalRecord) watcher;
+
+ EvalRecord record = null;
+ if (info instanceof EvalRecord)
+ record = (EvalRecord) info;
+
+ if (record == null)
+ return;
+
System.out.println("**************************************************************UPDATE @JOIN NODE");
switch (this.filterStrat.doTry(record)) {
case IFilterStrategy.DROP :
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -406,6 +406,8 @@
public boolean equals(final Object object) {
// we know the object is never null and always of the type ReteTuple
+ if (object == null || !(object instanceof LeftTuple))
+ return false;
return equals( (LeftTuple) object );
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,19 +1,25 @@
package org.drools.reteoo;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Collection;
import java.util.Map;
+import java.util.Observable;
import org.drools.RuntimeDroolsException;
import org.drools.common.BetaConstraints;
import org.drools.common.EmptyBetaConstraints;
import org.drools.common.ImperfectFactHandle;
import org.drools.common.ImplicationBetaConstraint;
+import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
import org.drools.reteoo.builder.BuildContext;
import org.drools.reteoo.filters.IFilterStrategy;
import org.drools.rule.Behavior;
+import org.drools.rule.ContextEntry;
import org.drools.spi.PropagationContext;
public class ModusPonensNode extends JoinNode {
@@ -79,11 +85,12 @@
EvalRecord premiseRecord = leftTuple.getRecord();
- Evaluation implEval = this.constraints.isSatisfiedCachedRight( memory.getContext(),
+ ContextEntry adHocCtx = new MPContextEntry(leftTuple);
+ Evaluation implEval = this.constraints.isSatisfiedCachedRight( new ContextEntry[] {adHocCtx},
leftTuple,
factory )[0];
- ArgList args = new ArgList(leftTuple.toObjectArray());
+ ArgList args = leftTuple.getArgList();
Collection<Evaluation> storedEvals = this.getGammaMemory().retrieve(args);
if (storedEvals != null) {
@@ -93,7 +100,7 @@
- EvalRecord mpRecord = new EvalRecord(this.id,factory.getModusPonensOp(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+ EvalRecord mpRecord = new EvalRecord(this.id,factory.getModusPonensOp(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
Evaluation core = premiseRecord.getOperands().iterator().next();
core.deleteObserver(premiseRecord);
mpRecord.addEvaluation(core);
@@ -109,15 +116,28 @@
System.out.println("HOLD RULES @MP NODE"+this.getId());
System.out.println("Situation is "+mpRecord.expand());
+ if (mpRecord.getLeftTuple() == null || ! mpRecord.getLeftTuple().equals(leftTuple))
+ mpRecord.addObserver(this);
+
mpRecord.setLeftTuple(leftTuple);
mpRecord.setFactory(factory);
mpRecord.setPropagationContext(context);
mpRecord.setWorkingMemory(workingMemory);
- mpRecord.addObserver(this);
+
break;
case IFilterStrategy.PASS :
+ //IN CASE, RULES ARE RECALLED ANYWAY!!!
+ if (mpRecord.getLeftTuple() == null || ! mpRecord.getLeftTuple().equals(leftTuple))
+ mpRecord.addObserver(this);
+
+ mpRecord.setLeftTuple(leftTuple);
+ mpRecord.setFactory(factory);
+ mpRecord.setPropagationContext(context);
+ mpRecord.setWorkingMemory(workingMemory);
+
+
this.sink.propagateAssertLeftTuple( leftTuple,
context,
workingMemory,
@@ -141,6 +161,63 @@
+ public void update(Observable watcher, Object info) {
+
+ EvalRecord record = null;
+ if (info instanceof EvalRecord)
+ record = (EvalRecord) info;
+
+ if (record == null)
+ return;
+
+ System.out.println("**************************************************************UPDATE @MP NODE");
+ switch (this.filterStrat.doTry(record)) {
+ case IFilterStrategy.DROP :
+ record.deleteObserver(this);
+ return;
+
+ case IFilterStrategy.HOLD :
+ //do nothing
+ return;
+
+ case IFilterStrategy.PASS :
+ //go on
+ //record.deleteObserver(this);
+ //throw new RuntimeException("Awakened objeect");
+ //TODO
+ if (record.getRightTuple() != null)
+ this.sink.propagateAssertLeftTuple( record.getLeftTuple(),
+ record.getRightTuple(),
+ record.getPropagationContext(),
+ record.getWorkingMemory(),
+ record.getFactory(),
+ record,
+ this.tupleMemoryEnabled );
+ else
+ this.sink.propagateAssertLeftTuple( record.getLeftTuple(),
+ record.getPropagationContext(),
+ record.getWorkingMemory(),
+ record.getFactory(),
+ record,
+ this.tupleMemoryEnabled );
+ //break;
+ default : return;
+
+ }
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
public void networkUpdated() {
//this.rightInput.networkUpdated();
this.leftInput.networkUpdated();
@@ -148,7 +225,63 @@
+ public static class MPContextEntry implements ContextEntry {
+
+
+ private ImperfectLeftTuple leftTuple;
+
+ public MPContextEntry(ImperfectLeftTuple lt) {
+ this.leftTuple = lt;
+ }
+
+ public ImperfectLeftTuple getLeftTuple() {
+ return leftTuple;
+ }
+
+ public ContextEntry getNext() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void resetFactHandle() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void resetTuple() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setNext(ContextEntry entry) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateFromFactHandle(InternalWorkingMemory workingMemory,
+ InternalFactHandle handle) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateFromTuple(InternalWorkingMemory workingMemory,
+ LeftTuple tuple) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void readExternal(ObjectInput arg0) throws IOException,
+ ClassNotFoundException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void writeExternal(ObjectOutput arg0) throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ }
-
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -514,7 +514,8 @@
public ConstraintKey getConstraintKey() {
- return new ConstraintKey("class","==",((ClassObjectType) this.objectType).getClassName() );
+ String cName = ((ClassObjectType) this.objectType).getClassName();
+ return new ConstraintKey("class","==",cName);
}
@@ -534,11 +535,17 @@
Evaluation eval = factHandle.getPropertyDegree(key);
if (eval == null) {
- eval = this.template.spawn(factory.True());
+ eval = this.template.spawn(factory.True(),new ArgList(factHandle.getObject()));
factHandle.addPropertyDegree(eval);
}
record.addEvaluation(eval);
+
+ if (factHandle instanceof InitialFactHandle)
+ record = null;
+
+
+
if ( this.objectMemoryEnabled ) {
final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
memory.add( factHandle,
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,9 +1,12 @@
package org.drools.reteoo;
import java.util.Collection;
+import java.util.LinkedList;
import java.util.Observable;
import java.util.Vector;
+import org.drools.FactHandle;
+import org.drools.degrees.factory.IDegreeFactory;
import org.drools.util.Iterator;
public class ObservableRightTupleMemoryWrapper extends Observable
@@ -13,18 +16,22 @@
private RightTupleMemory memory;
public ObservableRightTupleMemoryWrapper(RightTupleMemory wrapped) {
- this.memory = wrapped;
+ this.memory = wrapped;
}
- public EvalIterator getIterator() {
+ public EvalIterator getEvalIterator() {
return new EvalIterator(memory.iterator());
}
+ public HandleIterator getHandleIterator() {
+ return new HandleIterator(memory.iterator());
+ }
+
- public Collection<Evaluation> getArgs() {
- Vector<Evaluation> ans = new Vector<Evaluation>(memory.size());
- EvalIterator iter = this.getIterator();
+ public LinkedList<Evaluation> getEvaluations() {
+ LinkedList<Evaluation> ans = new LinkedList<Evaluation>();
+ EvalIterator iter = this.getEvalIterator();
while (iter.hasNext()) {
ans.add(iter.next());
}
@@ -32,7 +39,17 @@
return ans;
}
+ public LinkedList<FactHandle> getHandles() {
+ LinkedList<FactHandle> ans = new LinkedList<FactHandle>();
+ HandleIterator iter = this.getHandleIterator();
+ while (iter.hasNext()) {
+ ans.add(iter.next());
+ }
+
+ return ans;
+ }
+
public void add(RightTuple rightTuple) {
memory.add(rightTuple);
this.setChanged();
@@ -71,6 +88,32 @@
}
+
+ class HandleIterator implements java.util.Iterator<FactHandle> {
+
+ private Iterator iterator;
+
+ public HandleIterator(Iterator iter) {
+ this.iterator = iter;
+ }
+
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ public FactHandle next() {
+ return ((ImperfectRightTuple) iterator.next()).getFactHandle();
+ }
+
+ public void remove() {
+
+ }
+
+ }
+
+
+
+
class EvalIterator implements java.util.Iterator<Evaluation> {
private Iterator iterator;
@@ -93,4 +136,5 @@
}
+
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -49,7 +49,7 @@
getArity(),
operator,
mergeStrat,
- nullStrat
+ nullStrat
);
return template;
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RightTupleMemory.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -2,7 +2,7 @@
import org.drools.util.Iterator;
-public interface RightTupleMemory extends IOperandSet {
+public interface RightTupleMemory {
public RightTuple getFirst(LeftTuple leftTuple);
public RightTuple getLast(LeftTuple leftTuple);
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -4,56 +4,116 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.Observable;
import java.util.Observer;
import java.util.Set;
import java.util.Vector;
+import org.drools.FactHandle;
+import org.drools.RuntimeDroolsException;
+import org.drools.common.BetaConstraints;
+import org.drools.common.EmptyBetaConstraints;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.TupleStartEqualsConstraint;
import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
import org.drools.degrees.operators.IDegreeCombiner;
import org.drools.degrees.operators.IMergeStrategy;
import org.drools.degrees.operators.INullHandlingStrategy;
+import org.drools.spi.PropagationContext;
public class SetCompositeEvaluation extends CompositeEvaluation {
//IOperandSet args;
public SetCompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
- IDegreeCombiner operator, IOperandSet args,
- IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
- super(id,key,deps,mergeStrat,nullStrat);
+ IDegreeCombiner operator, OperandSet opSet,
+ IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat,
+ BetaConstraints joinConstraints) {
+ super(id,key,deps,mergeStrat,nullStrat, new ArgList());
setOperator(operator);
- if (args != null) {
- this.operands = new Vector<Evaluation>(args.size());
+ if (opSet != null && opSet.size() > 0) {
+ this.operands = new Vector<Evaluation>(Math.max(1,opSet.size()),1);
- int j = 0;
- for (Evaluation eval : args.getArgs())
- setOperand(j++,eval);
+ LinkedList<Evaluation> evals = opSet.getEvaluations();
+ LinkedList<FactHandle> handles = opSet.getHandles();
+ for (int j = 0; j < opSet.size(); j++) {
+
+
+ EvalRecord record = ((EvalRecord) evals.get(j)).clone();
+
+
+ if (! (joinConstraints instanceof EmptyBetaConstraints)) {
+ Evaluation[] newEvals = joinConstraints.isSatisfiedCachedLeft(opSet.getContext(), (InternalFactHandle) handles.get(j), opSet.getFactory());
+ for (Evaluation newEv : newEvals) {
+ if (! newEv.getKey().toString().equals("starts(tuple,...)"))
+ record.addEvaluation(newEv);
+ }
+ }
+
+
+ setOperand(j,record);
+ }
+ combine();
+
} else {
+ /*
+ if (! (joinConstraints instanceof EmptyBetaConstraints)) {
+ Evaluation[] newEvals = joinConstraints.isSatisfiedCachedLeft(opSet.getContext(), (InternalFactHandle) handles.get(j), opSet.getFactory());
+ for (Evaluation newEv : newEvals) {
+ if (! newEv.getKey().toString().equals("starts(tuple,...)"))
+ record.addEvaluation(newEv);
+ }
+ }
+ */
this.operands = new Vector<Evaluation>(0);
+ combine();
}
- combine();
+
System.out.println("Created setCE \n "+this.toString());
}
+
+
+
public void update(Observable o, Object arg) {
System.out.println("UPDATE HAS BEEN CALLED ON SETVAL by "+ o.toString());
- if (arg instanceof ImperfectRightTuple) {
- ImperfectRightTuple impRT = (ImperfectRightTuple) arg;
- if (! this.operands.contains(impRT.getRecord()))
- this.operands.add(impRT.getRecord());
+ if (arg instanceof EvalRecord) {
+ Evaluation eval = (Evaluation) arg;
+
+ System.out.println(eval.expand());
+
+
+ if (! this.operands.contains(eval)) {
+ //this.operands.add(impRT.getRecord());
+
+ setOperand(this.operands.size(), eval);
+ System.out.println(eval.expand());
+
+ //Just to notify the new arg...
+ setChanged();
+ this.notifyObservers(eval.getArgs());
+ }
+
+ //
+
+
+ System.out.println(eval.expand());
combine();
// setChanged();
// this.notifyObservers();
+ } else if (arg instanceof ArgList) {
+ this.getArgs().merge((ArgList) arg);
} else {
-
+ throw new RuntimeDroolsException("Only Records & Args accepted by quantifiers, so far. received "+arg.getClass());
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -115,7 +115,7 @@
InternalWorkingMemory workingMemory, IDegreeFactory factory,
EvalRecord record, boolean leftTupleMemoryEnabled) {
- EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+ EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
masterRecord.addEvaluation(record);
// System.out.println("--------------------------------------");
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -100,9 +100,11 @@
/** the calculate temporal distance matrix */
private TemporalDependencyMatrix temporal;
+ private boolean negated;
+
private Map<ConstraintKey,Set<String>> dependencies;
@@ -135,6 +137,8 @@
this.nodes = new LinkedList<BaseNode>();
this.partitionId = null;
+
+ this.negated = false;
}
/**
@@ -447,8 +451,22 @@
+ public boolean isNegated() {
+ return negated;
+ }
+ /**
+ * Changes negation state
+ * @return the new state
+ */
+ public boolean toggleNegated() {
+ this.negated = ! this.negated;
+ return this.negated;
+ }
+
+
+
/**
* @param dependencies the dependencies to set
*/
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -7,12 +7,15 @@
import java.util.List;
import java.util.Map;
+import org.drools.InitialFact;
import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassObjectType;
import org.drools.common.BetaConstraints;
import org.drools.common.EmptyBetaConstraints;
import org.drools.common.TupleStartEqualsConstraint;
import org.drools.degrees.factory.IDegreeFactory;
import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
import org.drools.reteoo.AndOperatorInstaller;
import org.drools.reteoo.ExistsNode;
import org.drools.reteoo.ImperfectExistsNode;
@@ -27,7 +30,12 @@
import org.drools.reteoo.RightInputAdapterNode;
import org.drools.rule.Behavior;
import org.drools.rule.GroupElement;
+import org.drools.rule.Pattern;
import org.drools.rule.RuleConditionElement;
+import org.drools.spi.ObjectType;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.LinkedListNode;
public class ImperfectGroupElementBuilder extends GroupElementBuilder implements
ReteooComponentBuilder {
@@ -72,6 +80,19 @@
+ IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
+
+ IDegreeCombiner operator;
+ if (context.isNegated()) {
+ operator = factory.getNegationOperator();
+ ((NegationOperator) operator).setOperator(factory.getAndOperator());
+ context.toggleNegated();
+
+ } else {
+ operator = factory.getAndOperator();
+ }
+
+
final GroupElement ge = (GroupElement) rce;
// iterate over each child and build it
@@ -117,17 +138,26 @@
}
}
-
+ int arity = ge.getChildren().size();
+ Object firstChild = ge.getChildren().get(0);
+ if (firstChild instanceof Pattern) {
+ Pattern pat = (Pattern) firstChild;
+ if (pat.getObjectType().isAssignableFrom(new ClassObjectType(InitialFact.class)))
+ arity--;
+ }
+// if (firstChild.isPatternScopeDelimiter())
+// ;
+
OperatorInstaller instNode = new AndOperatorInstaller(
context.getTupleSource(),
- ge.getChildren().size(),
+ arity,
context.getNextId(),
context.getPartitionId(),
context.getRuleBase().getConfiguration().isMultithreadEvaluation());
- IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
- instNode.buildEvaluationTemplate(factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+ instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+
context.setTupleSource((LeftTupleSource) utils.attachNode(
context,
instNode
@@ -165,6 +195,18 @@
final BuildUtils utils,
final RuleConditionElement rce) {
+ IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
+
+ IDegreeCombiner operator;
+ if (context.isNegated()) {
+ operator = factory.getNegationOperator();
+ ((NegationOperator) operator).setOperator(factory.getOrOperator());
+ context.toggleNegated();
+
+ } else {
+ operator = factory.getOrOperator();
+ }
+
final GroupElement ge = (GroupElement) rce;
@@ -218,10 +260,9 @@
context.getPartitionId(),
context.getRuleBase().getConfiguration().isMultithreadEvaluation());
- IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
-
- instNode.buildEvaluationTemplate(factory.getOrOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+ instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+
context.setTupleSource((LeftTupleSource) utils.attachNode(
context,
instNode
@@ -252,80 +293,41 @@
implements
ReteooComponentBuilder {
- /**
- * @inheritDoc
- *
- * Not must verify what is the class of its child:
- *
- * If it is a pattern, a simple NotNode is added to the rulebase
- * If it is a group element, than a subnetwork must be created
- */
- public void build(final BuildContext context,
- final BuildUtils utils,
- final RuleConditionElement rce) {
- final GroupElement not = (GroupElement) rce;
+ public void build(final BuildContext context,
+ final BuildUtils utils,
+ final RuleConditionElement rce) {
+ final GroupElement not = (GroupElement) rce;
- // NOT must save some context info to restore it later
- final int currentPatternIndex = context.getCurrentPatternOffset();
- final LeftTupleSource tupleSource = context.getTupleSource();
+ // get child
+ final RuleConditionElement child = (RuleConditionElement) not.getChildren().get( 0 );
- // get child
- final RuleConditionElement child = (RuleConditionElement) not.getChildren().get( 0 );
+ // set negation. Multiple cascaded negation will be toggled in chain
+ context.toggleNegated();
+
+ // get builder for child
+ final ReteooComponentBuilder builder = utils.getBuilderFor( child );
- // get builder for child
- final ReteooComponentBuilder builder = utils.getBuilderFor( child );
+ // builds the child
+ builder.build( context,
+ utils,
+ child );
+
+
+
+ }
- // builds the child
- builder.build( context,
- utils,
- child );
+ /**
+ * @inheritDoc
+ */
+ public boolean requiresLeftActivation(final BuildUtils utils,
+ final RuleConditionElement rce) {
+ final GroupElement not = (GroupElement) rce;
- // if it is a subnetwork
- if ( context.getObjectSource() == null && context.getTupleSource() != null ) {
+ // get child
+ final RuleConditionElement child = (RuleConditionElement) not.getChildren().get(0);
+ return utils.getBuilderFor(child).requiresLeftActivation(utils, child);
- // attach right input adapter node to convert tuple source into an object source
- context.setObjectSource( (ObjectSource) utils.attachNode( context,
- new RightInputAdapterNode( context.getNextId(),
- context.getTupleSource(),
- context ) ) );
-
- // restore tuple source from before the start of the sub network
- context.setTupleSource( tupleSource );
-
- // create a tuple start equals constraint and set it in the context
- final TupleStartEqualsConstraint constraint = TupleStartEqualsConstraint.getInstance();
- final List predicates = new ArrayList();
- predicates.add( constraint );
- context.setBetaconstraints( predicates );
-
- }
-
- final BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
- context.getBetaconstraints(),
- false );
- Behavior[] behaviors = createBehaviorArray( context );
-
- // then attach the NOT node. It will work both as a simple not node
- // or as subnetwork join node as the context was set appropriatelly
- // in each case
- context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
- new NotNode( context.getNextId(),
- context.getTupleSource(),
- context.getObjectSource(),
- betaConstraints,
- behaviors,
- context ) ) );
- context.setBetaconstraints( null );
- context.setObjectSource( null );
-
- // restore pattern index
- context.setCurrentPatternOffset( currentPatternIndex );
- }
-
- public boolean requiresLeftActivation(final BuildUtils utils,
- final RuleConditionElement rce) {
- return true;
- }
+ }
}
private static class ImperfectExistsBuilder
@@ -343,6 +345,20 @@
public void build(final BuildContext context,
final BuildUtils utils,
final RuleConditionElement rce) {
+
+ IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
+
+ IDegreeCombiner operator;
+ if (context.isNegated()) {
+ operator = factory.getNegationOperator();
+ ((NegationOperator) operator).setOperator(factory.getExistsOperator());
+ context.toggleNegated();
+
+ } else {
+ operator = factory.getExistsOperator();
+ }
+
+
final GroupElement exists = (GroupElement) rce;
// EXISTS must save some context info to restore it later
@@ -380,22 +396,32 @@
}
- final BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
+ BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
context.getBetaconstraints(),
false );
+
+
Behavior[] behaviors = createBehaviorArray( context );
// then attach the EXISTS node. It will work both as a simple exists node
// or as subnetwork join node as the context was set appropriatelly
// in each case
+
+
+
+
+ ImperfectExistsNode exNode = new ImperfectExistsNode( context.getNextId(),
+ context.getTupleSource(),
+ context.getObjectSource(),
+ betaConstraints,
+ behaviors,
+ context );
+
+ exNode.buildEvaluationTemplate(operator,context.getRule().getDependencies(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+
context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
- new ImperfectExistsNode( context.getNextId(),
- context.getTupleSource(),
- context.getObjectSource(),
- betaConstraints,
- behaviors,
- context ) ) );
+ exNode) );
context.setBetaconstraints( null );
context.setObjectSource( null );
@@ -408,7 +434,8 @@
*/
public boolean requiresLeftActivation(final BuildUtils utils,
final RuleConditionElement rce) {
- return true;
+
+ return true;
}
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectReteooRuleBuilder.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -50,7 +50,7 @@
this.getUtils().addBuilder( Accumulate.class,
new AccumulateBuilder() );
this.getUtils().addBuilder( Forall.class,
- new ForallBuilder() );
+ new ImperfectForallBuilder() );
this.getUtils().addBuilder( EntryPoint.class,
new EntryPointBuilder() );
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -29,8 +29,10 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.AlphaNode;
import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.ImperfectRuleBase;
import org.drools.reteoo.ObjectSource;
import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.PatternNegator;
import org.drools.reteoo.PropagationQueuingNode;
import org.drools.rule.Behavior;
import org.drools.rule.CompositeMaxDuration;
@@ -299,6 +301,23 @@
context ) ) );
}
+ if (context.isNegated()
+
+ //&&
+ // Has to be imperfect
+ //context.getRuleBase() instanceof ImperfectRuleBase
+ ) {
+
+ context.toggleNegated();
+
+ context.setObjectSource( (ObjectSource) utils.attachNode(context,
+ new PatternNegator(context.getNextId(),
+ context.getObjectSource(),
+ context)));
+
+
+ }
+
// now restore back to original values
context.setObjectTypeNodeMemoryEnabled( objectMemory );
context.setAlphaNodeMemoryAllowed( alphaMemory );
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -30,6 +30,7 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.EvaluationTemplate;
@@ -133,7 +134,7 @@
workingMemory,
context,
factory);
- return template.spawn(deg);
+ return template.spawn(deg,new ArgList(handle.getObject()));
}
public String toString() {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -265,7 +265,8 @@
public ConstraintKey getConstraintKey() {
if (singletonKey == null) {
- singletonKey = new ConstraintKey(((ClassFieldReader) this.readAccessor).getClassName()+"."+((ClassFieldReader) this.readAccessor).getFieldName(),this.getEvaluator().toString(),this.getField().toString());
+ String cName = ((ClassFieldReader) this.readAccessor).getClassName();
+ singletonKey = new ConstraintKey(cName + "."+((ClassFieldReader) this.readAccessor).getFieldName(),this.getEvaluator().toString(),this.getField().toString());
}
return singletonKey;
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -13,10 +13,12 @@
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.CompositeEvaluationTemplate;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.EvaluationTemplate;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.SingleEvaluationTemplate;
import org.drools.spi.AcceptsReadAccessor;
@@ -120,7 +122,7 @@
workingMemory,
context,
factory);
- return getTemplate().spawn(deg);
+ return getTemplate().spawn(deg,new ArgList(handle.getObject()));
}
public ContextEntry createContextEntry() {
@@ -136,7 +138,7 @@
public Evaluation isSatisfiedCachedLeft(ContextEntry context,
InternalFactHandle handle, IDegreeFactory factory) {
return this.getTemplate().spawn(this.restrictions.isSatisfiedCachedLeft( context,
- handle, factory ));
+ handle, factory ),new ArgList(handle.getObject()));
}
public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -148,7 +150,8 @@
public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
ContextEntry context, IDegreeFactory factory) {
return this.getTemplate().spawn(this.restrictions.isSatisfiedCachedRight( tuple,
- context, factory ));
+ context, factory ),
+ ((ImperfectLeftTuple) tuple).getArgList());
}
public Object clone() {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -198,6 +198,11 @@
public List getConstraints() {
return Collections.unmodifiableList( this.constraints );
}
+
+ public void dropLastConstraint() {
+ if (this.constraints.size() > 0)
+ this.constraints.remove(this.constraints.size()-1);
+ }
public void addConstraint(final Constraint constraint) {
if ( this.constraints == Collections.EMPTY_LIST ) {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -32,8 +32,10 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.spi.CompiledInvoker;
import org.drools.spi.InternalReadAccessor;
@@ -291,7 +293,7 @@
final ContextEntry ctx, IDegreeFactory factory) {
IDegree deg = factory.fromBoolean(this.isAllowed(handle, workingMemory, ctx));
- return getTemplate().spawn(deg);
+ return getTemplate().spawn(deg, new ArgList(handle.getObject()));
}
@@ -327,7 +329,7 @@
public Evaluation isSatisfiedCachedLeft(ContextEntry context,
InternalFactHandle handle, IDegreeFactory factory) {
- return this.getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedLeft(context, handle)));
+ return this.getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedLeft(context, handle)), new ArgList(handle.getObject()));
}
@@ -349,7 +351,8 @@
public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
ContextEntry context, IDegreeFactory factory) {
- return getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedRight(tuple, context)));
+ return getTemplate().spawn(factory.fromBoolean(this.isAllowedCachedRight(tuple, context)),
+ ((ImperfectLeftTuple) tuple).getArgList());
}
public Object clone() {
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -28,8 +28,10 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
import org.drools.runtime.rule.Evaluator;
@@ -157,7 +159,7 @@
workingMemory,
context,
factory);
- return getTemplate().spawn(deg);
+ return getTemplate().spawn(deg,new ArgList(handle.getObject()));
} catch ( final Exception e ) {
throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
e );
@@ -189,7 +191,8 @@
ctx.getTuple(),
ctx.getWorkingMemory(),
ctx,
- factory));
+ factory),
+ new ArgList(handle.getObject()));
} catch ( final Exception e ) {
throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
e );
@@ -222,7 +225,8 @@
tuple,
ctx.getWorkingMemory(),
ctx,
- factory));
+ factory),
+ ((ImperfectLeftTuple) tuple).getArgList());
} catch ( final Exception e ) {
throw new RuntimeDroolsException( "Exception executing ReturnValue constraint " + this.restriction + " : " + e.getMessage(),
e );
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -27,9 +27,13 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.degrees.IDegree;
import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ArgList;
import org.drools.reteoo.ConstraintKey;
import org.drools.reteoo.Evaluation;
+import org.drools.reteoo.ImperfectLeftTuple;
import org.drools.reteoo.LeftTuple;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
import org.drools.spi.AcceptsReadAccessor;
import org.drools.spi.Evaluator;
import org.drools.spi.InternalReadAccessor;
@@ -131,21 +135,33 @@
workingMemory,
context,
factory);
- return getTemplate().spawn(deg);
+ return getTemplate().spawn(deg,new ArgList(handle.getObject()));
}
public Evaluation isSatisfiedCachedLeft(ContextEntry context,
InternalFactHandle handle, IDegreeFactory factory) {
+
+ //merge to ensure uniqueness
+ ArgList args = ((ImperfectLeftTuple) ((VariableContextEntry) context).getTuple()).getArgList();
+ args.merge(handle.getObject());
+
return this.getTemplate().spawn(this.restriction.isSatisfiedCachedLeft( context,
handle,
- factory));
+ factory),
+ args);
}
public Evaluation isSatisfiedCachedRight(LeftTuple tuple,
ContextEntry context, IDegreeFactory factory) {
+
+ //merge to ensure uniqueness
+ ArgList args = ((ImperfectLeftTuple) tuple).getArgList();
+ args.merge(((VariableContextEntry) context).getObject());
+
return this.getTemplate().spawn(this.restriction.isSatisfiedCachedRight( tuple,
- context,
- factory));
+ context,
+ factory),
+ args);
}
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -9,6 +9,7 @@
import java.util.Collection;
import java.util.LinkedList;
+import org.drools.FactHandle;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.ImperfectRightTuple;
import org.drools.reteoo.LeftTuple;
@@ -375,7 +376,7 @@
- public Collection<Evaluation> getArgs() {
+ public LinkedList<Evaluation> getEvaluations() {
LinkedList<Evaluation> ans = new LinkedList<Evaluation>();
Iterator iter = this.iterator();
while (iter.hasNext()) {
@@ -385,4 +386,17 @@
}
return ans;
}
+
+
+ public LinkedList<FactHandle> getHandles() {
+ LinkedList<FactHandle> ans = new LinkedList<FactHandle>();
+ Iterator iter = this.iterator();
+ while (iter.hasNext()) {
+ RightTuple rt = (RightTuple) iter.next();
+ if (rt instanceof ImperfectRightTuple)
+ ans.add(((ImperfectRightTuple) rt).getFactHandle());
+ }
+ return ans;
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/util/RightTupleList.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -6,6 +6,7 @@
import java.util.Collection;
import java.util.LinkedList;
+import org.drools.FactHandle;
import org.drools.common.InternalFactHandle;
import org.drools.reteoo.Evaluation;
import org.drools.reteoo.ImperfectRightTuple;
@@ -216,7 +217,7 @@
return builder.toString();
}
- public Collection<Evaluation> getArgs() {
+ public LinkedList<Evaluation> getEvaluations() {
LinkedList<Evaluation> ans = new LinkedList<Evaluation>();
Iterator iter = this.iterator();
while (iter.hasNext()) {
@@ -226,4 +227,17 @@
}
return ans;
}
+
+ public LinkedList<FactHandle> getHandles() {
+ LinkedList<FactHandle> ans = new LinkedList<FactHandle>();
+ Iterator iter = this.iterator();
+ while (iter.hasNext()) {
+ RightTuple rt = (RightTuple) iter.next();
+ if (rt instanceof ImperfectRightTuple)
+ ans.add(((ImperfectRightTuple) rt).getFactHandle());
+ }
+ return ans;
+ }
+
+
}
\ No newline at end of file
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/.classpath 2009-04-25 02:31:25 UTC (rev 26251)
@@ -3,8 +3,8 @@
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
- <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/rules"/>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+ <classpathentry kind="src" path="src/main/rules"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/FuzzyTest0.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -168,7 +168,7 @@
}
public int hashCode() {
- return this.message.hashCode()+this.status;
+ return 10+this.message.hashCode()+this.status;
}
}
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Room.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -41,6 +41,10 @@
return temperature.getEvaluator(opId);
}
+
+ public int hashCode() {
+ return 47;
+ }
}
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/Test.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -238,6 +238,8 @@
public boolean equals(Object other) {
if (other == null) return false;
+ if (! (other instanceof Person))
+ return false;
Person p = (Person) other;
if (p == null) return false;
return this.name.equals(p.name);
@@ -299,6 +301,7 @@
public boolean equals(Object other) {
if (other == null) return false;
+ if (! (other instanceof Book)) return false;
Book b = (Book) other;
if (b == null) return false;
return this.title.equals(b.title);
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/chance/TestQuantifiers.java 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1,8 +1,10 @@
package org.drools.examples.chance;
+import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
+import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -71,45 +73,59 @@
final StatefulKnowledgeSession ksession = kbase
.newStatefulKnowledgeSession();
+
+
//
FileWriter writer = new FileWriter("testQuant.log");
ksession.setGlobal("writer", writer);
+ PrintStream outFile = new PrintStream("testQuant.out");
+ System.setOut(outFile);
+
ksession.fireAllRules();
+ System.out.println("\n\n\n\n\n\n no msg in ********************************************************\n\n\n\n\n\n\n");
final Message message = new Message();
- message.setStatus(0);
+ message.setStatus(0);
+ message.setMessage("M0");
ksession.insert(message);
ksession.fireAllRules();
- System.out.println("\n\n\n\n\n\n **********************************************************\n\n\n\n\n\n\n");
+ System.out.println("\n\n\n\n\n\n rigth msg in **********************************************************\n\n\n\n\n\n\n");
Message message1 = new Message();
- message1.setStatus(1);
+ message1.setStatus(1);
+ message1.setMessage("M1");
ksession.insert(message1);
- System.out.println("\n\n\n\n\n\n **********************************************************\n\n\n\n\n\n\n");
-
+ System.out.println("\n\n\n\n\n\n msg 1 in**********************************************************\n\n\n\n\n\n\n");
+
+ ksession.fireAllRules();
+
+
+
Message message2 = new Message();
message2.setStatus(2);
+ message2.setMessage("M2");
ksession.insert(message2);
ksession.fireAllRules();
-
+ System.out.println("\n\n\n\n\n\n msg 2 in**********************************************************\n\n\n\n\n\n\n");
-
+//
writer.close();
+ outFile.close();
// logger.close();
ksession.dispose();
@@ -170,7 +186,7 @@
public int hashCode() {
//return this.message.hashCode()+this.status;
- return this.status;
+ return this.status*11+3;
}
}
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestDegrees.drl 2009-04-25 02:31:25 UTC (rev 26251)
@@ -9,11 +9,19 @@
rule "TestOpDegs"
when
- (Message(status random[] 0 && status random[] 1)
+
+ (Message( status == 0 && status == 1 )
or
- Message(status random[] 2))
- and
- Message(status random[] 3)
+ Message(status not random[] 2))
+
+
+ not (Message(status random[] 3)
+ and
+ Message(status random[] 4)
+ )
+
+ Message(status random[] 5)
+
then
Modified: labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/chance/TestQuant.drl 2009-04-25 02:31:25 UTC (rev 26251)
@@ -7,15 +7,231 @@
global FileWriter writer;
-rule "Test Exist"
+/*
+//Check that join works properly
+rule "Test Join"
when
- exists(
- m: Message(status == 0)
+
+ m: Message(status == 0)
+ n : Message(status == 1)
+ then
+ writer.write("\n\n Tested couple "+m.getMessage() + " " + n.getMessage() +"\n");
+ writer.write("Simple Join check "+drools.getConsequenceDegree()+"\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree()+"\n");
+end
+*/
+
+
+
+/*
+//check also GE joins with bindings
+rule "Test Join 2"
+ when
+
+ m : Message( status == 1)
+ and
+ p : Message( this == m, status == 1)
+
+ then
+ writer.write(m.getMessage() + " " + p.getMessage());
+ writer.write("Self-Join check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+ System.out.println(m.getMessage() + " " + p.getMessage());
+end
+*/
+
+
+/*
+//check also GE joins with bindings
+rule "Test Join 2bis"
+ when
+
+ m : Message()
+ p : Message( this == m, status > -1)
+ q : Message( this == m, status < 2)
+
+ then
+ writer.write(m.getMessage() + " " + p.getMessage() + q.getMessage() + "\n");
+ writer.write("Self-Join check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+ System.out.println(m.getMessage() + " " + p.getMessage());
+end
+*/
+
+
+
+/*
+//Test exist quantifier
+rule "Test Exist 3"
+ when
+ exists (
+ Message( status == 1)
+ )
+ then
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+end
+*/
+
+
+/*
+// Test quantifier with GEs
+rule "Test Exist 4"
+ when
+ exists (
+ Message( status == 0 )
+ and
+ Message( status == 1)
)
then
- writer.write("Existential check "+drools.getConsequenceDegree()+"\n");
- System.out.println("Existential check "+drools.getConsequenceDegree()+"\n");
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
end
+*/
+
+
+
+/*
+// Test external variable binding
+rule "Test Exist 5"
+ when
+ $m : Message($s : status == 0)
+ exists ( Message(status > $s) )
+ then
+ writer.write("\n\n Conditional join with existence\n");
+ writer.write("\t Rule triggered for " + $m.getMessage() + "\n");
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+
+end
+*/
+
+
+
+/*
+//Test simple forall using exist
+rule "Test Exist 6"
+ when
+ not (
+ exists (
+ not ( Message( status random[] 0 )
+
+ ) ) )
+ then
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+
+end
+*/
+
+
+
+
+
+/*
+rule "Test Exist 7"
+ when
+ forall (
+ Message( status < 1 )
+ )
+ then
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+
+end
+*/
+
+
+/*
+rule "Test Exist 7bis"
+ when
+ Message( status == 2 )
+ forall (
+ Message( status < 3 )
+ )
+ then
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+
+end
+*/
+
+
+
+
+rule "Test Exist 8"
+ when
+ Message( status == 1)
+ forall (
+ m : Message()
+ Message( this == m , status <= 1)
+ Message( this == m , status > -1)
+ )
+ then
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+
+end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+//Complex nesting and conversion
+rule "Test Exist 8"
+ when
+ not ( exists (
+ m : Message()
+ and
+ not (
+ exists (
+ Message( this == m , status <= 1)
+ and
+ Message( this == m , status > -2)
+ )
+ )
+ )
+ )
+ then
+
+ writer.write("Existential check "+drools.getConsequenceDegree()+"\n"+drools.getEvaluation().expand()+"\n\n");
+ System.out.println("Existential check "+drools.getConsequenceDegree());
+
+end
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Modified: labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt 2009-04-24 20:53:00 UTC (rev 26250)
+++ labs/jbossrules/branches/DroolsChance/drools-guvnor/src/main/java/org/drools/guvnor/public/version.txt 2009-04-25 02:31:25 UTC (rev 26251)
@@ -1 +1 @@
-5.0.0.SNAPSHOT 26142:26163M
\ No newline at end of file
+5.0.0.SNAPSHOT 26142:26190M
\ No newline at end of file
More information about the jboss-svn-commits
mailing list