[jboss-svn-commits] JBL Code SVN: r7488 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo test/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Nov 8 17:03:50 EST 2006


Author: tirelli
Date: 2006-11-08 17:03:34 -0500 (Wed, 08 Nov 2006)
New Revision: 7488

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/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
Log:
JBRULES-544: improving query results to return empty list when no results where found. Unit test updated

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	2006-11-08 22:02:46 UTC (rev 7487)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2006-11-08 22:03:34 UTC (rev 7488)
@@ -111,6 +111,7 @@
     public void retractTuple(final ReteTuple tuple,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
+        // following code is needed because of queries that eventually uses "exists" 
         final LinkedList list = (LinkedList) workingMemory.getNodeMemory( this );
         list.remove( tuple );
     }

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	2006-11-08 22:02:46 UTC (rev 7487)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2006-11-08 22:03:34 UTC (rev 7488)
@@ -81,19 +81,35 @@
     public QueryResults getQueryResults(final String query) {
         final FactHandle handle = assertObject( new DroolsQuery( query ) );
         final QueryTerminalNode node = (QueryTerminalNode) this.queryResults.remove( query );
+        Query queryObj = null;
+        List list = null;
+
         if ( node == null ) {
+            org.drools.rule.Package[] pkgs = this.ruleBase.getPackages();
+            for( int i = 0; i < pkgs.length; i++ ) {
+                Rule rule = pkgs[i].getRule( query );
+                if( ( rule != null ) && ( rule instanceof Query ) ) {
+                    queryObj = (Query) rule;
+                    break;
+                }
+            }
             retractObject( handle );
-            return null;
+            if( queryObj == null ) {
+                throw new IllegalArgumentException("Query '"+query+"' does not exist");
+            }
+            list = Collections.EMPTY_LIST;
+        } else {
+            list = (List) this.nodeMemories.remove( node.getId() );
+
+            retractObject( handle );
+            if ( list == null ) {
+                list = Collections.EMPTY_LIST;
+            }
+            queryObj = (Query) node.getRule();
         }
 
-        final List list = (List) this.nodeMemories.remove( node.getId() );
-
-        retractObject( handle );
-        if ( list == null ) {
-            return null;
-        }
         return new QueryResults( list,
-                                 (Query) node.getRule(),
+                                 queryObj,
                                  this );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2006-11-08 22:02:46 UTC (rev 7487)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2006-11-08 22:03:34 UTC (rev 7488)
@@ -16,8 +16,11 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Field;
 import java.util.Iterator;
+import java.util.Map;
 
+import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.drools.FactHandle;
@@ -39,6 +42,7 @@
 public class QueryTerminalNodeTest extends TestCase {
     public void testQueryTerminalNode() {
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        
         final Rete rete = ruleBase.getRete();
 
         final ClassObjectType queryObjectType = new ClassObjectType( DroolsQuery.class );
@@ -101,10 +105,23 @@
 
         queryNode.attach();
 
+        final org.drools.rule.Package pkg = new org.drools.rule.Package("com.drools.test");
+        pkg.addRule( query );
+        
+        try {
+            Field pkgField = ruleBase.getClass().getSuperclass().getDeclaredField( "pkgs" );
+            pkgField.setAccessible( true );
+            Map pkgs = (Map) pkgField.get( ruleBase );
+            pkgs.put( pkg.getName(), pkg );
+        } catch ( Exception e ) {
+            Assert.fail("Should not throw any exception: "+e.getMessage());
+        }
+        
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
         QueryResults results = workingMemory.getQueryResults( "query-1" );
 
-        assertNull( results );
+        assertEquals( 0,
+                      results.size() );
 
         final Cheese stilton1 = new Cheese( "stilton",
                                             100 );
@@ -170,7 +187,8 @@
         workingMemory.retractObject( handle2 );
         results = workingMemory.getQueryResults( "query-1" );
 
-        assertNull( results );
+        assertEquals( 0,
+                      results.size() );
 
     }
 




More information about the jboss-svn-commits mailing list