[jboss-svn-commits] JBL Code SVN: r32475 - in labs/jbossrules/trunk: drools-api/META-INF and 16 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 7 18:30:29 EDT 2010


Author: mark.proctor at jboss.com
Date: 2010-04-07 18:30:27 -0400 (Wed, 07 Apr 2010)
New Revision: 32475

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/Arguments.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultQueryResultsCollector.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/QueryResultCollector.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/QueryElement.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/UnificationRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Variable.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryElementNodeTest.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/UnificationNode.java
Modified:
   labs/jbossrules/trunk/drools-api/.classpath
   labs/jbossrules/trunk/drools-api/META-INF/MANIFEST.MF
   labs/jbossrules/trunk/drools-compiler/.classpath
   labs/jbossrules/trunk/drools-compiler/META-INF/MANIFEST.MF
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-core/.classpath
   labs/jbossrules/trunk/drools-core/META-INF/MANIFEST.MF
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/debug/QueryTerminalNodeVisitor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NodeTypeEnums.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/NativeQueryResults.java
Log:
JBRULES-535 allow for plugeable query result handlers
JBRULES-46 Proloq Style Query Based Backward Chaining

Modified: labs/jbossrules/trunk/drools-api/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-api/.classpath	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-api/.classpath	2010-04-07 22:30:27 UTC (rev 32475)
@@ -8,28 +8,24 @@
   <classpathentry kind="var" path="M2_REPO/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/jms/jms/1.1/jms-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-digester/commons-digester/1.8/commons-digester-1.8.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-jexl/commons-jexl/1.1/commons-jexl-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.9/freemarker-2.3.9.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.11/freemarker-2.3.11.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-impl/2.1.7/jaxb-impl-2.1.7.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-xjc/2.1.7/jaxb-xjc-2.1.7.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/4.6/junit-4.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/net/sf/jxls/jxls-reader/0.9.6/jxls-reader-0.9.6.jar"/>
   <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/milyn/milyn-commons/1.1/milyn-commons-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/milyn/milyn-smooks-core/1.1/milyn-smooks-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/milyn/milyn-smooks-javabean/1.1/milyn-smooks-javabean-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/1.3.12-java1.5/mvel-1.3.12-java1.5.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/milyn/milyn-commons/1.2/milyn-commons-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/milyn/milyn-smooks-core/1.2/milyn-smooks-core-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/milyn/milyn-smooks-javabean/1.2/milyn-smooks-javabean-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mockito/mockito-all/1.8.2/mockito-all-1.8.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/felix/org.osgi.compendium/1.4.0/org.osgi.compendium-1.4.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/felix/org.osgi.core/1.4.0/org.osgi.core-1.4.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/poi/poi/3.0.2-FINAL/poi-3.0.2-FINAL.jar"/>
@@ -38,5 +34,5 @@
   <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-api/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/trunk/drools-api/META-INF/MANIFEST.MF	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-api/META-INF/MANIFEST.MF	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,64 +1,6 @@
 Manifest-Version: 1.0
-Export-Package: org.drools.event.io;uses:="org.drools";version="5.1.0.
- SNAPSHOT",org.drools.runtime;uses:="org.drools.command,org.drools.tim
- e,org.drools.runtime.process,org.drools.event,org.drools.runtime.rule
- ,org.drools,org.drools.runtime.conf";version="5.1.0.SNAPSHOT",org.dro
- ols.marshalling;uses:="org.drools.runtime,org.drools";version="5.1.0.
- SNAPSHOT",org.drools.event;uses:="org.drools.runtime,org.drools.event
- .process,org.drools.event.rule";version="5.1.0.SNAPSHOT",org.drools.c
- onf;uses:="org.drools.runtime.rule";version="5.1.0.SNAPSHOT",org.droo
- ls.event.knowledgebase;uses:="org.drools.definition.rule,org.drools.d
- efinition,org.drools";version="5.1.0.SNAPSHOT",org.drools;uses:="org.
- drools.io,org.drools.runtime,org.drools.definition.type,org.drools.ev
- ent.knowledgebase,org.drools.definition.process,org.drools.definition
- ,org.drools.definition.rule,org.drools.conf,org.drools.util";version=
- "5.1.0.SNAPSHOT",org.drools.definition.process;uses:="org.drools.defi
- nition";version="5.1.0.SNAPSHOT",org.drools.util;uses:="org.drools,or
- g.drools.io,org.drools.builder";version="5.1.0.SNAPSHOT",org.drools.b
- uilder;uses:="org.drools,org.drools.io,org.drools.definition,org.droo
- ls.builder.conf,org.drools.util";version="5.1.0.SNAPSHOT",org.drools.
- builder.conf;uses:="org.drools.runtime.rule,org.drools.conf";version=
- "5.1.0.SNAPSHOT",org.drools.logger;uses:="org.drools.event";version="
- 5.1.0.SNAPSHOT",org.drools.runtime.process;uses:="org.drools.runtime"
- ;version="5.1.0.SNAPSHOT",org.drools.runtime.conf;uses:="org.drools.c
- onf";version="5.1.0.SNAPSHOT",org.drools.runtime.help;uses:="com.thou
- ghtworks.xstream,org.quartz,org.drools.time";version="5.1.0.SNAPSHOT"
- ,org.drools.time;version="5.1.0.SNAPSHOT",org.drools.event.rule;uses:
- ="org.drools.event,org.drools.runtime.rule";version="5.1.0.SNAPSHOT",
- org.drools.definition.rule;uses:="org.drools.definition";version="5.1
- .0.SNAPSHOT",org.drools.osgi.api;uses:="org.osgi.framework,org.osgi.u
- til.tracker,org.drools,org.drools.util";version="5.1.0.SNAPSHOT",org.
- drools.runtime.rule;uses:="org.drools.definition.rule,org.drools.runt
- ime";version="5.1.0.SNAPSHOT",org.drools.event.process;uses:="org.dro
- ols.runtime.process,org.drools.event";version="5.1.0.SNAPSHOT",org.dr
- ools.definition;uses:="org.drools.definition.process,org.drools.defin
- ition.rule";version="5.1.0.SNAPSHOT",org.drools.vsm;uses:="org.drools
- .command,org.drools.runtime,org.drools,org.drools.agent,org.drools.bu
- ilder,org.drools.persistence.jpa";version="5.1.0.SNAPSHOT",org.drools
- .builder.help;uses:="com.sun.tools.xjc,org.drools.io,org.drools,org.d
- rools.builder,javax.xml.bind";version="5.1.0.SNAPSHOT",org.drools.def
- inition.type;version="5.1.0.SNAPSHOT",org.drools.io;uses:="org.drools
- ,org.drools.event.io,org.drools.util";version="5.1.0.SNAPSHOT",org.dr
- ools.runtime.pipeline;uses:="org.drools.runtime,javax.xml.bind,net.sf
- .jxls.reader,org.milyn,com.thoughtworks.xstream";version="5.1.0.SNAPS
- HOT",org.drools.agent;uses:="org.drools.runtime,org.drools.io,org.dro
- ols";version="5.1.0.SNAPSHOT",org.drools.command;uses:="org.drools.ru
- ntime,org.drools.runtime.rule";version="5.1.0.SNAPSHOT",org.drools.ta
- sk.service;version="5.1.0.SNAPSHOT",org.drools.persistence.jpa;uses:=
- "org.drools.runtime,org.drools";version="5.1.0.SNAPSHOT",org.drools.m
- anagement;uses:="javax.management";version="5.1.0.SNAPSHOT",org.drool
- s.command.impl;uses:="org.drools.command";version="5.1.0.SNAPSHOT"
-Private-Package: .;version="5.1.0.SNAPSHOT"
-Tool: Bnd-0.0.357
-Bundle-Name: Drools :: API
-Created-By: 1.6.0_18 (Sun Microsystems Inc.)
-Bundle-Vendor: JBoss Inc.
-DynamicImport-Package: *
-Bundle-Version: 5.1.0.SNAPSHOT
-Bnd-LastModified: 1266695704341
 Bundle-Activator: org.drools.osgi.api.Activator
-Bundle-ManifestVersion: 2
-Bundle-Description: A rule production system
+Created-By: 1.5.0_21 (Sun Microsystems Inc.)
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
 Import-Package: com.sun.tools.xjc;resolution:=optional,com.thoughtwork
  s.xstream;resolution:=optional,javax.management;resolution:=optional,
@@ -66,6 +8,64 @@
  tional,org.milyn;resolution:=optional,org.osgi.framework;resolution:=
  optional;version="1.5",org.osgi.util.tracker;resolution:=optional;ver
  sion="1.4",org.quartz;resolution:=optional
+Bnd-LastModified: 1267407372231
+Export-Package: org.drools.logger;uses:="org.drools.event";version="5.
+ 1.0.SNAPSHOT",org.drools.runtime;uses:="org.drools.command,org.drools
+ .time,org.drools.event,org.drools,org.drools.runtime.process,org.droo
+ ls.runtime.rule,org.drools.runtime.conf";version="5.1.0.SNAPSHOT",org
+ .drools.task.service;version="5.1.0.SNAPSHOT",org.drools.marshalling;
+ uses:="org.drools.runtime,org.drools";version="5.1.0.SNAPSHOT",org.dr
+ ools.runtime.rule;uses:="org.drools.definition.rule,org.drools.runtim
+ e";version="5.1.0.SNAPSHOT",org.drools.command;uses:="org.drools.runt
+ ime,org.drools.runtime.rule";version="5.1.0.SNAPSHOT",org.drools.time
+ ;version="5.1.0.SNAPSHOT",org.drools.management;uses:="javax.manageme
+ nt";version="5.1.0.SNAPSHOT",org.drools.event.process;uses:="org.droo
+ ls.event,org.drools.runtime.process";version="5.1.0.SNAPSHOT",org.dro
+ ols.event.io;uses:="org.drools";version="5.1.0.SNAPSHOT",org.drools.c
+ onf;uses:="org.drools.runtime.rule";version="5.1.0.SNAPSHOT",org.droo
+ ls.osgi.api;uses:="org.osgi.framework,org.drools,org.drools.util,org.
+ osgi.util.tracker";version="5.1.0.SNAPSHOT",org.drools;uses:="org.dro
+ ols.io,org.drools.event.knowledgebase,org.drools.runtime,org.drools.d
+ efinition,org.drools.definition.type,org.drools.definition.rule,org.d
+ rools.definition.process,org.drools.conf,org.drools.util";version="5.
+ 1.0.SNAPSHOT",org.drools.runtime.conf;uses:="org.drools.conf";version
+ ="5.1.0.SNAPSHOT",org.drools.runtime.process;uses:="org.drools.runtim
+ e";version="5.1.0.SNAPSHOT",org.drools.event.rule;uses:="org.drools.e
+ vent,org.drools.runtime.rule";version="5.1.0.SNAPSHOT",org.drools.bui
+ lder.help;uses:="com.sun.tools.xjc,org.drools.builder,org.drools.io,o
+ rg.drools,javax.xml.bind";version="5.1.0.SNAPSHOT",org.drools.vsm;use
+ s:="org.drools.command,org.drools.runtime,org.drools.persistence.jpa,
+ org.drools.builder,org.drools,org.drools.agent";version="5.1.0.SNAPSH
+ OT",org.drools.builder.conf;uses:="org.drools.runtime.rule,org.drools
+ .conf";version="5.1.0.SNAPSHOT",org.drools.definition;uses:="org.droo
+ ls.definition.rule,org.drools.definition.process";version="5.1.0.SNAP
+ SHOT",org.drools.definition.rule;uses:="org.drools.definition";versio
+ n="5.1.0.SNAPSHOT",org.drools.runtime.pipeline;uses:="org.drools.runt
+ ime,javax.xml.bind,net.sf.jxls.reader,org.milyn,com.thoughtworks.xstr
+ eam";version="5.1.0.SNAPSHOT",org.drools.runtime.help;uses:="com.thou
+ ghtworks.xstream,org.drools.time,org.quartz";version="5.1.0.SNAPSHOT"
+ ,org.drools.event.knowledgebase;uses:="org.drools.definition.rule,org
+ .drools.definition,org.drools";version="5.1.0.SNAPSHOT",org.drools.ev
+ ent;uses:="org.drools.runtime,org.drools.event.rule,org.drools.event.
+ process";version="5.1.0.SNAPSHOT",org.drools.persistence.jpa;uses:="o
+ rg.drools.runtime,org.drools";version="5.1.0.SNAPSHOT",org.drools.bui
+ lder;uses:="org.drools.io,org.drools,org.drools.definition,org.drools
+ .builder.conf,org.drools.util";version="5.1.0.SNAPSHOT",org.drools.io
+ ;uses:="org.drools,org.drools.event.io,org.drools.util";version="5.1.
+ 0.SNAPSHOT",org.drools.util;uses:="org.drools,org.drools.builder,org.
+ drools.io";version="5.1.0.SNAPSHOT",org.drools.command.impl;uses:="or
+ g.drools.command";version="5.1.0.SNAPSHOT",org.drools.definition.type
+ ;version="5.1.0.SNAPSHOT",org.drools.definition.process;uses:="org.dr
+ ools.definition";version="5.1.0.SNAPSHOT",org.drools.agent;uses:="org
+ .drools.runtime,org.drools,org.drools.io";version="5.1.0.SNAPSHOT"
+Bundle-Version: 5.1.0.SNAPSHOT
+Bundle-Name: Drools :: API
+Bundle-Description: A rule production system
+Private-Package: .;version="5.1.0.SNAPSHOT"
+Bundle-DocURL: http://www.jboss.org/
+Bundle-Vendor: JBoss Inc.
+Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.drools.api;singleton:=true
-Bundle-DocURL: http://www.jboss.org/
+Tool: Bnd-0.0.357
+DynamicImport-Package: *
 

Modified: labs/jbossrules/trunk/drools-compiler/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-compiler/.classpath	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-compiler/.classpath	2010-04-07 22:30:27 UTC (rev 32475)
@@ -11,24 +11,20 @@
   <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.1.3/antlr-3.1.3.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.1.3/antlr-runtime-3.1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/jasper/springsource/com.springsource.org.apache.jasper.org.eclipse.jdt.springsource/6.0.20.S2-r5956/com.springsource.org.apache.jasper.org.eclipse.jdt.springsource-6.0.20.S2-r5956.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"/>
   <classpathentry kind="src" path="/drools-api"/>
   <classpathentry kind="src" path="/drools-core"/>
   <classpathentry kind="var" path="M2_REPO/org/antlr/gunit/3.1.3/gunit-3.1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.15/janino-2.5.15.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-impl/2.1.7/jaxb-impl-2.1.7.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-xjc/2.1.7/jaxb-xjc-2.1.7.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/mortbay/jetty/jetty/6.1.15/jetty-6.1.15.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/mortbay/jetty/jetty-embedded/6.1.15/jetty-embedded-6.1.15.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/mortbay/jetty/jetty-util/6.1.15/jetty-util-6.1.15.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/4.6/junit-4.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mockito/mockito-all/1.8.2/mockito-all-1.8.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/felix/org.osgi.compendium/1.4.0/org.osgi.compendium-1.4.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/felix/org.osgi.core/1.4.0/org.osgi.core-1.4.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/opensymphony/quartz/quartz/1.6.1/quartz-1.6.1.jar"/>
@@ -36,5 +32,5 @@
   <classpathentry kind="var" path="M2_REPO/org/antlr/stringtemplate/3.2/stringtemplate-3.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/trunk/drools-compiler/META-INF/MANIFEST.MF	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-compiler/META-INF/MANIFEST.MF	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,68 +1,6 @@
 Manifest-Version: 1.0
-Export-Package: org.drools.builder.impl;uses:="org.drools.compiler";ve
- rsion="5.1.0.SNAPSHOT",org.drools.osgi.compiler;uses:="org.osgi.util.
- tracker,org.osgi.framework,org.drools.builder.impl,org.drools.compile
- r";version="5.1.0.SNAPSHOT",org.drools.compiler.xml.rules;uses:="org.
- w3c.dom,org.xml.sax,org.antlr.runtime.tree,org.antlr.runtime";version
- ="5.1.0.SNAPSHOT",org.drools.testframework;uses:="org.drools.guvnor.c
- lient.modeldriven.testing,org.mvel2,org.mvel2.compiler,org.drools.guv
- nor.server.util";version="5.1.0.SNAPSHOT",org.drools.process.builder;
- uses:="org.drools.rule.builder,org.drools.compiler";version="5.1.0.SN
- APSHOT",org.drools.rule.builder.dialect.java;uses:="org.mvel2.templat
- es,org.mvel2.integration,org.mvel2.integration.impl,org.drools.rule.b
- uilder,org.drools.compiler,org.drools.rule.builder.dialect.mvel,org.m
- vel2.optimizers,org.mvel2.compiler,org.drools.rule.builder.dialect.ja
- va.parser,org.antlr.runtime,org.mvel2";version="5.1.0.SNAPSHOT",org.d
- rools.rule.builder.dialect.mvel;uses:="org.drools.rule.builder,org.dr
- ools.compiler,org.mvel2,org.mvel2.util,org.drools.rule.builder.dialec
- t.java,org.mvel2.ast,org.mvel2.compiler";version="5.1.0.SNAPSHOT",org
- .drools.rule.builder.dialect.java.parser;uses:="org.antlr.runtime";ve
- rsion="5.1.0.SNAPSHOT",org.drools.guvnor.server.rules;uses:="org.droo
- ls.compiler,org.drools.guvnor.client.modeldriven,org.drools.guvnor.se
- rver.util";version="5.1.0.SNAPSHOT",org.drools.guvnor.client.modeldri
- ven.brl;version="5.1.0.SNAPSHOT",org.drools.guvnor.client.modeldriven
- .testing;uses:="org.drools.guvnor.client.modeldriven.brl";version="5.
- 1.0.SNAPSHOT",org.drools.guvnor.client.modeldriven.ui;version="5.1.0.
- SNAPSHOT",org.drools.compiler.xml.processes;uses:="org.drools.compile
- r.xml,org.w3c.dom,org.xml.sax,javax.xml.transform,javax.xml.transform
- .stream";version="5.1.0.SNAPSHOT",org.drools.compiler.xml;uses:="org.
- drools.compiler.xml.processes,org.drools.compiler.xml.rules,javax.xml
- .parsers,org.xml.sax";version="5.1.0.SNAPSHOT",org.drools.compiler;us
- es:="org.drools.rule.builder,org.antlr.runtime.tree,org.antlr.runtime
- ,org.xml.sax,org.drools.guvnor.client.modeldriven.brl,org.drools.comp
- iler.xml,org.drools.guvnor.server.util,org.drools.process.builder,org
- .mvel2,org.drools.compiler.xml.processes,javax.xml.parsers";version="
- 5.1.0.SNAPSHOT",org.drools.reteoo.compiled;uses:="org.drools.rule.bui
- lder.dialect.java,org.drools.compiler";version="5.1.0.SNAPSHOT",org.d
- rools.semantics.java.parser;version="5.1.0.SNAPSHOT",org.drools.guvno
- r.client.modeldriven.dt;uses:="org.drools.guvnor.client.modeldriven.b
- rl,org.drools.guvnor.client.modeldriven";version="5.1.0.SNAPSHOT",org
- .drools.rule.builder;uses:="org.drools.compiler,org.drools.rule.build
- er.dialect.mvel,org.mvel2,org.mvel2.compiler";version="5.1.0.SNAPSHOT
- ",org.drools.guvnor.client.modeldriven;uses:="org.drools.guvnor.clien
- t.modeldriven.brl";version="5.1.0.SNAPSHOT",org.drools.guvnor.server.
- util;uses:="org.drools.guvnor.client.modeldriven.brl,com.thoughtworks
- .xstream.io,com.thoughtworks.xstream.io.xml,com.thoughtworks.xstream,
- org.drools.guvnor.server.rules,org.drools.guvnor.client.modeldriven,o
- rg.mvel2,org.drools.guvnor.client.modeldriven.dt,org.drools.guvnor.cl
- ient.modeldriven.testing";version="5.1.0.SNAPSHOT"
-Private-Package: org.drools.lang.descr;version="5.1.0.SNAPSHOT",org.dr
- ools.commons.jci.compilers;version="5.1.0.SNAPSHOT",org.drools.lang.d
- sl;version="5.1.0.SNAPSHOT",org.drools.commons.jci.problems;version="
- 5.1.0.SNAPSHOT",org.drools.commons.jci.readers;version="5.1.0.SNAPSHO
- T",org.drools.commons.jci.stores;version="5.1.0.SNAPSHOT",org.drools.
- lang;version="5.1.0.SNAPSHOT"
-Tool: Bnd-0.0.357
-Bundle-Name: Drools :: Compiler
-Created-By: 1.6.0_18 (Sun Microsystems Inc.)
-Require-Bundle: org.drools.core;bundle-version="5.1.0.SNAPSHOT"
-Bundle-Vendor: JBoss Inc.
-DynamicImport-Package: *
-Bundle-Version: 5.1.0.SNAPSHOT
-Bnd-LastModified: 1266695776762
 Bundle-Activator: org.drools.osgi.compiler.Activator
-Bundle-ManifestVersion: 2
-Bundle-Description: A rule production system
+Created-By: 1.5.0_21 (Sun Microsystems Inc.)
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
 Import-Package: com.thoughtworks.xstream,com.thoughtworks.xstream.io,c
  om.thoughtworks.xstream.io.xml,javax.xml.parsers,javax.xml.transform,
