[jboss-svn-commits] JBL Code SVN: r16192 - in labs/jbossrules/trunk/drools-analytics/src: main/java/org/drools/analytics/components and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Oct 31 06:30:50 EDT 2007


Author: Rikkola
Date: 2007-10-31 06:30:50 -0400 (Wed, 31 Oct 2007)
New Revision: 16192

Added:
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/optimisation/PatternOrder.drl
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/PatternOrderTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/optimisation/OptimisationPatternOrderTest.drl
Modified:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsEvalDescr.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/RestrictionOrderTest.java
Log:
Added Eval order check to patterns.

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java	2007-10-31 06:55:18 UTC (rev 16191)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -246,6 +246,8 @@
 		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
 
 		AnalyticsEvalDescr eval = new AnalyticsEvalDescr();
+		eval.setRuleId(currentRule.getId());
+		eval.setRuleName(currentRule.getRuleName());
 		eval.setContent(descr.getContent().toString());
 		eval.setClassMethodName(descr.getClassMethodName());
 		eval.setOrderNumber(orderNumber);
@@ -431,6 +433,7 @@
 		pattern.setRuleId(currentRule.getId());
 		pattern.setRuleName(currentRule.getRuleName());
 		pattern.setClassId(clazz.getId());
+		pattern.setName(clazz.getName());
 		pattern.setPatternNot(solvers.getRuleSolver().isChildNot());
 		pattern.setPatternExists(solvers.getRuleSolver().isExists());
 		pattern.setPatternForall(solvers.getRuleSolver().isForall());

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java	2007-10-31 06:55:18 UTC (rev 16191)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -59,6 +59,8 @@
 				.getResourceAsStream("Consequence.drl")));
 		list.add(new InputStreamReader(RuleLoader.class
 				.getResourceAsStream("optimisation/RestrictionOrder.drl")));
+		list.add(new InputStreamReader(RuleLoader.class
+				.getResourceAsStream("optimisation/PatternOrder.drl")));
 
 		// list.add(new InputStreamReader(RuleLoader.class
 		// .getResourceAsStream("redundancy/Possibilities.drl")));

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsEvalDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsEvalDescr.java	2007-10-31 06:55:18 UTC (rev 16191)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsEvalDescr.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -41,4 +41,9 @@
 	public void setContent(String content) {
 		this.content = content;
 	}
+
+	@Override
+	public String toString() {
+		return "Eval, content: " + content;
+	}
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java	2007-10-31 06:55:18 UTC (rev 16191)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -14,6 +14,7 @@
 
 	private int ruleId;
 	private int classId;
+	private String name;
 	private AnalyticsComponentType sourceType = AnalyticsComponentType.NOTHING;
 	private int sourceId = -1;
 
@@ -90,11 +91,20 @@
 		this.sourceType = sourceType;
 	}
 
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
 	@Override
 	public Object clone() {
 		Pattern clone = new Pattern();
 		clone.setRuleId(ruleId);
 		clone.setClassId(classId);
+		clone.setName(name);
 		clone.setSourceType(sourceType);
 		clone.setSourceId(sourceId);
 		clone.setPatternNot(isPatternNot);
@@ -106,6 +116,6 @@
 
 	@Override
 	public String toString() {
-		return "Pattern, id: " + id + " from rule '" + ruleName + "'";
+		return "Pattern, name: " + name;
 	}
 }

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/optimisation/PatternOrder.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/optimisation/PatternOrder.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/optimisation/PatternOrder.drl	2007-10-31 10:30:50 UTC (rev 16192)
@@ -0,0 +1,56 @@
+#created on: 27.10.2007
+package org.drools.analytics.optimisation
+
+#list any import classes here.
+import java.util.Collection;
+import java.util.ArrayList;
+
+import org.drools.analytics.components.Pattern;
+import org.drools.analytics.components.AnalyticsRule;
+import org.drools.analytics.components.OperatorDescr;
+import org.drools.analytics.components.AnalyticsEvalDescr;
+import org.drools.analytics.components.AnalyticsComponent;
+import org.drools.analytics.components.AnalyticsComponentType;
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.dao.AnalyticsResult;
+
+
+#declare any global variables here
+global AnalyticsResult result;
+
+
+
+
+rule "Optimise evals inside pattern"
+	when
+		$operator :OperatorDescr()
+		
+		$eval :AnalyticsEvalDescr( 
+			parent == $operator 
+		)
+		
+		# Any other AnalyticsComponent that is not predicate or operator 
+		$other :AnalyticsComponent(
+			parent == $operator,
+			orderNumber > $eval.orderNumber,
+			( componentType != AnalyticsComponentType.OPERATOR && != AnalyticsComponentType.EVAL )
+		)
+
+		$rule :AnalyticsRule( 
+			id == $eval.ruleId 
+		)
+	then 
+		Collection list = new ArrayList();
+		list.add( $eval );
+		list.add( $other );
+		result.save( new AnalyticsMessage(
+								AnalyticsMessage.Severity.NOTE, 
+								AnalyticsMessage.MessageType.OPTIMISATION, 
+								$rule, 
+								"Rule \"" + $eval.getRuleName() + 
+								"\" would be more effective if the less expensive component, (" + 
+								$other +
+								"), could be before (" + 
+								$eval + ").", 
+								list ) );
+end

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java	2007-10-31 06:55:18 UTC (rev 16191)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -39,6 +39,10 @@
 					.parse(new InputStreamReader(
 							Analyzer.class
 									.getResourceAsStream("optimisation/OptimisationRestrictionOrderTest.drl")));
