[jboss-svn-commits] JBL Code SVN: r10565 - in labs/jbossrules/trunk/drools-clips/src: main/java/org/drools/clp/functions and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Mar 27 23:03:38 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-03-27 23:03:37 -0400 (Tue, 27 Mar 2007)
New Revision: 10565
Added:
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java
labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java
labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java
Removed:
labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java
labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java
Modified:
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf
Log:
JBRULES-720 Clips Parser
-(break) now works
-added switch
-added equals(ValueHandler, Context) to each ValueHandler
-added printout, with the route defined from a Map in the context, currently returns a PrintStream
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -39,6 +39,9 @@
try {
while ( (line = reader.readLine()) != null ) {
+ if ( line.startsWith( "#" ) || line.equals( "" )) {
+ continue;
+ }
Class clazz = getClass().getClassLoader().loadClass( line );
Function function = (Function) clazz.newInstance();
this.functions.put( function.getName(),
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,5 +1,10 @@
package org.drools.clp;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.HashMap;
+import java.util.Map;
+
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
@@ -8,6 +13,7 @@
private ReteTuple tuple;
private Object object;
private ValueHandler[] localVariables;
+ private Map printoutRouters;
public ExecutionContext(InternalWorkingMemory workingMemory,
ReteTuple tuple,
@@ -26,7 +32,17 @@
this.tuple = tuple;
this.object = object;
this.localVariables = new ValueHandler[localVariableSize];
+ this.printoutRouters = new HashMap();
+ this.printoutRouters.put( "t", System.out );
}
+
+ public void setPrintoutRouters(Map printoutRouters) {
+ this.printoutRouters = printoutRouters;
+ }
+
+ public PrintStream getPrintoutRouters(String identifier) {
+ return ( PrintStream ) this.printoutRouters.get( identifier );
+ }
public ReteTuple getTuple() {
return tuple;
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -37,7 +37,7 @@
public ValueHandler execute(ValueHandler[] args,
ExecutionContext context) {
if ( this.function == null ) {
- throw new RuntimeException( "Unable to find and bine Function '" + this.name + "'" );
+ throw new RuntimeException( "Unable to find and bind Function '" + this.name + "'" );
}
return function.execute( args,
context );
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -15,68 +15,57 @@
public FunctionRegistry(BuiltinFunctions builtin) {
this.functions = new HashMap();
- //this.variables = new HashMap();
this.builtin = builtin;
- try {
- loadFunctions();
- } catch ( IOException e ) {
- throw new RuntimeException( e );
- } catch ( ClassNotFoundException e ) {
- throw new RuntimeException( e );
- }
+// try {
+// loadFunctions();
+// } catch ( IOException e ) {
+// throw new RuntimeException( e );
+// } catch ( ClassNotFoundException e ) {
+// throw new RuntimeException( e );
+// }
}
- public void loadFunctions() throws IOException,
- ClassNotFoundException {
- BufferedReader reader = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "functions.conf" ) ) );
- loadFunctions( reader );
- }
+// public void loadFunctions() throws IOException,
+// ClassNotFoundException {
+// BufferedReader reader = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "functions.conf" ) ) );
+// loadFunctions( reader );
+// }
+//
+// public void loadFunctions(BufferedReader reader) throws IOException,
+// ClassNotFoundException {
+// String line = null;
+//
+// try {
+// while ( (line = reader.readLine()) != null ) {
+// Class clazz = getClass().getClassLoader().loadClass( line );
+// Function function = (Function) clazz.newInstance();
+// addFunction( function );
+// }
+// } catch ( IllegalAccessException e ) {
+// throw new RuntimeException( e );
+// } catch ( InstantiationException e ) {
+// throw new RuntimeException( e );
+// }
+// }
- public void loadFunctions(BufferedReader reader) throws IOException,
- ClassNotFoundException {
- String line = null;
-
- try {
- while ( (line = reader.readLine()) != null ) {
- Class clazz = getClass().getClassLoader().loadClass( line );
- Function function = (Function) clazz.newInstance();
- addFunction( function );
- }
- } catch ( IllegalAccessException e ) {
- throw new RuntimeException( e );
- } catch ( InstantiationException e ) {
- throw new RuntimeException( e );
- }
- }
-
public Function getFunction(String name) {
Function function = (Function) this.functions.get( name );
if ( function == null ) {
- // Allows for late binidng FunctionDelegators
- function = new FunctionDelegator( name );
+ function = this.builtin.getFunction( name );
+ if ( function == null ) {
+ function = new FunctionDelegator( name );
+ } else {
+ function = new FunctionDelegator(function);
+ }
this.functions.put( name,
function );
}
return function;
- }
+ }
- // public Function createFunction(String name) {
- // try {
- // Class clazz = ( Class ) this.functions.get( name );
- // if ( clazz == null ) {
- // throw new RuntimeException( "Function '" + name + "' does not exist" );
- // }
- // return (Function) clazz.newInstance();
- // } catch ( InstantiationException e ) {
- // throw new RuntimeException( e );
- // } catch ( IllegalAccessException e ) {
- // throw new RuntimeException( e );
- // }
- // }
-
public void addFunction(Function function) {
FunctionDelegator delegator = (FunctionDelegator) this.functions.get( function.getName() );
@@ -88,28 +77,7 @@
delegator.setFunction( function );
}
- // public void init() {
- // this.variables.clear();
- // }
- //
- // public void setVariable(LocalVariableValue variable) {
- // this.variables.put( variable.getIdentifier(), variable );
- // }
- //
- // public VariableValueHandler getVariable(String identifier) {
- // VariableValueHandler variable = ( VariableValueHandler ) this.variables.get( identifier );
- // if ( identifier == null ) {
- // variable = new TempTokenVariable( identifier );
- // this.variables.put( identifier, variable );
- // }
- // return variable;
- // }
-
public int getFunctionSize() {
return this.functions.size();
}
-
- // public int getVariablesSize() {
- // return this.variables.size();
- // }
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -64,4 +64,6 @@
*/
public BigDecimal getBigDecimalValue(ExecutionContext context) throws NumberFormatException;
+
+ public boolean equals(ValueHandler other, ExecutionContext context);
}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,26 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+
+public class BreakFunction extends BaseFunction
+ implements
+ Function {
+ private static final String name = "break";
+
+ public BreakFunction() {
+
+ }
+
+ public ValueHandler execute(ValueHandler[] args,
+ ExecutionContext context) {
+ return BaseValueHandler.BREAK;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,26 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+
+public class EqFunction extends BaseFunction
+ implements
+ Function {
+ private static final String name = "eq";
+
+ public EqFunction() {
+
+ }
+
+ public ValueHandler execute(ValueHandler[] args,
+ ExecutionContext context) {
+
+ return new BooleanValueHandler( args[0].equals( args[1], context ) );
+ }
+
+ public String getName() {
+ return name;
+ }
+}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -4,6 +4,7 @@
import org.drools.clp.ExecutionContext;
import org.drools.clp.Function;
import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
import org.drools.clp.valuehandlers.ListValueHandler;
import org.drools.clp.valuehandlers.TempTokenVariable;
@@ -50,6 +51,13 @@
for (int j = 2, length2 = args.length; j < length2; j++ ) {
// iterate for each action
result = args[j].getValue( context );
+ if ( result == BaseValueHandler.BREAK ) {
+ break;
+ }
+ }
+ if ( result == BaseValueHandler.BREAK ) {
+ // need to do this twice as its a nested loop here, a single loop in the lisp
+ break;
}
}
Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,46 @@
+package org.drools.clp.functions;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+import org.drools.base.SimpleValueType;
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.FunctionDelegator;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.ListValueHandler;
+
+public class PrintoutFunction extends BaseFunction
+ implements
+ Function {
+ private static final String name = "printout";
+
+ public PrintoutFunction() {
+
+ }
+
+ public ValueHandler execute(ValueHandler[] args,
+ ExecutionContext context) {
+ PrintStream route = context.getPrintoutRouters( args[0].getStringValue( context ) );
+
+ for ( int i = 1; i < args.length; i++ ) {
+ ValueHandler value = args[i].getValue( context );
+ if ( value != null && value.getValueType( context ) == SimpleValueType.LIST ) {
+ ValueHandler[] list = ((ListValueHandler)value).getList();
+ for ( int j = 0; j < list.length; j++ ) {
+ route.print( list[j].getStringValue( context ) );
+ }
+ } else {
+ System.out.print( args[i].getStringValue( context ) );
+ }
+ }
+
+ return null;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,48 +1,54 @@
package org.drools.clp.functions;
+import org.drools.clp.ExecutionBuildContext;
import org.drools.clp.ExecutionContext;
import org.drools.clp.Function;
import org.drools.clp.LispForm;
import org.drools.clp.LispList;
import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.TempTokenVariable;
public class SwitchCaseFunction extends BaseFunction
implements
Function {
- private static final String name = "switch";
+ private static final String name = "case";
public SwitchCaseFunction() {
}
+ public ValueHandler addParameterCallback(int index,
+ ValueHandler valueHandler,
+ ExecutionBuildContext context) {
+ if ( index == 0 ) {
+ // swap the element for an equality check
+ FunctionCaller caller = new FunctionCaller( context.getFunctionRegistry().getFunction( "eq" ) );
+ caller.addParameter( (ValueHandler) context.getProperty( "switch-variable" ) );
+ caller.addParameter( valueHandler );
+ valueHandler = caller;
+ }
+ return valueHandler;
+ }
+
public ValueHandler execute(ValueHandler[] args,
ExecutionContext context) {
- ValueHandler value = args[0].getValue( context );
-
ValueHandler result = null;
- //ValueHandler
+ if ( args[0].getBooleanValue( context ) ) {
+ for (int i = 2, length = args.length; i < length; i++ ) {
+ result = args[i].getValue( context );
+ if ( result == BaseValueHandler.BREAK ) {
+ break;
+ }
+ }
+ } else {
+ result = new BooleanValueHandler( false );
+ }
- for (int j = 2, length = args.length; j < length; j++ ) {
-
-
- // iterate for each action
- //result = args[j].getValue( context );
-
- }
-
return result;
-
- /*
- if ( result ) {
- return args[2].getValue( context );
- } else if ( args[3] != null && args[4] != null ) {
- return args[4].getValue( context );
- } else {
- return new BooleanValueHandler( result );
- }
- */
}
public String getName() {
Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,30 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionBuildContext;
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.LispForm;
+import org.drools.clp.LispList;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.TempTokenVariable;
+
+public class SwitchDefaultFunction extends BaseFunction
+ implements
+ Function {
+ private static final String name = "default";
+
+ public SwitchDefaultFunction() {
+
+ }
+
+ public ValueHandler execute(ValueHandler[] args,
+ ExecutionContext context) {
+ return args[0].getValue( context );
+ }
+
+ public String getName() {
+ return name;
+ }
+}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,11 +1,15 @@
package org.drools.clp.functions;
+import org.drools.clp.ExecutionBuildContext;
import org.drools.clp.ExecutionContext;
import org.drools.clp.Function;
import org.drools.clp.LispForm;
import org.drools.clp.LispList;
import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.LocalVariableValue;
+import org.drools.clp.valuehandlers.TempTokenVariable;
public class SwitchFunction extends BaseFunction
implements
@@ -15,34 +19,38 @@
public SwitchFunction() {
}
+
+ public ValueHandler addParameterCallback(int index,
+ ValueHandler valueHandler,
+ ExecutionBuildContext context) {
+ if ( index == 0 ) {
+ if ( !(valueHandler instanceof LocalVariableValue ) ) {
+ // this should already be bound as a local variable
+ throw new RuntimeException( "The variable must already have been declared to use it in a switch statement" );
+ } else {
+ context.setProperty( "switch-variable", valueHandler );
+ }
+ }
+ return valueHandler;
+ }
+
public ValueHandler execute(ValueHandler[] args,
- ExecutionContext context) {
- ValueHandler value = args[0].getValue( context );
-
+ ExecutionContext context) {
ValueHandler result = null;
- //ValueHandler
+ // binds the variable for the case function to use
+ args[0].getValue( context );
- for (int j = 2, length = args.length; j < length; j++ ) {
-
-
- // iterate for each action
- //result = args[j].getValue( context );
-
+ // now its bound we can execute each case statement in turn
+ for (int i = 1, length = args.length; i < length; i++ ) {
+ result = args[i].getValue( context );
+ if ( result == BaseValueHandler.BREAK ) {
+ break;
+ }
}
return result;
-
- /*
- if ( result ) {
- return args[2].getValue( context );
- } else if ( args[3] != null && args[4] != null ) {
- return args[4].getValue( context );
- } else {
- return new BooleanValueHandler( result );
- }
- */
}
public String getName() {
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -3,6 +3,7 @@
import org.drools.clp.ExecutionContext;
import org.drools.clp.Function;
import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
public class WhileFunction extends BaseFunction
implements
@@ -23,7 +24,14 @@
for (int i = 2, length = args.length; i < length; i++ ) {
// iterate for each action
result = args[i].getValue( context );
+ if ( result == BaseValueHandler.BREAK ) {
+ break;
+ }
}
+ if ( result == BaseValueHandler.BREAK ) {
+ // need to do this twice as its a nested loop here, a single loop in the lisp
+ break;
+ }
}
return result;
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -7,6 +7,8 @@
import org.drools.clp.ValueHandler;
public abstract class BaseValueHandler implements ValueHandler {
+ public static final ObjectValueHandler NULL = new ObjectValueHandler( "null" );
+ public static final ObjectValueHandler BREAK = new ObjectValueHandler( "break" );
public BigDecimal getBigDecimalValue(ExecutionContext context) throws NumberFormatException {
Object object = getObject( context );
@@ -51,7 +53,7 @@
}
public String getStringValue(ExecutionContext context) {
- return (String) getObject(context);
+ return getObject(context).toString();
}
public String toString() {
@@ -64,4 +66,11 @@
}
}
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ Object o1 = getObject(context);
+ Object o2 = other.getObject( context );
+ return o1.equals(o2);
+ }
+
+
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -90,5 +90,7 @@
return true;
}
-
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ return getBooleanValue( context ) == other.getBooleanValue( context );
+ }
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -91,5 +91,10 @@
String name = getClass().getName();
name = name.substring( name.lastIndexOf( "." ) + 1 );
return "[" + name + " identifier = '" + getIdentifier() + "']";
+ }
+
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ // FIXME
+ return false;
}
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -103,5 +103,10 @@
name = name.substring( name.lastIndexOf( "." ) + 1 );
return "[" + name + " identifier = '" + getIdentifier() + "']";
}
+
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ // FIXME
+ return false;
+ }
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -92,5 +92,9 @@
return true;
}
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ return getDoubleValue( context ) == other.getDoubleValue( context );
+ }
+
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -79,6 +79,9 @@
}
public void replaceTempTokens(Map variables) {
+ if ( this.parameters == null ) {
+ return;
+ }
for ( int i = 0, length = this.parameters.length; i < length; i++ ) {
if ( this.parameters[i] instanceof TempTokenVariable ) {
TempTokenVariable var = (TempTokenVariable) this.parameters[i];
@@ -130,5 +133,9 @@
public String toString() {
return "[FunctionCaller " + this.function + "]";
}
+
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ return this == other;
+ }
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -151,4 +151,13 @@
return b.toString();
}
+
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ for ( int i = 0, length = this.list.length; i < length; i++ ) {
+ if ( !getValue( context ).equals( other.getValue( context ), context) ) {
+ return false;
+ }
+ }
+ return true;
+ }
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -90,5 +90,8 @@
return true;
}
+ public boolean equals(ValueHandler other, ExecutionContext context) {
+ return getLongValue( context ) == other.getLongValue( context );
+ }
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -4,9 +4,7 @@
import org.drools.clp.ExecutionContext;
import org.drools.clp.ValueHandler;
-public class ObjectValueHandler extends BaseValueHandler {
- public static final ObjectValueHandler NULL = new ObjectValueHandler( "null" );
-
+public class ObjectValueHandler extends BaseValueHandler {
private Object objectValue;
public ObjectValueHandler(Object objectValue) {
@@ -27,6 +25,6 @@
public Object getObject(ExecutionContext context) {
return this.objectValue;
- }
-
+ }
+
}
Modified: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf 2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,8 +1,23 @@
+#working with vars
+org.drools.clp.functions.BindFunction
+org.drools.clp.functions.ModifyFunction
org.drools.clp.functions.CreateListFunction
-org.drools.clp.functions.AddFunction
+
+#flow control
org.drools.clp.functions.IfFunction
+org.drools.clp.functions.BreakFunction
+org.drools.clp.functions.SwitchFunction
+org.drools.clp.functions.SwitchCaseFunction
+org.drools.clp.functions.SwitchDefaultFunction
org.drools.clp.functions.WhileFunction
org.drools.clp.functions.ForeachFunction
+
+#math comparators
org.drools.clp.functions.LessThanFunction
-org.drools.clp.functions.BindFunction
-org.drools.clp.functions.ModifyFunction
\ No newline at end of file
+org.drools.clp.functions.EqFunction
+
+#math operators
+org.drools.clp.functions.AddFunction
+
+#io
+org.drools.clp.functions.PrintoutFunction
Deleted: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,410 +0,0 @@
-package org.drools.clp;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.TokenStream;
-import org.drools.clp.valuehandlers.DoubleValueHandler;
-import org.drools.clp.valuehandlers.FunctionCaller;
-import org.drools.clp.valuehandlers.LongValueHandler;
-import org.drools.compiler.SwitchingCommonTokenStream;
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.AttributeDescr;
-import org.drools.lang.descr.ColumnDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-
-public class ClpParserTest extends TestCase {
-
- private CLPParser parser;
-
- FunctionRegistry registry;
-
- public void setUp() {
- this.registry = new FunctionRegistry( BuiltinFunctions.getInstance() );
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- this.parser = null;
- }
-
- public void testParseFunction() throws Exception {
- ExecutionBuildContext context = new ExecutionBuildContext( new CLPPredicate(), this.registry );
- FunctionCaller fc = ( FunctionCaller ) parse( "(< 1 2)" ).lisp_list( context, new LispForm(context) );
-
- assertEquals( "<", fc.getName() );
- assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
- assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );
- }
-
- public void testPatternsRule() throws Exception {
- RuleDescr rule = parse( "(defrule xxx ?b <- (person (name \"yyy\"&?bf|~\"zzz\"|~=(+ 2 3)&:(< 1 2)) ) ?c <- (hobby (type ?bf2&~iii) (rating fivestar) ) => )" ).defrule();
-
- assertEquals( "xxx",
- rule.getName() );
-
- AndDescr lhs = rule.getLhs();
- List lhsList = lhs.getDescrs();
- assertEquals( 2,
- lhsList.size() );
-
- // Parse the first column
- ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
- assertEquals( "?b",
- col.getIdentifier() );
- assertEquals( "person",
- col.getObjectType() );
-
- List colList = col.getDescrs();
- assertEquals( 2,
- colList.size() );
- FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
- List restrictionList = fieldConstraintDescr.getRestrictions();
-
- assertEquals( "name",
- fieldConstraintDescr.getFieldName() );
- // @todo the 7th one has no constraint, as its a predicate, have to figure out how to handle this
- assertEquals( 8,
- restrictionList.size() );
-
- LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "yyy",
- litDescr.getText() );
-
- RestrictionConnectiveDescr connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
- assertEquals( RestrictionConnectiveDescr.AND,
- connDescr.getConnective() );
-
- VariableRestrictionDescr varDescr = (VariableRestrictionDescr) restrictionList.get( 2 );
- assertEquals( "==",
- varDescr.getEvaluator() );
- assertEquals( "?bf",
- varDescr.getIdentifier() );
-
- connDescr = (RestrictionConnectiveDescr) restrictionList.get( 3 );
- assertEquals( RestrictionConnectiveDescr.OR,
- connDescr.getConnective() );
-
- litDescr = (LiteralRestrictionDescr) restrictionList.get( 4 );
- assertEquals( "!=",
- litDescr.getEvaluator() );
- assertEquals( "zzz",
- litDescr.getText() );
-
- connDescr = (RestrictionConnectiveDescr) restrictionList.get( 5 );
- assertEquals( RestrictionConnectiveDescr.OR,
- connDescr.getConnective() );
-
- ReturnValueRestrictionDescr retDescr = (ReturnValueRestrictionDescr) restrictionList.get( 6 );
- assertEquals( "!=",
- retDescr.getEvaluator() );
- CLPReturnValue clprv = ( CLPReturnValue ) retDescr.getContent();
- FunctionCaller fc = clprv.getFunctions()[0];
- assertEquals( "+", fc.getName() );
- assertEquals( new LongValueHandler( 2 ), fc.getParameters()[0] );
- assertEquals( new LongValueHandler( 3 ), fc.getParameters()[1] );
-
- PredicateDescr predicateDescr = (PredicateDescr) colList.get( 1 );
- CLPPredicate clpp = ( CLPPredicate ) predicateDescr.getContent();
- fc = clpp.getFunctions()[0];
- assertEquals( "<", fc.getName() );
- assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
- assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );
-
- // Parse the second column
- col = (ColumnDescr) lhsList.get( 1 );
- assertEquals( "?c",
- col.getIdentifier() );
- assertEquals( "hobby",
- col.getObjectType() );
-
- colList = col.getDescrs();
- assertEquals( 2,
- colList.size() );
- fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
- restrictionList = fieldConstraintDescr.getRestrictions();
-
- assertEquals( "type",
- fieldConstraintDescr.getFieldName() );
-
- varDescr = (VariableRestrictionDescr) restrictionList.get( 0 );
- assertEquals( "==",
- varDescr.getEvaluator() );
- assertEquals( "?bf2",
- varDescr.getIdentifier() );
-
- connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
- assertEquals( RestrictionConnectiveDescr.AND,
- connDescr.getConnective() );
-
- litDescr = (LiteralRestrictionDescr) restrictionList.get( 2 );
- assertEquals( "!=",
- litDescr.getEvaluator() );
- assertEquals( "iii",
- litDescr.getText() );
-
- fieldConstraintDescr = (FieldConstraintDescr) colList.get( 1 );
- restrictionList = fieldConstraintDescr.getRestrictions();
-
- assertEquals( "rating",
- fieldConstraintDescr.getFieldName() );
-
- litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "fivestar",
- litDescr.getText() );
- }
-
- public void testNestedCERule() throws Exception {
- RuleDescr rule = parse( "(defrule xxx ?b <- (person (name yyy)) (or (and (hobby1 (type qqq1)) (hobby2 (type ~qqq2))) (food (veg ~shroom) ) ) => )" ).defrule();
-
- assertEquals( "xxx",
- rule.getName() );
-
- AndDescr lhs = rule.getLhs();
- List lhsList = lhs.getDescrs();
- assertEquals( 2,
- lhsList.size() );
-
- // Parse the first column
- ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
- assertEquals( "?b",
- col.getIdentifier() );
- assertEquals( "person",
- col.getObjectType() );
- FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "name",
- fieldConstraintDescr.getFieldName() ); //
- LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "yyy",
- litDescr.getText() );
-
- OrDescr orDescr = (OrDescr) lhsList.get( 1 );
- assertEquals( 2,
- orDescr.getDescrs().size() );
-
- AndDescr andDescr = (AndDescr) orDescr.getDescrs().get( 0 );
- col = (ColumnDescr) andDescr.getDescrs().get( 0 );
- assertEquals( "hobby1",
- col.getObjectType() );
- fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "type",
- fieldConstraintDescr.getFieldName() ); //
- litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "qqq1",
- litDescr.getText() );
-
- col = (ColumnDescr) andDescr.getDescrs().get( 1 );
- assertEquals( "hobby2",
- col.getObjectType() );
- fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "type",
- fieldConstraintDescr.getFieldName() ); //
- litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "!=",
- litDescr.getEvaluator() );
- assertEquals( "qqq2",
- litDescr.getText() );
-
- col = (ColumnDescr) orDescr.getDescrs().get( 1 );
- assertEquals( "food",
- col.getObjectType() );
- fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "veg",
- fieldConstraintDescr.getFieldName() ); //
- litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "!=",
- litDescr.getEvaluator() );
- assertEquals( "shroom",
- litDescr.getText() );
- }
-
- public void testNotExistsRule() throws Exception {
- RuleDescr rule = parse( "(defrule xxx (or (hobby1 (type qqq1)) (not (and (exists (person (name ppp))) (person (name yyy))))) => )" ).defrule();
-
- assertEquals( "xxx",
- rule.getName() );
-
- AndDescr lhs = rule.getLhs();
- List lhsList = lhs.getDescrs();
- assertEquals( 1,
- lhsList.size() );
-
- OrDescr orDescr = (OrDescr) lhsList.get( 0 );
- assertEquals( 2,
- orDescr.getDescrs().size() );
-
- ColumnDescr col = (ColumnDescr) orDescr.getDescrs().get( 0 );
- assertEquals( "hobby1",
- col.getObjectType() );
- FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "type",
- fieldConstraintDescr.getFieldName() ); //
- LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "qqq1",
- litDescr.getText() );
-
- NotDescr notDescr = (NotDescr) orDescr.getDescrs().get( 1 );
- assertEquals( 1,
- notDescr.getDescrs().size() );
-
- AndDescr andDescr = (AndDescr) notDescr.getDescrs().get( 0 );
- assertEquals( 2, andDescr.getDescrs().size() );
- ExistsDescr existsDescr = (ExistsDescr) andDescr.getDescrs().get( 0 );
- col = (ColumnDescr) existsDescr.getDescrs().get( 0 );
- assertEquals( "person",
- col.getObjectType() );
- fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "name",
- fieldConstraintDescr.getFieldName() ); //
- litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "ppp",
- litDescr.getText() );
-
- col = (ColumnDescr) andDescr.getDescrs().get( 1 );
- assertEquals( "person",
- col.getObjectType() );
- fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
- assertEquals( "name",
- fieldConstraintDescr.getFieldName() ); //
- litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
- assertEquals( "==",
- litDescr.getEvaluator() );
- assertEquals( "yyy",
- litDescr.getText() );
- }
-
- public void testTestRule() throws Exception {
- RuleDescr rule = parse( "(defrule xxx (test (< 9.0 1.3) ) => )" ).defrule();
-
- assertEquals( "xxx",
- rule.getName() );
-
- AndDescr lhs = rule.getLhs();
- List lhsList = lhs.getDescrs();
- assertEquals( 1,
- lhsList.size() );
-
- EvalDescr evalDescr = (EvalDescr) lhsList.get( 0 );
-
- CLPEval clpe = ( CLPEval ) evalDescr.getContent();
- FunctionCaller f = clpe.getFunctions()[0];
- assertEquals( "<", f.getName() );
- assertEquals( new DoubleValueHandler( 9.0 ), f.getParameters()[0] );
- assertEquals( new DoubleValueHandler( 1.3 ), f.getParameters()[1] );
- }
-
- public void testRuleHeader() throws Exception {
- RuleDescr rule = parse( "(defrule MAIN::name \"docs\"(declare (salience -100) ) => )" ).defrule();
-
- List attributes = rule.getAttributes();
- AttributeDescr module = ( AttributeDescr ) attributes.get( 0 );
- assertEquals( "agenda-group", module.getName() );
- assertEquals( "MAIN", module.getValue() );
-
- assertEquals("name", rule.getName() );
-
- AttributeDescr salience = ( AttributeDescr ) attributes.get( 1 );
- assertEquals( "salience", salience.getName() );
- assertEquals( "-100", salience.getValue() );
-
-
- }
-
- private CLPParser parse(final String text) throws Exception {
- this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
- return this.parser;
- }
-
- private CLPParser parse(final String source,
- final String text) throws Exception {
- this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
- this.parser.setSource( source );
- return this.parser;
- }
-
- private Reader getReader(final String name) throws Exception {
- final InputStream in = getClass().getResourceAsStream( name );
-
- return new InputStreamReader( in );
- }
-
- private CLPParser parseResource(final String name) throws Exception {
-
- // System.err.println( getClass().getResource( name ) );
- Reader reader = getReader( name );
-
- final StringBuffer text = new StringBuffer();
-
- final char[] buf = new char[1024];
- int len = 0;
-
- while ( (len = reader.read( buf )) >= 0 ) {
- text.append( buf,
- 0,
- len );
- }
-
- return parse( name,
- text.toString() );
- }
-
- private CharStream newCharStream(final String text) {
- return new ANTLRStringStream( text );
- }
-
- private CLPLexer newLexer(final CharStream charStream) {
- return new CLPLexer( charStream );
- }
-
- private TokenStream newTokenStream(final Lexer lexer) {
- return new SwitchingCommonTokenStream( lexer );
- }
-
- private CLPParser newParser(final TokenStream tokenStream) {
- final CLPParser p = new CLPParser( tokenStream );
- p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() ) );
- //p.setParserDebug( true );
- return p;
- }
-
- private void assertEqualsIgnoreWhitespace(final String expected,
- final String actual) {
- final String cleanExpected = expected.replaceAll( "\\s+",
- "" );
- final String cleanActual = actual.replaceAll( "\\s+",
- "" );
-
- assertEquals( cleanExpected,
- cleanActual );
- }
-
-}
Copied: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java (from rev 10555, labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,281 @@
+package org.drools.clp;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.TokenStream;
+import org.drools.Person;
+import org.drools.clp.valuehandlers.ListValueHandler;
+import org.drools.clp.valuehandlers.LocalVariableValue;
+import org.drools.clp.valuehandlers.LongValueHandler;
+import org.drools.clp.valuehandlers.ObjectValueHandler;
+import org.drools.compiler.SwitchingCommonTokenStream;
+
+import junit.framework.TestCase;
+
+public class CompiledFunctionsTest extends TestCase {
+ private CLPParser parser;
+
+ public void testBindAndModify() throws Exception {
+ BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (+ 20 11) ) (modify ?p (age ?x) )" ).rhs();
+ ExecutionContext context = new ExecutionContext( null,
+ null,
+ 2 );
+
+ Map vars = new HashMap();
+ Person p = new Person( "mark" );
+ vars.put( "?p",
+ new ObjectValueHandler( p ) );
+ engine.replaceTempTokens( vars );
+
+ engine.execute( context );
+
+ assertEquals( 31,
+ p.getAge() );
+ }
+
+ public void testSimpleCreate$() throws Exception {
+ BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 3) )" ).rhs();
+ ExecutionContext context = new ExecutionContext( null,
+ null,
+ 1 );
+ engine.execute( context );
+
+ ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
+
+ assertEquals( 3,
+ list.size() );
+
+ assertEquals( 1,
+ list.getList()[0].getIntValue( context ) );
+ assertEquals( 2,
+ list.getList()[1].getIntValue( context ) );
+ assertEquals( 3,
+ list.getList()[2].getIntValue( context ) );
+ }
+
+ public void testNestedCreate$() throws Exception {
+ BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 (+ 1 2) ) ) (bind ?y (create$ (+ 1 0) ?x (create$ a b ?x (+ 1 1) ) 3) )" ).rhs();
+ ExecutionContext context = new ExecutionContext( null,
+ null,
+ 2 );
+ engine.execute( context );
+
+ // check ?x
+ ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
+ assertEquals( 3,
+ list.size() );
+ assertEquals( 1,
+ list.getList()[0].getIntValue( context ) );
+ assertEquals( 2,
+ list.getList()[1].getIntValue( context ) );
+ assertEquals( new BigDecimal( 3 ),
+ list.getList()[2].getBigDecimalValue( context ) );
+
+ // check ?y
+ list = (ListValueHandler) context.getLocalVariable( 1 );
+ assertEquals( 11,
+ list.size() );
+
+ assertEquals( new BigDecimal( 1 ),
+ list.getList()[0].getBigDecimalValue( context ) );
+ assertEquals( 1,
+ list.getList()[1].getIntValue( context ) );
+ assertEquals( 2,
+ list.getList()[2].getIntValue( context ) );
+ assertEquals( new BigDecimal( 3 ),
+ list.getList()[3].getBigDecimalValue( context ) );
+ assertEquals( "a",
+ list.getList()[4].getStringValue( context ) );
+ assertEquals( "b",
+ list.getList()[5].getStringValue( context ) );
+ assertEquals( 1,
+ list.getList()[6].getIntValue( context ) );
+ assertEquals( 2,
+ list.getList()[7].getIntValue( context ) );
+ assertEquals( new BigDecimal( 3 ),
+ list.getList()[8].getBigDecimalValue( context ) );
+ assertEquals( new BigDecimal( 2 ),
+ list.getList()[9].getBigDecimalValue( context ) );
+ assertEquals( 3,
+ list.getList()[10].getIntValue( context ) );
+ }
+
+ public void testIf() throws Exception {
+ BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(if (< ?x ?y ) then (modify ?p (age 15) ) else (modify ?p (age 5)))" ).rhs();
+ ExecutionContext context = new ExecutionContext( null,
+ null,
+ 2 );
+
+ Person p = new Person( "mark" );
+ Map vars = new HashMap();
+
+ vars.put( "?x",
+ new LongValueHandler( 10 ) );
+ vars.put( "?y",
+ new LocalVariableValue( "?y",
+ 0 ) );
+ vars.put( "?p",
+ new ObjectValueHandler( p ) );
+ engine.replaceTempTokens( vars );
+
+ context.setLocalVariable( 0,
+ new LongValueHandler( 20 ) );
+
+ engine.execute( context );
+ assertEquals( 15,
+ p.getAge() );
+
+ context.setLocalVariable( 0,
+ new LongValueHandler( 7 ) );
+ engine.execute( context );
+ assertEquals( 5,
+ p.getAge() );
+ }
+
+ public void testWhile() throws Exception {
+ BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(while (< ?x ?y) do (bind ?x (+ ?x 1) ) )" ).rhs();
+ ExecutionContext context = new ExecutionContext( null,
+ null,
+ 2 );
+
+ Map vars = new HashMap();
+
+ vars.put( "?x",
+ new LocalVariableValue( "?x",
+ 0 ) );
+ vars.put( "?y",
+ new LocalVariableValue( "?y",
+ 1 ) );
+ engine.replaceTempTokens( vars );
+
+ context.setLocalVariable( 0,
+ new LongValueHandler( 0 ) );
+ context.setLocalVariable( 1,
+ new LongValueHandler( 10 ) );
+
+ engine.execute( 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 );
+ engine.execute( context );
+ assertEquals( new BigDecimal( 6 ),
+ context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+ }
+
+ public void testSwitch() throws Exception {
+ BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?cheese ?var) (switch ?cheese (case stilton then (bind ?x ?cheese ) (printout t xxx (eq 1 1) (create$ x y) zzz) (break) ) (case cheddar then (bind ?x ?cheese ) (break) ) (default (bind ?x \"default\" ) ) )" ).rhs();
+ ExecutionContext context = new ExecutionContext( null,
+ null,
+ 3 );
+
+ Map vars = new HashMap();
+
+ vars.put( "?var",
+ new LocalVariableValue( "?var",
+ 2 ) );
+ engine.replaceTempTokens( vars );
+
+ // try it with stilton
+ context.setLocalVariable( 2,
+ new ObjectValueHandler( "stilton" ) );
+ engine.execute( context );
+ assertEquals( "stilton" ,
+ context.getLocalVariable( 1 ).getObject( context ) );
+
+ // try it with cheddar
+ context.setLocalVariable( 2,
+ new ObjectValueHandler( "cheddar" ) );
+ engine.execute( context );
+ assertEquals( "cheddar" ,
+ context.getLocalVariable( 1 ).getObject( context ) );
+
+ // try it with a brie, which has no matching case
+ context.setLocalVariable( 2,
+ new ObjectValueHandler( "brie" ) );
+ engine.execute( context );
+ assertEquals( "default" ,
+ context.getLocalVariable( 1 ).getObject( context ) );
+
+
+ }
+
+ private CLPParser parse(final String text) throws Exception {
+ this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+ return this.parser;
+ }
+
+ private CLPParser parse(final String source,
+ final String text) throws Exception {
+ this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+ this.parser.setSource( source );
+ return this.parser;
+ }
+
+ private Reader getReader(final String name) throws Exception {
+ final InputStream in = getClass().getResourceAsStream( name );
+
+ return new InputStreamReader( in );
+ }
+
+ private CLPParser parseResource(final String name) throws Exception {
+ Reader reader = getReader( name );
+
+ final StringBuffer text = new StringBuffer();
+
+ final char[] buf = new char[1024];
+ int len = 0;
+
+ while ( (len = reader.read( buf )) >= 0 ) {
+ text.append( buf,
+ 0,
+ len );
+ }
+
+ return parse( name,
+ text.toString() );
+ }
+
+ private CharStream newCharStream(final String text) {
+ return new ANTLRStringStream( text );
+ }
+
+ private CLPLexer newLexer(final CharStream charStream) {
+ return new CLPLexer( charStream );
+ }
+
+ private TokenStream newTokenStream(final Lexer lexer) {
+ return new SwitchingCommonTokenStream( lexer );
+ }
+
+ private CLPParser newParser(final TokenStream tokenStream) {
+ final CLPParser p = new CLPParser( tokenStream );
+ p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() ) );
+ //p.setParserDebug( true );
+ return p;
+ }
+
+ private void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+}
Deleted: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java 2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,254 +0,0 @@
-package org.drools.clp;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.TokenStream;
-import org.drools.Person;
-import org.drools.clp.valuehandlers.ListValueHandler;
-import org.drools.clp.valuehandlers.LocalVariableValue;
-import org.drools.clp.valuehandlers.LongValueHandler;
-import org.drools.clp.valuehandlers.ObjectValueHandler;
-import org.drools.compiler.SwitchingCommonTokenStream;
-
-import junit.framework.TestCase;
-
-public class CompiledParserTest extends TestCase {
- private CLPParser parser;
-
- public void testBindAndModify() throws Exception {
- BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (+ 20 11) ) (modify ?p (age ?x) )" ).rhs();
- ExecutionContext context = new ExecutionContext( null,
- null,
- 2 );
-
- Map vars = new HashMap();
- Person p = new Person( "mark" );
- vars.put( "?p",
- new ObjectValueHandler( p ) );
- engine.replaceTempTokens( vars );
-
- engine.execute( context );
-
- assertEquals( 31,
- p.getAge() );
- }
-
- public void testSimpleCreate$() throws Exception {
- BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 3) )" ).rhs();
- ExecutionContext context = new ExecutionContext( null,
- null,
- 1 );
- engine.execute( context );
-
- ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
-
- assertEquals( 3,
- list.size() );
-
- assertEquals( 1,
- list.getList()[0].getIntValue( context ) );
- assertEquals( 2,
- list.getList()[1].getIntValue( context ) );
- assertEquals( 3,
- list.getList()[2].getIntValue( context ) );
- }
-
- public void testNestedCreate$() throws Exception {
- BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 (+ 1 2) ) ) (bind ?y (create$ (+ 1 0) ?x (create$ a b ?x (+ 1 1) ) 3) )" ).rhs();
- ExecutionContext context = new ExecutionContext( null,
- null,
- 2 );
- engine.execute( context );
-
- // check ?x
- ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
- assertEquals( 3,
- list.size() );
- assertEquals( 1,
- list.getList()[0].getIntValue( context ) );
- assertEquals( 2,
- list.getList()[1].getIntValue( context ) );
- assertEquals( new BigDecimal( 3 ),
- list.getList()[2].getBigDecimalValue( context ) );
-
- // check ?y
- list = (ListValueHandler) context.getLocalVariable( 1 );
- assertEquals( 11,
- list.size() );
-
- assertEquals( new BigDecimal( 1 ),
- list.getList()[0].getBigDecimalValue( context ) );
- assertEquals( 1,
- list.getList()[1].getIntValue( context ) );
- assertEquals( 2,
- list.getList()[2].getIntValue( context ) );
- assertEquals( new BigDecimal( 3 ),
- list.getList()[3].getBigDecimalValue( context ) );
- assertEquals( "a",
- list.getList()[4].getStringValue( context ) );
- assertEquals( "b",
- list.getList()[5].getStringValue( context ) );
- assertEquals( 1,
- list.getList()[6].getIntValue( context ) );
- assertEquals( 2,
- list.getList()[7].getIntValue( context ) );
- assertEquals( new BigDecimal( 3 ),
- list.getList()[8].getBigDecimalValue( context ) );
- assertEquals( new BigDecimal( 2 ),
- list.getList()[9].getBigDecimalValue( context ) );
- assertEquals( 3,
- list.getList()[10].getIntValue( context ) );
- }
-
- public void testIf() throws Exception {
- BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(if (< ?x ?y ) then (modify ?p (age 15) ) else (modify ?p (age 5)))" ).rhs();
- ExecutionContext context = new ExecutionContext( null,
- null,
- 2 );
-
- Person p = new Person( "mark" );
- Map vars = new HashMap();
-
- vars.put( "?x",
- new LongValueHandler( 10 ) );
- vars.put( "?y",
- new LocalVariableValue( "?y",
- 0 ) );
- vars.put( "?p",
- new ObjectValueHandler( p ) );
- engine.replaceTempTokens( vars );
-
- context.setLocalVariable( 0,
- new LongValueHandler( 20 ) );
-
- engine.execute( context );
- assertEquals( 15,
- p.getAge() );
-
- context.setLocalVariable( 0,
- new LongValueHandler( 7 ) );
- engine.execute( context );
- assertEquals( 5,
- p.getAge() );
- }
-
- public void testWhile() throws Exception {
- BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(while (< ?x ?y) do (bind ?x (+ ?x 1) ) )" ).rhs();
- ExecutionContext context = new ExecutionContext( null,
- null,
- 2 );
-
- Map vars = new HashMap();
-
- vars.put( "?x",
- new LocalVariableValue( "?x",
- 0 ) );
- vars.put( "?y",
- new LocalVariableValue( "?y",
- 1 ) );
- engine.replaceTempTokens( vars );
-
- context.setLocalVariable( 0,
- new LongValueHandler( 0 ) );
- context.setLocalVariable( 1,
- new LongValueHandler( 10 ) );
-
- engine.execute( 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;
- }
-
- private CLPParser parse(final String source,
- final String text) throws Exception {
- this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
- this.parser.setSource( source );
- return this.parser;
- }
-
- private Reader getReader(final String name) throws Exception {
- final InputStream in = getClass().getResourceAsStream( name );
-
- return new InputStreamReader( in );
- }
-
- private CLPParser parseResource(final String name) throws Exception {
- Reader reader = getReader( name );
-
- final StringBuffer text = new StringBuffer();
-
- final char[] buf = new char[1024];
- int len = 0;
-
- while ( (len = reader.read( buf )) >= 0 ) {
- text.append( buf,
- 0,
- len );
- }
-
- return parse( name,
- text.toString() );
- }
-
- private CharStream newCharStream(final String text) {
- return new ANTLRStringStream( text );
- }
-
- private CLPLexer newLexer(final CharStream charStream) {
- return new CLPLexer( charStream );
- }
-
- private TokenStream newTokenStream(final Lexer lexer) {
- return new SwitchingCommonTokenStream( lexer );
- }
-
- private CLPParser newParser(final TokenStream tokenStream) {
- final CLPParser p = new CLPParser( tokenStream );
- p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() ) );
- //p.setParserDebug( true );
- return p;
- }
-
- private void assertEqualsIgnoreWhitespace(final String expected,
- final String actual) {
- final String cleanExpected = expected.replaceAll( "\\s+",
- "" );
- final String cleanActual = actual.replaceAll( "\\s+",
- "" );
-
- assertEquals( cleanExpected,
- cleanActual );
- }
-}
Copied: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java (from rev 10555, labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java 2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,410 @@
+package org.drools.clp;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.TokenStream;
+import org.drools.clp.valuehandlers.DoubleValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.LongValueHandler;
+import org.drools.compiler.SwitchingCommonTokenStream;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.ColumnDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+
+public class LhsClpParserTest extends TestCase {
+
+ private CLPParser parser;
+
+ FunctionRegistry registry;
+
+ public void setUp() {
+ this.registry = new FunctionRegistry( BuiltinFunctions.getInstance() );
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ this.parser = null;
+ }
+
+ public void testParseFunction() throws Exception {
+ ExecutionBuildContext context = new ExecutionBuildContext( new CLPPredicate(), this.registry );
+ FunctionCaller fc = ( FunctionCaller ) parse( "(< 1 2)" ).lisp_list( context, new LispForm(context) );
+
+ assertEquals( "<", fc.getName() );
+ assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
+ assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );
+ }
+
+ public void testPatternsRule() throws Exception {
+ RuleDescr rule = parse( "(defrule xxx ?b <- (person (name \"yyy\"&?bf|~\"zzz\"|~=(+ 2 3)&:(< 1 2)) ) ?c <- (hobby (type ?bf2&~iii) (rating fivestar) ) => )" ).defrule();
+
+ assertEquals( "xxx",
+ rule.getName() );
+
+ AndDescr lhs = rule.getLhs();
+ List lhsList = lhs.getDescrs();
+ assertEquals( 2,
+ lhsList.size() );
+
+ // Parse the first column
+ ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
+ assertEquals( "?b",
+ col.getIdentifier() );
+ assertEquals( "person",
+ col.getObjectType() );
+
+ List colList = col.getDescrs();
+ assertEquals( 2,
+ colList.size() );
+ FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
+ List restrictionList = fieldConstraintDescr.getRestrictions();
+
+ assertEquals( "name",
+ fieldConstraintDescr.getFieldName() );
+ // @todo the 7th one has no constraint, as its a predicate, have to figure out how to handle this
+ assertEquals( 8,
+ restrictionList.size() );
+
+ LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "yyy",
+ litDescr.getText() );
+
+ RestrictionConnectiveDescr connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
+ assertEquals( RestrictionConnectiveDescr.AND,
+ connDescr.getConnective() );
+
+ VariableRestrictionDescr varDescr = (VariableRestrictionDescr) restrictionList.get( 2 );
+ assertEquals( "==",
+ varDescr.getEvaluator() );
+ assertEquals( "?bf",
+ varDescr.getIdentifier() );
+
+ connDescr = (RestrictionConnectiveDescr) restrictionList.get( 3 );
+ assertEquals( RestrictionConnectiveDescr.OR,
+ connDescr.getConnective() );
+
+ litDescr = (LiteralRestrictionDescr) restrictionList.get( 4 );
+ assertEquals( "!=",
+ litDescr.getEvaluator() );
+ assertEquals( "zzz",
+ litDescr.getText() );
+
+ connDescr = (RestrictionConnectiveDescr) restrictionList.get( 5 );
+ assertEquals( RestrictionConnectiveDescr.OR,
+ connDescr.getConnective() );
+
+ ReturnValueRestrictionDescr retDescr = (ReturnValueRestrictionDescr) restrictionList.get( 6 );
+ assertEquals( "!=",
+ retDescr.getEvaluator() );
+ CLPReturnValue clprv = ( CLPReturnValue ) retDescr.getContent();
+ FunctionCaller fc = clprv.getFunctions()[0];
+ assertEquals( "+", fc.getName() );
+ assertEquals( new LongValueHandler( 2 ), fc.getParameters()[0] );
+ assertEquals( new LongValueHandler( 3 ), fc.getParameters()[1] );
+
+ PredicateDescr predicateDescr = (PredicateDescr) colList.get( 1 );
+ CLPPredicate clpp = ( CLPPredicate ) predicateDescr.getContent();
+ fc = clpp.getFunctions()[0];
+ assertEquals( "<", fc.getName() );
+ assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
+ assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );
+
+ // Parse the second column
+ col = (ColumnDescr) lhsList.get( 1 );
+ assertEquals( "?c",
+ col.getIdentifier() );
+ assertEquals( "hobby",
+ col.getObjectType() );
+
+ colList = col.getDescrs();
+ assertEquals( 2,
+ colList.size() );
+ fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
+ restrictionList = fieldConstraintDescr.getRestrictions();
+
+ assertEquals( "type",
+ fieldConstraintDescr.getFieldName() );
+
+ varDescr = (VariableRestrictionDescr) restrictionList.get( 0 );
+ assertEquals( "==",
+ varDescr.getEvaluator() );
+ assertEquals( "?bf2",
+ varDescr.getIdentifier() );
+
+ connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
+ assertEquals( RestrictionConnectiveDescr.AND,
+ connDescr.getConnective() );
+
+ litDescr = (LiteralRestrictionDescr) restrictionList.get( 2 );
+ assertEquals( "!=",
+ litDescr.getEvaluator() );
+ assertEquals( "iii",
+ litDescr.getText() );
+
+ fieldConstraintDescr = (FieldConstraintDescr) colList.get( 1 );
+ restrictionList = fieldConstraintDescr.getRestrictions();
+
+ assertEquals( "rating",
+ fieldConstraintDescr.getFieldName() );
+
+ litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "fivestar",
+ litDescr.getText() );
+ }
+
+ public void testNestedCERule() throws Exception {
+ RuleDescr rule = parse( "(defrule xxx ?b <- (person (name yyy)) (or (and (hobby1 (type qqq1)) (hobby2 (type ~qqq2))) (food (veg ~shroom) ) ) => )" ).defrule();
+
+ assertEquals( "xxx",
+ rule.getName() );
+
+ AndDescr lhs = rule.getLhs();
+ List lhsList = lhs.getDescrs();
+ assertEquals( 2,
+ lhsList.size() );
+
+ // Parse the first column
+ ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
+ assertEquals( "?b",
+ col.getIdentifier() );
+ assertEquals( "person",
+ col.getObjectType() );
+ FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "name",
+ fieldConstraintDescr.getFieldName() ); //
+ LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "yyy",
+ litDescr.getText() );
+
+ OrDescr orDescr = (OrDescr) lhsList.get( 1 );
+ assertEquals( 2,
+ orDescr.getDescrs().size() );
+
+ AndDescr andDescr = (AndDescr) orDescr.getDescrs().get( 0 );
+ col = (ColumnDescr) andDescr.getDescrs().get( 0 );
+ assertEquals( "hobby1",
+ col.getObjectType() );
+ fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "type",
+ fieldConstraintDescr.getFieldName() ); //
+ litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "qqq1",
+ litDescr.getText() );
+
+ col = (ColumnDescr) andDescr.getDescrs().get( 1 );
+ assertEquals( "hobby2",
+ col.getObjectType() );
+ fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "type",
+ fieldConstraintDescr.getFieldName() ); //
+ litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "!=",
+ litDescr.getEvaluator() );
+ assertEquals( "qqq2",
+ litDescr.getText() );
+
+ col = (ColumnDescr) orDescr.getDescrs().get( 1 );
+ assertEquals( "food",
+ col.getObjectType() );
+ fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "veg",
+ fieldConstraintDescr.getFieldName() ); //
+ litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "!=",
+ litDescr.getEvaluator() );
+ assertEquals( "shroom",
+ litDescr.getText() );
+ }
+
+ public void testNotExistsRule() throws Exception {
+ RuleDescr rule = parse( "(defrule xxx (or (hobby1 (type qqq1)) (not (and (exists (person (name ppp))) (person (name yyy))))) => )" ).defrule();
+
+ assertEquals( "xxx",
+ rule.getName() );
+
+ AndDescr lhs = rule.getLhs();
+ List lhsList = lhs.getDescrs();
+ assertEquals( 1,
+ lhsList.size() );
+
+ OrDescr orDescr = (OrDescr) lhsList.get( 0 );
+ assertEquals( 2,
+ orDescr.getDescrs().size() );
+
+ ColumnDescr col = (ColumnDescr) orDescr.getDescrs().get( 0 );
+ assertEquals( "hobby1",
+ col.getObjectType() );
+ FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "type",
+ fieldConstraintDescr.getFieldName() ); //
+ LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "qqq1",
+ litDescr.getText() );
+
+ NotDescr notDescr = (NotDescr) orDescr.getDescrs().get( 1 );
+ assertEquals( 1,
+ notDescr.getDescrs().size() );
+
+ AndDescr andDescr = (AndDescr) notDescr.getDescrs().get( 0 );
+ assertEquals( 2, andDescr.getDescrs().size() );
+ ExistsDescr existsDescr = (ExistsDescr) andDescr.getDescrs().get( 0 );
+ col = (ColumnDescr) existsDescr.getDescrs().get( 0 );
+ assertEquals( "person",
+ col.getObjectType() );
+ fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "name",
+ fieldConstraintDescr.getFieldName() ); //
+ litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "ppp",
+ litDescr.getText() );
+
+ col = (ColumnDescr) andDescr.getDescrs().get( 1 );
+ assertEquals( "person",
+ col.getObjectType() );
+ fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+ assertEquals( "name",
+ fieldConstraintDescr.getFieldName() ); //
+ litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+ assertEquals( "==",
+ litDescr.getEvaluator() );
+ assertEquals( "yyy",
+ litDescr.getText() );
+ }
+
+ public void testTestRule() throws Exception {
+ RuleDescr rule = parse( "(defrule xxx (test (< 9.0 1.3) ) => )" ).defrule();
+
+ assertEquals( "xxx",
+ rule.getName() );
+
+ AndDescr lhs = rule.getLhs();
+ List lhsList = lhs.getDescrs();
+ assertEquals( 1,
+ lhsList.size() );
+
+ EvalDescr evalDescr = (EvalDescr) lhsList.get( 0 );
+
+ CLPEval clpe = ( CLPEval ) evalDescr.getContent();
+ FunctionCaller f = clpe.getFunctions()[0];
+ assertEquals( "<", f.getName() );
+ assertEquals( new DoubleValueHandler( 9.0 ), f.getParameters()[0] );
+ assertEquals( new DoubleValueHandler( 1.3 ), f.getParameters()[1] );
+ }
+
+ public void testRuleHeader() throws Exception {
+ RuleDescr rule = parse( "(defrule MAIN::name \"docs\"(declare (salience -100) ) => )" ).defrule();
+
+ List attributes = rule.getAttributes();
+ AttributeDescr module = ( AttributeDescr ) attributes.get( 0 );
+ assertEquals( "agenda-group", module.getName() );
+ assertEquals( "MAIN", module.getValue() );
+
+ assertEquals("name", rule.getName() );
+
+ AttributeDescr salience = ( AttributeDescr ) attributes.get( 1 );
+ assertEquals( "salience", salience.getName() );
+ assertEquals( "-100", salience.getValue() );
+
+
+ }
+
+ private CLPParser parse(final String text) throws Exception {
+ this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+ return this.parser;
+ }
+
+ private CLPParser parse(final String source,
+ final String text) throws Exception {
+ this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+ this.parser.setSource( source );
+ return this.parser;
+ }
+
+ private Reader getReader(final String name) throws Exception {
+ final InputStream in = getClass().getResourceAsStream( name );
+
+ return new InputStreamReader( in );
+ }
+
+ private CLPParser parseResource(final String name) throws Exception {
+
+ // System.err.println( getClass().getResource( name ) );
+ Reader reader = getReader( name );
+
+ final StringBuffer text = new StringBuffer();
+
+ final char[] buf = new char[1024];
+ int len = 0;
+
+ while ( (len = reader.read( buf )) >= 0 ) {
+ text.append( buf,
+ 0,
+ len );
+ }
+
+ return parse( name,
+ text.toString() );
+ }
+
+ private CharStream newCharStream(final String text) {
+ return new ANTLRStringStream( text );
+ }
+
+ private CLPLexer newLexer(final CharStream charStream) {
+ return new CLPLexer( charStream );
+ }
+
+ private TokenStream newTokenStream(final Lexer lexer) {
+ return new SwitchingCommonTokenStream( lexer );
+ }
+
+ private CLPParser newParser(final TokenStream tokenStream) {
+ final CLPParser p = new CLPParser( tokenStream );
+ p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() ) );
+ //p.setParserDebug( true );
+ return p;
+ }
+
+ private void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+
+}
More information about the jboss-svn-commits
mailing list