[jboss-svn-commits] JBL Code SVN: r17130 - in labs/jbossrules/trunk/drools-analytics/src: main/resources/org/drools/analytics/redundancy and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Dec 9 07:05:49 EST 2007


Author: Rikkola
Date: 2007-12-09 07:05:48 -0500 (Sun, 09 Dec 2007)
New Revision: 17130

Added:
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Warnings.drl
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/WarningsTest.java
Modified:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantPossibilitiesTest.java
Log:
Finds and reports redundant rules.

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java	2007-12-09 11:48:29 UTC (rev 17129)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java	2007-12-09 12:05:48 UTC (rev 17130)
@@ -5,7 +5,6 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.analytics.components.Pattern;
 import org.drools.analytics.dao.AnalyticsData;
 import org.drools.analytics.dao.AnalyticsDataFactory;
 import org.drools.analytics.dao.AnalyticsResult;

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-12-09 11:48:29 UTC (rev 17129)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java	2007-12-09 12:05:48 UTC (rev 17130)
@@ -32,7 +32,7 @@
 				"redundancy/Restrictions.drl", "redundancy/Notes.drl",
 				"redundancy/Consequence.drl", "redundancy/Patterns.drl",
 				"redundancy/Possibilities.drl", "redundancy/Rules.drl",
-				"reports/RangeCheckReports.drl",
+				"redundancy/Warnings.drl", "reports/RangeCheckReports.drl",
 				// Missing consequence
 				"Consequence.drl", };
 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl	2007-12-09 11:48:29 UTC (rev 17129)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl	2007-12-09 12:05:48 UTC (rev 17130)
@@ -25,13 +25,24 @@
 		)
 
 		# Find two PatternPossibilities.