+			PackageDescr descr10 = new DrlParser()
+			.parse(new InputStreamReader(
+					Analyzer.class
+					.getResourceAsStream("optimisation/OptimisationPatternOrderTest.drl")));
 
 			Analyzer a = new Analyzer();
 			// a.addPackageDescr(descr);
@@ -50,6 +54,8 @@
 			a.addPackageDescr(descr7);
 			a.addPackageDescr(descr8);
 			a.addPackageDescr(descr9);
+			a.addPackageDescr(descr10);
+			
 			a.fireAnalysis();
 			// System.out.print(a.getResultAsPlainText());
 			// System.out.print(a.getResultAsXML());

Added: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/PatternOrderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/PatternOrderTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/PatternOrderTest.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -0,0 +1,59 @@
+package org.drools.analytics.optimisation;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.drools.StatelessSession;
+import org.drools.analytics.TestBase;
+import org.drools.analytics.components.AnalyticsComponent;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.report.components.AnalyticsMessageBase;
+import org.drools.base.RuleNameMatchesAgendaFilter;
+
+public class PatternOrderTest extends TestBase {
+
+	public void testEvalOrderInsideOperator() throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("PatternOrder.drl"));
+
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Optimise evals inside pattern"));
+
+		// Clear data so that test data doesn't mix.
+		AnalyticsDataFactory.clearAnalyticsData();
+		Collection<? extends Object> testData = getTestData(this.getClass()
+				.getResourceAsStream("OptimisationPatternOrderTest.drl"));
+
+		// Clear result so that test data doesn't mix.
+		AnalyticsDataFactory.clearAnalyticsResult();
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
+
+		session.executeWithResults(testData);
+
+		Iterator<AnalyticsMessageBase> iter = result.getBySeverity(
+				AnalyticsMessageBase.Severity.NOTE).iterator();
+
+		Collection<String> ruleNames = new ArrayList<String>();
+		while (iter.hasNext()) {
+			Object o = (Object) iter.next();
+			if (o instanceof AnalyticsMessage) {
+				String name = ((AnalyticsMessage) o).getCauses().toArray(
+						new AnalyticsComponent[2])[0].getRuleName();
+
+				ruleNames.add(name);
+			}
+		}
+
+		assertTrue(ruleNames.remove("Wrong eval order 1"));
+
+		if (!ruleNames.isEmpty()) {
+			for (String string : ruleNames) {
+				fail("Rule " + string + " caused an error.");
+			}
+		}
+	}
+}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/RestrictionOrderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/RestrictionOrderTest.java	2007-10-31 06:55:18 UTC (rev 16191)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/optimisation/RestrictionOrderTest.java	2007-10-31 10:30:50 UTC (rev 16192)
@@ -166,7 +166,7 @@
 		assertEquals(2, pairs.size());
 	}
 
-	public void testEvalOrderInsideOperator() throws Exception {
+	public void testPredicateOrderInsideOperator() throws Exception {
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("RestrictionOrder.drl"));
 

Added: labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/optimisation/OptimisationPatternOrderTest.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/optimisation/OptimisationPatternOrderTest.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/optimisation/OptimisationPatternOrderTest.drl	2007-10-31 10:30:50 UTC (rev 16192)
@@ -0,0 +1,19 @@
+package com.misc.someData
+
+import com.sample.DroolsTest.Message;
+
+rule "Correct eval order 1"
+	when
+		Foo( )
+		eval( func(1, 2) )
+	then
+		// Something
+end
+
+rule "Wrong eval order 1"
+	when
+		eval( func(1, 2) )
+		Foo( )
+	then
+		// Something
+end
\ No newline at end of file




More information about the jboss-svn-commits mailing list