[jboss-svn-commits] JBL Code SVN: r34465 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/runtime/rule/impl and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Aug 2 13:23:51 EDT 2010


Author: mark.proctor at jboss.com
Date: 2010-08-02 13:23:51 -0400 (Mon, 02 Aug 2010)
New Revision: 34465

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/RowAdapter.java
Log:
JBRULES-2607 Nullpointer and/or incrorrect object for identifier when using live query rows
-Updated unit test to show error
-Fixed issue

Modified: 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	2010-08-02 15:27:53 UTC (rev 34464)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java	2010-08-02 17:23:51 UTC (rev 34465)
@@ -627,8 +627,8 @@
         str += "package org.drools.test  \n";
         str += "import org.drools.Cheese \n";
         str += "query cheeses(String $type1, String $type2) \n";
-        str += "    stilton : Cheese(type == $type1, $price : price) \n";
-        str += "    cheddar : Cheese(type == $type2, price == stilton.price) \n";
+        str += "    stilton : Cheese(type == $type1, $sprice : price) \n";
+        str += "    cheddar : Cheese(type == $type2, $cprice : price == stilton.price) \n";
         str += "end\n";
 
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
@@ -665,36 +665,65 @@
         ksession.insert( cheddar2 );
         org.drools.runtime.rule.FactHandle c3Fh = ksession.insert( cheddar3 );
         
-        final List updated = new ArrayList();
-        final List removed = new ArrayList();
-        final List added = new ArrayList();
+        final List<Object[]> updated = new ArrayList<Object[]>();
+        final List<Object[]> removed = new ArrayList<Object[]>();
+        final List<Object[]> added = new ArrayList<Object[]>();
         
         ViewChangedEventListener listener = new ViewChangedEventListener() {            
             public void rowUpdated(Row row) {
-                updated.add( row.get( "$price" ) );
+                Object[] array = new Object[6];
+                array[0] = row.get("stilton");
+                array[1] = row.get("cheddar");
+                array[2] = row.get("$sprice");
+                array[3] = row.get("$cprice");
+                array[4] = row.get("$type1");
+                array[5] = row.get("$type2");
+                updated.add( array );
             }
             
             public void rowRemoved(Row row) {
-                removed.add( row.get( "$price" ) );
+                Object[] array = new Object[6];
+                array[0] = row.get("stilton");
+                array[1] = row.get("cheddar");
+                array[2] = row.get("$sprice");
+                array[3] = row.get("$cprice");
+                array[4] = row.get("$type1");
+                array[5] = row.get("$type2");
+                removed.add( array );
             }
             
             public void rowAdded(Row row) {
-                added.add( row.get( "$price" ) );
+                Object[] array = new Object[6];
+                array[0] = row.get("stilton");
+                array[1] = row.get("cheddar");
+                array[2] = row.get("$sprice");
+                array[3] = row.get("$cprice");
+                array[4] = row.get("$type1");
+                array[5] = row.get("$type2");
+                added.add( array );
             }
         };        
         
         // Open the LiveQuery
-        LiveQuery query = ksession.openLiveQuery( "cheeses", new Object[] { "cheddar", "stilton" } , listener );
+        LiveQuery query = ksession.openLiveQuery( "cheeses", new Object[] { "stilton", "cheddar" } , listener );
         
         // Assert that on opening we have three rows added
         assertEquals( 3, added.size() );
         assertEquals( 0, removed.size() );
         assertEquals( 0, updated.size() );
         
+        // Assert that the identifiers where retrievable
+        assertSame(stilton1, added.get( 0 )[0] );
+        assertSame(cheddar1, added.get( 0 )[1] );
+        assertEquals(1, added.get( 0 )[2] );
+        assertEquals(1, added.get( 0 )[3] );
+        assertEquals("stilton", added.get( 0 )[4] );
+        assertEquals("cheddar", added.get( 0 )[5] );
+        
         // And that we have correct values from those rows
-        assertEquals( 1, added.get( 0 ) );
-        assertEquals( 2, added.get( 1 ) );
-        assertEquals( 3, added.get( 2 ) );
+        assertEquals( 1, added.get( 0 )[3] );
+        assertEquals( 2, added.get( 1 )[3] );
+        assertEquals( 3, added.get( 2 )[3] );
         
         // Do an update that causes a match to become untrue, thus triggering a removed
         cheddar3.setPrice( 4 );
