[jboss-svn-commits] JBL Code SVN: r10525 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/clp/functions and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Mar 24 23:43:07 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-03-24 23:43:07 -0400 (Sat, 24 Mar 2007)
New Revision: 10525

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ForeachFunction.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java
Log:
JBRULES-720 Clips Parser
-added foreach function

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-25 02:44:34 UTC (rev 10524)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-25 03:43:07 UTC (rev 10525)
@@ -36,6 +36,9 @@
 
     public ValueHandler execute(ValueHandler[] args,
                                 ExecutionContext context) {
+        if ( this.function == null ) {
+            throw new RuntimeException( "Unable to find and bine Function '" + this.name + "'" );
+        }
         return function.execute( args,
                                  context );
     }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ForeachFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ForeachFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ForeachFunction.java	2007-03-25 03:43:07 UTC (rev 10525)
@@ -0,0 +1,63 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionBuildContext;
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.ListValueHandler;
+import org.drools.clp.valuehandlers.TempTokenVariable;
+
+public class ForeachFunction extends BaseFunction
+    implements
+    Function {
+    private static final String name = "foreach";
+
+    public ForeachFunction() {
+
+    }
+    
+    public ValueHandler addParameterCallback(int index,
+                                             ValueHandler valueHandler,
+                                             ExecutionBuildContext context) {
+        // The first index in the 'foreach' function is the variable
+        // register the variable, if it doesn't already exist, will be a TempTokenVariable if it does not already exist
+        if ( index == 0 && (valueHandler instanceof TempTokenVariable) ) {
+            TempTokenVariable temp = (TempTokenVariable) valueHandler;
+            valueHandler = context.createLocalVariable( temp.getIdentifier() );
+        }
+
+        return valueHandler;
+    }    
+
+    public ValueHandler execute(ValueHandler[] args,
+                                ExecutionContext context) {
+        ValueHandler result = null;
+        
+        BindFunction bind = new BindFunction();
+        ValueHandler[] bindArgs = new ValueHandler[2];
+        bindArgs[0] = args[0];
+  
+        // Check if the arg is a List or a variable resolving to a list
+        ValueHandler value = args[1];
+        if ( !(value instanceof ListValueHandler ) ) {
+           value = value.getValue( context ); 
+        }
+        ValueHandler[] list  = (( ListValueHandler ) value).getList();
+      
+        for (int i = 0, length1 = list.length; i < length1; i++ ) {
+            bindArgs[1] = list[i];
+            bind.execute( bindArgs, context );
+            for (int j = 2, length2 = args.length; j < length2; j++ ) {
+                // iterate for each action
+                result = args[j].getValue( context );
+            }            
+        }
+
+        return result;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java	2007-03-25 02:44:34 UTC (rev 10524)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java	2007-03-25 03:43:07 UTC (rev 10525)
@@ -17,10 +17,13 @@
                                 ExecutionContext context) {
         ValueHandler result = null;
 
-        ValueHandler doHandler = args[args.length - 1];
-
-        while ( args[0].getBooleanValue( context ) ) {
-            result = doHandler.getValue( context );
+        ValueHandler doLoop = args[0];
+        
+        while ( doLoop.getBooleanValue( context ) ) {
+            for (int i = 2, length = args.length; i < length; i++ ) {
+                // iterate for each action                
+                result = args[i].getValue( context );
+            }
         }
 
         return result;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf	2007-03-25 02:44:34 UTC (rev 10524)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf	2007-03-25 03:43:07 UTC (rev 10525)
@@ -2,6 +2,7 @@
 org.drools.clp.functions.AddFunction
 org.drools.clp.functions.IfFunction
 org.drools.clp.functions.WhileFunction
+org.drools.clp.functions.ForeachFunction
 org.drools.clp.functions.LessThanFunction
 org.drools.clp.functions.BindFunction
 org.drools.clp.functions.ModifyFunction
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java	2007-03-25 02:44:34 UTC (rev 10524)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java	2007-03-25 03:43:07 UTC (rev 10525)
@@ -116,9 +116,23 @@
         context.setLocalVariable( 1, new LongValueHandler( 10 ) );
         
         engine.execute( context );        
-        assertEquals( new BigDecimal(10), context.getLocalVariable( 0 ).getObject( context ) );
-    }    
+        assertEquals( new BigDecimal(10), context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+    }   
     
+    public void testForeach() throws Exception {
+        BlockExecutionEngine engine = ( BlockExecutionEngine ) parse("(bind ?x 0) (foreach ?e (create$ 1 2 3) (bind ?x (+ ?x ?e) ) )").rhs();
+        ExecutionContext context = new ExecutionContext(null, null, 2);
+        
+        Map vars = new HashMap();
+        
+        vars.put( "?x", new LocalVariableValue( "?x", 0 ) );  
+        engine.replaceTempTokens( vars );
+        
+        context.setLocalVariable( 0, new LongValueHandler( 0 ) );        
+        engine.execute( context );        
+        assertEquals( new BigDecimal(6), context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+    }     
+    
     private CLPParser parse(final String text) throws Exception {
         this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
         return this.parser;




More information about the jboss-svn-commits mailing list