[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