@@ -79,6 +17,68 @@
  2.optimizers;version="2.0",org.mvel2.templates;version="2.0",org.mvel
  2.util;version="2.0",org.osgi.framework;version="1.5",org.osgi.util.t
  racker;version="1.4",org.w3c.dom,org.xml.sax
+Bnd-LastModified: 1267407606512
+Export-Package: org.drools.builder.impl;uses:="org.drools.compiler";ve
+ rsion="5.1.0.SNAPSHOT",org.drools.rule.builder;uses:="org.drools.comp
+ iler,org.mvel2.compiler,org.mvel2,org.drools.rule.builder.dialect.mve
+ l";version="5.1.0.SNAPSHOT",org.drools.guvnor.client.modeldriven.test
+ ing;uses:="org.drools.guvnor.client.modeldriven.brl";version="5.1.0.S
+ NAPSHOT",org.drools.guvnor.server.util;uses:="org.drools.guvnor.clien
+ t.modeldriven.brl,com.thoughtworks.xstream.io,com.thoughtworks.xstrea
+ m.io.xml,com.thoughtworks.xstream,org.drools.guvnor.server.rules,org.
+ drools.guvnor.client.modeldriven,org.mvel2,org.drools.guvnor.client.m
+ odeldriven.dt,org.drools.guvnor.client.modeldriven.testing";version="
+ 5.1.0.SNAPSHOT",org.drools.compiler.xml;uses:="org.drools.compiler.xm
+ l.processes,org.drools.compiler.xml.rules,org.xml.sax,javax.xml.parse
+ rs";version="5.1.0.SNAPSHOT",org.drools.compiler.xml.processes;uses:=
+ "org.xml.sax,org.w3c.dom,org.drools.compiler.xml,javax.xml.transform.
+ stream,javax.xml.transform";version="5.1.0.SNAPSHOT",org.drools.osgi.
+ compiler;uses:="org.osgi.framework,org.osgi.util.tracker,org.drools.c
+ ompiler,org.drools.builder.impl";version="5.1.0.SNAPSHOT",org.drools.
+ guvnor.client.modeldriven.dt;uses:="org.drools.guvnor.client.modeldri
+ ven.brl,org.drools.guvnor.client.modeldriven";version="5.1.0.SNAPSHOT
+ ",org.drools.compiler.xml.rules;uses:="org.xml.sax,org.w3c.dom,org.an
+ tlr.runtime.tree,org.antlr.runtime";version="5.1.0.SNAPSHOT",org.droo
+ ls.process.builder;uses:="org.drools.rule.builder,org.drools.compiler
+ ";version="5.1.0.SNAPSHOT",org.drools.testframework;uses:="org.drools
+ .guvnor.client.modeldriven.testing,org.mvel2.compiler,org.drools.guvn
+ or.server.util,org.mvel2";version="5.1.0.SNAPSHOT",org.drools.guvnor.
+ client.modeldriven.ui;version="5.1.0.SNAPSHOT",org.drools.guvnor.clie
+ nt.modeldriven;uses:="org.drools.guvnor.client.modeldriven.brl";versi
+ on="5.1.0.SNAPSHOT",org.drools.reteoo.compiled;uses:="org.drools.comp
+ iler,org.drools.rule.builder.dialect.java";version="5.1.0.SNAPSHOT",o
+ rg.drools.rule.builder.dialect.java.parser;uses:="org.antlr.runtime";
+ version="5.1.0.SNAPSHOT",org.drools.semantics.java.parser;version="5.
+ 1.0.SNAPSHOT",org.drools.rule.builder.dialect.java;uses:="org.drools.
+ rule.builder,org.mvel2.integration,org.mvel2.integration.impl,org.mve
+ l2.templates,org.mvel2.compiler,org.mvel2.optimizers,org.drools.compi
+ ler,org.drools.rule.builder.dialect.mvel,org.drools.rule.builder.dial
+ ect.java.parser,org.antlr.runtime,org.mvel2";version="5.1.0.SNAPSHOT"
+ ,org.drools.compiler;uses:="org.drools.rule.builder,org.antlr.runtime
+ .tree,org.antlr.runtime,org.drools.guvnor.server.util,org.drools.comp
+ iler.xml,org.xml.sax,org.drools.guvnor.client.modeldriven.brl,org.mve
+ l2,org.drools.process.builder,org.drools.compiler.xml.processes,javax
+ .xml.parsers";version="5.1.0.SNAPSHOT",org.drools.rule.builder.dialec
+ t.mvel;uses:="org.drools.rule.builder,org.drools.compiler,org.mvel2,o
+ rg.mvel2.compiler,org.mvel2.util,org.drools.rule.builder.dialect.java
+ ,org.mvel2.ast";version="5.1.0.SNAPSHOT",org.drools.guvnor.server.rul
+ es;uses:="org.drools.guvnor.server.util,org.drools.compiler,org.drool
+ s.guvnor.client.modeldriven";version="5.1.0.SNAPSHOT",org.drools.guvn
+ or.client.modeldriven.brl;version="5.1.0.SNAPSHOT"
+Bundle-Version: 5.1.0.SNAPSHOT
+Bundle-Name: Drools :: Compiler
+Bundle-Description: A rule production system
+Private-Package: org.drools.lang.descr;version="5.1.0.SNAPSHOT",org.dr
+ ools.lang.dsl;version="5.1.0.SNAPSHOT",org.drools.commons.jci.compile
+ rs;version="5.1.0.SNAPSHOT",org.drools.commons.jci.stores;version="5.
+ 1.0.SNAPSHOT",org.drools.lang;version="5.1.0.SNAPSHOT",org.drools.com
+ mons.jci.problems;version="5.1.0.SNAPSHOT",org.drools.commons.jci.rea
+ ders;version="5.1.0.SNAPSHOT"
+Bundle-DocURL: http://www.jboss.org/
+Bundle-Vendor: JBoss Inc.
+Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.drools.compiler;singleton:=true
-Bundle-DocURL: http://www.jboss.org/
+Tool: Bnd-0.0.357
+Require-Bundle: org.drools.core;bundle-version="5.1.0.SNAPSHOT"
+DynamicImport-Package: *
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -25,6 +25,7 @@
 import java.util.Set;
 
 import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EvaluatorDefinition;
@@ -72,6 +73,7 @@
 import org.drools.rule.RuleConditionElement;
 import org.drools.rule.SlidingLengthWindow;
 import org.drools.rule.SlidingTimeWindow;
+import org.drools.rule.UnificationRestriction;
 import org.drools.rule.VariableConstraint;
 import org.drools.rule.VariableRestriction;
 import org.drools.rule.builder.dialect.mvel.MVELDialect;
@@ -382,17 +384,17 @@
                                   pattern.getObjectType(),
                                   fieldName,
                                   (LiteralRestriction) restriction );
-        } else if ( restriction instanceof VariableRestriction ) {
+        } else if ( restriction instanceof VariableRestriction ||  restriction instanceof UnificationRestriction ) {
             constraint = new VariableConstraint( extractor,
-                                                 (VariableRestriction) restriction );
+                                                 restriction );
             registerReadAccessor( context,
                                   pattern.getObjectType(),
                                   fieldName,
-                                  (VariableRestriction) restriction );
+                                  (AcceptsReadAccessor) restriction );
             registerReadAccessor( context,
                                   pattern.getObjectType(),
                                   fieldName,
-                                  (VariableRestriction) restriction );
+                                  (AcceptsReadAccessor) restriction );
         } else if ( restriction instanceof ReturnValueRestriction ) {
             constraint = new ReturnValueConstraint( extractor,
                                                     (ReturnValueRestriction) restriction );
@@ -743,7 +745,7 @@
         return restriction;
     }
 
-    private VariableRestriction buildRestriction(final RuleBuildContext context,
+    private Restriction buildRestriction(final RuleBuildContext context,
                                                  final InternalReadAccessor extractor,
                                                  final FieldConstraintDescr fieldConstraintDescr,
                                                  final VariableRestrictionDescr variableRestrictionDescr) {
@@ -788,10 +790,17 @@
         if ( evaluator == null ) {
             return null;
         }
+        
+        Restriction restriction = new VariableRestriction( extractor,
+                                                           declaration,
+                                                           evaluator );
+        
+        if ( declaration.getPattern().getObjectType().equals( new ClassObjectType( DroolsQuery.class ) ) )  {
+            // declaration is query argument, so allow for unification.
+            restriction = new UnificationRestriction( ( VariableRestriction ) restriction );
+        }
 
-        return new VariableRestriction( extractor,
-                                        declaration,
-                                        evaluator );
+        return restriction;
     }
 
     private LiteralRestriction buildRestriction(final RuleBuildContext context,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,5 +1,6 @@
 package org.drools.rule.builder;
 
+import org.drools.base.Arguments;
 import org.drools.base.ClassObjectType;
 import org.drools.base.DroolsQuery;
 import org.drools.base.FieldFactory;
@@ -19,13 +20,13 @@
 public class QueryBuilder implements EngineElementBuilder {
     public Pattern build(final RuleBuildContext context,
                          final QueryDescr queryDescr) {
-        ObjectType objectType = new ClassObjectType( DroolsQuery.class );
+        ObjectType queryObjectType = new ClassObjectType( DroolsQuery.class );
         final Pattern pattern = new Pattern( context.getNextPatternId(),
                                              0, // offset is 0 by default
-                                             objectType,
+                                             queryObjectType,
                                              null );
         
-        final InternalReadAccessor extractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, objectType, "name", null, true );
+        final InternalReadAccessor extractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, queryObjectType, "name", null, true );
 
         final FieldValue field = FieldFactory.getFieldValue( queryDescr.getName(),
                                                              ValueType.STRING_TYPE,
@@ -36,12 +37,14 @@
                                                                                                                                     Operator.EQUAL ),
                                                                     field );
         
-        PatternBuilder.registerReadAccessor( context, objectType, "name", constraint );
+        PatternBuilder.registerReadAccessor( context, queryObjectType, "name", constraint );
 
         // adds appropriate constraint to the pattern
         pattern.addConstraint( constraint );
 
-        InternalReadAccessor arrayExtractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, objectType, "arguments", null, true );
+        ObjectType argsObjectType = new ClassObjectType( Arguments.class );
+        
+        InternalReadAccessor arrayExtractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, argsObjectType, "arguments", null, true );
 
         String[] params = queryDescr.getParameters();
         String[] types = queryDescr.getParameterTypes();
@@ -57,7 +60,7 @@
                 ArrayElementReader reader = new ArrayElementReader( arrayExtractor,
                                         i,
                                         context.getDialect().getTypeResolver().resolveType( types[i] ) );
-                PatternBuilder.registerReadAccessor( context, objectType, "arguments", reader );
+                PatternBuilder.registerReadAccessor( context, argsObjectType, "arguments", reader );
                 
                 declr.setReadAccessor( reader );
                 

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsTest.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,77 @@
+package org.drools.integrationtests;
+
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.PackageBuilder;
+
+public class DroolsTest extends TestCase {
+    private final static int NUM_FACTS = 20;
+
+    private static int       counter;
+
+    public static class Foo {
+        private final int id;
+
+        Foo(int id) {
+            this.id = id;
+        }
+
+        public int getId() {
+            return id;
+        }
+    }
+
+    public static class Bar {
+        private final int id;
+
+        Bar(int id) {
+            this.id = id;
+        }
+
+        public int getId() {
+            return id;
+        }
+    }
+
+    public static void test1() throws Exception {
+        String str = "package org.drools.integrationtests;\n";
+        str += "import org.drools.integrationtests.DroolsTest;\n";
+        str += "import org.drools.integrationtests.DroolsTest.Foo;\n";
+        str += "import org.drools.integrationtests.DroolsTest.Bar;\n";
+        str += "rule test\n";
+        str += "when\n";
+        str += "      Foo($p : id, id < " + Integer.toString( NUM_FACTS ) + ")\n";
+        str += "      Bar(id == $p)\n";
+        str += "then\n";
+        str += "   DroolsTest.incCounter();\n";
+        str += "end\n";
+
+        counter = 0;
+
+        RuleBase rb = RuleBaseFactory.newRuleBase();
+        WorkingMemory wm = rb.newStatefulSession();
+
+        for ( int i = 0; i < NUM_FACTS; i++ ) {
+            wm.insert( new Foo( i ) );
+            wm.insert( new Bar( i ) );
+        }
+        PackageBuilder bld = new PackageBuilder();
+        bld.addPackageFromDrl( new StringReader( str ) );
+        if ( bld.hasErrors() ) {
+            fail( bld.getErrors().toString() );
+        }
+
+        rb.addPackage( bld.getPackage() );
+        wm.fireAllRules();
+        System.out.println( counter + ":" + (counter == NUM_FACTS ? "passed" : "failed" ));
+    }
+
+    public static void incCounter() {
+        ++counter;
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -33,12 +34,10 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Set;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
@@ -62,7 +61,6 @@
 import org.drools.FromTestClass;
 import org.drools.Guess;
 import org.drools.IndexedNumber;
-import org.drools.InsertedObject;
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.Message;
@@ -79,8 +77,6 @@
 import org.drools.Pet;
 import org.drools.PolymorphicFact;
 import org.drools.Primitives;
-import org.drools.QueryResult;
-import org.drools.QueryResults;
 import org.drools.RandomNumber;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
@@ -93,11 +89,8 @@
 import org.drools.StatelessSession;
 import org.drools.TestParam;
 import org.drools.Win;
-import org.drools.Worker;
 import org.drools.WorkingMemory;
 import org.drools.Cheesery.Maturity;
-import org.drools.base.ClassObjectType;
-import org.drools.base.DroolsQuery;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderError;
 import org.drools.builder.KnowledgeBuilderErrors;
@@ -108,7 +101,6 @@
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.DisconnectedFactHandle;
 import org.drools.common.InternalFactHandle;
-import org.drools.common.InternalRuleBase;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsError;
@@ -118,9 +110,6 @@
 import org.drools.compiler.ParserError;
 import org.drools.compiler.PackageBuilder.PackageMergeException;
 import org.drools.compiler.xml.XmlDumper;
-import org.drools.core.util.Entry;
-import org.drools.core.util.ObjectHashSet;
-import org.drools.core.util.ObjectHashMap.ObjectEntry;
 import org.drools.definition.KnowledgePackage;
 import org.drools.definition.type.FactType;
 import org.drools.event.ActivationCancelledEvent;
@@ -144,10 +133,9 @@
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.marshalling.MarshallerFactory;
-import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.ObjectTypeNode;
 import org.drools.reteoo.ReteooRuleBase;
+import org.drools.reteoo.ReteooRuleBase;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.InvalidRulePackage;
 import org.drools.rule.Package;
@@ -155,10 +143,8 @@
 import org.drools.runtime.Globals;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.WorkingMemoryEntryPoint;
-import org.drools.runtime.rule.impl.FlatQueryResults;
 import org.drools.spi.ConsequenceExceptionHandler;
 import org.drools.spi.GlobalResolver;
-import org.drools.spi.ObjectType;
 
 /** Run all the tests with the ReteOO engine implementation */
 public class MiscTest extends TestCase {
@@ -2112,28 +2098,7 @@
 
     }
 
-    public void testQuery() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "simple_query_test.drl" ) ) );
-        final Package pkg = builder.getPackage();
 
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-
-        //ruleBase = SerializationHelper.serializeObject( ruleBase );
-        StatefulSession session = ruleBase.newStatefulSession();
-
-        final Cheese stilton = new Cheese( "stinky",
-                                           5 );
-        session.insert( stilton );
-        //        session = SerializationHelper.getSerialisedStatefulSession( session,
-        //                                                                    ruleBase );
-        final QueryResults results = session.getQueryResults( "simple query" );
-        assertEquals( 1,
-                      results.size() );
-
-    }
-
     public void testEval() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "eval_rule_test.drl" ) ) );
@@ -3225,233 +3190,7 @@
         }
     }
 
-    public void testQuery2() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Query.drl" ) ) );
 
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        workingMemory.fireAllRules();
-
-        final QueryResults results = workingMemory.getQueryResults( "assertedobjquery" );
-        assertEquals( 1,
-                      results.size() );
-        assertEquals( new InsertedObject( "value1" ),
-                      results.get( 0 ).get( 0 ) );
-    }
-
-    public void testQueryWithParams() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_QueryWithParams.drl" ) ) );
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        workingMemory.fireAllRules();
-
-        QueryResults results = workingMemory.getQueryResults( "assertedobjquery",
-                                                              new String[]{"value1"} );
-        assertEquals( 1,
-                      results.size() );
-        assertEquals( new InsertedObject( "value1" ),
-                      results.get( 0 ).get( 0 ) );
-
-        results = workingMemory.getQueryResults( "assertedobjquery",
-                                                 new String[]{"value3"} );
-        assertEquals( 0,
-                      results.size() );
-
-        results = workingMemory.getQueryResults( "assertedobjquery2",
-                                                 new String[]{null, "value2"} );
-        assertEquals( 1,
-                      results.size() );
-        assertEquals( new InsertedObject( "value2" ),
-                      results.get( 0 ).get( 0 ) );
-
-        results = workingMemory.getQueryResults( "assertedobjquery2",
-                                                 new String[]{"value3", "value2"} );
-        assertEquals( 1,
-                      results.size() );
-        assertEquals( new InsertedObject( "value2" ),
-                      results.get( 0 ).get( 0 ) );
-    }
-
-    public void testQueryWithParamsOnKnowledgeApi() throws Exception {
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_QueryWithParams.drl",
-                                                            getClass() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            fail( kbuilder.getErrors().toString() );
-        }
-
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        kbase = SerializationHelper.serializeObject( kbase );
-
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-        ksession.fireAllRules();
-
-        org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "assertedobjquery",
-                                                                                 new String[]{"value1"} );
-        assertEquals( 1,
-                      results.size() );
-        //        assertEquals( new InsertedObject( "value1" ),
-        //                      results.get( 0 ).get( 0 ) );
-
-        results = ksession.getQueryResults( "assertedobjquery",
-                                            new String[]{"value3"} );
-        assertEquals( 0,
-                      results.size() );
-
-        results = ksession.getQueryResults( "assertedobjquery2",
-                                            new String[]{null, "value2"} );
-        assertEquals( 1,
-                      results.size() );
-
-        assertEquals( new InsertedObject( "value2" ),
-                      ((org.drools.runtime.rule.QueryResultsRow) results.iterator().next()).get( "assertedobj" ) );
-
-        results = ksession.getQueryResults( "assertedobjquery2",
-                                            new String[]{"value3", "value2"} );
-        assertEquals( 1,
-                      results.size() );
-        assertEquals( new InsertedObject( "value2" ),
-                      ((org.drools.runtime.rule.QueryResultsRow) results.iterator().next()).get( "assertedobj" ) );
-    }
-
-    public void testQueryWithMultipleResultsOnKnowledgeApi() throws Exception {
-        String str = "";
-        str += "package org.drools.test  \n";
-        str += "import org.drools.Cheese \n";
-        str += "query cheeses \n";
-        str += "    stilton : Cheese(type == 'stilton') \n";
-        str += "    cheddar : Cheese(type == 'cheddar', price == stilton.price) \n";
-        str += "end\n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            fail( kbuilder.getErrors().toString() );
-        }
-
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        kbase = SerializationHelper.serializeObject( kbase );
-
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-        Cheese stilton1 = new Cheese( "stilton",
-                                      1 );
-        Cheese cheddar1 = new Cheese( "cheddar",
-                                      1 );
-        Cheese stilton2 = new Cheese( "stilton",
-                                      2 );
-        Cheese cheddar2 = new Cheese( "cheddar",
-                                      2 );
-        Cheese stilton3 = new Cheese( "stilton",
-                                      3 );
-        Cheese cheddar3 = new Cheese( "cheddar",
-                                      3 );
-
-        Set set = new HashSet();
-        List list = new ArrayList();
-        list.add( stilton1 );
-        list.add( cheddar1 );
-        set.add( list );
-
-        list = new ArrayList();
-        list.add( stilton2 );
-        list.add( cheddar2 );
-        set.add( list );
-
-        list = new ArrayList();
-        list.add( stilton3 );
-        list.add( cheddar3 );
-        set.add( list );
-
-        ksession.insert( stilton1 );
-        ksession.insert( stilton2 );
-        ksession.insert( stilton3 );
-        ksession.insert( cheddar1 );
-        ksession.insert( cheddar2 );
-        ksession.insert( cheddar3 );
-
-        org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "cheeses" );
-        assertEquals( 3,
-                      results.size() );
-        assertEquals( 2,
-                      results.getIdentifiers().length );
-        Set newSet = new HashSet();
-        for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
-            list = new ArrayList();
-            list.add( result.get( "stilton" ) );
-            list.add( result.get( "cheddar" ) );
-            newSet.add( list );
-        }
-        assertEquals( set,
-                      newSet );
-
-        FlatQueryResults flatResults = new FlatQueryResults( ((StatefulKnowledgeSessionImpl) ksession).session.getQueryResults( "cheeses" ) );
-        assertEquals( 3,
-                      flatResults.size() );
-        assertEquals( 2,
-                      flatResults.getIdentifiers().length );
-        newSet = new HashSet();
-        for ( org.drools.runtime.rule.QueryResultsRow result : flatResults ) {
-            list = new ArrayList();
-            list.add( result.get( "stilton" ) );
-            list.add( result.get( "cheddar" ) );
-            newSet.add( list );
-        }
-        assertEquals( set,
-                      newSet );
-    }
-
-    public void testTwoQuerries() throws Exception {
-        // @see JBRULES-410 More than one Query definition causes an incorrect
-        // Rete network to be built.
-
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_TwoQuerries.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final Cheese stilton = new Cheese( "stinky",
-                                           5 );
-        workingMemory.insert( stilton );
-        final Person per1 = new Person( "stinker",
-                                        "smelly feet",
-                                        70 );
-        final Person per2 = new Person( "skunky",
-                                        "smelly armpits",
-                                        40 );
-
-        workingMemory.insert( per1 );
-        workingMemory.insert( per2 );
-
-        QueryResults results = workingMemory.getQueryResults( "find stinky cheeses" );
-        assertEquals( 1,
-                      results.size() );
-
-        results = workingMemory.getQueryResults( "find pensioners" );
-        assertEquals( 1,
-                      results.size() );
-    }
-
     public void testInsurancePricingExample() throws Exception {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newClassPathResource( "insurance_pricing_example.drl", getClass() ), ResourceType.DRL );        
