[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