-		$pp1 :PatternPossibility(
-			eval( patternId == $ppr.getLeft().getId() )
+		(
+				$pp1 :PatternPossibility(
+					eval( patternId == $ppr.getLeft().getId() )
+				)
+			and
+				$pp2 :PatternPossibility(
+					eval( patternId == $ppr.getRight().getId() )
+				)
+		) or (
+				$pp1 :PatternPossibility(
+					eval( patternId == $ppr.getRight().getId() )
+				)
+			and
+				$pp2 :PatternPossibility(
+					eval( patternId == $ppr.getLeft().getId() )
+				)
+	
 		)
-
-		$pp2 :PatternPossibility(
-			eval( patternId == $ppr.getRight().getId() )
-		)
 		
 		# For every restriction in $pp1 there is a redundancy to $pp2. 
 		forall(
@@ -90,13 +101,23 @@
 		)
 
 		# Find two RulePossibilities.
-		$rp1 :RulePossibility(
-			eval( ruleId == $redundancy.getLeft().getId() )
+		(
+				$rp1 :RulePossibility(
+					eval( ruleId == $redundancy.getLeft().getId() )
+				)
+			and
+				$rp2 :RulePossibility(
+					eval( ruleId == $redundancy.getRight().getId() )
+				)
+		) or (
+				$rp1 :RulePossibility(
+					eval( ruleId == $redundancy.getRight().getId() )
+				)
+			and
+				$rp2 :RulePossibility(
+					eval( ruleId == $redundancy.getLeft().getId() )
+				)
 		)
-
-		$rp2 :RulePossibility(
-			eval( ruleId == $redundancy.getRight().getId() )
-		)
 		
 		# For every pattern possibility in $pp1 there is a pattern possibility in $pp2. 
 		forall(

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Warnings.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Warnings.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Warnings.drl	2007-12-09 12:05:48 UTC (rev 17130)
@@ -0,0 +1,97 @@
+#created on: 9.12.2007
+package org.drools.analytics.redundancy
+
+#list any import classes here.
+global AnalyticsResult result;
+
+
+
+#declare any global variables here
+import java.util.Collection;
+import java.util.ArrayList;
+
+import org.drools.analytics.components.RulePossibility;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.report.components.Cause;
+import org.drools.analytics.report.components.Cause.CauseType;
+
+
+rule "Find redundant rule possibilities from different rules"
+	salience -100
+	when
+		$ruleRedundancy :Redundancy(
+			left.causeType == Cause.CauseType.RULE
+		)
+		
+		$rulePossibilityRedundancy :Redundancy(
+			left.causeType == Cause.CauseType.RULE_POSSIBILITY
+		)
+		
+		# Check that redundant possibilities are from redundant rules
+		exists RulePossibility(
+			this == $rulePossibilityRedundancy.left,
+			eval( ruleId == $ruleRedundancy.getLeft().getId() )
+		)
+		
+		exists RulePossibility(
+			this == $rulePossibilityRedundancy.right,
+			eval( ruleId == $ruleRedundancy.getRight().getId() )
+		)
+		
+		# Check that the possibilties are redundant to each other. 
+		exists Redundancy(
+			left.causeType == Cause.CauseType.RULE_POSSIBILITY,
+			left == $rulePossibilityRedundancy.right,
+			right == $rulePossibilityRedundancy.left
+		)
+		
+	then
+		Collection<Cause> causes = new ArrayList<Cause>();
+		causes.add( $rulePossibilityRedundancy.getLeft() );
+		causes.add( $rulePossibilityRedundancy.getRight() );
+		
+		result.save(new AnalyticsMessage( 
+						AnalyticsMessage.Severity.WARNING, AnalyticsMessage.MessageType.REDUNDANCY, 
+						$rulePossibilityRedundancy, "Rules are redundant.", causes ) );
+end
+
+rule "Find subsumptant rule possibilities from different rules"
+	salience -100
+	when
+		$ruleRedundancy :Redundancy(
+			left.causeType == Cause.CauseType.RULE
+		)
+		
+		$rulePossibilityRedundancy :Redundancy(
+			left.causeType == Cause.CauseType.RULE_POSSIBILITY
+		)
+		
+		# Check that redundant possibilities are from redundant rules
+		exists RulePossibility(
+			this == $rulePossibilityRedundancy.left,
+			eval( ruleId == $ruleRedundancy.getLeft().getId() )
+		)
+		
+		exists RulePossibility(
+			this == $rulePossibilityRedundancy.right,
+			eval( ruleId == $ruleRedundancy.getRight().getId() )
+		)
+		
+		# Check that the left side is redundant to right, but the right side is not redudant to left. 
+		not Redundancy(
+			left.causeType == Cause.CauseType.RULE_POSSIBILITY,
+			left == $rulePossibilityRedundancy.right,
+			right == $rulePossibilityRedundancy.left
+		)
+		
+	then
+		Collection<Cause> causes = new ArrayList<Cause>();
+		causes.add( $rulePossibilityRedundancy.getLeft() );
+		causes.add( $rulePossibilityRedundancy.getRight() );
+		
+		result.save(new AnalyticsMessage( 
+						AnalyticsMessage.Severity.WARNING, AnalyticsMessage.MessageType.REDUNDANCY, 
+						$rulePossibilityRedundancy, "Rules are subsumptant.", causes ) );
+end

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantPossibilitiesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantPossibilitiesTest.java	2007-12-09 11:48:29 UTC (rev 17129)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantPossibilitiesTest.java	2007-12-09 12:05:48 UTC (rev 17130)
@@ -74,8 +74,8 @@
 		Map<String, Set<String>> map = createRedundancyMap(sessionResult
 				.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2)
-				^ TestBase.mapContains(map, ruleName2, ruleName1));
+		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
+		assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");
@@ -137,8 +137,8 @@
 		Map<String, Set<String>> map = createRedundancyMap(sessionResult
 				.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2)
-				^ TestBase.mapContains(map, ruleName2, ruleName1));
+		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
+		assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");

Added: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/WarningsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/WarningsTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/WarningsTest.java	2007-12-09 12:05:48 UTC (rev 17130)
@@ -0,0 +1,116 @@
+package org.drools.analytics.redundancy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.drools.StatelessSession;
+import org.drools.analytics.TestBase;
+import org.drools.analytics.components.AnalyticsRule;
+import org.drools.analytics.components.RulePossibility;
+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.analytics.report.components.Redundancy;
+import org.drools.base.RuleNameMatchesAgendaFilter;
+
+public class WarningsTest extends TestBase {
+
+	public void testRedundantRules() throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("Warnings.drl"));
+
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Find redundant rule possibilities from different rules"));
+
+		Collection<Object> objects = new ArrayList<Object>();
+
+		AnalyticsRule rule1 = new AnalyticsRule();
+		AnalyticsRule rule2 = new AnalyticsRule();
+
+		Redundancy ruleRedundancy = new Redundancy(
+				Redundancy.RedundancyType.STRONG, rule1, rule2);
+
+		RulePossibility rp1 = new RulePossibility();
+		rp1.setRuleId(rule1.getId());
+
+		RulePossibility rp2 = new RulePossibility();
+		rp2.setRuleId(rule2.getId());
+
+		Redundancy rulePossibilityRedundancy1 = new Redundancy(
+				Redundancy.RedundancyType.STRONG, rp1, rp2);
+
+		Redundancy rulePossibilityRedundancy2 = new Redundancy(
+				Redundancy.RedundancyType.STRONG, rp2, rp1);
+
+		objects.add(rule1);
+		objects.add(rule2);
+		objects.add(ruleRedundancy);
+		objects.add(rp1);
+		objects.add(rp2);
+		objects.add(rulePossibilityRedundancy1);
+		objects.add(rulePossibilityRedundancy2);
+
+		AnalyticsDataFactory.clearAnalyticsResult();
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
+
+		session.executeWithResults(objects);
+
+		Collection<AnalyticsMessageBase> notes = result
+				.getBySeverity(AnalyticsMessage.Severity.WARNING);
+
+		// Has at least one item.
+		assertEquals(1, notes.size());
+
+		AnalyticsMessageBase warning = notes.iterator().next();
+		assertTrue(warning.getFaulty().equals(rulePossibilityRedundancy1));
+	}
+
+	public void testSubsumptantRules() throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("Warnings.drl"));
+
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Find subsumptant rule possibilities from different rules"));
+
+		Collection<Object> objects = new ArrayList<Object>();
+
+		AnalyticsRule rule1 = new AnalyticsRule();
+		AnalyticsRule rule2 = new AnalyticsRule();
+
+		Redundancy ruleRedundancy = new Redundancy(
+				Redundancy.RedundancyType.STRONG, rule1, rule2);
+
+		RulePossibility rp1 = new RulePossibility();
+		rp1.setRuleId(rule1.getId());
+
+		RulePossibility rp2 = new RulePossibility();
+		rp2.setRuleId(rule2.getId());
+
+		Redundancy rulePossibilityRedundancy1 = new Redundancy(
+				Redundancy.RedundancyType.STRONG, rp1, rp2);
+
+		objects.add(rule1);
+		objects.add(rule2);
+		objects.add(ruleRedundancy);
+		objects.add(rp1);
+		objects.add(rp2);
+		objects.add(rulePossibilityRedundancy1);
+
+		AnalyticsDataFactory.clearAnalyticsResult();
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
+
+		session.executeWithResults(objects);
+
+		Collection<AnalyticsMessageBase> notes = result
+				.getBySeverity(AnalyticsMessage.Severity.WARNING);
+
+		// Has at least one item.
+		assertEquals(1, notes.size());
+
+		AnalyticsMessageBase warning = notes.iterator().next();
+		assertTrue(warning.getFaulty().equals(rulePossibilityRedundancy1));
+	}
+}




More information about the jboss-svn-commits mailing list