@@ -3572,92 +3311,8 @@
         ksession.fireAllRules();
     }
 
-    public void testDoubleQueryWithExists() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DoubleQueryWithExists.drl" ) ) );
-        final Package pkg = builder.getPackage();
 
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
-        final Person p1 = new Person( "p1",
-                                      "stilton",
-                                      20 );
-        p1.setStatus( "europe" );
-        final FactHandle c1FactHandle = workingMemory.insert( p1 );
-        final Person p2 = new Person( "p2",
-                                      "stilton",
-                                      30 );
-        p2.setStatus( "europe" );
-        final FactHandle c2FactHandle = workingMemory.insert( p2 );
-        final Person p3 = new Person( "p3",
-                                      "stilton",
-                                      40 );
-        p3.setStatus( "europe" );
-        final FactHandle c3FactHandle = workingMemory.insert( p3 );
-        workingMemory.fireAllRules();
-
-        QueryResults queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 2,
-                      queryResults.size() );
-
-        // europe=[ 1, 2 ], america=[ 3 ]
-        p3.setStatus( "america" );
-        workingMemory.update( c3FactHandle,
-                              p3 );
-        workingMemory.fireAllRules();
-        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 1,
-                      queryResults.size() );
-
-        // europe=[ 1 ], america=[ 2, 3 ]
-        p2.setStatus( "america" );
-        workingMemory.update( c2FactHandle,
-                              p2 );
-        workingMemory.fireAllRules();
-        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 1,
-                      queryResults.size() );
-
-        // europe=[ ], america=[ 1, 2, 3 ]
-        p1.setStatus( "america" );
-        workingMemory.update( c1FactHandle,
-                              p1 );
-        workingMemory.fireAllRules();
-        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 2,
-                      queryResults.size() );
-
-        // europe=[ 2 ], america=[ 1, 3 ]
-        p2.setStatus( "europe" );
-        workingMemory.update( c2FactHandle,
-                              p2 );
-        workingMemory.fireAllRules();
-        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 1,
-                      queryResults.size() );
-
-        // europe=[ 1, 2 ], america=[ 3 ]
-        p1.setStatus( "europe" );
-        workingMemory.update( c1FactHandle,
-                              p1 );
-        workingMemory.fireAllRules();
-        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 1,
-                      queryResults.size() );
-
-        // europe=[ 1, 2, 3 ], america=[ ]
-        p3.setStatus( "europe" );
-        workingMemory.update( c3FactHandle,
-                              p3 );
-        workingMemory.fireAllRules();
-        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
-        assertEquals( 2,
-                      queryResults.size() );
-    }
-
     public void testFunctionWithPrimitives() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FunctionWithPrimitives.drl" ) ) );
@@ -5868,28 +5523,6 @@
                       objectWithSet.getMessage() );
     }
 
-    public void testQueryWithCollect() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Query.drl" ) ) );
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        workingMemory.fireAllRules();
-
-        final QueryResults results = workingMemory.getQueryResults( "collect objects" );
-        assertEquals( 1,
-                      results.size() );
-
-        final QueryResult result = results.get( 0 );
-        final List list = (List) result.get( "$list" );
-
-        assertEquals( 2,
-                      list.size() );
-    }
-
     public void testNestedAccessors() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_NestedAccessors.drl" ) ) );
@@ -7120,76 +6753,6 @@
         assertEquals( 3, list.size() ); 
     }        
 
-    public void testDroolsQueryCleanup() {
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_QueryMemoryLeak.drl",
-                                                            getClass() ),
-                      ResourceType.DRL );
-        KnowledgeBuilderErrors errors = kbuilder.getErrors();
-        if ( errors.size() > 0 ) {
-            for ( KnowledgeBuilderError error : errors ) {
-                System.err.println( error );
-            }
-            throw new IllegalArgumentException( "Could not parse knowledge." );
-        }
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-
-        String workerId = "B1234";
-        Worker worker = new Worker();
-        worker.setId( workerId );
-
-        org.drools.runtime.rule.FactHandle handle = ksession.insert( worker );
-        ksession.fireAllRules();
-
-        assertNotNull( handle );
-
-        Object retractedWorker = null;
-        for ( int i = 0; i < 100; i++ ) {
-            retractedWorker = (Object) ksession.getQueryResults( "getWorker",
-                                                                 new Object[]{workerId} );
-        }
-
-        assertNotNull( retractedWorker );
-
-        StatefulKnowledgeSessionImpl sessionImpl = (StatefulKnowledgeSessionImpl) ksession;
-
-        ReteooWorkingMemory reteWorkingMemory = sessionImpl.session;
-        AbstractWorkingMemory abstractWorkingMemory = (AbstractWorkingMemory) reteWorkingMemory;
-
-        InternalRuleBase ruleBase = (InternalRuleBase) abstractWorkingMemory.getRuleBase();
-        Collection<EntryPointNode> entryPointNodes = ruleBase.getRete().getEntryPointNodes().values();
-
-        EntryPointNode defaultEntryPointNode = null;
-        for ( EntryPointNode epNode : entryPointNodes ) {
-            if ( epNode.getEntryPoint().getEntryPointId() == "DEFAULT" ) {
-                defaultEntryPointNode = epNode;
-                break;
-            }
-        }
-        assertNotNull( defaultEntryPointNode );
-
-        Map<ObjectType, ObjectTypeNode> obnodes = defaultEntryPointNode.getObjectTypeNodes();
-
-        ObjectType key = new ClassObjectType( DroolsQuery.class );
-        ObjectTypeNode droolsQueryNode = obnodes.get( key );
-        ObjectHashSet droolsQueryMemory = (ObjectHashSet) abstractWorkingMemory.getNodeMemory( droolsQueryNode );
-        assertEquals( 0,
-                      droolsQueryMemory.size() );
-
-        Entry[] entries = droolsQueryMemory.getTable();
-        int entryCounter = 0;
-        for ( Entry entry : entries ) {
-            if ( entry != null ) {
-                entryCounter++;
-                ObjectEntry oEntry = (ObjectEntry) entry;
-                DefaultFactHandle factHandle = (DefaultFactHandle) oEntry.getValue();
-                assertNull( factHandle.getObject() );
-            }
-        }
-    }
-
     public void testJBRules2140() {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newClassPathResource( "test_JBRules2140.drl",
@@ -7338,8 +6901,7 @@
         // XXX: Fails here, this worked in revision 30833
         ksession.insert( new Pet("Toni") );
     }
-
-    
+   
     public void testSharedLIANodeRemoval() throws IOException, DroolsParserException {
         String str = "global java.util.List list;\n";
         str += "rule \"test\"\n";
@@ -7375,4 +6937,5 @@
         assertEquals(1, list.size() );
         
     }
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,566 @@
+package org.drools.integrationtests;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.Cheese;
+import org.drools.FactHandle;
+import org.drools.InsertedObject;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.Person;
+import org.drools.QueryResult;
+import org.drools.QueryResults;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.Worker;
+import org.drools.WorkingMemory;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderErrors;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.common.AbstractWorkingMemory;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.compiler.PackageBuilder;
+import org.drools.core.util.Entry;
+import org.drools.core.util.ObjectHashSet;
+import org.drools.core.util.ObjectHashMap.ObjectEntry;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.ResourceFactory;
+import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.rule.Package;
+import org.drools.rule.Variable;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+import org.drools.spi.ObjectType;
+
+import junit.framework.TestCase;
+
+public class QueryTest extends TestCase {
+    protected RuleBase getRuleBase() throws Exception {
+
+        RuleBaseConfiguration config = new RuleBaseConfiguration();
+        config.setMultithreadEvaluation( false );
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+    
+
+    public void testQuery() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "simple_query_test.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+
+        //ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        final Cheese stilton = new Cheese( "stinky",
+                                           5 );
+        session.insert( stilton );
+        //        session = SerializationHelper.getSerialisedStatefulSession( session,
+        //                                                                    ruleBase );
+        final QueryResults results = session.getQueryResults( "simple query" );
+        assertEquals( 1,
+                      results.size() );
+
+    }
+    
+    public void testQuery2() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Query.drl" ) ) );
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        workingMemory.fireAllRules();
+
+        final QueryResults results = workingMemory.getQueryResults( "assertedobjquery" );
+        assertEquals( 1,
+                      results.size() );
+        assertEquals( new InsertedObject( "value1" ),
+                      results.get( 0 ).get( 0 ) );
+    }
+
+    public void testQueryWithParams() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_QueryWithParams.drl" ) ) );
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        workingMemory.fireAllRules();
+
+        QueryResults results = workingMemory.getQueryResults( "assertedobjquery",
+                                                              new String[]{"value1"} );
+        assertEquals( 1,
+                      results.size() );
+        assertEquals( new InsertedObject( "value1" ),
+                      results.get( 0 ).get( 0 ) );
+
+        results = workingMemory.getQueryResults( "assertedobjquery",
+                                                 new String[]{"value3"} );
+        assertEquals( 0,
+                      results.size() );
+
+        results = workingMemory.getQueryResults( "assertedobjquery2",
+                                                 new String[]{null, "value2"} );
+        assertEquals( 1,
+                      results.size() );
+        assertEquals( new InsertedObject( "value2" ),
+                      results.get( 0 ).get( 0 ) );
+
+        results = workingMemory.getQueryResults( "assertedobjquery2",
+                                                 new String[]{"value3", "value2"} );
+        assertEquals( 1,
+                      results.size() );
+        assertEquals( new InsertedObject( "value2" ),
+                      results.get( 0 ).get( 0 ) );
+    }
+
+    public void testQueryWithParamsOnKnowledgeApi() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_QueryWithParams.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        ksession.fireAllRules();
+
+        org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "assertedobjquery",
+                                                                                 new String[]{"value1"} );
+        assertEquals( 1,
+                      results.size() );
+        //        assertEquals( new InsertedObject( "value1" ),
+        //                      results.get( 0 ).get( 0 ) );
+
+        results = ksession.getQueryResults( "assertedobjquery",
+                                            new String[]{"value3"} );
+        assertEquals( 0,
+                      results.size() );
+
+        results = ksession.getQueryResults( "assertedobjquery2",
+                                            new String[]{null, "value2"} );
+        assertEquals( 1,
+                      results.size() );
+
+        assertEquals( new InsertedObject( "value2" ),
+                      ((org.drools.runtime.rule.QueryResultsRow) results.iterator().next()).get( "assertedobj" ) );
+
+        results = ksession.getQueryResults( "assertedobjquery2",
+                                            new String[]{"value3", "value2"} );
+        assertEquals( 1,
+                      results.size() );
+        assertEquals( new InsertedObject( "value2" ),
+                      ((org.drools.runtime.rule.QueryResultsRow) results.iterator().next()).get( "assertedobj" ) );
+    }
+
+    public void testQueryWithMultipleResultsOnKnowledgeApi() throws Exception {
+        String str = "";
+        str += "package org.drools.test  \n";
+        str += "import org.drools.Cheese \n";
+        str += "query cheeses \n";
+        str += "    stilton : Cheese(type == 'stilton') \n";
+        str += "    cheddar : Cheese(type == 'cheddar', price == stilton.price) \n";
+        str += "end\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        Cheese stilton1 = new Cheese( "stilton",
+                                      1 );
+        Cheese cheddar1 = new Cheese( "cheddar",
+                                      1 );
+        Cheese stilton2 = new Cheese( "stilton",
+                                      2 );
+        Cheese cheddar2 = new Cheese( "cheddar",
+                                      2 );
+        Cheese stilton3 = new Cheese( "stilton",
+                                      3 );
+        Cheese cheddar3 = new Cheese( "cheddar",
+                                      3 );
+
+        Set set = new HashSet();
+        List list = new ArrayList();
+        list.add( stilton1 );
+        list.add( cheddar1 );
+        set.add( list );
+
+        list = new ArrayList();
+        list.add( stilton2 );
+        list.add( cheddar2 );
+        set.add( list );
+
+        list = new ArrayList();
+        list.add( stilton3 );
+        list.add( cheddar3 );
+        set.add( list );
+
+        ksession.insert( stilton1 );
+        ksession.insert( stilton2 );
+        ksession.insert( stilton3 );
+        ksession.insert( cheddar1 );
+        ksession.insert( cheddar2 );
+        ksession.insert( cheddar3 );
+
+        org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "cheeses" );
+        assertEquals( 3,
+                      results.size() );
+        assertEquals( 2,
+                      results.getIdentifiers().length );
+        Set newSet = new HashSet();
+        for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
+            list = new ArrayList();
+            list.add( result.get( "stilton" ) );
+            list.add( result.get( "cheddar" ) );
+            newSet.add( list );
+        }
+        assertEquals( set,
+                      newSet );
+
+        FlatQueryResults flatResults = new FlatQueryResults( ((StatefulKnowledgeSessionImpl) ksession).session.getQueryResults( "cheeses" ) );
+        assertEquals( 3,
+                      flatResults.size() );
+        assertEquals( 2,
+                      flatResults.getIdentifiers().length );
+        newSet = new HashSet();
+        for ( org.drools.runtime.rule.QueryResultsRow result : flatResults ) {
+            list = new ArrayList();
+            list.add( result.get( "stilton" ) );
+            list.add( result.get( "cheddar" ) );
+            newSet.add( list );
+        }
+        assertEquals( set,
+                      newSet );
+    }
+
+    public void testTwoQuerries() throws Exception {
+        // @see JBRULES-410 More than one Query definition causes an incorrect
+        // Rete network to be built.
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_TwoQuerries.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final Cheese stilton = new Cheese( "stinky",
+                                           5 );
+        workingMemory.insert( stilton );
+        final Person per1 = new Person( "stinker",
+                                        "smelly feet",
+                                        70 );
+        final Person per2 = new Person( "skunky",
+                                        "smelly armpits",
+                                        40 );
+
+        workingMemory.insert( per1 );
+        workingMemory.insert( per2 );
+
+        QueryResults results = workingMemory.getQueryResults( "find stinky cheeses" );
+        assertEquals( 1,
+                      results.size() );
+
+        results = workingMemory.getQueryResults( "find pensioners" );
+        assertEquals( 1,
+                      results.size() );
+    }
+    
+    public void testDoubleQueryWithExists() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DoubleQueryWithExists.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final Person p1 = new Person( "p1",
+                                      "stilton",
+                                      20 );
+        p1.setStatus( "europe" );
+        final FactHandle c1FactHandle = workingMemory.insert( p1 );
+        final Person p2 = new Person( "p2",
+                                      "stilton",
+                                      30 );
+        p2.setStatus( "europe" );
+        final FactHandle c2FactHandle = workingMemory.insert( p2 );
+        final Person p3 = new Person( "p3",
+                                      "stilton",
+                                      40 );
+        p3.setStatus( "europe" );
+        final FactHandle c3FactHandle = workingMemory.insert( p3 );
+        workingMemory.fireAllRules();
+
+        QueryResults queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 2,
+                      queryResults.size() );
+
+        // europe=[ 1, 2 ], america=[ 3 ]
+        p3.setStatus( "america" );
+        workingMemory.update( c3FactHandle,
+                              p3 );
+        workingMemory.fireAllRules();
+        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 1,
+                      queryResults.size() );
+
+        // europe=[ 1 ], america=[ 2, 3 ]
+        p2.setStatus( "america" );
+        workingMemory.update( c2FactHandle,
+                              p2 );
+        workingMemory.fireAllRules();
+        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 1,
+                      queryResults.size() );
+
+        // europe=[ ], america=[ 1, 2, 3 ]
+        p1.setStatus( "america" );
+        workingMemory.update( c1FactHandle,
+                              p1 );
+        workingMemory.fireAllRules();
+        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 2,
+                      queryResults.size() );
+
+        // europe=[ 2 ], america=[ 1, 3 ]
+        p2.setStatus( "europe" );
+        workingMemory.update( c2FactHandle,
+                              p2 );
+        workingMemory.fireAllRules();
+        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 1,
+                      queryResults.size() );
+
+        // europe=[ 1, 2 ], america=[ 3 ]
+        p1.setStatus( "europe" );
+        workingMemory.update( c1FactHandle,
+                              p1 );
+        workingMemory.fireAllRules();
+        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 1,
+                      queryResults.size() );
+
+        // europe=[ 1, 2, 3 ], america=[ ]
+        p3.setStatus( "europe" );
+        workingMemory.update( c3FactHandle,
+                              p3 );
+        workingMemory.fireAllRules();
+        queryResults = workingMemory.getQueryResults( "2 persons with the same status" );
+        assertEquals( 2,
+                      queryResults.size() );
+    }
+    
+    public void testQueryWithCollect() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Query.drl" ) ) );
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        workingMemory.fireAllRules();
+
+        final QueryResults results = workingMemory.getQueryResults( "collect objects" );
+        assertEquals( 1,
+                      results.size() );
+
+        final QueryResult result = results.get( 0 );
+        final List list = (List) result.get( "$list" );
+
+        assertEquals( 2,
+                      list.size() );
+    }
+    
+    public void testDroolsQueryCleanup() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_QueryMemoryLeak.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if ( errors.size() > 0 ) {
+            for ( KnowledgeBuilderError error : errors ) {
+                System.err.println( error );
+            }
+            throw new IllegalArgumentException( "Could not parse knowledge." );
+        }
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        String workerId = "B1234";
+        Worker worker = new Worker();
+        worker.setId( workerId );
+
+        org.drools.runtime.rule.FactHandle handle = ksession.insert( worker );
+        ksession.fireAllRules();
+
+        assertNotNull( handle );
+
+        Object retractedWorker = null;
+        for ( int i = 0; i < 100; i++ ) {
+            retractedWorker = (Object) ksession.getQueryResults( "getWorker",
+                                                                 new Object[]{workerId} );
+        }
+
+        assertNotNull( retractedWorker );
+
+        StatefulKnowledgeSessionImpl sessionImpl = (StatefulKnowledgeSessionImpl) ksession;
+
+        ReteooWorkingMemory reteWorkingMemory = sessionImpl.session;
+        AbstractWorkingMemory abstractWorkingMemory = (AbstractWorkingMemory) reteWorkingMemory;
+
+        InternalRuleBase ruleBase = (InternalRuleBase) abstractWorkingMemory.getRuleBase();
+        Collection<EntryPointNode> entryPointNodes = ruleBase.getRete().getEntryPointNodes().values();
+
+        EntryPointNode defaultEntryPointNode = null;
+        for ( EntryPointNode epNode : entryPointNodes ) {
+            if ( epNode.getEntryPoint().getEntryPointId() == "DEFAULT" ) {
+                defaultEntryPointNode = epNode;
+                break;
+            }
+        }
+        assertNotNull( defaultEntryPointNode );
+
+        Map<ObjectType, ObjectTypeNode> obnodes = defaultEntryPointNode.getObjectTypeNodes();
+
+        ObjectType key = new ClassObjectType( DroolsQuery.class );
+        ObjectTypeNode droolsQueryNode = obnodes.get( key );
+        ObjectHashSet droolsQueryMemory = (ObjectHashSet) abstractWorkingMemory.getNodeMemory( droolsQueryNode );
+        assertEquals( 0,
+                      droolsQueryMemory.size() );
+
+        Entry[] entries = droolsQueryMemory.getTable();
+        int entryCounter = 0;
+        for ( Entry entry : entries ) {
+            if ( entry != null ) {
+                entryCounter++;
+                ObjectEntry oEntry = (ObjectEntry) entry;
+                DefaultFactHandle factHandle = (DefaultFactHandle) oEntry.getValue();
+                assertNull( factHandle.getObject() );
+            }
+        }
+    }    
+    
+    public void testQueriesWithVariableUnification() throws Exception {
+            String str = "";
+            str += "package org.drools.test  \n";
+            str += "import org.drools.Person \n";
+            str += "query peeps( String $name, String $likes, int $age ) \n";
+            str += "    $p : Person(name == $name, likes == $likes, age == $age) \n";
+            str += "end\n";
+
+            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+            kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                          ResourceType.DRL );
+
+            if ( kbuilder.hasErrors() ) {
+                fail( kbuilder.getErrors().toString() );
+            }
+
+            KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+            kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+            kbase = SerializationHelper.serializeObject( kbase );
+
+            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+            Person p1 = new Person( "darth", "stilton", 100 );
+            Person p2 = new Person( "yoda", "stilton", 300 );
+            Person p3 = new Person( "luke", "brie", 300 );
+            Person p4 = new Person( "bobba", "cheddar", 300 );
+            
+
+            ksession.insert( p1 );
+            ksession.insert( p2 );
+            ksession.insert( p3 );
+            ksession.insert( p4 );
+
+
+            //org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "peeps", new Object[] {"darth", "stilton", 100} );
+            //org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "peeps", new Object[] { new Variable(), "stilton", 300 } );
+            org.drools.runtime.rule.QueryResults results = ksession.getQueryResults( "peeps", new Object[] { new Variable(),new Variable(), 300 } );
+            System.out.println( Arrays.asList( results.getIdentifiers() ) );
+//            assertEquals( 4,
+//                          results.size() );
+            for ( org.drools.runtime.rule.QueryResultsRow row : results ) {
+                for ( String id : results.getIdentifiers() ) {
+                    System.out.print( row.get( id ) + ", " );
+                }
+                System.out.println();
+            }
+//            assertEquals( 1,
+//                          results.getIdentifiers().length );
+            
+            
+//            Set newSet = new HashSet();
+//            for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
+//                list = new ArrayList();
+//                list.add( result.get( "stilton" ) );
+//                list.add( result.get( "cheddar" ) );
+//                newSet.add( list );
+//            }
+//            assertEquals( set,
+//                          newSet );
+//
+//            FlatQueryResults flatResults = new FlatQueryResults( ((StatefulKnowledgeSessionImpl) ksession).session.getQueryResults( "cheeses" ) );
+//            assertEquals( 3,
+//                          flatResults.size() );
+//            assertEquals( 2,
+//                          flatResults.getIdentifiers().length );
+//            newSet = new HashSet();
+//            for ( org.drools.runtime.rule.QueryResultsRow result : flatResults ) {
+//                list = new ArrayList();
+//                list.add( result.get( "stilton" ) );
+//                list.add( result.get( "cheddar" ) );
+//                newSet.add( list );
+//            }
+//            assertEquals( set,
+//                          newSet );
+        }
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -41,7 +41,9 @@
 import org.drools.process.instance.event.SignalManager;
 import org.drools.process.instance.timer.TimerManager;
 import org.drools.reteoo.LIANodePropagation;
