[jboss-svn-commits] JBL Code SVN: r12798 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/xml and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Jun 23 22:13:44 EDT 2007
Author: fmeyer
Date: 2007-06-23 22:13:44 -0400 (Sat, 23 Jun 2007)
New Revision: 12798
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_accumulateall.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AccumulateHelperHandler.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java
labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-4.0.xsd
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseAccumulate.xml
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_from.drl
Log:
JBRULES-943 - Added support to pluggable accumulate functions
JBRULES-880 - Updated XmlDumper and DrlDumper to handle with pluggable functions
- Updated unit tests
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java 2007-06-24 02:13:44 UTC (rev 12798)
@@ -144,38 +144,42 @@
tmpstr += this.template.substring( 2 );
this.template = tmpstr + ");";
}
-
+
public void visitAccumulateDescr(final AccumulateDescr descr) {
String tmpstr = new String();
visitPatternDescr( descr.getResultPattern() );
tmpstr += this.template + " from accumulate (";
visitPatternDescr( descr.getSourcePattern() );
tmpstr += this.template.substring( 2 );
- tmpstr += ", init(" + descr.getInitCode() + "), ";
- tmpstr += "action(" + descr.getActionCode() + "), ";
- tmpstr += "result(" + descr.getResultCode() + ")";
+
+ if ( descr.isExternalFunction() ) tmpstr += "," + descr.getFunctionIdentifier() + "(" + descr.getExpression() + ")";
+ else {
+ tmpstr += ", init(" + descr.getInitCode() + "), ";
+ tmpstr += "action(" + descr.getActionCode() + "), ";
+ tmpstr += "result(" + descr.getResultCode() + ")";
+ }
this.template = tmpstr + ");";
}
-
+
public void visitFromDescr(final FromDescr descr) {
visitPatternDescr( descr.getReturnedPattern() );
this.template += " from ";
this.template += descr.getDataSource();
}
-
public void visitForallDescr(final ForallDescr descr) {
String localstr = new String();
localstr += "\t\tforall ( ";
localstr += DrlDumper.eol;
-
+
for ( final Iterator ite = descr.getDescrs().iterator(); ite.hasNext(); ) {
Object obj = ite.next();
visit( obj );
localstr += this.template + ",";
}
-
- this.template = localstr.substring( 0, localstr.lastIndexOf( "," ) );
+
+ this.template = localstr.substring( 0,
+ localstr.lastIndexOf( "," ) );
this.template += "\t\t)";
this.template += DrlDumper.eol;
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AccumulateHelperHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AccumulateHelperHandler.java 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AccumulateHelperHandler.java 2007-06-24 02:13:44 UTC (rev 12798)
@@ -47,7 +47,7 @@
final String expression = config.getText();
- if ( expression == null || expression.trim().equals( "" ) ) {
+ if ( expression == null) {
throw new SAXParseException( "<" + localName + "> must have some content",
this.xmlPackageReader.getLocator() );
}
@@ -63,8 +63,10 @@
else if ( localName.equals( "action" ) ) accumulate.setActionCode( expression.trim() );
else if ( localName.equals( "result" ) ) accumulate.setResultCode( expression.trim() );
else if ( localName.equals( "reverse" ) ) accumulate.setReverseCode( expression.trim() );
- else {
- //TODO FM: support for external functions
+ else if ( localName.equals( "external-function" ) ) {
+ accumulate.setExternalFunction( true );
+ accumulate.setFunctionIdentifier( config.getAttribute( "evaluator" ) );
+ accumulate.setExpression( config.getAttribute( "expression" ) );
}
return null;
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java 2007-06-24 02:13:44 UTC (rev 12798)
@@ -132,17 +132,17 @@
tmpstr += this.template + " <from> <accumulate> ";
visit( descr.getSourcePattern() );
tmpstr += this.template;
+
+ if ( descr.isExternalFunction() )
+ tmpstr += "<external-function evaluator=\"" + descr.getFunctionIdentifier() + "\" expression=\"" + descr.getExpression() + "\"/>";
+ else
+ tmpstr += "<init>" + descr.getInitCode() + "</init><action>" + descr.getActionCode() + "</action><result>" + descr.getResultCode() + "</result>";
- tmpstr += "<init>" + descr.getInitCode() + "</init><action>" + descr.getActionCode() + "</action><result>" + descr.getResultCode() + "</result>";
-
this.template = tmpstr + " </accumulate> </from> ";
this.template += "</pattern>";
}
- //TODO FM: FIXME
-
public void visitFromDescr(final FromDescr descr) {
-
String tmpstr = new String();
visitPatternDescr( descr.getReturnedPattern() );
this.template = this.template.substring( 0,
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java 2007-06-24 02:13:44 UTC (rev 12798)
@@ -207,8 +207,11 @@
this.handlers.put( "reverse",
new AccumulateHelperHandler( this ) );
+ this.handlers.put( "external-function",
+ new AccumulateHelperHandler( this ) );
+
this.handlers.put( "expression",
- new ExpressionHandler( this ) );
+ new ExpressionHandler( this ) );
initEntityResolver();
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-4.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-4.0.xsd 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-4.0.xsd 2007-06-24 02:13:44 UTC (rev 12798)
@@ -259,15 +259,22 @@
<xs:group name="accumulate">
<xs:sequence>
<xs:element ref="drools:pattern"/>
- <xs:element name="init" type="xs:string"/>
- <xs:element name="action" type="xs:string"/>
- <xs:element name="result" type="xs:string"/>
+ <xs:choice>
+ <xs:sequence>
+ <xs:element name="init" type="xs:string"/>
+ <xs:element name="action" type="xs:string"/>
+ <xs:element name="result" type="xs:string"/>
+ </xs:sequence>
+ <xs:element ref="drools:external-function"/>
+ </xs:choice>
</xs:sequence>
</xs:group>
<xs:element name="accumulate">
<xs:complexType>
- <xs:group ref="drools:accumulate"/>
+ <xs:choice maxOccurs="1" minOccurs="1">
+ <xs:group ref="drools:accumulate"/>
+ </xs:choice>
</xs:complexType>
</xs:element>
@@ -325,9 +332,17 @@
</xs:complexType>
</xs:element>
- <xs:element name="variable-restriction">
+
+ <xs:element name="external-function">
<xs:complexType>
<xs:attribute name="evaluator" type="xs:string" use="required"/>
+ <xs:attribute name="expression" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="variable-restriction">
+ <xs:complexType>
+ <xs:attribute name="evaluator" type="xs:string" use="required"/>
<xs:attribute name="identifier" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java 2007-06-24 02:13:44 UTC (rev 12798)
@@ -34,10 +34,6 @@
DumperTestHelper.XmlFile( "test_ParseFrom.xml" );
}
- public void testRoundTripSimpleRuleXml() throws Exception {
- DumperTestHelper.XmlFile( "test_ParseAccumulate.xml" );
- }
-
public void testRoundTripComplexRuleXml() throws Exception {
DumperTestHelper.XmlFile( "test_RoundTrip.xml" );
}
@@ -53,7 +49,7 @@
}
public void testRoundTripAccumulateDrl() throws Exception {
- DumperTestHelper.DrlFile( "../integrationtests/test_Accumulate.drl" );
+ DumperTestHelper.DrlFile( "test_accumulateall.drl" );
}
public void testRoundTripExistsDrl() throws Exception {
@@ -64,7 +60,6 @@
DumperTestHelper.DrlFile( "../integrationtests/test_Forall.drl" );
}
- //FM: FIXME
public void testRoundTripFromDrl() throws Exception {
DumperTestHelper.DrlFile( "test_from.drl" );
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseAccumulate.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseAccumulate.xml 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseAccumulate.xml 2007-06-24 02:13:44 UTC (rev 12798)
@@ -34,6 +34,15 @@
</accumulate>
</from>
</pattern>
+
+ <pattern identifier="max" object-type="Number">
+ <from>
+ <accumulate>
+ <pattern identifier="cheese" object-type="Cheese"></pattern>
+ <external-function evaluator="max" expression="$price"/>
+ </accumulate>
+ </from>
+ </pattern>
</lhs>
<rhs>
list1.add( $cheese );
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_accumulateall.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_accumulateall.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_accumulateall.drl 2007-06-24 02:13:44 UTC (rev 12798)
@@ -0,0 +1,79 @@
+package org.drools.test;
+
+import org.drools.Cheese;
+import org.drools.Person;
+import org.drools.Cheesery;
+
+global java.util.List results;
+
+rule "AccumulateTest" salience 100
+ when
+ $totalAmount : Integer() from accumulate( $cheese : Cheese( ),
+ init( int total = 0; ),
+ action( total += $cheese.getPrice(); ),
+ result( new Integer( total ) ) );
+ then
+ //System.out.println("Total amount = US$ "+$totalAmount );
+ results.add($totalAmount);
+end
+
+rule "Accumulate with Bindings" salience 90
+ when
+ $person : Person( name == "Bob", $likes : likes )
+ $totalAmount : Integer() from accumulate( $cheese : Cheese( type == $likes ),
+ init( int total = 0; ),
+ action( total += $cheese.getPrice(); ),
+ result( new Integer( total ) ) );
+ then
+ //System.out.println($person.getName() +" will spend US$ "+ $totalAmount + " buying cheese");
+ results.add($totalAmount);
+end
+
+rule "Constraints everywhere" salience 80
+ when
+ $person : Person( $likes : likes )
+ $cheesery : Cheesery( totalAmount > 100 )
+ from accumulate( $cheese : Cheese( type == $likes ),
+ init( Cheesery cheesery = new Cheesery(); ),
+ action( cheesery.addCheese( $cheese ); ),
+ result( cheesery ) );
+ then
+ //System.out.println($person.getName() +" is spending a lot buying cheese ( US$ "+$cheesery.getTotalAmount()+" )!");
+ results.add(new Integer($cheesery.getTotalAmount()));
+end
+
+rule "Source pattern binds" salience 70
+ when
+ $person : Person( name == "Bob", $likes : likes )
+ $totalAmount : Integer() from accumulate( $cheese : Cheese( type == $likes, $price: price ),
+ init( int total = 0; ),
+ action( total += $price; ),
+ result( new Integer( total ) ) );
+ then
+ //System.out.println($person.getName() +" will spend US$ "+ $totalAmount + " buying cheese");
+ results.add($totalAmount);
+end
+
+rule "Accumulate with previous Bindings" salience 60
+ when
+ $person : Person( name == "Bob", $likes : likes, $age : age )
+ $totalAmount : Integer() from accumulate( $cheese : Cheese( type == $likes, $price : price ),
+ init( int total = $age * 10; ),
+ action( total += $price; ),
+ result( new Integer( total ) ) );
+ then
+ results.add($totalAmount);
+end
+
+
+rule "External Function" salience 80
+ when
+ $person : Person( $likes : likes )
+ $max : Number( intValue >= 5 )
+ from accumulate( $cheese : Cheese( type == $likes, $price : price ),
+ max( $price ) );
+ then
+ results.add( $max );
+end
+
+
Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_from.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_from.drl 2007-06-23 20:44:42 UTC (rev 12797)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_from.drl 2007-06-24 02:13:44 UTC (rev 12798)
@@ -21,4 +21,4 @@
$cheese : Cheese( type == "stilton" ) from cheesery.getCheeseMap["stilton"]
then
list1.add( $cheese );
-end
\ No newline at end of file
+end
More information about the jboss-svn-commits
mailing list