[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