+import org.drools.reteoo.ObjectTypeConf;
 import org.drools.reteoo.PartitionTaskManager;
+import org.drools.rule.EntryPoint;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
 import org.drools.runtime.Calendars;
@@ -624,4 +626,18 @@
         return null;
     }
 
+    public EntryPoint getEntryPoint() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void insert(InternalFactHandle handle,
+                       Object object,
+                       Rule rule,
+                       Activation activation,
+                       ObjectTypeConf typeConf) {
+        // TODO Auto-generated method stub
+        
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-core/.classpath	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/.classpath	2010-04-07 22:30:27 UTC (rev 32475)
@@ -7,20 +7,18 @@
   <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/xml/bind/jaxb-api/2.0/jaxb-api-2.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/xml/bind/jsr173_api/1.0/jsr173_api-1.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.1.3/antlr-3.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.1.3/antlr-runtime-3.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"/>
   <classpathentry kind="src" path="/drools-api"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-impl/2.0.3/jaxb-impl-2.0.3.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-xjc/2.0.3/jaxb-xjc-2.0.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/4.6/junit-4.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mockito/mockito-all/1.8.2/mockito-all-1.8.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/felix/org.osgi.compendium/1.4.0/org.osgi.compendium-1.4.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/felix/org.osgi.core/1.4.0/org.osgi.core-1.4.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/trunk/drools-core/META-INF/MANIFEST.MF	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/META-INF/MANIFEST.MF	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,287 +1,6 @@
 Manifest-Version: 1.0
-Export-Package: org.drools.audit.event;version="5.1.0.SNAPSHOT",org.dr
- ools.process.instance.context.swimlane;uses:="org.drools.process.core
- .context.swimlane,org.drools.process.instance.context,org.drools.proc
- ess.core";version="5.1.0.SNAPSHOT",org.drools.base.dataproviders;uses
- :="org.mvel2.integration,org.drools.base.mvel,org.mvel2,org.drools.ru
- le,org.drools,org.drools.spi,org.drools.core.util";version="5.1.0.SNA
- PSHOT",org.drools.process.core.impl;uses:="org.drools.process.core,or
- g.drools.process.core.datatype,org.drools.process.core.context";versi
- on="5.1.0.SNAPSHOT",org.drools.builder.conf.impl;version="5.1.0.SNAPS
- HOT",org.drools;uses:="org.drools.spi,org.drools.time.impl,org.drools
- .time,org.drools.rule,org.drools.common,org.drools.workflow.instance.
- impl,org.drools.process.core.impl,org.drools.process.instance.impl,or
- g.drools.runtime.rule.impl,org.drools.process.instance,org.drools.con
- flict,org.drools.process.core.datatype,org.mvel2,org.drools.process.c
- ore,org.drools.core.util,org.drools.concurrent,org.drools.event,org.d
- rools.process.instance.event,org.drools.command,org.drools.process.in
- stance.timer";version="5.1.0.SNAPSHOT",org.drools.command.assertion;u
- ses:="org.mvel2,org.drools.command,org.drools.core.util,org.drools.co
- mmand.impl";version="5.1.0.SNAPSHOT",org.drools.workflow.instance.con
- text;uses:="org.drools.process.instance,org.drools.workflow.instance,
- org.drools.process.instance.impl,org.drools.process.instance.context,
- org.drools.process.core";version="5.1.0.SNAPSHOT",org.drools.type;ver
- sion="5.1.0.SNAPSHOT",org.drools.workflow.core;uses:="org.drools.spi,
- org.drools.process.core";version="5.1.0.SNAPSHOT",org.drools.workflow
- .core.impl;uses:="org.drools.workflow.core,org.drools.process.core,or
- g.drools.workflow.core.node,org.drools.process.core.impl";version="5.
- 1.0.SNAPSHOT",org.drools.process.core.validation;version="5.1.0.SNAPS
- HOT",org.drools.command.runtime.process;uses:="javax.xml.bind.annotat
- ion,org.drools.command,org.drools.command.impl,org.drools.process.ins
- tance,org.drools.xml.jaxb.util,javax.xml.bind.annotation.adapters";ve
- rsion="5.1.0.SNAPSHOT",org.drools.runtime.pipeline.impl;uses:="org.dr
- ools.runtime.pipeline,org.drools.command,org.drools.command.runtime.r
- ule,org.mvel2,org.mvel2.compiler,org.drools.common,org.drools.impl,or
- g.drools.rule,org.drools";version="5.1.0.SNAPSHOT",org.drools.conflic
- t;uses:="org.drools.spi,org.drools.rule,org.drools.common";version="5
- .1.0.SNAPSHOT",org.drools.time.impl;uses:="org.drools.time,org.drools
- .common,org.drools";version="5.1.0.SNAPSHOT",org.drools.process.insta
- nce.impl.humantask;uses:="javax.swing,javax.swing.event,javax.swing.b
- order";version="5.1.0.SNAPSHOT",org.drools.process.core.datatype.impl
- ;uses:="org.drools.process.core.datatype";version="5.1.0.SNAPSHOT",or
- g.drools.rule;uses:="org.drools.common,org.drools.spi,org.drools,org.
- drools.core.util,org.drools.base,org.mvel2.integration.impl,org.mvel2
- .integration,org.mvel2.ast,org.drools.base.mvel,org.drools.factmodel,
- org.drools.facttemplates,org.drools.time.impl,org.drools.marshalling.
- impl,org.drools.time";version="5.1.0.SNAPSHOT",org.drools.process.ins
- tance.context;uses:="org.drools.process.instance,org.drools.process.c
- ore";version="5.1.0.SNAPSHOT",org.drools.spi;uses:="org.drools.base,o
- rg.drools.common,org.drools.rule,org.drools,org.drools.core.util,org.
- drools.time,org.drools.concurrent,org.drools.facttemplates,org.drools
- .process.core.context.variable,org.drools.impl,org.drools.process.ins
- tance,org.drools.process.instance.context.variable,org.drools.workflo
- w.instance,org.drools.event";version="5.1.0.SNAPSHOT",org.drools.time
- ;uses:="org.drools.rule,org.drools,org.drools.time.impl";version="5.1
- .0.SNAPSHOT",org.drools.xml;uses:="org.xml.sax,org.drools.xml.changes
- et,javax.xml.parsers,org.w3c.dom,org.xml.sax.helpers,org.drools";vers
- ion="5.1.0.SNAPSHOT",org.drools.process.core.context.exception;uses:=
- "org.drools.workflow.core,org.drools.process.core.context,org.drools.
- process.core";version="5.1.0.SNAPSHOT",org.drools.base.field;uses:="o
- rg.drools,org.drools.spi,org.drools.common,org.drools.core.util";vers
- ion="5.1.0.SNAPSHOT",org.drools.base.extractors;uses:="org.drools.com
- mon,org.drools.base,org.drools.spi,org.drools.core.util,org.drools,or
- g.mvel2,org.mvel2.compiler";version="5.1.0.SNAPSHOT",org.drools.audit
- ;uses:="org.drools.event,org.drools.audit.event,org.drools,com.though
- tworks.xstream,org.drools.impl,org.drools.workflow.instance.node,org.
- drools.workflow.core.node,org.drools.common,org.drools.rule,org.drool
- s.workflow.instance,org.drools.command,org.drools.spi,org.drools.comm
- and.impl";version="5.1.0.SNAPSHOT",org.drools.osgi.core;uses:="org.dr
- ools.io.impl,org.drools.impl,org.drools,org.osgi.framework";version="
- 5.1.0.SNAPSHOT",org.drools.impl;uses:="org.drools,org.drools.definiti
- ons.rule.impl,org.drools.event.knowlegebase.impl,org.drools.event,org
- .drools.rule,org.drools.definitions.impl,org.drools.common,org.drools
- .command,org.drools.agent,org.drools.command.impl,org.drools.event.ru
- le.impl,org.drools.spi,org.drools.event.process.impl,org.drools.runti
- me.impl,org.drools.runtime.rule.impl,org.drools.process.instance.even
- t,org.drools.process.instance,org.drools.time,org.drools.base,org.dro
- ols.command.runtime.rule,org.drools.agent.impl,org.drools.core.util";
- version="5.1.0.SNAPSHOT",org.drools.event.knowlegebase.impl;uses:="or
- g.drools";version="5.1.0.SNAPSHOT",org.drools.ruleflow.core;uses:="or
- g.drools.ruleflow.core.factory,org.drools.workflow.core,org.drools.wo
- rkflow.core.impl,org.drools.workflow.core.node,org.drools.process.cor
- e.context.variable,org.drools.process.core.context.exception,org.droo
- ls.process.core.context.swimlane,org.drools.process.core,org.drools.p
- rocess.core.validation,org.drools.process.core.datatype,org.drools.ru
- leflow.core.validation";version="5.1.0.SNAPSHOT",org.drools.workflow.
- instance.impl;uses:="org.drools.workflow.instance.node,org.drools.wor
- kflow.core,org.drools,org.drools.workflow.core.impl,org.drools.common
- ,org.drools.process.instance,org.drools.base,org.drools.workflow.inst
- ance,org.drools.process.instance.context.exception,org.drools.spi,org
- .drools.workflow.instance.impl.factory,org.drools.workflow.core.node,
- org.drools.event,org.drools.process.core,org.mvel2.integration.impl,o
- rg.mvel2.integration,org.drools.process.instance.context.variable,org
- .drools.process.instance.impl,org.drools.process.instance.event";vers
- ion="5.1.0.SNAPSHOT",org.drools.process.core.context.swimlane;uses:="
- org.drools.process.core.context,org.drools.process.core";version="5.1
- .0.SNAPSHOT",org.drools.ruleflow.core.factory;uses:="org.drools.rulef
- low.core,org.drools.workflow.core.node,org.drools.workflow.core,org.d
- rools.workflow.core.impl,org.drools.process.core.context.variable,org
- .drools.process.core.context.exception,org.drools.process.core.dataty
- pe,org.drools.process.core,org.drools.process.core.event,org.drools.p
- rocess.core.timer,org.drools.process.core.impl";version="5.1.0.SNAPSH
- OT",org.drools.event.rule.impl;uses:="org.drools.common,org.drools.ev
- ent,org.drools,org.drools.spi,org.drools.impl";version="5.1.0.SNAPSHO
- T",org.drools.workflow.core.node;uses:="org.drools.workflow.core,org.
- drools.workflow.core.impl,org.drools.process.core.context,org.drools.
- process.core.impl,org.drools.process.core,org.drools.process.core.eve
- nt,org.drools.process.core.context.variable,org.drools.process.core.d
- atatype,org.drools.process.core.datatype.impl.type,org.drools.process
- .core.timer";version="5.1.0.SNAPSHOT",org.drools.core.util.debug;uses
- :="org.drools.common,org.drools.core.util,org.drools.rule,org.drools.
- impl,org.drools,org.mvel2.integration.impl,org.mvel2.templates,org.mv
- el2.integration,org.mvel2.optimizers,org.mvel2.compiler";version="5.1
- .0.SNAPSHOT",org.drools.base.evaluators;uses:="org.drools.common,org.
- drools.base,org.drools.rule,org.drools,org.drools.spi,org.drools.time
- ,org.drools.core.util,org.drools.type,org.mvel2.util";version="5.1.0.
- SNAPSHOT",org.drools.process.core.event;version="5.1.0.SNAPSHOT",org.
- drools.definitions.impl;uses:="org.drools.definitions.rule.impl,org.d
- rools.rule";version="5.1.0.SNAPSHOT",org.drools.process.instance.even
- t;uses:="org.drools.common,org.drools.process.instance,org.drools.mar
- shalling.impl,org.drools";version="5.1.0.SNAPSHOT",org.drools.process
- .instance;uses:="org.drools.process.core.context.variable,org.drools.
- common,org.drools.process.instance.context.variable,org.drools,org.dr
- ools.process.core,org.drools.ruleflow.core,org.drools.ruleflow.instan
- ce";version="5.1.0.SNAPSHOT",org.drools.command.builder;uses:="org.dr
- ools.command,org.drools.command.impl,org.drools.runtime.impl";version
- ="5.1.0.SNAPSHOT",org.drools.xml.jaxb.util;uses:="javax.xml.bind.anno
- tation.adapters,javax.xml.bind.annotation";version="5.1.0.SNAPSHOT",o
- rg.drools.command.runtime;uses:="org.drools.command,org.drools.comman
- d.impl,org.drools.command.runtime.process,javax.xml.bind.annotation,o
- rg.drools.command.runtime.rule,org.drools.impl,org.drools.runtime.imp
- l,org.drools";version="5.1.0.SNAPSHOT",org.drools.process.instance.co
- ntext.variable;uses:="org.drools.common,org.drools.process.core.conte
- xt.variable,org.drools.process.instance,org.drools.event,org.drools,o
- rg.drools.process.instance.context,org.drools.process.core";version="
- 5.1.0.SNAPSHOT",org.drools.ruleflow.core.validation;uses:="org.drools
- .process.core.timer,org.drools.process.core.context.variable,org.droo
- ls.ruleflow.core,org.drools.workflow.core.node,org.drools,org.drools.
- process.core.validation.impl,org.drools.workflow.core,org.drools.work
- flow.core.impl,org.drools.process.core.validation,org.drools.process.
- core.datatype,org.mvel2,org.mvel2.compiler,org.drools.time,org.drools
- .process.core";version="5.1.0.SNAPSHOT",org.drools.process.instance.c
- ontext.exception;uses:="org.drools.common,org.drools.process.core.con
- text.exception,org.drools.process.instance,org.drools.base,org.drools
- .workflow.instance,org.drools,org.drools.workflow.core,org.drools.spi
- ,org.drools.process.instance.context,org.drools.process.core";version
- ="5.1.0.SNAPSHOT",org.drools.command;uses:="org.drools.command.impl,o
- rg.drools.runtime.impl,org.drools.time,org.drools";version="5.1.0.SNA
- PSHOT",org.drools.management;uses:="org.drools.common,javax.managemen
- t,org.drools,javax.management.openmbean,org.drools.base,org.drools.sp
- i,org.drools.event,org.drools.rule";version="5.1.0.SNAPSHOT",org.droo
- ls.process.core.context.variable;uses:="org.drools.process.core.datat
- ype.impl.type,org.drools.process.core.datatype,org.drools.process.cor
- e,org.drools.process.core.context";version="5.1.0.SNAPSHOT",org.drool
- s.process.core.timer;version="5.1.0.SNAPSHOT",org.drools.io.impl;uses
- :="org.drools.io.internal,org.drools,org.drools.core.util";version="5
- .1.0.SNAPSHOT",org.drools.definitions.rule.impl;uses:="org.drools.rul
- e";version="5.1.0.SNAPSHOT",org.drools.core.util.asm;uses:="org.mvel2
- .asm,org.drools,org.mvel2.asm.util";version="5.1.0.SNAPSHOT",org.droo
- ls.workflow.instance.node;uses:="org.drools.workflow.instance.impl,or
- g.drools.workflow.core.node,org.drools,org.drools.workflow.core,org.d
- rools.common,org.drools.process.instance,org.drools.base,org.drools.w
- orkflow.instance,org.drools.spi,org.drools.process.instance.impl,org.
- drools.process.core,org.drools.event,org.drools.process.instance.cont
- ext.variable,org.drools.process.core.event,org.drools.process.instanc
- e.context.exception,org.mvel2.integration,org.mvel2,org.drools.proces
- s.instance.context.swimlane,org.drools.rule,org.drools.process.core.t
- imer,org.drools.process.instance.timer,org.drools.time";version="5.1.
- 0.SNAPSHOT",org.drools.event;uses:="org.drools.rule,org.drools.spi,or
- g.drools,org.drools.common,org.drools.process.instance";version="5.1.
- 0.SNAPSHOT",org.drools.base.mvel;uses:="org.mvel2.integration,org.dro
- ols,org.drools.common,org.mvel2.integration.impl,org.mvel2,org.drools
- .rule,org.drools.spi,org.mvel2.compiler,org.drools.type,org.drools.co
- re.util,org.drools.base,org.mvel2.debug";version="5.1.0.SNAPSHOT",org
- .drools.event.process.impl;uses:="org.drools.event,org.drools,org.dro
- ols.common";version="5.1.0.SNAPSHOT",org.drools.process.instance.impl
- ;uses:="org.drools.process.instance,org.drools.process.core,org.drool
- s.process.core.context.exception,org.drools.process.core.context.vari
- able,org.drools.process.instance.context.swimlane,org.drools.process.
- core.context.swimlane,org.drools.process.instance.impl.factory,org.dr
- ools.process.instance.context.variable,org.drools.process.instance.co
- ntext.exception,org.drools,org.drools.common";version="5.1.0.SNAPSHOT
- ",org.drools.runtime.impl;uses:="javax.xml.bind.annotation,org.drools
- .command,org.drools.command.impl,org.drools.xml.jaxb.util,javax.xml.b
- ind.annotation.adapters";version="5.1.0.SNAPSHOT",org.drools.base.acc
- umulators;uses:="org.drools.common,org.drools.rule,org.drools,org.dro
- ols.spi,org.mvel2.integration,org.drools.base.mvel,org.mvel2";version
- ="5.1.0.SNAPSHOT",org.drools.process.core.validation.impl;uses:="org.
- drools.process.core.validation";version="5.1.0.SNAPSHOT",org.drools.r
- untime.rule.impl;uses:="org.drools.common,org.drools.spi,org.drools.x
- ml.jaxb.util,javax.xml.bind.annotation,org.drools.rule,org.drools,jav
- ax.xml.bind.annotation.adapters";version="5.1.0.SNAPSHOT",org.drools.
- process.instance.timer;uses:="org.drools.time,org.drools.process.inst
- ance.event,org.drools,org.drools.process.instance,org.drools.time.imp
- l";version="5.1.0.SNAPSHOT",org.drools.facttemplates;uses:="org.drool
- s.rule,org.drools.common,org.drools.base,org.drools,org.drools.spi,or
- g.drools.core.util";version="5.1.0.SNAPSHOT",org.drools.base;uses:="o
- rg.drools.event,org.drools,org.drools.spi,org.drools.concurrent,org.d
- rools.common,org.drools.core.util.asm,org.drools.core.util,org.drools
- .base.evaluators,org.drools.time,org.drools.base.extractors,org.mvel2
- .asm,org.drools.rule,org.drools.impl,org.drools.base.field,org.drools
- .type,org.mvel2.integration,org.drools.base.mvel,org.mvel2.ast,org.mv
- el2.compiler,org.drools.facttemplates";version="5.1.0.SNAPSHOT",org.d
- rools.process.core.datatype;version="5.1.0.SNAPSHOT",org.drools.workf
- low.instance;uses:="org.drools.process.instance,org.drools.impl,org.d
- rools.workflow.instance.impl,org.drools,org.drools.workflow.core.impl
- ,org.drools.common,org.drools.process.core";version="5.1.0.SNAPSHOT",
- org.drools.visualize;version="5.1.0.SNAPSHOT",org.drools.process.core
- ;uses:="org.drools.process.core.datatype";version="5.1.0.SNAPSHOT",or
- g.drools.core.util;uses:="org.drools.common,org.drools.rule,org.drool
- s.spi,org.drools,org.drools.type";version="5.1.0.SNAPSHOT",org.drools
- .process.core.datatype.impl.type;uses:="org.drools.process.core.datat
- ype,org.drools.process.core,com.thoughtworks.xstream";version="5.1.0.
- SNAPSHOT",org.drools.factmodel;uses:="org.mvel2.asm,org.drools.base,c
- om.thoughtworks.xstream.io,com.thoughtworks.xstream.io.xml,com.though
- tworks.xstream";version="5.1.0.SNAPSHOT",org.drools.ruleflow.instance
- ;uses:="org.drools.ruleflow.core,org.drools.workflow.instance.impl,or
- g.drools.workflow.core.node,org.drools.workflow.instance,org.drools.p
- rocess.instance";version="5.1.0.SNAPSHOT",org.drools.marshalling.impl
- ;uses:="org.drools.process.instance.context.swimlane,org.drools.workf
- low.instance.impl,org.drools.workflow.instance.node,org.drools.common
- ,org.drools.process.instance,org.drools.process.instance.context.vari
- able,org.drools.workflow.instance,org.drools.process.core,org.drools.
- core.util,org.drools.impl,org.drools,org.drools.spi,org.drools.concur
- rent,org.drools.process.instance.impl,org.drools.process.instance.tim
- er,org.drools.base,org.drools.rule,org.drools.process.instance.event,
- org.drools.ruleflow.instance";version="5.1.0.SNAPSHOT",org.drools.com
- mon;uses:="org.drools.spi,org.drools.rule,org.drools.impl,org.drools.
- event,org.drools,org.drools.base,org.drools.process.core,org.drools.m
- anagement,org.drools.core.util,org.drools.process.instance.event,org.
- drools.process.instance,org.drools.process.core.event,org.drools.runt
- ime.impl,org.drools.type,org.drools.process.instance.timer,org.drools
- .time,org.drools.ruleflow.core,org.drools.workflow.core.node,org.droo
- ls.concurrent,org.drools.base.evaluators,javax.xml.bind.annotation,or
- g.drools.facttemplates,org.drools.marshalling.impl,org.drools.time.im
- pl";version="5.1.0.SNAPSHOT",org.drools.process.core.context;uses:="o
- rg.drools.process.core";version="5.1.0.SNAPSHOT",org.drools.process.i
- nstance.impl.demo;uses:="org.drools.process.instance,javax.swing,java
- x.swing.event";version="5.1.0.SNAPSHOT",org.drools.agent.impl;uses:="
- org.drools,org.drools.spi,org.drools.rule,org.drools.agent,org.drools
- .core.util,org.drools.definitions.impl,org.drools.io.impl,org.drools.
- impl,org.drools.common,org.drools.io.internal,org.drools.process.core
- ,org.drools.xml";version="5.1.0.SNAPSHOT",org.drools.process.instance
- .impl.factory;uses:="org.drools.process.instance,org.drools.process.i
- nstance.impl,org.drools.process.instance.context,org.drools.process.c
- ore";version="5.1.0.SNAPSHOT",org.drools.workflow.instance.impl.facto
- ry;uses:="org.drools.workflow.instance.impl,org.drools.workflow.insta
- nce";version="5.1.0.SNAPSHOT",org.drools.runtime.pipeline;version="5.
- 1.0.SNAPSHOT",org.drools.agent;uses:="org.drools,org.drools.rule,org.
- drools.core.util,org.drools.definitions.impl,org.drools.agent.impl,or
- g.drools.common";version="5.1.0.SNAPSHOT",org.drools.command.runtime.
- rule;uses:="org.drools.command,org.drools.command.impl,org.drools.imp
- l,org.drools,org.drools.spi,javax.xml.bind.annotation,org.drools.runt
- ime.impl,org.drools.common,org.mvel2";version="5.1.0.SNAPSHOT",org.dr
- ools.io.internal;version="5.1.0.SNAPSHOT",org.drools.runtime.help.imp
- l;uses:="org.drools.command.runtime.process,com.thoughtworks.xstream.
- io,com.thoughtworks.xstream.converters,com.thoughtworks.xstream.mappe
- r,org.drools.command,com.thoughtworks.xstream.converters.collections,
- org.drools.common,org.drools.runtime.impl,org.drools.command.runtime.
- rule,org.drools.command.runtime,org.drools.runtime.rule.impl,org.droo
- ls.base,org.drools.rule,org.drools.spi,com.thoughtworks.xstream";vers
- ion="5.1.0.SNAPSHOT",org.drools.xml.changeset;uses:="org.drools.io.im
- pl,org.drools,org.w3c.dom,org.xml.sax,org.drools.xml,org.drools.build
- er.conf.impl,org.drools.io.internal,org.drools.core.util";version="5.
- 1.0.SNAPSHOT",org.drools.command.impl;uses:="org.drools.command,org.d
- rools.command.runtime.process,org.drools.command.runtime.rule,org.dro
- ols.impl,org.drools,org.drools.command.runtime,org.drools.rule,org.dr
- ools.time,org.drools.runtime.impl";version="5.1.0.SNAPSHOT",org.drool
- s.concurrent;uses:="org.drools,org.drools.spi";version="5.1.0.SNAPSHO
- T"
-Private-Package: org.drools.reteoo;version="5.1.0.SNAPSHOT",.;version=
- "5.1.0.SNAPSHOT",org.drools.reteoo.compiled;version="5.1.0.SNAPSHOT",
- org.drools.reteoo.builder;version="5.1.0.SNAPSHOT"
-Tool: Bnd-0.0.357
-Bundle-Name: Drools :: Core
-Created-By: 1.6.0_18 (Sun Microsystems Inc.)
-Require-Bundle: org.drools.api;visibility:=reexport;bundle-version="5.
- 1.0.SNAPSHOT"
-Bundle-Vendor: JBoss Inc.
-DynamicImport-Package: *
-Bundle-Version: 5.1.0.SNAPSHOT
-Bnd-LastModified: 1266695717368
 Bundle-Activator: org.drools.osgi.core.Activator
-Bundle-ManifestVersion: 2
-Bundle-Description: A rule production system
+Created-By: 1.5.0_21 (Sun Microsystems Inc.)
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
 Import-Package: com.thoughtworks.xstream,com.thoughtworks.xstream.conv
  erters,com.thoughtworks.xstream.converters.collections,com.thoughtwor
@@ -294,7 +13,287 @@
  rsion="2.0",org.mvel2.integration;version="2.0",org.mvel2.integration
  .impl;version="2.0",org.mvel2.optimizers;version="2.0",org.mvel2.temp
  lates;version="2.0",org.mvel2.util;version="2.0",org.osgi.framework;v
- ersion="1.5",org.w3c.dom,org.xml.sax,org.xml.sax.helpers
-Bundle-SymbolicName: org.drools.core;singleton:=true
+ ersion="1.5",org.w3c.dom,org.xml.sax,org.xml.sax.helpers,sun.misc
+Bnd-LastModified: 1267407378178
+Export-Package: org.drools.process.instance.context.swimlane;uses:="or
+ g.drools.process.core.context.swimlane,org.drools.process.core,org.dr
+ ools.process.instance.context";version="5.1.0.SNAPSHOT",org.drools.pr
+ ocess.core.timer;version="5.1.0.SNAPSHOT",org.drools.ruleflow.core.va
+ lidation;uses:="org.mvel2.compiler,org.drools.process.core.timer,org.
+ drools.process.core.validation,org.drools.process.core.datatype,org.d
+ rools.workflow.core.node,org.drools.process.core.context.variable,org
+ .drools.workflow.core.impl,org.mvel2,org.drools.time,org.drools,org.d
+ rools.process.core.validation.impl,org.drools.ruleflow.core,org.drool
+ s.process.core,org.drools.workflow.core";version="5.1.0.SNAPSHOT",org
+ .drools.ruleflow.instance;uses:="org.drools.workflow.instance.impl,or
+ g.drools.workflow.instance,org.drools.ruleflow.core,org.drools.workfl
+ ow.core.node,org.drools.process.instance";version="5.1.0.SNAPSHOT",or
+ g.drools.workflow.core.node;uses:="org.drools.workflow.core.impl,org.
+ drools.workflow.core,org.drools.process.core.context,org.drools.proce
+ ss.core,org.drools.process.core.impl,org.drools.process.core.event,or
+ g.drools.process.core.datatype,org.drools.process.core.context.variab
+ le,org.drools.process.core.datatype.impl.type,org.drools.process.core
+ .timer";version="5.1.0.SNAPSHOT",org.drools.core.util.asm;uses:="org.
+ mvel2.asm,org.drools,org.mvel2.asm.util";version="5.1.0.SNAPSHOT",org
+ .drools.command.runtime.process;uses:="org.drools.command,org.drools.
+ command.impl,javax.xml.bind.annotation,org.drools.process.instance,or
+ g.drools.xml.jaxb.util,javax.xml.bind.annotation.adapters";version="5
+ .1.0.SNAPSHOT",org.drools.process.instance.event;uses:="org.drools.ma
+ rshalling.impl,org.drools.process.instance,org.drools.common,org.droo
+ ls";version="5.1.0.SNAPSHOT",org.drools.osgi.core;uses:="org.drools,o
+ rg.drools.impl,org.osgi.framework,org.drools.io.impl";version="5.1.0.
+ SNAPSHOT",org.drools.ruleflow.core.factory;uses:="org.drools.workflow
+ .core.impl,org.drools.ruleflow.core,org.drools.workflow.core.node,org
+ .drools.workflow.core,org.drools.process.core,org.drools.process.core
+ .datatype,org.drools.process.core.context.exception,org.drools.proces
+ s.core.context.variable,org.drools.process.core.event,org.drools.proc
+ ess.core.timer,org.drools.process.core.impl";version="5.1.0.SNAPSHOT"
+ ,org.drools.marshalling.impl;uses:="org.drools.workflow.instance.impl
+ ,org.drools.process.instance.context.swimlane,org.drools.process.inst
+ ance,org.drools.workflow.instance.node,org.drools.workflow.instance,o
+ rg.drools.process.core,org.drools.process.instance.context.variable,o
+ rg.drools.common,org.drools.core.util,org.drools.impl,org.drools.conc
+ urrent,org.drools,org.drools.spi,org.drools.process.instance.timer,or
+ g.drools.base,org.drools.rule,org.drools.process.instance.impl,org.dr
+ ools.process.instance.event,org.drools.ruleflow.instance";version="5.
+ 1.0.SNAPSHOT",org.drools.time;uses:="org.drools.rule,org.drools,org.d
+ rools.time.impl";version="5.1.0.SNAPSHOT",org.drools.workflow.core.im
+ pl;uses:="org.drools.workflow.core,org.drools.process.core,org.drools
+ .workflow.core.node,org.drools.process.core.impl";version="5.1.0.SNAP
+ SHOT",org.drools.io.internal;version="5.1.0.SNAPSHOT",org.drools.proc
+ ess.instance.impl.demo;uses:="org.drools.process.instance,javax.swing
+ .event,javax.swing";version="5.1.0.SNAPSHOT",org.drools.rule;uses:="o
+ rg.drools.spi,org.drools.common,org.drools,org.drools.core.util,org.d
+ rools.base,org.mvel2.ast,org.mvel2.integration,org.mvel2.integration.
+ impl,org.drools.base.mvel,org.drools.facttemplates,org.drools.factmod
+ el,org.drools.time.impl,org.drools.marshalling.impl,org.drools.time";
+ version="5.1.0.SNAPSHOT",org.drools.process.core.event;version="5.1.0
+ .SNAPSHOT",org.drools.event.knowlegebase.impl;uses:="org.drools";vers
+ ion="5.1.0.SNAPSHOT",org.drools.conflict;uses:="org.drools.spi,org.dr
+ ools.rule,org.drools.common";version="5.1.0.SNAPSHOT",org.drools.proc
+ ess.core.context.exception;uses:="org.drools.workflow.core,org.drools
+ .process.core.context,org.drools.process.core";version="5.1.0.SNAPSHO
+ T",org.drools.process.instance.context.variable;uses:="org.drools.eve
+ nt,org.drools,org.drools.process.core,org.drools.process.instance,org
+ .drools.process.core.context.variable,org.drools.process.instance.con
+ text,org.drools.common";version="5.1.0.SNAPSHOT",org.drools.audit;use
+ s:="org.drools.event,org.drools,org.drools.audit.event,com.thoughtwor
+ ks.xstream,org.drools.impl,org.drools.workflow.core.node,org.drools.c
+ ommand,org.drools.workflow.instance.node,org.drools.workflow.instance
+ ,org.drools.rule,org.drools.spi,org.drools.command.impl,org.drools.co
+ mmon";version="5.1.0.SNAPSHOT",org.drools.base.extractors;uses:="org.
+ drools.base,org.drools.spi,org.drools.core.util,org.drools.common,org
+ .drools,org.mvel2,org.mvel2.compiler";version="5.1.0.SNAPSHOT",org.dr
+ ools.process.core.context;uses:="org.drools.process.core";version="5.
+ 1.0.SNAPSHOT",org.drools.workflow.instance.impl.factory;uses:="org.dr
+ ools.workflow.instance.impl,org.drools.workflow.instance";version="5.
+ 1.0.SNAPSHOT",org.drools.core.util.debug;uses:="org.drools.common,org
+ .drools.core.util,org.drools.rule,org.drools,org.drools.impl,org.mvel
+ 2.integration,org.mvel2.compiler,org.mvel2.optimizers,org.mvel2.integ
+ ration.impl,org.mvel2.templates";version="5.1.0.SNAPSHOT",org.drools.
+ process.instance;uses:="org.drools,org.drools.process.core,org.drools
+ .process.core.context.variable,org.drools.process.instance.context.va
+ riable,org.drools.common,org.drools.ruleflow.instance,org.drools.rule
+ flow.core";version="5.1.0.SNAPSHOT",org.drools.process.core.context.v
+ ariable;uses:="org.drools.process.core.datatype,org.drools.process.co
+ re,org.drools.process.core.datatype.impl.type,org.drools.process.core
+ .context";version="5.1.0.SNAPSHOT",org.drools.event.rule.impl;uses:="
+ org.drools.event,org.drools,org.drools.spi,org.drools.common,org.droo
+ ls.impl";version="5.1.0.SNAPSHOT",org.drools.command.builder;uses:="o
+ rg.drools.command,org.drools.command.impl,org.drools.runtime.impl";ve
+ rsion="5.1.0.SNAPSHOT",org.drools.runtime.pipeline;version="5.1.0.SNA
+ PSHOT",org.drools.base.accumulators;uses:="org.drools,org.drools.rule
+ ,org.drools.spi,org.drools.common,org.mvel2,org.mvel2.integration,org
+ .drools.base.mvel";version="5.1.0.SNAPSHOT",org.drools.event;uses:="o
+ rg.drools.rule,org.drools.spi,org.drools,org.drools.common,org.drools
+ .process.instance";version="5.1.0.SNAPSHOT",org.drools.definitions.ru
+ le.impl;uses:="org.drools.rule";version="5.1.0.SNAPSHOT",org.drools.x
+ ml;uses:="org.xml.sax,org.drools.xml.changeset,javax.xml.parsers,org.
+ xml.sax.helpers,org.w3c.dom,org.drools";version="5.1.0.SNAPSHOT",org.
+ drools.facttemplates;uses:="org.drools.rule,org.drools.base,org.drool
+ s,org.drools.spi,org.drools.core.util,org.drools.common";version="5.1
+ .0.SNAPSHOT",org.drools.base.field;uses:="org.drools,org.drools.spi,o
+ rg.drools.core.util,org.drools.common";version="5.1.0.SNAPSHOT",org.d
+ rools.runtime.rule.impl;uses:="org.drools.spi,org.drools.common,org.d
+ rools,org.drools.rule,org.drools.xml.jaxb.util,javax.xml.bind.annotat
+ ion.adapters,javax.xml.bind.annotation";version="5.1.0.SNAPSHOT",org.
+ drools.process.core.context.swimlane;uses:="org.drools.process.core.c
+ ontext,org.drools.process.core";version="5.1.0.SNAPSHOT",org.drools.c
+ oncurrent;uses:="org.drools,org.drools.spi";version="5.1.0.SNAPSHOT",
+ org.drools.ruleflow.core;uses:="org.drools.workflow.core.impl,org.dro
+ ols.workflow.core,org.drools.ruleflow.core.factory,org.drools.workflo
+ w.core.node,org.drools.process.core.context.swimlane,org.drools.proce
+ ss.core,org.drools.process.core.context.exception,org.drools.process.
+ core.context.variable,org.drools.ruleflow.core.validation,org.drools.
+ process.core.validation,org.drools.process.core.datatype";version="5.
+ 1.0.SNAPSHOT",org.drools.type;version="5.1.0.SNAPSHOT",org.drools.cor
+ e.util;uses:="org.drools.rule,org.drools.spi,org.drools.common,org.dr
+ ools,org.drools.type";version="5.1.0.SNAPSHOT",org.drools.agent;uses:
+ ="org.drools,org.drools.rule,org.drools.definitions.impl,org.drools.c
+ ore.util,sun.misc,org.drools.agent.impl,org.drools.common";version="5
+ .1.0.SNAPSHOT",org.drools.time.impl;uses:="org.drools.time,org.drools
+ ,org.drools.common";version="5.1.0.SNAPSHOT",org.drools.event.process
+ .impl;uses:="org.drools.event,org.drools,org.drools.common";version="
+ 5.1.0.SNAPSHOT",org.drools.common;uses:="org.drools.spi,org.drools.ru
+ le,org.drools.impl,org.drools.event,org.drools.management,org.drools.
+ base,org.drools,org.drools.process.core,org.drools.core.util,org.droo
+ ls.process.instance.event,org.drools.process.core.event,org.drools.pr
+ ocess.instance,org.drools.workflow.core.node,org.drools.time,org.droo
+ ls.runtime.impl,org.drools.process.instance.timer,org.drools.concurre
+ nt,org.drools.ruleflow.core,org.drools.type,org.drools.base.evaluator
+ s,javax.xml.bind.annotation,org.drools.facttemplates,org.drools.marsh
+ alling.impl,org.drools.time.impl";version="5.1.0.SNAPSHOT",org.drools
+ .workflow.instance.impl;uses:="org.drools.workflow.instance.node,org.
+ drools.workflow.core,org.drools.process.instance.context.exception,or
+ g.drools.process.instance,org.drools.workflow.core.impl,org.drools.ba
+ se,org.drools.workflow.instance,org.drools,org.drools.spi,org.drools.
+ common,org.drools.workflow.instance.impl.factory,org.drools.workflow.
+ core.node,org.drools.event,org.drools.process.core,org.mvel2.integrat
+ ion,org.mvel2.integration.impl,org.drools.process.instance.context.va
+ riable,org.drools.process.instance.event,org.drools.process.instance.
+ impl";version="5.1.0.SNAPSHOT",org.drools.base.evaluators;uses:="org.
+ drools.time,org.drools.base,org.drools,org.drools.rule,org.drools.spi
+ ,org.drools.common,org.drools.core.util,org.drools.type,org.mvel2.uti
+ l";version="5.1.0.SNAPSHOT",org.drools.impl;uses:="org.drools,org.dro
+ ols.event,org.drools.definitions.rule.impl,org.drools.rule,org.drools
+ .definitions.impl,org.drools.event.knowlegebase.impl,org.drools.comma
+ nd,org.drools.command.impl,org.drools.agent,org.drools.common,org.dro
+ ols.spi,org.drools.event.rule.impl,org.drools.event.process.impl,org.
+ drools.runtime.impl,org.drools.process.instance,org.drools.process.in
+ stance.event,org.drools.time,org.drools.runtime.rule.impl,org.drools.
+ base,org.drools.command.runtime.rule,org.drools.agent.impl,org.drools
+ .core.util";version="5.1.0.SNAPSHOT",org.drools.definitions.impl;uses
+ :="org.drools.definitions.rule.impl,org.drools.rule";version="5.1.0.S
+ NAPSHOT",org.drools.audit.event;version="5.1.0.SNAPSHOT",org.drools.p
+ rocess.core.datatype;version="5.1.0.SNAPSHOT",org.drools.process.inst
+ ance.context;uses:="org.drools.process.core,org.drools.process.instan
+ ce";version="5.1.0.SNAPSHOT",org.drools.command;uses:="org.drools.com
+ mand.impl,org.drools.runtime.impl,org.drools.time,org.drools";version
+ ="5.1.0.SNAPSHOT",org.drools.management;uses:="javax.management,org.d
+ rools.common,org.drools,org.drools.base,org.drools.spi,javax.manageme
+ nt.openmbean,org.drools.event,org.drools.rule";version="5.1.0.SNAPSHO
+ T",org.drools.base;uses:="org.drools.event,org.drools.concurrent,org.
+ drools,org.drools.spi,org.drools.core.util.asm,org.drools.core.util,o
+ rg.drools.common,org.drools.time,org.drools.base.evaluators,org.drool
+ s.base.extractors,org.mvel2.asm,org.drools.rule,org.drools.impl,org.d
+ rools.base.field,org.drools.type,org.mvel2.ast,org.mvel2.integration,
+ org.drools.base.mvel,org.drools.facttemplates";version="5.1.0.SNAPSHO
+ T",org.drools;uses:="org.drools.spi,org.drools.time,org.drools.time.i
+ mpl,org.drools.rule,org.drools.common,org.drools.workflow.instance.im
+ pl,org.drools.process.core.datatype,org.drools.process.instance,org.m
+ vel2,org.drools.runtime.rule.impl,org.drools.concurrent,org.drools.pr
+ ocess.core,org.drools.conflict,org.drools.process.core.impl,org.drool
+ s.core.util,org.drools.process.instance.impl,org.drools.event,org.dro
+ ols.process.instance.event,org.drools.command,org.drools.process.inst
+ ance.timer";version="5.1.0.SNAPSHOT",org.drools.command.assertion;use
+ s:="org.drools.command,org.mvel2,org.drools.command.impl,org.drools.c
+ ore.util";version="5.1.0.SNAPSHOT",org.drools.agent.impl;uses:="org.d
+ rools,org.drools.spi,org.drools.rule,org.drools.definitions.impl,org.
+ drools.core.util,org.drools.agent,org.drools.impl,org.drools.xml,org.
+ drools.io.internal,org.drools.process.core,org.drools.io.impl,org.dro
+ ols.common";version="5.1.0.SNAPSHOT",org.drools.spi;uses:="org.drools
+ .base,org.drools,org.drools.rule,org.drools.common,org.drools.core.ut
+ il,org.drools.time,org.drools.concurrent,org.drools.facttemplates,org
+ .drools.workflow.instance,org.drools.impl,org.drools.process.instance
+ ,org.drools.process.core.context.variable,org.drools.process.instance
+ .context.variable,org.drools.event";version="5.1.0.SNAPSHOT",org.droo
+ ls.xml.jaxb.util;uses:="javax.xml.bind.annotation.adapters,javax.xml.
+ bind.annotation";version="5.1.0.SNAPSHOT",org.drools.process.core.imp
+ l;uses:="org.drools.process.core,org.drools.process.core.datatype,org
+ .drools.process.core.context";version="5.1.0.SNAPSHOT",org.drools.pro
+ cess.instance.impl.humantask;uses:="javax.swing.event,javax.swing,jav
+ ax.swing.border";version="5.1.0.SNAPSHOT",org.drools.workflow.core;us
+ es:="org.drools.spi,org.drools.process.core";version="5.1.0.SNAPSHOT"
+ ,org.drools.visualize;version="5.1.0.SNAPSHOT",org.drools.runtime.imp
+ l;uses:="org.drools.command,org.drools.command.impl,javax.xml.bind.an
+ notation,org.drools.xml.jaxb.util,javax.xml.bind.annotation.adapters"
+ ;version="5.1.0.SNAPSHOT",org.drools.builder.conf.impl;version="5.1.0
+ .SNAPSHOT",org.drools.workflow.instance.context;uses:="org.drools.wor
+ kflow.instance,org.drools.process.instance,org.drools.process.core,or
+ g.drools.process.instance.impl,org.drools.process.instance.context";v
+ ersion="5.1.0.SNAPSHOT",org.drools.process.core.validation;version="5
+ .1.0.SNAPSHOT",org.drools.process.instance.context.exception;uses:="o
+ rg.drools.base,org.drools.workflow.instance,org.drools,org.drools.spi
+ ,org.drools.process.instance,org.drools.process.core.context.exceptio
+ n,org.drools.workflow.core,org.drools.common,org.drools.process.core,
+ org.drools.process.instance.context";version="5.1.0.SNAPSHOT",org.dro
+ ols.xml.changeset;uses:="org.drools.xml,org.xml.sax,org.drools,org.w3
+ c.dom,org.drools.io.impl,org.drools.io.internal,org.drools.builder.co
+ nf.impl,org.drools.core.util";version="5.1.0.SNAPSHOT",org.drools.pro
+ cess.instance.timer;uses:="org.drools.time,org.drools,org.drools.proc
+ ess.instance.event,org.drools.process.instance,org.drools.time.impl";
+ version="5.1.0.SNAPSHOT",org.drools.base.dataproviders;uses:="org.mve
+ l2,org.mvel2.integration,org.drools,org.drools.rule,org.drools.spi,or
+ g.drools.base.mvel,org.drools.core.util";version="5.1.0.SNAPSHOT",org
+ .drools.process.instance.impl.factory;uses:="org.drools.process.core,
+ org.drools.process.instance,org.drools.process.instance.impl,org.droo
+ ls.process.instance.context";version="5.1.0.SNAPSHOT",org.drools.work
+ flow.instance;uses:="org.drools.process.instance,org.drools.workflow.
+ instance.impl,org.drools.impl,org.drools.workflow.core.impl,org.drool
+ s,org.drools.process.core,org.drools.common";version="5.1.0.SNAPSHOT"
+ ,org.drools.workflow.instance.node;uses:="org.drools.workflow.instanc
+ e.impl,org.drools.workflow.core.node,org.drools.process.instance,org.
+ drools.base,org.drools.workflow.instance,org.drools,org.drools.spi,or
+ g.drools.workflow.core,org.drools.common,org.drools.process.core,org.
+ drools.process.instance.impl,org.drools.event,org.drools.process.core
+ .event,org.drools.process.instance.context.variable,org.drools.proces
+ s.instance.context.exception,org.mvel2,org.mvel2.integration,org.droo
+ ls.process.instance.context.swimlane,org.drools.rule,org.drools.proce
+ ss.core.timer,org.drools.process.instance.timer,org.drools.time";vers
+ ion="5.1.0.SNAPSHOT",org.drools.process.core.validation.impl;uses:="o
+ rg.drools.process.core.validation";version="5.1.0.SNAPSHOT",org.drool
+ s.factmodel;uses:="org.mvel2.asm,org.drools.base,com.thoughtworks.xst
+ ream.io,com.thoughtworks.xstream.io.xml,com.thoughtworks.xstream";ver
+ sion="5.1.0.SNAPSHOT",org.drools.base.mvel;uses:="org.mvel2.integrati
+ on,org.mvel2.integration.impl,org.mvel2,org.drools,org.drools.rule,or
+ g.drools.spi,org.drools.common,org.mvel2.compiler,org.drools.type,org
+ .drools.core.util,org.drools.base,org.mvel2.debug";version="5.1.0.SNA
+ PSHOT",org.drools.process.core;uses:="org.drools.process.core.datatyp
+ e";version="5.1.0.SNAPSHOT",org.drools.command.impl;uses:="org.drools
+ .command,org.drools.command.runtime.process,org.drools.command.runtim
+ e.rule,org.drools.impl,org.drools.time,org.drools,org.drools.rule,org
+ .drools.command.runtime,org.drools.runtime.impl";version="5.1.0.SNAPS
+ HOT",org.drools.io.impl;uses:="org.drools.io.internal,org.drools,org.
+ drools.core.util";version="5.1.0.SNAPSHOT",org.drools.runtime.help.im
+ pl;uses:="org.drools.command,com.thoughtworks.xstream.io,com.thoughtw
+ orks.xstream.mapper,com.thoughtworks.xstream.converters.collections,o
+ rg.drools.command.runtime.process,com.thoughtworks.xstream.converters
+ ,org.drools.runtime.impl,org.drools.common,org.drools.command.runtime
+ .rule,org.drools.command.runtime,org.drools.base,org.drools.runtime.r
+ ule.impl,org.drools.rule,org.drools.spi,com.thoughtworks.xstream";ver
+ sion="5.1.0.SNAPSHOT",org.drools.process.core.datatype.impl;uses:="or
+ g.drools.process.core.datatype";version="5.1.0.SNAPSHOT",org.drools.p
+ rocess.core.datatype.impl.type;uses:="org.drools.process.core.datatyp
+ e,org.drools.process.core,com.thoughtworks.xstream";version="5.1.0.SN
+ APSHOT",org.drools.process.instance.impl;uses:="org.drools.process.co
+ re,org.drools.process.instance,org.drools.process.instance.context.sw
+ imlane,org.drools.process.core.context.swimlane,org.drools.process.in
+ stance.context.exception,org.drools.process.instance.impl.factory,org
+ .drools.process.core.context.exception,org.drools.process.core.contex
+ t.variable,org.drools.process.instance.context.variable,org.drools,or
+ g.drools.common";version="5.1.0.SNAPSHOT",org.drools.runtime.pipeline
+ .impl;uses:="org.drools.runtime.pipeline,org.drools.command,org.drool
+ s.command.runtime.rule,org.mvel2,org.mvel2.compiler,org.drools.common
+ ,org.drools,org.drools.impl,org.drools.rule";version="5.1.0.SNAPSHOT"
+ ,org.drools.command.runtime.rule;uses:="org.drools.command,org.drools
+ .command.impl,org.drools,org.drools.impl,org.drools.spi,org.drools.ru
+ ntime.impl,javax.xml.bind.annotation,org.drools.common,org.mvel2";ver
+ sion="5.1.0.SNAPSHOT",org.drools.command.runtime;uses:="org.drools.co
+ mmand,org.drools.command.impl,org.drools.command.runtime.process,java
+ x.xml.bind.annotation,org.drools.command.runtime.rule,org.drools.runt
+ ime.impl,org.drools.impl,org.drools";version="5.1.0.SNAPSHOT"
+Bundle-Version: 5.1.0.SNAPSHOT
+Bundle-Name: Drools :: Core
+Bundle-Description: A rule production system
+Private-Package: org.drools.reteoo.builder;version="5.1.0.SNAPSHOT",or
+ g.drools.reteoo.compiled;version="5.1.0.SNAPSHOT",org.drools.reteoo;v
+ ersion="5.1.0.SNAPSHOT",.;version="5.1.0.SNAPSHOT"
 Bundle-DocURL: http://www.jboss.org/
+Bundle-Vendor: JBoss Inc.
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.drools.core
+Tool: Bnd-0.0.357
+Require-Bundle: org.drools.api;visibility:=reexport;bundle-version="5.
+ 1.0.SNAPSHOT"
+DynamicImport-Package: *
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -25,6 +25,8 @@
 import org.drools.WorkingMemory;
 import org.drools.spi.Tuple;
 
+import com.sun.xml.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
+
 public class QueryResult {
 
     protected FactHandle[] factHandles;
@@ -58,7 +60,7 @@
      *     The Object
      */
     public Object get(final int i) {
-        return getObject( this.factHandles[ i ]);
+        return getObject( this.factHandles[ i + 1]); // Add one, as we hide root DroolsQuery
     }
 
     /** 
@@ -86,7 +88,7 @@
     }
     
     public FactHandle getFactHandle(Declaration declr) {
-        return this.factHandles[  declr.getPattern().getOffset() -1 ]; // -1 because we shifted the array left
+        return this.factHandles[  declr.getPattern().getOffset() ]; // -1 because we shifted the array left
                                                                        // when removing the query object
     }     
 
@@ -95,7 +97,11 @@
      * @return
      */
     public FactHandle[] getFactHandles() {
-        return this.factHandles;
+        int size = size();
+        FactHandle[] subArray = new FactHandle[ size];
+        
+        System.arraycopy( this.factHandles, 1, subArray, 0, size );
+        return subArray;
     }
 
     /**
@@ -103,7 +109,7 @@
      * @return
      */
     public int size() {
-        return this.factHandles.length;
+        return this.factHandles.length -1;
     }
     
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,4 +1,5 @@
 package org.drools;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -15,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -29,30 +31,40 @@
  * get a specific row. All the available Declarations used in the query can also be accessed.
  *
  */
-public class QueryResults implements Iterable<QueryResult>{
-    private Query           query;
-
+public class QueryResults
+    implements
+    Iterable<QueryResult> {
     private Map<String, Declaration> declarations;
 
-    protected List<FactHandle[]> results;
-    protected WorkingMemory workingMemory;
-    
+    protected List<FactHandle[]>     results;
+    protected WorkingMemory          workingMemory;
+
     public QueryResults() {
-	}
+    }
 
     public QueryResults(final List<FactHandle[]> results,
-                        final Query query,
+                        final Declaration[] declArray,
                         final WorkingMemory workingMemory) {
         this.results = results;
-        this.query = query;
         this.workingMemory = workingMemory;
+
+        if ( declArray.length > 0 ) {
+            final Map<String, Declaration> map = new HashMap<String, Declaration>( declArray.length );
+            for ( int i = 0, length = declArray.length; i < length; i++ ) {
+                map.put( declArray[i].getIdentifier(),
+                         declArray[i] );
+            }
+            this.declarations = map;
+        } else {
+            this.declarations = Collections.emptyMap();
+        }
     }
 
     public QueryResult get(final int i) {
         if ( i > this.results.size() ) {
             throw new NoSuchElementException();
         }
-        return new QueryResult( this.results.get(i),
+        return new QueryResult( this.results.get( i ),
                                 this.workingMemory,
                                 this );
     }
@@ -66,23 +78,7 @@
         return new QueryResultsIterator( this.results.iterator() );
     }
 
-    /**
-     * Return a map of Declarations where the key is the identifier and the value
-     * is the Declaration.
-     * 
-     * @return
-     *      The Map of Declarations.
-     */
     public Map<String, Declaration> getDeclarations() {
-
-        final Declaration[] declarations = this.query.getDeclarations();
-        final Map<String, Declaration> map = new HashMap<String, Declaration>( declarations.length );
-        for ( int i = 0, length = declarations.length; i < length; i++ ) {
-            map.put( declarations[i].getIdentifier(),
-                     declarations[i] );
-        }
-        this.declarations = map;
-
         return this.declarations;
     }
 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/Arguments.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/Arguments.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/Arguments.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,47 @@
+package org.drools.base;
+
+import java.util.Arrays;
+
+
+public class Arguments {
+    private final Object[] args;
+    
+    private static final Object[] EMPTY_PARAMS = new Object[0];
+    
+    public Arguments() {
+        this(null);
+    }
+    
+    public Arguments(final Object[] params) {
+        if ( params != null ) {
+            this.args = params;
+        } else {
+            this.args = EMPTY_PARAMS;
+        }
+    }    
+    
+    public Object[] getArguments() {
+        return this.args;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Arrays.hashCode( args );
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        Arguments other = (Arguments) obj;
+        if ( !Arrays.equals( args,
+                             other.args ) ) return false;
+        return true;
+    }
+    
+    
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultQueryResultsCollector.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultQueryResultsCollector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultQueryResultsCollector.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,69 @@
+package org.drools.base;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.rule.Query;
+import org.drools.rule.Variable;
+import org.drools.spi.PropagationContext;
+
+public class DefaultQueryResultsCollector
+    implements
+    QueryResultCollector {
+
+    private List results;
+
+    public DefaultQueryResultsCollector() {
+        this.results = new ArrayList( 250 );
+    }
+
+    public List getResults() {
+        return this.results;
+    }
+
+    public void add(final LeftTuple tuple,
+                    final PropagationContext context,
+                    final InternalWorkingMemory workingMemory) {
+        InternalFactHandle[] handles = new InternalFactHandle[tuple.getIndex() + 1];
+        LeftTuple entry = tuple;
+
+        // Add all the FactHandles except the root DroolQuery object
+        while ( entry.getIndex() > 0 ) {
+            InternalFactHandle handle = entry.getLastHandle();
+            handles[entry.getIndex()] = new DisconnectedFactHandle( handle.getId(),
+                                                                    handle.getIdentityHashCode(),
+                                                                    handle.getObjectHashCode(),
+                                                                    handle.getRecency(),
+                                                                    handle.getObject() );
+            entry = entry.getParent();
+        }
+
+        // Get the Query object
+        InternalFactHandle handle = entry.getLastHandle();
+        DroolsQuery query = (DroolsQuery) handle.getObject();
+
+        // Copy of it's arguments for unification variables.
+        Object[] args = query.getArguments();
+        Object[] newArgs = new Object[args.length];
+        for ( int i = 0, length = args.length; i < length; i++ ) {
+            if ( args[i] instanceof Variable ) {
+                newArgs[i] = ((Variable) args[i]).getValue();
+            } else {
+                newArgs[i] = args[i];
+            }
+        }
+        handles[entry.getIndex()] = new DisconnectedFactHandle( handle.getId(),
+                                                                handle.getIdentityHashCode(),
+                                                                handle.getObjectHashCode(),
+                                                                handle.getRecency(),
+                                                                new Arguments( newArgs ) );
+
+        this.results.add( handles );
+
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,5 +1,11 @@
 package org.drools.base;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.rule.Query;
+import org.drools.rule.Variable;
+
 /*
  * Copyright 2005 JBoss Inc
  *
@@ -16,53 +22,61 @@
  * limitations under the License.
  */
 
-public final class DroolsQuery {
-    private final String name;
-    private final Object[] args;
+public final class DroolsQuery extends Arguments {
+    private final String         name;
+    private QueryResultCollector resultsCollector;
+    private Query                query;
 
-    private static final Object[] EMPTY_PARAMS = new Object[0];
-
-    public DroolsQuery(final String name) {
-        super();
-        this.name = name;
-        this.args = EMPTY_PARAMS;
+    public DroolsQuery(final String name,
+                       QueryResultCollector resultsCollector) {
+        this( name,
+              null,
+              resultsCollector );
     }
 
-    public DroolsQuery(final String name, final Object[] params) {
-        super();
+    public DroolsQuery(final String name,
+                       final Object[] params,
+                       QueryResultCollector resultsCollector) {
+        super( params );
         this.name = name;
-        if ( params != null ) {
-            this.args = params;
-        } else {
-            this.args = EMPTY_PARAMS;
-        }
+        this.resultsCollector = resultsCollector;
     }
 
     public String getName() {
         return this.name;
     }
 
-    public Object[] getArguments() {
-        return this.args;
+    public void setQuery(Query query) {
+        // this is set later, as we don't yet know which Query will match this DroolsQuery propagation
+        this.query = query;
     }
 
+    public Query getQuery() {
+        return this.query;
+    }
+
+    public QueryResultCollector getQueryResultCollector() {
+        return this.resultsCollector;
+    }
+
+    @Override
     public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + ((this.name == null) ? 0 : this.name.hashCode());
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
         return result;
     }
 
-    public boolean equals(final Object object) {
-        if ( this == object ) {
-            return true;
-        }
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( !super.equals( obj ) ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        DroolsQuery other = (DroolsQuery) obj;
+        if ( name == null ) {
+            if ( other.name != null ) return false;
+        } else if ( !name.equals( other.name ) ) return false;
+        return true;
+    }
 
-        if ( object == null || getClass() != object.getClass() ) {
-            return false;
-        }
-
-        final DroolsQuery other = (DroolsQuery) object;
-        return this.name.equals( other.name );
-    }
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/QueryResultCollector.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/QueryResultCollector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/QueryResultCollector.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,11 @@
+package org.drools.base;
+
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.spi.PropagationContext;
+
+public interface QueryResultCollector {
+    public void add(final LeftTuple tuple,
+                    final PropagationContext context,
+                    final InternalWorkingMemory workingMemory);
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -147,8 +147,6 @@
 
     protected ObjectStore                                        objectStore;
 
-    protected Map                                                queryResults;
-
     /** Global values which are associated with this memory. */
     protected GlobalResolver                                     globalResolver;
     
@@ -313,7 +311,6 @@
         this.actionQueue = new LinkedList<WorkingMemoryAction>();
 
         this.addRemovePropertyChangeListenerArgs = new Object[]{this};
-        this.queryResults = Collections.EMPTY_MAP;
         this.workingMemoryEventSupport = new WorkingMemoryEventSupport();
         this.agendaEventSupport = new AgendaEventSupport();
         this.workflowEventSupport = new RuleFlowEventSupport();
@@ -1105,7 +1102,7 @@
         return handle;
     }
 
-    protected void insert(final InternalFactHandle handle,
+    public void insert(final InternalFactHandle handle,
                           final Object object,
                           final Rule rule,
                           final Activation activation,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -121,12 +121,7 @@
     }
 
     private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
-        if ( constraint instanceof VariableConstraint ) {
-            final VariableConstraint variableConstraint = (VariableConstraint) constraint;
-            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
-        } else {
-            return false;
-        }
+        return SingleBetaConstraints.isIndexable( constraint );
     }
 
     /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -14,7 +14,9 @@
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.ProcessInstanceManager;
 import org.drools.reteoo.LIANodePropagation;
+import org.drools.reteoo.ObjectTypeConf;
 import org.drools.reteoo.PartitionTaskManager;
+import org.drools.rule.EntryPoint;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
 import org.drools.runtime.Calendars;
@@ -63,6 +65,14 @@
 
     public FactHandleFactory getFactHandleFactory();
     
+    public EntryPoint getEntryPoint();
+    
+    public void insert(final InternalFactHandle handle,
+                       final Object object,
+                       final Rule rule,
+                       final Activation activation,
+                       ObjectTypeConf typeConf);    
+    
     /**
      * Looks for the fact handle associated to the given object
      * by looking up the object IDENTITY (==), even if rule base

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -177,12 +177,7 @@
     }
 
     private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
-        if ( constraint instanceof VariableConstraint ) {
-            final VariableConstraint variableConstraint = (VariableConstraint) constraint;
-            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
-        } else {
-            return false;
-        }
+        return SingleBetaConstraints.isIndexable( constraint );
     }
 
     /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -33,6 +33,7 @@
 import org.drools.reteoo.LeftTupleMemory;
 import org.drools.reteoo.RightTupleMemory;
 import org.drools.rule.ContextEntry;
+import org.drools.rule.UnificationRestriction;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 
@@ -97,13 +98,15 @@
         out.writeObject(conf);
     }
 
-    private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
-        if ( constraint instanceof VariableConstraint ) {
+    public  static boolean isIndexable(final BetaNodeFieldConstraint constraint) {
+        if ( constraint instanceof VariableConstraint  ) {
             final VariableConstraint variableConstraint = (VariableConstraint) constraint;
-            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
-        } else {
-            return false;
-        }
+            if ( (!(variableConstraint.getRestriction() instanceof UnificationRestriction )) ) {
+                return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
+            }
+        } 
+        
+        return false;
     }
 
     public ContextEntry[] createContext() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -144,12 +144,7 @@
     }
 
     private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
-        if ( constraint instanceof VariableConstraint ) {
-            final VariableConstraint variableConstraint = (VariableConstraint) constraint;
-            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
-        } else {
-            return false;
-        }
+        return SingleBetaConstraints.isIndexable( constraint );
     }
 
     /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/debug/QueryTerminalNodeVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/debug/QueryTerminalNodeVisitor.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/debug/QueryTerminalNodeVisitor.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -25,10 +25,12 @@
             info.assign( snode, rule );
         }
 
-        final LinkedList<?> memory = (LinkedList<?>) info.getSession().getNodeMemory( rtn );
-        final DefaultNodeInfo ni = (DefaultNodeInfo) info.getNodeInfo( node );
-        ni.setMemoryEnabled( true );
-        ni.setTupleMemorySize( memory.size() );
+        // Query Terminal Nodes no longer have memory
+        // TODO delete this
+//        final LinkedList<?> memory = (LinkedList<?>) info.getSession().getNodeMemory( rtn );
+//        final DefaultNodeInfo ni = (DefaultNodeInfo) info.getNodeInfo( node );
+//        ni.setMemoryEnabled( true );
+//        ni.setTupleMemorySize( memory.size() );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NodeTypeEnums.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NodeTypeEnums.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NodeTypeEnums.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -12,4 +12,5 @@
     public static final short QueryTerminalNode    = 8;
     public static final short RuleTerminalNode     = 9;
     public static final short ForallNotNode        = 10;
+    public static final short UnificationNode      = 11;
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java (from rev 32260, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/UnificationNode.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,258 @@
+package org.drools.reteoo;
+
+import org.drools.QueryResults;
+import org.drools.RuleBaseConfiguration;
+import org.drools.base.DefaultQueryResultsCollector;
+import org.drools.base.DroolsQuery;
+import org.drools.base.QueryResultCollector;
+import org.drools.common.BaseNode;
+import org.drools.common.BetaConstraints;
+import org.drools.common.EmptyBetaConstraints;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.NodeMemory;
+import org.drools.common.PropagationContextImpl;
+import org.drools.core.util.Entry;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.rule.Declaration;
+import org.drools.rule.EntryPoint;
+import org.drools.rule.QueryElement;
+import org.drools.rule.Variable;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.DataProvider;
+import org.drools.spi.PropagationContext;
+
+public class QueryElementNode extends LeftTupleSource
+    implements
+    LeftTupleSinkNode {
+
+    private LeftTupleSource   tupleSource;
+
+    private LeftTupleSinkNode previousTupleSinkNode;
+    private LeftTupleSinkNode nextTupleSinkNode;
+
+    private QueryElement      queryElement;
+
+    private boolean           tupleMemoryEnabled;
+
+    public QueryElementNode(final int id,
+                            final LeftTupleSource tupleSource,
+                            final QueryElement queryElement,
+                            final boolean tupleMemoryEnabled,
+                            final BuildContext context) {
+        super( id,
+               context.getPartitionId(),
+               context.getRuleBase().getConfiguration().isMultithreadEvaluation() );
+        this.tupleSource = tupleSource;
+        this.queryElement = queryElement;
+        this.tupleMemoryEnabled = tupleMemoryEnabled;
+    }
+
+    public void updateSink(LeftTupleSink sink,
+                           PropagationContext context,
+                           InternalWorkingMemory workingMemory) {
+        // do nothing as we have no left memory
+    }
+
+    protected void doRemove(RuleRemovalContext context,
+                            ReteooBuilder builder,
+                            BaseNode node,
+                            InternalWorkingMemory[] workingMemories) {
+        context.visitTupleSource( this );
+        if ( !node.isInUse() ) {
+            removeTupleSink( (LeftTupleSink) node );
+        }
+
+        if ( !context.alreadyVisited( this.tupleSource ) ) {
+            this.tupleSource.remove( context,
+                                     builder,
+                                     this,
+                                     workingMemories );
+        }
+    }
+
+    public void attach() {
+        this.tupleSource.addTupleSink( this );
+    }
+
+    public void attach(InternalWorkingMemory[] workingMemories) {
+        attach();
+
+        for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+            final InternalWorkingMemory workingMemory = workingMemories[i];
+            final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
+                                                                                      PropagationContext.RULE_ADDITION,
+                                                                                      null,
+                                                                                      null,
+                                                                                      null );
+            this.tupleSource.updateSink( this,
+                                         propagationContext,
+                                         workingMemory );
+        }
+    }
+
+    public void networkUpdated() {
+        this.tupleSource.networkUpdated();
+    }
+
+    public void assertLeftTuple(LeftTuple leftTuple,
+                                PropagationContext context,
+                                InternalWorkingMemory workingMemory) {
+        Object[] arguments = this.queryElement.getArguments();
+        Object[] inputArgs = new Object[arguments.length];
+
+        System.arraycopy( arguments,
+                          0,
+                          inputArgs,
+                          0,
+                          inputArgs.length );
+
+        int[] declIndexes = this.queryElement.getDeclIndexes();
+
+        for ( int i = 0, length = declIndexes.length; i > length; i++ ) {
+            Declaration declr = (Declaration) arguments[declIndexes[i]];
+            inputArgs[i] = declr.getValue( workingMemory,
+                                           leftTuple.get( declr ).getObject() );
+        }
+
+        UnificationNodeQueryResultsCollector collector = new UnificationNodeQueryResultsCollector( leftTuple,
+                                                                                                   this.queryElement.getVariables(),
+                                                                                                   this.sink );
+        
+        DroolsQuery queryObject = new DroolsQuery( this.queryElement.getQueryName(),
+                                                   inputArgs,
+                                                   collector );
+        collector.setDroolsQuery( queryObject );
+
+        InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( queryObject,
+                                                                                        workingMemory.getObjectTypeConfigurationRegistry().getObjectTypeConf( EntryPoint.DEFAULT,
+                                                                                                                                                              queryObject ),
+                                                                                        workingMemory );
+
+        workingMemory.insert( handle,
+                              queryObject,
+                              null,
+                              null,
+                              workingMemory.getObjectTypeConfigurationRegistry().getObjectTypeConf( workingMemory.getEntryPoint(),
+                                                                                                    queryObject ) );
+
+        workingMemory.getFactHandleFactory().destroyFactHandle( handle );
+
+    }
+
+    public static class UnificationNodeQueryResultsCollector
+        implements
+        QueryResultCollector {
+
+        private LeftTuple                 leftTuple;
+        protected LeftTupleSinkPropagator sink;
+
+        private DroolsQuery               query;
+        private int[]                     variables;
+
+        public UnificationNodeQueryResultsCollector(LeftTuple leftTuple,
+                                                    int[] variables,
+                                                    LeftTupleSinkPropagator sink) {
+            this.leftTuple = leftTuple;
+            this.variables = variables;
+            this.sink = sink;
+        }
+
+        public void setDroolsQuery(DroolsQuery query) {
+            this.query = query;
+        }
+
+        public void add(LeftTuple resultLeftTuple,
+                        PropagationContext context,
+                        InternalWorkingMemory workingMemory) {
+
+            Object[] args = query.getArguments();
+            Object[] objects = new Object[this.variables.length];
+
+            for ( int i = 0, length = this.variables.length; i < length; i++ ) {
+                objects[i] = ((Variable) args[ this.variables[i]] ).getValue();
+            }
+
+            final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( objects,
+                                                                                                  null, // set this to null, otherwise it uses the driver fact's entrypoint
+                                                                                                  workingMemory );
+
+            RightTuple rightTuple = new RightTuple( handle,
+                                                    null );
+
+            this.sink.propagateAssertLeftTuple( this.leftTuple,
+                                                rightTuple,
+                                                null,
+                                                null,
+                                                context,
+                                                workingMemory,
+                                                false );
+        }
+
+    }
+
+    public short getType() {
+        return NodeTypeEnums.UnificationNode;
+    }
+
+    public boolean isLeftTupleMemoryEnabled() {
+        return false;
+    }
+
+    public void retractLeftTuple(LeftTuple leftTuple,
+                                 PropagationContext context,
+                                 InternalWorkingMemory workingMemory) {
+    }
+
+    public void modifyLeftTuple(LeftTuple leftTuple,
+                                PropagationContext context,
+                                InternalWorkingMemory workingMemory) {
+    }
+
+    public void modifyLeftTuple(InternalFactHandle factHandle,
+                                ModifyPreviousTuples modifyPreviousTuples,
+                                PropagationContext context,
+                                InternalWorkingMemory workingMemory) {
+    }
+
+    public void setLeftTupleMemoryEnabled(boolean tupleMemoryEnabled) {
+        this.tupleMemoryEnabled = tupleMemoryEnabled;
+    }
+
+    /**
+     * Returns the next node
+     * @return
+     *      The next TupleSinkNode
+     */
+    public LeftTupleSinkNode getNextLeftTupleSinkNode() {
+        return this.nextTupleSinkNode;
+    }
+
+    /**
+     * Sets the next node
+     * @param next
+     *      The next TupleSinkNode
+     */
+    public void setNextLeftTupleSinkNode(final LeftTupleSinkNode next) {
+        this.nextTupleSinkNode = next;
+    }
+
+    /**
+     * Returns the previous node
+     * @return
+     *      The previous TupleSinkNode
+     */
+    public LeftTupleSinkNode getPreviousLeftTupleSinkNode() {
+        return this.previousTupleSinkNode;
+    }
+
+    /**
+     * Sets the previous node
+     * @param previous
+     *      The previous TupleSinkNode
+     */
+    public void setPreviousLeftTupleSinkNode(final LeftTupleSinkNode previous) {
+        this.previousTupleSinkNode = previous;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -20,8 +20,11 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.LinkedList;
+import java.util.List;
 
 import org.drools.RuleBaseConfiguration;
+import org.drools.base.Arguments;
+import org.drools.base.DroolsQuery;
 import org.drools.common.BaseNode;
 import org.drools.common.DisconnectedFactHandle;
 import org.drools.common.InternalFactHandle;
@@ -30,7 +33,9 @@
 import org.drools.common.PropagationContextImpl;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.GroupElement;
+import org.drools.rule.Query;
 import org.drools.rule.Rule;
+import org.drools.rule.Variable;
 import org.drools.spi.PropagationContext;
 
 /**
@@ -44,7 +49,6 @@
 public final class QueryTerminalNode extends BaseNode
     implements
     LeftTupleSinkNode,
-    NodeMemory,
     TerminalNode {
     // ------------------------------------------------------------
     // Instance members
@@ -54,14 +58,13 @@
      *
      */
     private static final long serialVersionUID = 400L;
-    
-    public static final short type = 8;
-    
+
+    public static final short type             = 8;
+
     /** The rule to invoke upon match. */
     private Rule              rule;
     private GroupElement      subrule;
     private LeftTupleSource   tupleSource;
-    private boolean           tupleMemoryEnabled;
 
     private LeftTupleSinkNode previousTupleSinkNode;
     private LeftTupleSinkNode nextTupleSinkNode;
@@ -85,14 +88,13 @@
                              final LeftTupleSource source,
                              final Rule rule,
                              final GroupElement subrule,
-                             final BuildContext context ) {
+                             final BuildContext context) {
         super( id,
                context.getPartitionId(),
                context.getRuleBase().getConfiguration().isMultithreadEvaluation() );
         this.rule = rule;
         this.subrule = subrule;
         this.tupleSource = source;
-        this.tupleMemoryEnabled = false; //hard coded to false
     }
 
     // ------------------------------------------------------------
@@ -104,7 +106,6 @@
         rule = (Rule) in.readObject();
         subrule = (GroupElement) in.readObject();
         tupleSource = (LeftTupleSource) in.readObject();
-        tupleMemoryEnabled = in.readBoolean();
         previousTupleSinkNode = (LeftTupleSinkNode) in.readObject();
         nextTupleSinkNode = (LeftTupleSinkNode) in.readObject();
     }
@@ -114,7 +115,6 @@
         out.writeObject( rule );
         out.writeObject( subrule );
         out.writeObject( tupleSource );
-        out.writeBoolean( tupleMemoryEnabled );
         out.writeObject( previousTupleSinkNode );
         out.writeObject( nextTupleSinkNode );
     }
@@ -145,32 +145,29 @@
     public void assertLeftTuple(final LeftTuple tuple,
                                 final PropagationContext context,
                                 final InternalWorkingMemory workingMemory) {
-        final LinkedList list = (LinkedList) workingMemory.getNodeMemory( this );
-        if ( list.isEmpty() ) {
-            ((ReteooWorkingMemory) workingMemory).setQueryResults( this.rule.getName(),
-                                                                   this );
-        }
-        
-        InternalFactHandle[] handles = new InternalFactHandle[tuple.getIndex()]; // don't add one, as we adjust for root Query object
         LeftTuple entry = tuple;
-  
-        // miss out 0, which is the DroolsQuery object
-        while ( entry.getIndex() != 0 ) { 
-            InternalFactHandle handle  = entry.getLastHandle();
-            handles[entry.getIndex() - 1] = new DisconnectedFactHandle(handle.getId(), handle.getIdentityHashCode(), handle.getObjectHashCode(), handle.getRecency(), handle.getObject() );
+
+        // find the DroolsQuery object
+        while ( entry.getParent() != null ) {
             entry = entry.getParent();
         }
-        
-        list.add( handles );   
+        DroolsQuery query = (DroolsQuery) entry.getLastHandle().getObject();
+        query.setQuery( (Query) this.rule );
+
+        // Add results to the adapter
+        query.getQueryResultCollector().add( tuple,
+                                             context,
+                                             workingMemory );
     }
 
     public void retractLeftTuple(final LeftTuple tuple,
                                  final PropagationContext context,
                                  final InternalWorkingMemory workingMemory) {
+        throw new UnsupportedOperationException( "Querries should not result in this method being called" );
     }
 
     public String toString() {
-        return "[QueryTerminalNode("+this.getId()+"): rule=" + this.rule.getName() + "]";
+        return "[QueryTerminalNode(" + this.getId() + "): query=" + this.rule.getName() + "]";
     }
 
     public void ruleAttached() {
@@ -205,10 +202,6 @@
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-            workingMemories[i].clearNodeMemory( this );
-        }
-
         if ( !context.alreadyVisited( this.tupleSource ) ) {
             this.tupleSource.remove( context,
                                      builder,
@@ -226,16 +219,12 @@
         // There are no child nodes to update, do nothing.
     }
 
-    public Object createMemory(final RuleBaseConfiguration config) {
-        return new LinkedList();
-    }
-
     public boolean isLeftTupleMemoryEnabled() {
-        return tupleMemoryEnabled;
+        return false;
     }
 
     public void setLeftTupleMemoryEnabled(boolean tupleMemoryEnabled) {
-        this.tupleMemoryEnabled = tupleMemoryEnabled;
+        // do nothing, this can only ever be false
     }
 
     /**
@@ -280,7 +269,7 @@
     public void setNextLeftTupleSinkNode(final LeftTupleSinkNode next) {
         this.nextTupleSinkNode = next;
     }
-    
+
     public short getType() {
         return NodeTypeEnums.QueryTerminalNode;
     }
@@ -289,15 +278,13 @@
                                 ModifyPreviousTuples modifyPreviousTuples,
                                 PropagationContext context,
                                 InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
+        throw new UnsupportedOperationException( "Querries should not result in this method being called" );
     }
 
     public void modifyLeftTuple(LeftTuple leftTuple,
                                 PropagationContext context,
                                 InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
-    } 
+        throw new UnsupportedOperationException( "Querries should not result in this method being called" );
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -26,6 +26,7 @@
 
 import org.drools.QueryResults;
 import org.drools.SessionConfiguration;
+import org.drools.base.DefaultQueryResultsCollector;
 import org.drools.base.DroolsQuery;
 import org.drools.common.AbstractWorkingMemory;
 import org.drools.common.DefaultAgenda;
@@ -39,6 +40,7 @@
 import org.drools.impl.EnvironmentFactory;
 import org.drools.marshalling.impl.MarshallerReaderContext;
 import org.drools.marshalling.impl.MarshallerWriteContext;
+import org.drools.rule.Declaration;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.Package;
 import org.drools.rule.Query;
@@ -61,7 +63,7 @@
      *
      */
     private static final long serialVersionUID = 400L;
-    
+
     public ReteooWorkingMemory() {
         super();
     }
@@ -136,76 +138,40 @@
         try {
             startOperation();
             this.ruleBase.readLock();
-            this.lock.lock();            
-            Object object = new DroolsQuery( query,
-                                             arguments );
-            InternalFactHandle handle = this.handleFactory.newFactHandle( object,
+            this.lock.lock();
+            DroolsQuery queryObject = new DroolsQuery( query,
+                                                       arguments,
+                                                       new DefaultQueryResultsCollector() );
+            InternalFactHandle handle = this.handleFactory.newFactHandle( queryObject,
                                                                           this.getObjectTypeConfigurationRegistry().getObjectTypeConf( EntryPoint.DEFAULT,
-                                                                                                                                       object ),
+                                                                                                                                       queryObject ),
                                                                           this );
 
             insert( handle,
-                    object,
+                    queryObject,
                     null,
                     null,
                     this.typeConfReg.getObjectTypeConf( this.entryPoint,
-                                                        object ) );
+                                                        queryObject ) );
 
-            final QueryTerminalNode node = (QueryTerminalNode) this.queryResults.remove( query );
-            Query queryObj = null;
-            List list = null;
+            this.handleFactory.destroyFactHandle( handle );
 
-            if ( node == null ) {
-                // There are no results, first check the query object actually exists
-                final org.drools.rule.Package[] pkgs = this.ruleBase.getPackages();
-                for ( int i = 0; i < pkgs.length; i++ ) {
-                    final Rule rule = pkgs[i].getRule( query );
-                    if ( (rule != null) && (rule instanceof Query) ) {
-                        queryObj = (Query) rule;
-                        break;
-                    }
-                }
-
-                this.handleFactory.destroyFactHandle( handle );
-
-                if ( queryObj == null ) {
-                    throw new IllegalArgumentException( "Query '" + query + "' does not exist" );
-                }
-                list = Collections.EMPTY_LIST;
-            } else {
-                list = (List) this.getNodeMemory( node );
-
-                if ( list == null ) {
-                    list = Collections.EMPTY_LIST;
-                } else {
-                    this.clearNodeMemory( node );
-                }
-                queryObj = (Query) node.getRule();
-
-                this.handleFactory.destroyFactHandle( handle );
+            Declaration[] declarations = new Declaration[0];
+            if ( queryObject.getQuery() != null ) {
+                // this is null when there are no query results, thus the query object is never set
+                declarations = queryObject.getQuery().getDeclarations();
             }
 
-            return new QueryResults( list,
-                                     queryObj,
+            return new QueryResults( ((DefaultQueryResultsCollector) queryObject.getQueryResultCollector()).getResults(),
+                                     declarations,
                                      this );
         } finally {
             this.lock.unlock();
-            this.ruleBase.readUnlock();            
+            this.ruleBase.readUnlock();
             endOperation();
         }
     }
 
-    void setQueryResults(final String query,
-                         final QueryTerminalNode node) {
-        if ( this.queryResults == Collections.EMPTY_MAP ) {
-            this.queryResults = new HashMap();
-        }
-        this.queryResults.put( query,
-                               node );
-    }
-    
-    
-
     public static class WorkingMemoryReteAssertAction
         implements
         WorkingMemoryAction {
@@ -340,47 +306,49 @@
         }
 
         public void execute(InternalWorkingMemory workingMemory) {
-            if( this.factHandle.isValid() ) {
+            if ( this.factHandle.isValid() ) {
                 // if the fact is still in the working memory (since it may have been previously retracted already
                 final PropagationContext context = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
                                                                                PropagationContext.EXPIRATION,
                                                                                null,
                                                                                null,
                                                                                this.factHandle );
-                ((EventFactHandle)factHandle).setExpired( true );
+                ((EventFactHandle) factHandle).setExpired( true );
                 this.node.retractObject( factHandle,
                                          context,
                                          workingMemory );
-                
+
                 // if no activations for this expired event
-                if( ((EventFactHandle)factHandle).getActivationsCount() == 0 ) {
+                if ( ((EventFactHandle) factHandle).getActivationsCount() == 0 ) {
                     // remove it from the object store and clean up resources
-                    ((EventFactHandle)factHandle).getEntryPoint().retract( factHandle );
+                    ((EventFactHandle) factHandle).getEntryPoint().retract( factHandle );
                 }
             }
         }
     }
-  public EntryPoint getEntryPoint() {
+
+    public EntryPoint getEntryPoint() {
         return this.entryPoint;
-  }
-   public InternalWorkingMemory getInternalWorkingMemory() {
+    }
+
+    public InternalWorkingMemory getInternalWorkingMemory() {
         return this;
     }
 
-    public <T extends org.drools.runtime.rule.FactHandle> Collection< T > getFactHandles() {
-        throw new UnsupportedOperationException("this is implementedby StatefulKnowledgeImpl");
+    public <T extends org.drools.runtime.rule.FactHandle> Collection<T> getFactHandles() {
+        throw new UnsupportedOperationException( "this is implementedby StatefulKnowledgeImpl" );
     }
 
-    public <T extends org.drools.runtime.rule.FactHandle> Collection< T > getFactHandles(ObjectFilter filter) {
-        throw new UnsupportedOperationException("this is implementedby StatefulKnowledgeImpl");
+    public <T extends org.drools.runtime.rule.FactHandle> Collection<T> getFactHandles(ObjectFilter filter) {
+        throw new UnsupportedOperationException( "this is implementedby StatefulKnowledgeImpl" );
     }
 
-    public Collection< Object > getObjects() {
-        throw new UnsupportedOperationException("this is implementedby StatefulKnowledgeImpl");
+    public Collection<Object> getObjects() {
+        throw new UnsupportedOperationException( "this is implementedby StatefulKnowledgeImpl" );
     }
 
-    public Collection< Object > getObjects(ObjectFilter filter) {
-        throw new UnsupportedOperationException("this is implementedby StatefulKnowledgeImpl");
+    public Collection<Object> getObjects(ObjectFilter filter) {
+        throw new UnsupportedOperationException( "this is implementedby StatefulKnowledgeImpl" );
     }
 
 }

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/UnificationNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/UnificationNode.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/UnificationNode.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -1,114 +0,0 @@
-package org.drools.reteoo;
-
-import org.drools.RuleBaseConfiguration;
-import org.drools.common.BaseNode;
-import org.drools.common.InternalFactHandle;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
-import org.drools.spi.PropagationContext;
-
-public class UnificationNode extends LeftTupleSource
-    implements
-    LeftTupleSinkNode,
-    NodeMemory {
-
-    public void updateSink(LeftTupleSink sink,
-                           PropagationContext context,
-                           InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public void attach() {
-        // TODO Auto-generated method stub
-        
-    }
-   
-    public void attach(InternalWorkingMemory[] workingMemories) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    protected void doRemove(RuleRemovalContext context,
-                            ReteooBuilder builder,
-                            BaseNode node,
-                            InternalWorkingMemory[] workingMemories) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public void networkUpdated() {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public LeftTupleSinkNode getNextLeftTupleSinkNode() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public LeftTupleSinkNode getPreviousLeftTupleSinkNode() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public void setNextLeftTupleSinkNode(LeftTupleSinkNode next) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public void setPreviousLeftTupleSinkNode(LeftTupleSinkNode previous) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public void assertLeftTuple(LeftTuple leftTuple,
-                                PropagationContext context,
-                                InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public short getType() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    public boolean isLeftTupleMemoryEnabled() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    public void retractLeftTuple(LeftTuple leftTuple,
-                                 PropagationContext context,
-                                 InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public void setLeftTupleMemoryEnabled(boolean tupleMemoryEnabled) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public Object createMemory(RuleBaseConfiguration config) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public void modifyLeftTuple(LeftTuple leftTuple,
-                                PropagationContext context,
-                                InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    public void modifyLeftTuple(InternalFactHandle factHandle,
-                                ModifyPreviousTuples modifyPreviousTuples,
-                                PropagationContext context,
-                                InternalWorkingMemory workingMemory) {
-        // TODO Auto-generated method stub
-        
-    }
-
-}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.reteoo.builder;
+
+import org.drools.reteoo.LeftTupleSource;
+import org.drools.reteoo.QueryElementNode;
+import org.drools.rule.QueryElement;
+import org.drools.rule.RuleConditionElement;
+
+
+public class QueryElementBuilder
+    implements
+    ReteooComponentBuilder {
+
+    /**
+     * @inheritDoc
+     */
+    public void build(final BuildContext context,
+                      final BuildUtils utils,
+                      final RuleConditionElement rce) {
+
+        final QueryElement qe = (QueryElement) rce;
+        utils.checkUnboundDeclarations( context,
+                                        qe.getRequiredDeclarations() );
+
+        context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
+                                                                    new QueryElementNode( context.getNextId(),
+                                                                                          context.getTupleSource(),
+                                                                                          qe,
+                                                                                          false,
+                                                                                          context ) ) );
+
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean requiresLeftActivation(final BuildUtils utils,
+                                          final RuleConditionElement rce) {
+        return true;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -39,6 +39,7 @@
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Pattern;
 import org.drools.rule.Query;
+import org.drools.rule.QueryElement;
 import org.drools.rule.Rule;
 import org.drools.time.TemporalDependencyMatrix;
 
@@ -59,6 +60,8 @@
                                new PatternBuilder() );
         this.utils.addBuilder( EvalCondition.class,
                                new EvalBuilder() );
+        this.utils.addBuilder( QueryElement.class,
+                               new QueryElementBuilder() );        
         this.utils.addBuilder( From.class,
                                new FromBuilder() );
         this.utils.addBuilder( Collect.class,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -176,7 +176,16 @@
     public Map getOuterDeclarations() {
         return Collections.EMPTY_MAP;
     }
+    
 
+    public List getNestedElements() {
+        return Collections.EMPTY_LIST;
+    }    
+    
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }    
+
     /**
      * @inheritDoc
      */
@@ -184,14 +193,7 @@
         return null;
     }
 
-    public List getNestedElements() {
-        return Collections.EMPTY_LIST;
-    }
 
-    public boolean isPatternScopeDelimiter() {
-        return true;
-    }
-
     public void replaceDeclaration(Declaration declaration,
                                    Declaration resolved) {
         for ( int i = 0; i < this.requiredDeclarations.length; i++ ) {

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/QueryElement.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/QueryElement.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/QueryElement.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,140 @@
+package org.drools.rule;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class QueryElement extends ConditionalElement
+    implements
+    Externalizable {
+    private String        queryName;
+    private Object[]      arguments;
+    private int[]         declIndexes;
+    private int[]         variables;
+
+    private Declaration[] requiredDeclarations;
+
+    public QueryElement(String queryName,
+                        Object[] arguments,
+                        Declaration[] requiredDeclarations,
+                        int[] declIndexes,
+                        int[] variables) {
+        super();
+        this.queryName = queryName;
+        this.arguments = arguments;
+        this.requiredDeclarations = requiredDeclarations;
+        this.declIndexes = declIndexes;
+        this.variables = variables;
+    }
+
+    public String getQueryName() {
+        return queryName;
+    }
+
+    public Object[] getArguments() {
+        return arguments;
+    }
+
+    public int[] getDeclIndexes() {
+        return declIndexes;
+    }
+
+    public int[] getVariables() {
+        return variables;
+    }
+
+    public Map getInnerDeclarations() {
+        return Collections.EMPTY_MAP;
+    }
+
+    public Map getOuterDeclarations() {
+        return Collections.EMPTY_MAP;
+    }
+
+    public List getNestedElements() {
+        return Collections.EMPTY_LIST;
+    }
+
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
+    
+    public Declaration[] getRequiredDeclarations() {
+        return this.requiredDeclarations;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public Declaration resolveDeclaration(final String identifier) {
+        return null;
+    }
+
+    public void replaceDeclaration(Declaration declaration,
+                                   Declaration resolved) {
+        for ( int i = 0; i < this.requiredDeclarations.length; i++ ) {
+            if ( this.requiredDeclarations[i].equals( declaration ) ) {
+                this.requiredDeclarations[i] = resolved;
+            }
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Arrays.hashCode( arguments );
+        result = prime * result + Arrays.hashCode( declIndexes );
+        result = prime * result + ((queryName == null) ? 0 : queryName.hashCode());
+        result = prime * result + Arrays.hashCode( variables );
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        QueryElement other = (QueryElement) obj;
+        if ( !Arrays.equals( arguments,
+                             other.arguments ) ) return false;
+        if ( !Arrays.equals( declIndexes,
+                             other.declIndexes ) ) return false;
+        if ( queryName == null ) {
+            if ( other.queryName != null ) return false;
+        } else if ( !queryName.equals( other.queryName ) ) return false;
+        if ( !Arrays.equals( variables,
+                             other.variables ) ) return false;
+        return true;
+    }
+
+    @Override
+    public Object clone() {
+        return new QueryElement( queryName, arguments, requiredDeclarations, declIndexes, variables );
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+       out.writeObject( this.queryName );
+       out.writeObject( this.arguments );
+       out.writeObject( this.requiredDeclarations );
+       out.writeObject( this.declIndexes );
+       out.writeObject( this.variables );
+    }    
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        this.queryName = (String) in.readObject();
+        this.arguments = (Object[]) in.readObject();
+        this.requiredDeclarations = ( Declaration[] ) in.readObject();
+        this.declIndexes = ( int[] ) in.readObject();
+        this.variables = ( int[] ) in.readObject();
+    }
+
+
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/UnificationRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/UnificationRestriction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/UnificationRestriction.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,173 @@
+package org.drools.rule;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.AcceptsReadAccessor;
+import org.drools.spi.Evaluator;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.Restriction;
+import org.drools.time.Interval;
+
+public class UnificationRestriction
+    implements
+    AcceptsReadAccessor,
+    Restriction {
+    
+    VariableRestriction vr;
+    Declaration declaration;
+    
+    public UnificationRestriction() {
+        
+    }
+    
+    public UnificationRestriction(VariableRestriction vr) {
+        this.vr = vr;
+        this.declaration = vr.getRequiredDeclarations()[0];
+    }
+
+    public ContextEntry createContextEntry() {
+        return new UnificationContextEntry(this.vr.createContextEntry(), declaration);
+    }
+
+    public Declaration[] getRequiredDeclarations() {
+        return this.vr.getRequiredDeclarations();
+    }
+
+    public boolean isAllowed(InternalReadAccessor extractor,
+                             InternalFactHandle handle,
+                             InternalWorkingMemory workingMemory,
+                             ContextEntry context) {
+        throw new UnsupportedOperationException( "Cannot use a Unification Restriction in the AlphaNetwork" );
+    }
+
+    public boolean isAllowedCachedLeft(ContextEntry context,
+                                       InternalFactHandle handle) {
+        if ( ((UnificationContextEntry)context).getVariable() == null ) {
+            return this.vr.isAllowedCachedLeft( ((UnificationContextEntry)context).getContextEntry(), handle );
+        } else {
+            VariableContextEntry vContext =  (VariableContextEntry) ((UnificationContextEntry)context).getContextEntry();
+            ((UnificationContextEntry)context).getVariable() .setValue( vContext.getFieldExtractor().getValue(handle.getObject() ) );
+            return true;
+        }
+    }
+
+    public boolean isAllowedCachedRight(LeftTuple tuple,
+                                        ContextEntry context) {
+        throw new UnsupportedOperationException( "Cannot right activate a Unification Restriction (for now )" );
+    }
+    
+    public Evaluator getEvaluator() {
+        return this.vr.getEvaluator();
+    }
+    
+    public Interval getInterval() {
+        return this.vr.getInterval();
+    }
+
+    public boolean isTemporal() {
+        return false;
+    }
+
+    public void replaceDeclaration(Declaration oldDecl,
+                                   Declaration newDecl) {
+        this.vr.replaceDeclaration( oldDecl, newDecl );
+        this.declaration = vr.getRequiredDeclarations()[0];
+    }
+    
+    
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        this.vr = ( VariableRestriction ) in.readObject();
+        this.declaration = vr.getRequiredDeclarations()[0];
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( this.vr );
+    }
+
+    public Object clone() {
+        return new UnificationRestriction( (VariableRestriction) this.vr.clone() );
+    }
+    
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.vr.setReadAccessor( readAccessor );
+        this.declaration = vr.getRequiredDeclarations()[0];
+    }    
+    
+    public static class UnificationContextEntry implements ContextEntry {
+        private ContextEntry contextEntry;
+        private Declaration declaration;
+        private Variable variable;
+        
+        public UnificationContextEntry(ContextEntry contextEntry,
+                                       Declaration declaration) {
+            this.contextEntry = contextEntry;
+            this.declaration = declaration;
+        }
+
+
+        public ContextEntry getContextEntry() {
+            return this.contextEntry;
+        }
+        
+
+        public ContextEntry getNext() {
+            return this.contextEntry.getNext();
+        }
+
+        public void resetFactHandle() {
+            this.contextEntry.resetFactHandle();
+        }
+
+        public void resetTuple() {
+            this.contextEntry.resetTuple();
+        }
+
+        public void setNext(ContextEntry entry) {
+            this.contextEntry.setNext( entry );
+        }
+
+        public void updateFromFactHandle(InternalWorkingMemory workingMemory,
+                                         InternalFactHandle handle) {
+            throw new UnsupportedOperationException( "Cannot right activate a Unification Restriction (for now )" );
+            //this.contextEntry.updateFromFactHandle( workingMemory, handle );
+        }
+
+        public void updateFromTuple(InternalWorkingMemory workingMemory,
+                                    LeftTuple tuple) {
+            Object object = this.declaration.getValue( workingMemory, tuple.get( 0 ).getObject() );
+            if ( !(object instanceof Variable) ) {
+                this.variable = null;
+                this.contextEntry.updateFromTuple( workingMemory, tuple );    
+            } else {                
+                this.variable = (Variable) object;
+            }
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            this.contextEntry = (ContextEntry) in.readObject();
+            this.declaration = ( Declaration ) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject( this.contextEntry );
+            out.writeObject( this.declaration );
+        }
+        
+        public Variable getVariable() {
+            return this.variable;
+        }
+        
+    }
+
+
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Variable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Variable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Variable.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,16 @@
+package org.drools.rule;
+
+public class Variable {
+    private Object value;
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+    
+    
+    
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -27,6 +27,7 @@
 import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Evaluator;
 import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.Restriction;
 import org.drools.time.Interval;
 
 public class VariableConstraint extends MutableTypeConstraint
@@ -37,7 +38,7 @@
     private static final long    serialVersionUID = 400L;
 
     private InternalReadAccessor fieldExtractor;
-    private VariableRestriction  restriction;
+    private Restriction  restriction;
 
     public VariableConstraint() {
     }
@@ -52,7 +53,7 @@
     }
 
     public VariableConstraint(final InternalReadAccessor fieldExtractor,
-                              final VariableRestriction restriction) {
+                              final Restriction restriction) {
         this.fieldExtractor = fieldExtractor;
         this.restriction = restriction;
     }
@@ -61,7 +62,7 @@
                                             ClassNotFoundException {
         super.readExternal( in );
         fieldExtractor = (InternalReadAccessor) in.readObject();
-        restriction = (VariableRestriction) in.readObject();
+        restriction = (Restriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
@@ -89,8 +90,16 @@
     }
 
     public Evaluator getEvaluator() {
-        return this.restriction.getEvaluator();
+        if ( this.restriction instanceof UnificationRestriction ) {
+            return ((UnificationRestriction) this.restriction).getEvaluator();
+        } else {
+            return ((VariableRestriction) this.restriction).getEvaluator();
+        }
     }
+    
+    public Restriction getRestriction() {
+        return this.restriction;
+    }
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
@@ -118,7 +127,11 @@
     }
     
     public Interval getInterval() {
-        return this.restriction.getInterval();
+        if ( this.restriction instanceof UnificationRestriction ) {
+            return ((UnificationRestriction) this.restriction).getInterval();
+        } else {
+            return ((VariableRestriction) this.restriction).getInterval();
+        }
     }
 
     public String toString() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/NativeQueryResults.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/NativeQueryResults.java	2010-04-07 22:23:52 UTC (rev 32474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/NativeQueryResults.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -29,7 +29,7 @@
 	}
 
 	public String[] getIdentifiers() {
-        return this.getResults().getDeclarations().keySet().toArray( new String[this.getResults().getDeclarations().size()] );
+        return getDeclarations().keySet().toArray( new String[this.getResults().getDeclarations().size()] );
     }
     
     

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryElementNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryElementNodeTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryElementNodeTest.java	2010-04-07 22:30:27 UTC (rev 32475)
@@ -0,0 +1,169 @@
+package org.drools.reteoo;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.DroolsTestCase;
+import org.drools.FactException;
+import org.drools.FactHandle;
+import org.drools.RuleBaseFactory;
+import org.drools.base.DroolsQuery;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.EvalConditionNode.EvalMemory;
+import org.drools.reteoo.QueryElementNode.UnificationNodeQueryResultsCollector;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.rule.Declaration;
+import org.drools.rule.QueryElement;
+import org.drools.rule.Rule;
+import org.drools.rule.Variable;
+import org.drools.spi.Activation;
+import org.drools.spi.PropagationContext;
+
+public class QueryElementNodeTest extends DroolsTestCase {
+    private PropagationContext  context;
+    private ReteooWorkingMemory workingMemory;
+    private ReteooRuleBase      ruleBase;
+    private BuildContext        buildContext;
+
+    public QueryElementNodeTest(final String name) {
+        super( name );
+    }
+
+    public void setUp() {
+        this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        this.buildContext = new BuildContext( ruleBase,
+                                              ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
+
+        this.context = new PropagationContextImpl( 0,
+                                                   PropagationContext.ASSERTION,
+                                                   null,
+                                                   null,
+                                                   null );
+
+        this.workingMemory = new InstrumentedWorkingMemory( 0,
+                                       (InternalRuleBase) this.ruleBase );
+    }
+
+    public void testAttach() throws Exception {
+        final MockTupleSource source = new MockTupleSource( 12 );
+
+        final QueryElementNode node = new QueryElementNode( 18,
+                                                            source,
+                                                            null,
+                                                            false,
+                                                            buildContext );
+
+        assertEquals( 18,
+                      node.getId() );
+
+        assertEquals( 0,
+                      source.getAttached() );
+
+        node.attach();
+
+        assertEquals( 1,
+                      source.getAttached() );
+
+    }
+
+    public void test1() {
+        QueryElement qe = new QueryElement( "queryName1",
+                                            new Object[]{new Variable(), "x1", new Variable(), "x3", "x4", new Variable(),"x6",},
+                                            new Declaration[0],
+                                            new int[0],
+                                            new int[] { 0, 2, 5 } );
+
+        final MockTupleSource source = new MockTupleSource( 12 );
+
+        final QueryElementNode node = new QueryElementNode( 18,
+                                                            source,
+                                                            qe,
+                                                            false,
+                                                            buildContext );
+      
+        MockLeftTupleSink sink = new MockLeftTupleSink(12);
+        node.addTupleSink( sink );
+        sink.attach();
+        
+        
+        InternalFactHandle s1 = (InternalFactHandle) this.workingMemory.insert( "string" );
+
+        node.assertLeftTuple( new LeftTuple( s1,
+                                             node,
+                                             true ),
+                              context,
+                              workingMemory );
+        
+        assertEquals(3, sink.getAsserted().size() );
+        LeftTuple leftTuple = (LeftTuple)((Object[])sink.getAsserted().get( 0 ))[0];
+        assertEquals(2, leftTuple.size());
+        assertEquals("string", leftTuple.getParent().getLastHandle().getObject() );
+        Object[] variables = (Object[]) leftTuple.getLastHandle().getObject();
+        assertEquals( "string_0_0", variables[0] );
+        assertEquals( "string_2_0", variables[1] );
+        assertEquals( "string_5_0", variables[2] );
+        
+        leftTuple = (LeftTuple)((Object[])sink.getAsserted().get( 1 ))[0];
+        assertEquals(2, leftTuple.size());
+        assertEquals("string", leftTuple.getParent().getLastHandle().getObject() );
+        variables = (Object[]) leftTuple.getLastHandle().getObject();
+        assertEquals( "string_0_1", variables[0] );
+        assertEquals( "string_2_1", variables[1] );
+        assertEquals( "string_5_1", variables[2] );
+        
+        leftTuple = (LeftTuple)((Object[])sink.getAsserted().get( 2 ))[0];
+        assertEquals(2, leftTuple.size());
+        assertEquals("string", leftTuple.getParent().getLastHandle().getObject() );
+        variables = (Object[]) leftTuple.getLastHandle().getObject();
+        assertEquals( "string_0_2", variables[0] );
+        assertEquals( "string_2_2", variables[1] );
+        assertEquals( "string_5_2", variables[2] );
+    }
+
+
+    public static class InstrumentedWorkingMemory extends ReteooWorkingMemory {
+
+        public InstrumentedWorkingMemory(final int id,
+                                         final InternalRuleBase ruleBase) {
+            super( id,
+                   ruleBase );
+        }
+
+        public void insert(final InternalFactHandle handle,
+                           final Object object,
+                           final Rule rule,
+                           final Activation activation,
+                           ObjectTypeConf typeConf) {
+            if( object instanceof DroolsQuery ) {
+                DroolsQuery query = ( DroolsQuery ) object;
+                UnificationNodeQueryResultsCollector collector = ( UnificationNodeQueryResultsCollector ) query.getQueryResultCollector();
+                for ( int i = 0; i < 3; i++ ) {
+                    Object[] args = query.getArguments();
+                    ((Variable)args[0]).setValue( "string_0_" + i );
+                    ((Variable)args[2]).setValue( "string_2_" + i );
+                    ((Variable)args[5]).setValue( "string_5_" + i );
+                    collector.add( null, null, this );
+                }
+            } else {
+                super.insert( handle, object, rule, activation, typeConf );
+            }
+        }
+    }
+}
\ No newline at end of file



More information about the jboss-svn-commits mailing list