[jboss-svn-commits] JBL Code SVN: r34211 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/runtime/rule and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 26 21:02:26 EDT 2010


Author: tirelli
Date: 2010-07-26 21:02:25 -0400 (Mon, 26 Jul 2010)
New Revision: 34211

Added:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/conf/QueryListenerClassOption.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/QueryViewChangedEventListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/NonCloningQueryViewListener.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsEventList.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/InternalViewChangedEventListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/StandardQueryViewChangedEventListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.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/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/OpenQueryViewChangedEventListenerAdapter.java
Log:
JBRULES-2596: improving query performance by caching system hash code for fact handles and providing session configuration to configure which query listener class to use

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/conf/QueryListenerClassOption.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/conf/QueryListenerClassOption.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/conf/QueryListenerClassOption.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -0,0 +1,115 @@
+/**
+ * Copyright 2010 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.runtime.conf;
+
+import org.drools.runtime.rule.QueryViewChangedEventListener;
+
+
+/**
+ * A class to configure the session query listener configuration.
+ * 
+ * @author etirelli
+ */
+public class QueryListenerClassOption implements SingleValueKnowledgeSessionOption {
+
+    private static final long serialVersionUID = -8461267995706982981L;
+    
+    /**
+     * The property name for the clock type configuration
+     */
+    public static final String PROPERTY_NAME = "drools.queryListener";
+    
+    /**
+     * clock type
+     */
+    private final Class<? extends QueryViewChangedEventListener> queryListener;
+    
+    /**
+     * Private constructor to enforce the use of the factory method
+     * @param queryListener
+     */
+    private QueryListenerClassOption( Class<? extends QueryViewChangedEventListener> queryListener ) {
+        this.queryListener = queryListener;
+    }
+    
+    /**
+     * This is a factory method for this Query Listener configuration.
+     * The factory method is a best practice for the case where the 
+     * actual object construction is changed in the future.
+     * 
+     * @param queryListener is the class that implements the actual query listener
+     * 
+     * @return the actual type safe query listener configuration.
+     */
+    public static QueryListenerClassOption get( Class<? extends QueryViewChangedEventListener> queryListener ) {
+        return new QueryListenerClassOption( queryListener );
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public String getPropertyName() {
+        return PROPERTY_NAME;
+    }
+    
+    /**
+     * Returns the configured query listener class
+     * 
+     * @return
+     */
+    public Class<? extends QueryViewChangedEventListener> getQueryListenerClass() {
+        return queryListener;
+    }
+    
+    /**
+     * Returns a new instance of the query listener class
+     * 
+     * @return
+     */
+    public QueryViewChangedEventListener newQueryListenerInstance() {
+        try {
+            return queryListener.newInstance();
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Error instantiating configured query view listener class: '"+queryListener.getName()+"'", e );
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + (( queryListener == null) ? 0 :  queryListener.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        QueryListenerClassOption other = (QueryListenerClassOption) obj;
+        if (  queryListener == null ) {
+            if ( other. queryListener != null ) return false;
+        } else if ( ! queryListener.equals( other.queryListener ) ) return false;
+        return true;
+    }
+    
+    @Override
+    public String toString() {
+        return "QueryListenerOption( "+ queryListener +" )";
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/conf/QueryListenerClassOption.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/QueryViewChangedEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/QueryViewChangedEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/QueryViewChangedEventListener.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -0,0 +1,20 @@
+package org.drools.runtime.rule;
+
+/**
+ * Copyright 2010 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.
+ */
+public interface QueryViewChangedEventListener {
+
+}


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/QueryViewChangedEventListener.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsEventList.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsEventList.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DroolsEventList.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -15,13 +15,10 @@
 public class DroolsEventList extends AbstractEventList<Row> implements ViewChangedEventListener {
     List<Row> data = new ArrayList<Row>();
     
-    
-    @Override
     public Row get(int index) {
         return this.data.get( index );
     }
 
-    @Override
     public int size() {
         return this.data.size();
     }

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-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/QueryTest.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -25,6 +25,8 @@
 import org.drools.WorkingMemory;
 import org.drools.base.ClassObjectType;
 import org.drools.base.DroolsQuery;
+import org.drools.base.NonCloningQueryViewListener;
+import org.drools.base.StandardQueryViewChangedEventListener;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderError;
 import org.drools.builder.KnowledgeBuilderErrors;
@@ -44,8 +46,11 @@
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.Package;
 import org.drools.rule.Variable;
+import org.drools.runtime.KnowledgeSessionConfiguration;
 import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.conf.QueryListenerClassOption;
 import org.drools.runtime.rule.LiveQuery;
+import org.drools.runtime.rule.QueryResultsRow;
 import org.drools.runtime.rule.Row;
 import org.drools.runtime.rule.ViewChangedEventListener;
 import org.drools.runtime.rule.impl.FlatQueryResults;
@@ -747,5 +752,58 @@
         assertEquals( 4, removed.size() );
         assertEquals( 1, updated.size() );           
     }
+    
+    public void testStandardQueryListener() {
+        runQueryListenerTest( QueryListenerClassOption.get( StandardQueryViewChangedEventListener.class ) );
+    }
+    
+    public void testNonCloningQueryListener() {
+        runQueryListenerTest( QueryListenerClassOption.get( NonCloningQueryViewListener.class ) );
+    }
+    
+    public void runQueryListenerTest( QueryListenerClassOption option ) {
+        String str = "";
+        str += "package org.drools\n";
+        str += "query cheeses(String $type) \n";
+        str += "    $cheese : Cheese(type == $type) \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() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( option );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null);
+
+        // insert some data into the session
+        for( int i = 0; i < 10000; i++ ) {
+            ksession.insert( new Cheese( i%2==0 ? "stilton" : "brie") );
+        }
+        
+        // query the session
+        long start = System.currentTimeMillis();
+        List<Cheese> cheeses;
+        for ( int i = 0; i < 100; i++ ) {
+            org.drools.runtime.rule.QueryResults queryResults = ksession.getQueryResults( "cheeses",
+                                                                                          new Object[]{"stilton"} );
+            cheeses = new ArrayList<Cheese>();
+            for ( QueryResultsRow row : queryResults ) {
+                cheeses.add( (Cheese) row.get( "$cheese" ) );
+            }
+            
+            assertEquals( 5000, cheeses.size() );
+        }
+        long end = System.currentTimeMillis();
+        
+        //System.out.println("Query time = "+(end-start));
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -24,7 +24,8 @@
 import java.util.Map;
 import java.util.Properties;
 
-import org.drools.builder.conf.AccumulateFunctionOption;
+import org.drools.base.InternalViewChangedEventListener;
+import org.drools.base.StandardQueryViewChangedEventListener;
 import org.drools.command.CommandService;
 import org.drools.core.util.ConfFileUtils;
 import org.drools.core.util.StringUtils;
@@ -37,9 +38,11 @@
 import org.drools.runtime.conf.KeepReferenceOption;
 import org.drools.runtime.conf.KnowledgeSessionOption;
 import org.drools.runtime.conf.MultiValueKnowledgeSessionOption;
+import org.drools.runtime.conf.QueryListenerClassOption;
 import org.drools.runtime.conf.SingleValueKnowledgeSessionOption;
 import org.drools.runtime.conf.WorkItemHandlerOption;
 import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.rule.QueryViewChangedEventListener;
 import org.drools.util.ChainedProperties;
 import org.drools.util.ClassLoaderUtil;
 import org.mvel2.MVEL;
@@ -76,6 +79,8 @@
 
     private ClockType                     clockType;
 
+    private QueryListenerClassOption           queryListener;
+
     private Map<String, WorkItemHandler>  workItemHandlers;
     private ProcessInstanceManagerFactory processInstanceManagerFactory;
     private SignalManagerFactory          processSignalManagerFactory;
@@ -89,14 +94,19 @@
         out.writeBoolean( immutable );
         out.writeBoolean( keepReference );
         out.writeObject( clockType );
+        out.writeObject( queryListener.getQueryListenerClass().getName() );
     }
 
+    @SuppressWarnings("unchecked")
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
         chainedProperties = (ChainedProperties) in.readObject();
         immutable = in.readBoolean();
         keepReference = in.readBoolean();
         clockType = (ClockType) in.readObject();
+        queryListener = QueryListenerClassOption.get( (Class< ? extends QueryViewChangedEventListener>) Class.forName( (String) in.readObject(),
+                                                                                                                  true,
+                                                                                                                  this.classLoader ) );
     }
 
     /**
@@ -142,6 +152,9 @@
 
         setClockType( ClockType.resolveClockType( this.chainedProperties.getProperty( ClockTypeOption.PROPERTY_NAME,
                                                                                       "realtime" ) ) );
+
+        setQueryListenerClass( this.chainedProperties.getProperty( QueryListenerClassOption.PROPERTY_NAME,
+                                                                   StandardQueryViewChangedEventListener.class.getName() ) );
     }
 
     public void addProperties(Properties properties) {
@@ -161,6 +174,8 @@
             setKeepReference( StringUtils.isEmpty( value ) ? true : Boolean.parseBoolean( value ) );
         } else if ( name.equals( ClockTypeOption.PROPERTY_NAME ) ) {
             setClockType( ClockType.resolveClockType( StringUtils.isEmpty( value ) ? "realtime" : value ) );
+        } else if ( name.equals( QueryListenerClassOption.PROPERTY_NAME ) ) {
+            setQueryListenerClass( StringUtils.isEmpty( value ) ? StandardQueryViewChangedEventListener.class.getName() : value );
         }
     }
 
@@ -174,6 +189,8 @@
             return Boolean.toString( this.keepReference );
         } else if ( name.equals( ClockTypeOption.PROPERTY_NAME ) ) {
             return this.clockType.toExternalForm();
+        } else if ( name.equals( QueryListenerClassOption.PROPERTY_NAME ) ) {
+            return this.queryListener.getQueryListenerClass().getName();
         }
 
         return null;
@@ -220,6 +237,24 @@
         this.clockType = clockType;
     }
 
+    @SuppressWarnings("unchecked")
+    private void setQueryListenerClass(String property) {
+        checkCanChange();
+        try {
+            Class< ? extends InternalViewChangedEventListener> listenerClass = (Class< ? extends InternalViewChangedEventListener>) Class.forName( property,
+                                                                                                                                                   true,
+                                                                                                                                                   this.classLoader );
+            setQueryListenerClass( listenerClass );
+        } catch ( ClassNotFoundException e ) {
+            throw new RuntimeDroolsException("Unable to find query listener class : '"+property+"'", e);
+        }
+    }
+
+    private void setQueryListenerClass(Class< ? extends InternalViewChangedEventListener> listenerClass) {
+        checkCanChange();
+        this.queryListener = QueryListenerClassOption.get( listenerClass );
+    }
+    
     public Map<String, WorkItemHandler> getWorkItemHandlers() {
         if ( this.workItemHandlers == null ) {
             initWorkItemHandlers();
@@ -421,6 +456,8 @@
             return (T) ClockTypeOption.get( getClockType().toExternalForm() );
         } else if ( KeepReferenceOption.class.equals( option ) ) {
             return (T) (this.keepReference ? KeepReferenceOption.YES : KeepReferenceOption.NO);
+        } else if ( QueryListenerClassOption.class.equals( option ) ) {
+            return (T) this.queryListener;
         }
         return null;
     }
@@ -441,8 +478,10 @@
         } else if ( option instanceof KeepReferenceOption ) {
             setKeepReference( ((KeepReferenceOption) option).isKeepReference() );
         } else if ( option instanceof WorkItemHandlerOption ) {
-            getWorkItemHandlers().put( ((WorkItemHandlerOption)option).getName(),
-                                       ((WorkItemHandlerOption)option).getHandler() );
+            getWorkItemHandlers().put( ((WorkItemHandlerOption) option).getName(),
+                                       ((WorkItemHandlerOption) option).getHandler() );
+        } else if ( option instanceof QueryListenerClassOption ) {
+            this.queryListener = (QueryListenerClassOption) option;
         }
     }
 
@@ -454,4 +493,8 @@
         this.classLoader = classLoader;
     }
 
+    public QueryListenerClassOption getQueryListenerOption() {
+        return this.queryListener;
+    }
+
 }

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-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -16,11 +16,7 @@
 
 package org.drools.base;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.drools.rule.Query;
-import org.drools.rule.Variable;
 
 public final class DroolsQuery extends ArrayElements {
     private final String         name;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/InternalViewChangedEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/InternalViewChangedEventListener.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/InternalViewChangedEventListener.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -16,12 +16,15 @@
 
 package org.drools.base;
 
+import java.util.List;
+
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.Rule;
+import org.drools.runtime.rule.QueryViewChangedEventListener;
 import org.drools.spi.PropagationContext;
 
-public interface InternalViewChangedEventListener {
+public interface InternalViewChangedEventListener extends QueryViewChangedEventListener { 
     public void rowAdded(Rule rule, 
                          LeftTuple tuple,
                          PropagationContext context,
@@ -35,4 +38,7 @@
                            LeftTuple leftTuple,
                            PropagationContext context,
                            InternalWorkingMemory workingMemory);
+    
+    public List<? extends Object> getResults();
+    
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/NonCloningQueryViewListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/NonCloningQueryViewListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/NonCloningQueryViewListener.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -0,0 +1,73 @@
+/**
+ * Copyright 2010 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.base;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.rule.Rule;
+import org.drools.spi.PropagationContext;
+
+public class NonCloningQueryViewListener 
+    implements
+    InternalViewChangedEventListener {
+
+    private List<Object> results;
+
+    public NonCloningQueryViewListener() {
+        this.results = new ArrayList<Object>( 250 );
+    }
+
+    public List<? extends Object> getResults() {
+        return this.results;
+    }
+
+    public void rowAdded(final Rule rule,
+                         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()] = handle;
+            entry = entry.getParent();
+        }
+
+        InternalFactHandle handle = entry.getLastHandle();
+        handles[entry.getIndex()] = handle;
+        this.results.add( handles );
+    }
+    
+    public void rowRemoved(final Rule rule,
+                           final LeftTuple tuple,
+            final PropagationContext context,
+            final InternalWorkingMemory workingMemory) {
+    }
+    
+    public void rowUpdated(final Rule rule,
+                           final LeftTuple tuple,
+            final PropagationContext context,
+            final InternalWorkingMemory workingMemory) {    	
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/StandardQueryViewChangedEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/StandardQueryViewChangedEventListener.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/StandardQueryViewChangedEventListener.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -23,7 +23,6 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
-import org.drools.rule.Query;
 import org.drools.rule.Rule;
 import org.drools.rule.Variable;
 import org.drools.spi.PropagationContext;
@@ -32,13 +31,13 @@
     implements
     InternalViewChangedEventListener {
 
-    private List results;
+    private List<Object> results;
 
     public StandardQueryViewChangedEventListener() {
-        this.results = new ArrayList( 250 );
+        this.results = new ArrayList<Object>( 250 );
     }
 
-    public List getResults() {
+    public List<? extends Object> getResults() {
         return this.results;
     }
 
@@ -81,7 +80,6 @@
                                                                 new ArrayElements( newArgs ) );
 
         this.results.add( handles );
-
     }
     
     public void rowRemoved(final Rule rule,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -52,6 +52,7 @@
     private Object                  object;
     private EqualityKey             key;
     private int                     objectHashCode;
+    private transient int           identityHashCode;
     
     public RightTuple              firstRightTuple;
     public RightTuple              lastRightTuple;
@@ -87,19 +88,18 @@
         this.recency = recency;
         this.object = object;
         this.objectHashCode = object.hashCode();
+        setIdentityHashCode();
     }
-    
+
     public DefaultFactHandle(final int id,
                              final int objectHashCode,
                              final long recency) {
         this.id = id;
         this.recency = recency;
         this.objectHashCode = objectHashCode;
+        setIdentityHashCode();
     }
         
-    
-    
-
     // ----------------------------------------------------------------------
     // Instance members
     // ----------------------------------------------------------------------
@@ -124,9 +124,13 @@
     }
     
     public int getIdentityHashCode() {
-        return System.identityHashCode( this.object );
+        return this.identityHashCode;
     }    
     
+    private void setIdentityHashCode() {
+        this.identityHashCode = System.identityHashCode( this.object );
+    }
+    
     protected void setObjectHashCode( int hashCode ) {
         this.objectHashCode = hashCode;
     }
@@ -187,6 +191,7 @@
 
     public void setObject(final Object object) {
         this.object = object;
+        setIdentityHashCode();
     }
 
     /**
@@ -262,6 +267,7 @@
         clone.lastRightTuple = this.lastRightTuple;
         
         clone.objectHashCode = this.objectHashCode;
+        clone.identityHashCode = System.identityHashCode( clone.object );
         return clone;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -16,6 +16,8 @@
 
 package org.drools.reteoo;
 
+import java.util.List;
+
 import org.drools.base.DroolsQuery;
 import org.drools.base.InternalViewChangedEventListener;
 import org.drools.common.BaseNode;
@@ -218,6 +220,9 @@
             //TODO        	
         }        
 
+        public List< ? extends Object> getResults() {
+            throw new UnsupportedOperationException(getClass().getCanonicalName()+" does not support the getResults() method.");
+        }
     }
 
     public short getType() {

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-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -20,11 +20,13 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.Collection;
+import java.util.List;
 
+import org.drools.FactHandle;
 import org.drools.QueryResults;
 import org.drools.SessionConfiguration;
 import org.drools.base.DroolsQuery;
-import org.drools.base.StandardQueryViewChangedEventListener;
+import org.drools.base.InternalViewChangedEventListener;
 import org.drools.common.AbstractWorkingMemory;
 import org.drools.common.DefaultAgenda;
 import org.drools.common.EventFactHandle;
@@ -155,6 +157,7 @@
                                 null );
     }
 
+    @SuppressWarnings("unchecked")
     public QueryResults getQueryResults(final String query,
                                         final Object[] arguments) {
 
@@ -164,7 +167,7 @@
             this.lock.lock();
             DroolsQuery queryObject = new DroolsQuery( query,
                                                        arguments,
-                                                       new StandardQueryViewChangedEventListener(),
+                                                       (InternalViewChangedEventListener) this.config.getQueryListenerOption().newQueryListenerInstance(),
                                                        false );
             InternalFactHandle handle = this.handleFactory.newFactHandle( queryObject,
                                                                           this.getObjectTypeConfigurationRegistry().getObjectTypeConf( EntryPoint.DEFAULT,
@@ -186,7 +189,7 @@
                 declarations = queryObject.getQuery().getDeclarations();
             }
 
-            return new QueryResults( ((StandardQueryViewChangedEventListener) queryObject.getQueryResultCollector()).getResults(),
+            return new QueryResults( (List<FactHandle[]>) queryObject.getQueryResultCollector().getResults(),
                                      declarations,
                                      this );
         } finally {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/OpenQueryViewChangedEventListenerAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/OpenQueryViewChangedEventListenerAdapter.java	2010-07-26 20:58:33 UTC (rev 34210)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/rule/impl/OpenQueryViewChangedEventListenerAdapter.java	2010-07-27 01:02:25 UTC (rev 34211)
@@ -16,6 +16,8 @@
 
 package org.drools.runtime.rule.impl;
 
+import java.util.List;
+
 import org.drools.base.InternalViewChangedEventListener;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
@@ -59,4 +61,8 @@
         this.viewEventListener.rowUpdated( rowAdapter );
     }
 
+    public List< ? extends Object> getResults() {
+        throw new UnsupportedOperationException(getClass().getCanonicalName()+" does not support the getResults() method.");
+    }
+
 }



More information about the jboss-svn-commits mailing list