[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