[jboss-svn-commits] JBL Code SVN: r12298 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: base and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Jun 2 21:41:53 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-06-02 21:41:53 -0400 (Sat, 02 Jun 2007)
New Revision: 12298
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.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/Query.java
Log:
JBRULES-900 allow parameterised queries
-parameterised querries now work
-added an ArrayExtractor that allows binding to elements
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 2007-06-02 06:05:48 UTC (rev 12297)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -2,6 +2,8 @@
import java.util.Map;
+import org.drools.base.ShadowProxy;
+import org.drools.common.InternalFactHandle;
import org.drools.rule.Declaration;
import org.drools.spi.Tuple;
@@ -25,15 +27,15 @@
public Object get(final int i) {
//adjust for the DroolsQuery object
- return this.tuple.get( i + 1 ).getObject();
+ return getObject( this.tuple.get( i + 1 ));
}
- public Object get(final String declaration) {
- return get( (Declaration) this.queryResults.getDeclarations().get( declaration ) );
+ public Object get(final String identifier) {
+ return get( (Declaration) this.queryResults.getDeclarations().get( identifier ) );
}
public Object get(final Declaration declaration) {
- return declaration.getValue( this.tuple.get( declaration ).getObject() );
+ return declaration.getValue( getObject( this.tuple.get( declaration ) ) );
}
public FactHandle[] getFactHandles() {
@@ -52,4 +54,12 @@
// Adjust for the DroolsQuery object
return this.tuple.getFactHandles().length - 1;
}
+
+ private Object getObject(InternalFactHandle handle) {
+ if ( handle.isShadowFact() ) {
+ return ((ShadowProxy) handle.getObject()).getShadowedObject();
+ } else {
+ return handle.getObject();
+ }
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java 2007-06-02 06:05:48 UTC (rev 12297)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -234,6 +234,8 @@
* if no query named "query" is found in the rulebase
*/
public QueryResults getQueryResults(String query);
+
+ public QueryResults getQueryResults(String query, Object[] arguments);
/**
* Assert a fact registering JavaBean <code>PropertyChangeListeners</code>
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 2007-06-02 06:05:48 UTC (rev 12297)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DroolsQuery.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -17,16 +17,34 @@
*/
public class DroolsQuery {
- private String name;
+ private final String name;
+ private final Object[] args;
+
+ 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, final Object[] params) {
+ super();
+ this.name = name;
+ if ( params != null ) {
+ this.args = params;
+ } else {
+ this.args = EMPTY_PARAMS;
+ }
+ }
public String getName() {
return this.name;
}
+
+ public Object[] getArguments() {
+ return this.args;
+ }
public int hashCode() {
final int PRIME = 31;
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -0,0 +1,99 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.base.ValueType;
+import org.drools.spi.Extractor;
+
+public class ArrayExtractor implements Extractor {
+ private final Extractor arrayExtractor;
+ private final int index;
+
+ public ArrayExtractor(Extractor arrayExtractor, int index) {
+ this.arrayExtractor = arrayExtractor;
+ this.index = index;
+ }
+
+ public Class getExtractToClass() {
+ return Object.class;
+ }
+
+ public boolean getBooleanValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Boolean)array[ this.index ]).booleanValue();
+ }
+ public byte getByteValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Byte)array[ this.index ]).byteValue();
+ }
+ public char getCharValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Character)array[ this.index ]).charValue();
+ }
+ public double getDoubleValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Double)array[ this.index ]).doubleValue();
+ }
+
+ public float getFloatValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Float)array[ this.index ]).floatValue();
+ }
+
+ public int getIntValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Integer)array[ this.index ]).intValue();
+ }
+ public long getLongValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Long) array[ this.index ]).longValue();
+ }
+ public Method getNativeReadMethod() {
+ throw new UnsupportedOperationException("cannot call a method on an array extractor" );
+ }
+ public short getShortValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return ( (Short)array[ this.index ]).shortValue();
+ }
+ public Object getValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return array[ this.index ];
+ }
+ public ValueType getValueType() {
+ return ValueType.OBJECT_TYPE;
+ }
+ public boolean isNullValue(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return array[ this.index ] == null;
+ }
+
+ public int getHashCode(Object object) {
+ Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+ return array[ this.index ].hashCode();
+ }
+
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((arrayExtractor == null) ? 0 : arrayExtractor.hashCode());
+ result = PRIME * result + index;
+ return result;
+ }
+
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( obj == null ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ final ArrayExtractor other = (ArrayExtractor) obj;
+ if ( arrayExtractor == null ) {
+ if ( other.arrayExtractor != null ) return false;
+ } else if ( !arrayExtractor.equals( other.arrayExtractor ) ) return false;
+ if ( index != other.index ) return false;
+ return true;
+ }
+
+
+
+
+
+}
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 2007-06-02 06:05:48 UTC (rev 12297)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -81,12 +81,16 @@
}
public QueryResults getQueryResults(final String query) {
- final FactHandle handle = assertObject( new DroolsQuery( query ) );
+ return getQueryResults( query, null );
+ }
+ public QueryResults getQueryResults(final String query, final Object[] arguments) {
+ final FactHandle handle = assertObject( new DroolsQuery( query, arguments ) );
final QueryTerminalNode node = (QueryTerminalNode) this.queryResults.remove( query );
Query queryObj = null;
List list = null;
if ( node == null ) {
+ // There are no results, first check the query object actually exists and then retract the DroolsQuery object
final org.drools.rule.Package[] pkgs = this.ruleBase.getPackages();
for ( int i = 0; i < pkgs.length; i++ ) {
final Rule rule = pkgs[i].getRule( query );
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 2007-06-02 06:05:48 UTC (rev 12297)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -120,14 +120,6 @@
private TerminalNode addSubRule(final BuildContext context,
final GroupElement subrule,
final Rule rule) throws InvalidPatternException {
-
- // if it is a query, needs to add the query pattern
- if ( rule instanceof Query ) {
- this.addQueryPattern( context,
- subrule,
- (Query) rule );
- }
-
// gets the appropriate builder
final ReteooComponentBuilder builder = this.utils.getBuilderFor( subrule );
@@ -135,8 +127,8 @@
if ( builder.requiresLeftActivation( this.utils,
subrule ) ) {
this.addInitialFactPattern( context,
- subrule,
- rule );
+ subrule,
+ rule );
}
// builds and attach
@@ -181,47 +173,13 @@
* @param subrule
* @param query
*/
- private void addQueryPattern(final BuildContext context,
- final GroupElement subrule,
- final Query query) {
-
- // creates a pattern for initial fact
- final Pattern pattern = new Pattern( 0,
- new ClassObjectType( DroolsQuery.class ) );
-
- final ClassFieldExtractor extractor = new ClassFieldExtractor( DroolsQuery.class,
- "name" );
-
- final FieldValue field = FieldFactory.getFieldValue( query.getName(),
- ValueType.STRING_TYPE );
-
- final LiteralConstraint constraint = new LiteralConstraint( extractor,
- ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL ),
- field );
-
- // adds appropriate constraint to the pattern
- pattern.addConstraint( constraint );
-
- // adds the pattern as the first child of the given AND group element
- subrule.addChild( 0,
- pattern );
-
- }
-
- /**
- * Adds a query pattern to the given subrule
- *
- * @param context
- * @param subrule
- * @param query
- */
private void addInitialFactPattern(final BuildContext context,
- final GroupElement subrule,
- final Rule rule) {
+ final GroupElement subrule,
+ final Rule rule) {
// creates a pattern for initial fact
final Pattern pattern = new Pattern( 0,
- new ClassObjectType( InitialFact.class ) );
+ new ClassObjectType( InitialFact.class ) );
// adds the pattern as the first child of the given AND group element
subrule.addChild( 0,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Query.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Query.java 2007-06-02 06:05:48 UTC (rev 12297)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Query.java 2007-06-03 01:41:53 UTC (rev 12298)
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-public class Query extends Rule {
+public class Query extends Rule {
/**
*
@@ -25,7 +25,7 @@
public Query(final String name) {
super( name );
- }
+ }
/**
* Override this as Queries will NEVER have a consequence, and it should
More information about the jboss-svn-commits
mailing list