@@ -704,7 +733,7 @@
         assertEquals( 1, removed.size() );
         assertEquals( 0, updated.size() );
         
-        assertEquals( 4, removed.get( 0 ) );
+        assertEquals( 4, removed.get( 0 )[3] );
                 
         // Now make that partial true again, and thus another added
         cheddar3.setPrice( 3 );
@@ -715,7 +744,7 @@
         assertEquals( 1, removed.size() );
         assertEquals( 0, updated.size() );  
         
-        assertEquals( 3, added.get( 3 ) );        
+        assertEquals( 3, added.get( 3 )[3] );        
         
         // check a standard update
         cheddar3.setOldPrice( 0 );
@@ -725,7 +754,7 @@
         assertEquals( 1, removed.size() );
         assertEquals( 1, updated.size() );         
         
-        assertEquals( 3, updated.get( 0 ) );      
+        assertEquals( 3, updated.get( 0 )[3] );      
         
         // Check a standard retract
         ksession.retract( s1Fh );
@@ -734,7 +763,7 @@
         assertEquals( 2, removed.size() );
         assertEquals( 1, updated.size() );    
         
-        assertEquals( 1, removed.get( 1 ) );          
+        assertEquals( 1, removed.get( 1 )[3] );          
         
         // Close the query, we should get removed events for each row
         query.close();
@@ -743,8 +772,8 @@
         assertEquals( 4, removed.size() );
         assertEquals( 1, updated.size() );         
      
-        assertEquals( 2, removed.get( 2 ) );
-        assertEquals( 3, removed.get( 3 ) );
+        assertEquals( 2, removed.get( 2 )[3] );
+        assertEquals( 3, removed.get( 3 )[3] );
         
         // Check that updates no longer have any impact.
         ksession.update(  c3Fh, cheddar3 ); 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/RowAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/RowAdapter.java	2010-08-02 15:27:53 UTC (rev 34464)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/RowAdapter.java	2010-08-02 17:23:51 UTC (rev 34465)
@@ -36,43 +36,43 @@
 	}
 	
     private InternalFactHandle getFactHandle(Declaration declr) {
-        return this.factHandles[  declr.getPattern().getOffset() ]; // -1 because we shifted the array left
-                                                                       // when removing the query object
+        return this.factHandles[  declr.getPattern().getOffset() ]; 
     }  	
 
 	public Object get(String identifier) {
 		if ( factHandles == null ) {
-			this.factHandles = this.leftTuple.getFactHandles();
+			this.factHandles = this.leftTuple.toFactHandles();
 		}
 		Declaration declr = this.rule.getDeclaration( identifier );
+		if ( declr == null ) {
+		    throw new RuntimeException("The identifier '" + identifier + "' does not exist as a bound varirable for this query" );
+		}
 		InternalFactHandle factHandle = getFactHandle( declr );
 		return declr.getValue( null, factHandle.getObject() );
 	}
 
-	public Object get(int i) {
-		if ( factHandles == null ) {
-			this.factHandles = this.leftTuple.getFactHandles();
-		}
-		return this.factHandles[ i + 1].getObject();
-	}
-
 	public FactHandle getFactHandle(String identifier) {
 		if ( factHandles == null ) {
-			this.factHandles = this.leftTuple.getFactHandles();
+			this.factHandles = this.leftTuple.toFactHandles();
 		}
-		return null;
+        Declaration declr = this.rule.getDeclaration( identifier );
+        if ( declr == null ) {
+            throw new RuntimeException("The identifier '" + identifier + "' does not exist as a bound varirable for this query" );
+        }
+        InternalFactHandle factHandle = getFactHandle( declr );		
+		return factHandle;
 	}
 
 	public FactHandle getFactHandle(int i) {
 		if ( factHandles == null ) {
-			this.factHandles = this.leftTuple.getFactHandles();
+			this.factHandles = this.leftTuple.toFactHandles();
 		}
 		return null;
 	}
 
 	public int size() {
 		if ( factHandles == null ) {
-			this.factHandles = this.leftTuple.getFactHandles();
+			this.factHandles = this.leftTuple.toFactHandles();
 		}
 		return 0;
 	}



More information about the jboss-svn-commits mailing list