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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Dec 27 07:14:06 EST 2007


Author: Rikkola
Date: 2007-12-27 07:14:05 -0500 (Thu, 27 Dec 2007)
New Revision: 17411

Added:
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/equivalence/
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/equivalence/Rules.drl
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/equivalence/
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/equivalence/EquivalentRulesTest.java
Modified:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl
   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/Rules.drl
   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/AnalyticsTestStandalone.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyzerTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundancyTestBase.java
   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/RedundantRulesAndPatternsTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl
Log:
Added equivalent rules test and fixed bugs from redundant rules tests.

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-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -14,6 +14,8 @@
 	public static Collection<Package> loadPackages() {
 
 		String[] fileNames = new String[] {
+				// Equivalence
+				"equivalence/Rules.drl",
 				// Incoherence
 				"incoherence/Patterns.drl",
 				"incoherence/Restrictions.drl",

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/equivalence/Rules.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/equivalence/Rules.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/equivalence/Rules.drl	2007-12-27 12:14:05 UTC (rev 17411)
@@ -0,0 +1,37 @@
+#created on: 7.9.2007
+package org.drools.analytics.redundancy.rules
+
+import org.drools.analytics.components.AnalyticsRule;
+import org.drools.analytics.report.components.Redundancy;
+
+#
+# Only checks for redundant rule specifications where consequences are not redundant, 
+# does not include actual pattern and restriction checks.
+#
+rule "Find equivalent Rules"
+	when
+		# Check that AnalyticsRule $left and $right have redundant fields.
+		$left :AnalyticsRule()
+		$right :AnalyticsRule( 
+			id != $left.id, 
+			ruleAgendaGroup == $left.ruleAgendaGroup
+		)
+		
+		not Redundancy(
+			left == $left.consequence,
+			right == $right.consequence
+		)
+		
+		# Check that there is not already a pair with these values.
+		not Redundancy( 
+			left == $left, 
+			right == $right 
+		)
+		#not Redundancy( 
+		#	left == $right, 
+		#	right == $left 
+		#)
+	then
+		insert( new Redundancy( Redundancy.RedundancyType.WEAK, $left, $right ) );
+end
+

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl	2007-12-27 12:14:05 UTC (rev 17411)
@@ -79,7 +79,6 @@
 			restriction.intValue < $higher.intValue
 		)
 	then
-		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
 		result.remove( $gap );
 end
@@ -121,7 +120,6 @@
 			restriction.intValue < $higher.intValue
 		)
 	then
-		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
 		result.remove( $gap );
 end
@@ -163,7 +161,6 @@
 			restriction.doubleValue < $higher.doubleValue
 		)
 	then
-		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
 		result.remove( $gap );
 end
@@ -205,7 +202,6 @@
 			restriction.doubleValue < $higher.doubleValue
 		)
 	then
-		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
 		result.remove( $gap );
 end
@@ -288,7 +284,6 @@
 			eval( restriction.getDateValue().before( $higher.getDateValue() ) )
 		)
 	then
-		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
 		result.remove( $gap );
 end

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-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl	2007-12-27 12:14:05 UTC (rev 17411)
@@ -15,33 +15,31 @@
 # Fires when two PatternPossibilities are redundant.
 # Marks these possibilities as redundant.
 # 
-# Example 1: Pattern1( a == b) and Pattern1( a == b)
-# Example 2: Pattern1( a == b || a == c) and Pattern1( a == b)
+# Example 1: Pattern1( a == b ) and Pattern1( a == b )
+# Example 2: Pattern1( a == b || a == c ) and Pattern1( a == b )
 rule "Find pattern possibility redundancy"
 	when
-		$ppr :Redundancy( 
-			type == Redundancy.RedundancyType.WEAK,
+		$redundancy :Redundancy( 
 			left.causeType == Cause.CauseType.PATTERN 
 		)
 
 		# Find two PatternPossibilities.
 		(
 				$pp1 :PatternPossibility(
-					eval( patternId == $ppr.getLeft().getId() )
+					eval( patternId == $redundancy.getLeft().getId() )
 				)
 			and
 				$pp2 :PatternPossibility(
-					eval( patternId == $ppr.getRight().getId() )
+					eval( patternId == $redundancy.getRight().getId() )
 				)
 		) or (
 				$pp1 :PatternPossibility(
-					eval( patternId == $ppr.getRight().getId() )
+					eval( patternId == $redundancy.getRight().getId() )
 				)
 			and
 				$pp2 :PatternPossibility(
-					eval( patternId == $ppr.getLeft().getId() )
+					eval( patternId == $redundancy.getLeft().getId() )
 				)
-	
 		)
 		
 		# For every restriction in $pp1 there is a redundancy to $pp2. 
@@ -61,6 +59,7 @@
 					&&
 					right == $r
 				)
+				
 			)
 		)
 		
@@ -71,7 +70,7 @@
 				this memberOf $pp2.items
 			)
 			
-			Redundancy(
+			Redundancy(	
 				(
 					left == $r
 					&&
@@ -96,68 +95,43 @@
 rule "Find rule possibility redundancy"
 	when
 		$redundancy :Redundancy( 
-			type == Redundancy.RedundancyType.WEAK,
 			left.causeType == Cause.CauseType.RULE 
 		)
 
 		# Find two RulePossibilities.
-		(
-				$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() )
-				)
+		$rp1 :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. 
+		# For every pattern possibility in $rp1 there is a redundant pattern possibility in $rp2. 
 		forall(
 			$pp :PatternPossibility(
-				patternId == $rp1.ruleId,
+				ruleId == $rp1.ruleId,
 				this memberOf $rp1.items
 			)
-			
+					
 			Redundancy(
 				type == Redundancy.RedundancyType.STRONG,
-				(
-					left == $pp
-					&&
-					right memberOf $rp2.items
-				) || (
-					left memberOf $rp2.items
-					&&
-					right == $pp
-				)
+				left == $pp,
+				right memberOf $rp2.items
 			)
+			
 		)
 		
-		# For every restriction in $pp2 there is a redundancy to $pp1. 
+		# For every pattern possibility in $rp2 there is a redundant pattern possibility in $rp1. 
 		forall(
 			$pp :PatternPossibility(
-				patternId == $rp2.ruleId,
+				ruleId == $rp2.ruleId,
 				this memberOf $rp2.items
 			)
 			
 			Redundancy(
 				type == Redundancy.RedundancyType.STRONG,
-				(
-					left == $pp
-					&&
-					right memberOf $rp1.items
-				) || (
-					left memberOf $rp1.items
-					&&
-					right == $pp
-				)
+				left == $pp,
+				right memberOf $rp1.items
 			)
 		)
 	then

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl	2007-12-27 12:14:05 UTC (rev 17411)
@@ -8,7 +8,7 @@
 # Only checks for redundant rule specifications, 
 # does not include actual pattern and restriction checks.
 #
-rule "Find redundant Rules, weak redundancy"
+rule "Find redundant Rules, strong redundancy"
 	when
 		# Check that AnalyticsRule $left and $right have redundant fields.
 		$left :AnalyticsRule()
@@ -27,11 +27,11 @@
 			left == $left, 
 			right == $right 
 		)
-		not Redundancy( 
-			left == $right, 
-			right == $left 
-		)
+		#not Redundancy( 
+		#	left == $right, 
+		#	right == $left 
+		#)
 	then
-		insert( new Redundancy( Redundancy.RedundancyType.WEAK, $left, $right ) );
+		insert( new Redundancy( Redundancy.RedundancyType.STRONG, $left, $right ) );
 end
 

Modified: 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	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Warnings.drl	2007-12-27 12:14:05 UTC (rev 17411)
@@ -52,9 +52,16 @@
 		causes.add( $rulePossibilityRedundancy.getLeft() );
 		causes.add( $rulePossibilityRedundancy.getRight() );
 		
+		String message;
+		if( $ruleRedundancy.getType() == Redundancy.RedundancyType.WEAK ) {
+			message = "Rules are equivalent.";
+		} else {
+			message = "Rules are redundant.";
+		}
+		
 		result.add(new AnalyticsMessage( 
 						AnalyticsMessage.Severity.WARNING, AnalyticsMessage.MessageType.REDUNDANCY, 
-						$rulePossibilityRedundancy, "Rules are redundant.", causes ) );
+						$rulePossibilityRedundancy, message, causes ) );
 end
 
 rule "Find subsumptant rule possibilities from different rules"

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-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -31,16 +31,16 @@
 			Collection<String> fileNames = new ArrayList<String>();
 
 			// Test data
-//			fileNames.add("MissingRangesForDates.drl");
-//			fileNames.add("MissingRangesForDoubles.drl");
-//			fileNames.add("MissingRangesForInts.drl");
-//			fileNames.add("MissingRangesForVariables.drl");
-//			fileNames.add("Misc.drl");
-//			fileNames.add("Misc2.drl");
+			// fileNames.add("MissingRangesForDates.drl");
+			// fileNames.add("MissingRangesForDoubles.drl");
+			// fileNames.add("MissingRangesForInts.drl");
+			// fileNames.add("MissingRangesForVariables.drl");
+			// fileNames.add("Misc.drl");
+			// fileNames.add("Misc2.drl");
 			fileNames.add("Misc3.drl");
-//			fileNames.add("ConsequenceTest.drl");
-//			fileNames.add("optimisation/OptimisationRestrictionOrderTest.drl");
-//			fileNames.add("optimisation/OptimisationPatternOrderTest.drl");
+			// fileNames.add("ConsequenceTest.drl");
+			// fileNames.add("optimisation/OptimisationRestrictionOrderTest.drl");
+			// fileNames.add("optimisation/OptimisationPatternOrderTest.drl");
 
 			DrlParser parser = new DrlParser();
 			Analyzer a = new Analyzer();
@@ -55,33 +55,40 @@
 			// System.out.print(a.getResultAsPlainText());
 			// System.out.print(a.getResultAsXML());
 			// a.writeComponentsHTML("/stash/");
-			a.writeComponentsHTML("/Users/michaelneale/foo.html");
+			// a.writeComponentsHTML("/Users/michaelneale/foo.html");
+			a.writeComponentsHTML("c:/");
 
-
 			AnalyticsResult result = a.getResult();
-			Collection<AnalyticsMessageBase> msgs = result.getBySeverity(AnalyticsMessageBase.Severity.ERROR);
+			Collection<AnalyticsMessageBase> msgs = result
+					.getBySeverity(AnalyticsMessageBase.Severity.ERROR);
 
 			for (Iterator iterator = msgs.iterator(); iterator.hasNext();) {
-				AnalyticsMessageBase msg = (AnalyticsMessageBase) iterator.next();
+				AnalyticsMessageBase msg = (AnalyticsMessageBase) iterator
+						.next();
 				System.out.println("ERR: " + msg.getMessage());
 			}
 
 			msgs = result.getBySeverity(AnalyticsMessageBase.Severity.WARNING);
 			for (Iterator iterator = msgs.iterator(); iterator.hasNext();) {
-				AnalyticsMessageBase msg = (AnalyticsMessageBase) iterator.next();
-				System.out.println("WARN (" + msg.getClass().getSimpleName() +"): " + msg.getMessage());
-				System.out.println("\t FAULT: [" + msg.getClass().getSimpleName() + "] " + msg.getFaulty());
+				AnalyticsMessageBase msg = (AnalyticsMessageBase) iterator
+						.next();
+				System.out.println("WARN (" + msg.getClass().getSimpleName()
+						+ "): " + msg.getMessage());
+				System.out.println("\t FAULT: ["
+						+ msg.getClass().getSimpleName() + "] "
+						+ msg.getFaulty());
 				if (msg instanceof AnalyticsMessage) {
 					System.out.println("\t CAUSES (message):");
-						AnalyticsMessage amsg = (AnalyticsMessage) msg;
-						for (Iterator iterator2 = amsg.getCauses().iterator(); iterator2
-								.hasNext();) {
-							Cause c = (Cause) iterator2.next();
-							System.out.println("\t\t [" + c.getClass().getSimpleName() + "]" + c);
+					AnalyticsMessage amsg = (AnalyticsMessage) msg;
+					for (Iterator iterator2 = amsg.getCauses().iterator(); iterator2
+							.hasNext();) {
+						Cause c = (Cause) iterator2.next();
+						System.out.println("\t\t ["
+								+ c.getClass().getSimpleName() + "]" + c);
 
-						}
+					}
 
-				} else if (msg instanceof AnalyticsRangeCheckMessage)  {
+				} else if (msg instanceof AnalyticsRangeCheckMessage) {
 					System.out.println("\t CAUSES (range):");
 					AnalyticsRangeCheckMessage amsg = (AnalyticsRangeCheckMessage) msg;
 					for (Iterator iterator2 = amsg.getCauses().iterator(); iterator2
@@ -96,18 +103,19 @@
 
 			msgs = result.getBySeverity(AnalyticsMessageBase.Severity.NOTE);
 			for (Iterator iterator = msgs.iterator(); iterator.hasNext();) {
-				AnalyticsMessageBase msg = (AnalyticsMessageBase) iterator.next();
+				AnalyticsMessageBase msg = (AnalyticsMessageBase) iterator
+						.next();
 				System.out.println("NOTE: " + msg.getMessage());
 				System.out.println("\t" + msg.getFaulty());
 			}
 
-
-
-			Collection<AnalyticsClass> classes = result.getAnalyticsData().getAllClasses();
+			Collection<AnalyticsClass> classes = result.getAnalyticsData()
+					.getAllClasses();
 			for (Iterator iterator = classes.iterator(); iterator.hasNext();) {
 				AnalyticsClass c = (AnalyticsClass) iterator.next();
 
-				Collection<AnalyticsRule> cr =  result.getAnalyticsData().getRulesByClassId(c.getId());
+				Collection<AnalyticsRule> cr = result.getAnalyticsData()
+						.getRulesByClassId(c.getId());
 				System.err.println("Class rules:" + cr);
 				Set<Field> flds = c.getFields();
 				for (Iterator iterator2 = flds.iterator(); iterator2.hasNext();) {
@@ -115,13 +123,12 @@
 					cr = result.getAnalyticsData().getRulesByFieldId(f.getId());
 					System.err.println("Field rules: " + cr);
 
-
 				}
 			}
 
-			//System.err.println(a.getResultAsPlainText());
-            //System.out.println(result.toString());
-        } catch (Throwable t) {
+			// System.err.println(a.getResultAsPlainText());
+			// System.out.println(result.toString());
+		} catch (Throwable t) {
 			t.printStackTrace();
 		}
 	}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyzerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyzerTest.java	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyzerTest.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -26,7 +26,7 @@
 		AnalyticsResult result = anal.getResult();
 		assertNotNull(result);
 		assertEquals(0, result.getBySeverity(AnalyticsMessageBase.Severity.ERROR).size());
-		assertEquals(10, result.getBySeverity(AnalyticsMessageBase.Severity.WARNING).size());
+		assertEquals(17, result.getBySeverity(AnalyticsMessageBase.Severity.WARNING).size());
 		assertEquals(1, result.getBySeverity(AnalyticsMessageBase.Severity.NOTE).size());
 
 
@@ -44,7 +44,7 @@
 		result = anal.getResult();
 		assertNotNull(result);
 		assertEquals(0, result.getBySeverity(AnalyticsMessageBase.Severity.ERROR).size());
-		assertEquals(10, result.getBySeverity(AnalyticsMessageBase.Severity.WARNING).size());
+		assertEquals(17, result.getBySeverity(AnalyticsMessageBase.Severity.WARNING).size());
 		assertEquals(1, result.getBySeverity(AnalyticsMessageBase.Severity.NOTE).size());
 
 

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -13,6 +13,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatelessSession;
 import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.report.components.Cause;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.PackageBuilder;
 import org.drools.lang.descr.PackageDescr;
@@ -73,6 +74,30 @@
 		return false;
 	}
 
+	/**
+	 * Returns true if map contains redundancy where cause1 is redundant to
+	 * cause2.
+	 * 
+	 * @param map
+	 * @param cause1
+	 * @param cause2
+	 * @return True if redundancy exists.
+	 */
+	protected static boolean causeMapContains(Map<Cause, Set<Cause>> map,
+			Cause cause1, Cause cause2) {
+		if (map.containsKey(cause1)) {
+			Set<Cause> set = map.get(cause1);
+			boolean exists = set.remove(cause2);
+
+			// If set is empty remove key from map.
+			if (set.isEmpty()) {
+				map.remove(cause1);
+			}
+			return exists;
+		}
+		return false;
+	}
+
 	public Collection<? extends Object> getTestData(InputStream stream,
 			AnalyticsData data) throws Exception {
 		Reader drlReader = new InputStreamReader(stream);

Added: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/equivalence/EquivalentRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/equivalence/EquivalentRulesTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/equivalence/EquivalentRulesTest.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -0,0 +1,58 @@
+package org.drools.analytics.equivalence;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.StatelessSession;
+import org.drools.StatelessSessionResult;
+import org.drools.analytics.TestBase;
+import org.drools.analytics.components.AnalyticsRule;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.dao.AnalyticsResultFactory;
+import org.drools.analytics.redundancy.RedundancyTestBase;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.base.RuleNameMatchesAgendaFilter;
+
+public class EquivalentRulesTest extends RedundancyTestBase {
+
+	public void testRuleRedundancy() throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("Rules.drl"));
+
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Find equivalent Rules"));
+
+		Collection<Object> data = new ArrayList<Object>();
+
+		String ruleName1 = "Rule 1";
+		String ruleName2 = "Rule 2";
+
+		AnalyticsRule rule1 = new AnalyticsRule();
+		rule1.setRuleName(ruleName1);
+		AnalyticsRule rule2 = new AnalyticsRule();
+		rule2.setRuleName(ruleName2);
+
+		Redundancy r1 = new Redundancy(rule1, rule2);
+
+		data.add(rule1);
+		data.add(rule2);
+		data.add(r1);
+
+		AnalyticsResult result = AnalyticsResultFactory.createAnalyticsResult();
+		session.setGlobal("result", result);
+
+		StatelessSessionResult sessionResult = session.executeWithResults(data);
+
+		Map<String, Set<String>> map = createRedundancyMap(sessionResult
+				.iterateObjects());
+
+		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
+		assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
+
+		if (!map.isEmpty()) {
+			fail("More equivalences than was expected.");
+		}
+	}
+}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundancyTestBase.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundancyTestBase.java	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundancyTestBase.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -8,19 +8,20 @@
 
 import org.drools.analytics.TestBase;
 import org.drools.analytics.components.AnalyticsComponent;
+import org.drools.analytics.report.components.Cause;
 import org.drools.analytics.report.components.Redundancy;
 
 /**
- *
+ * 
  * @author Toni Rikkola
- *
+ * 
  */
 public class RedundancyTestBase extends TestBase {
 
 	/**
 	 * Creates redundancy map from Redundancy objects, one rule may have several
 	 * redundancy dependencies.
-	 *
+	 * 
 	 * @param iter
 	 * @return
 	 */
@@ -48,13 +49,49 @@
 		return map;
 	}
 
+	/**
+	 * Creates redundancy map from Redundancy objects, one rule may have several
+	 * redundancy dependencies.
+	 * 
+	 * @param iter
+	 * @return
+	 */
+	protected Map<Cause, Set<Cause>> createRedundancyCauseMap(
+			Cause.CauseType type, Iterator<Object> iter) {
+
+		Map<Cause, Set<Cause>> map = new HashMap<Cause, Set<Cause>>();
+		while (iter.hasNext()) {
+			Object o = (Object) iter.next();
+			if (o instanceof Redundancy) {
+				Redundancy r = (Redundancy) o;
+
+				if (r.getLeft().getCauseType() == type) {
+					Cause left = r.getLeft();
+					Cause right = r.getRight();
+
+					if (map.containsKey(left)) {
+						Set<Cause> set = map.get(left);
+						set.add(right);
+					} else {
+						Set<Cause> set = new HashSet<Cause>();
+						set.add(right);
+						map.put(left, set);
+					}
+				}
+			}
+		}
+
+		return map;
+	}
+
 	public void testDummy() {
-		//this is needed as eclipse will try to run this and produce a failure if its not here.
+		// this is needed as eclipse will try to run this and produce a failure
+		// if its not here.
 	}
 
 	/**
 	 * Returns true if map contains redundancy where key is redundant to value.
-	 *
+	 * 
 	 * @param map
 	 * @param key
 	 * @param value

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-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantPossibilitiesTest.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -15,6 +15,7 @@
 import org.drools.analytics.components.RulePossibility;
 import org.drools.analytics.dao.AnalyticsResultFactory;
 import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Cause;
 import org.drools.analytics.report.components.Redundancy;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
@@ -92,6 +93,9 @@
 		AnalyticsResult result = AnalyticsResultFactory.createAnalyticsResult();
 		session.setGlobal("result", result);
 
+		/*
+		 * First rules. These are redundant,
+		 */
 		String ruleName1 = "Rule 1";
 		String ruleName2 = "Rule 2";
 
@@ -128,13 +132,61 @@
 		data.add(rp1);
 		data.add(rp2);
 
+		/*
+		 * These two rules are not redundant
+		 */
+		String ruleName3 = "Rule 3";
+		String ruleName4 = "Rule 4";
+
+		AnalyticsRule r3 = new AnalyticsRule();
+		r3.setRuleName(ruleName3);
+		AnalyticsRule r4 = new AnalyticsRule();
+		r4.setRuleName(ruleName4);
+
+		PatternPossibility pp3 = new PatternPossibility();
+		pp3.setRuleId(r3.getId());
+		pp3.setRuleName(ruleName3);
+		PatternPossibility pp4 = new PatternPossibility();
+		pp4.setRuleId(r4.getId());
+		pp4.setRuleName(ruleName4);
+		// This possibility makes them different
+		PatternPossibility pp5 = new PatternPossibility();
+		pp5.setRuleId(r4.getId());
+		pp5.setRuleName(ruleName4);
+
+		RulePossibility rp3 = new RulePossibility();
+		rp3.setRuleId(r3.getId());
+		rp3.setRuleName(ruleName3);
+		rp3.add(pp3);
+
+		RulePossibility rp4 = new RulePossibility();
+		rp4.setRuleId(r4.getId());
+		rp4.setRuleName(ruleName4);
+		rp4.add(pp4);
+		rp4.add(pp5);
+
+		Redundancy possibilityredundancy2 = new Redundancy(
+				Redundancy.RedundancyType.STRONG, pp3, pp4);
+		Redundancy ruleRedundancy2 = new Redundancy(r3, r4);
+
+		data.add(r3);
+		data.add(r4);
+		data.add(pp3);
+		data.add(pp4);
+		data.add(pp5);
+		data.add(possibilityredundancy2);
+		data.add(ruleRedundancy2);
+		data.add(rp3);
+		data.add(rp4);
+
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
-		Map<String, Set<String>> map = createRedundancyMap(sessionResult
-				.iterateObjects());
+		Map<Cause, Set<Cause>> map = createRedundancyCauseMap(
+				Cause.CauseType.RULE_POSSIBILITY, sessionResult
+						.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
-		assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
+		assertTrue(TestBase.causeMapContains(map, rp1, rp2));
+		assertFalse(TestBase.causeMapContains(map, rp3, rp4));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantRulesAndPatternsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantRulesAndPatternsTest.java	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/RedundantRulesAndPatternsTest.java	2007-12-27 12:14:05 UTC (rev 17411)
@@ -22,7 +22,7 @@
 				.getResourceAsStream("Rules.drl"));
 
 		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
-				"Find redundant Rules, weak redundancy"));
+				"Find redundant Rules, strong redundancy"));
 
 		Collection<Object> data = new ArrayList<Object>();
 

Modified: labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl	2007-12-26 21:22:26 UTC (rev 17410)
+++ labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl	2007-12-27 12:14:05 UTC (rev 17411)
@@ -15,7 +15,7 @@
 		RedundancyPattern( a == 1 )
 		RedundancyPattern2( a == 1 )
 	then
-		System.println("TEST");
+		System.out.println("TEST");
 end
 
 rule "Redundant rule 2, rules"
@@ -23,5 +23,13 @@
 		RedundancyPattern( a == 1 )
 		RedundancyPattern2( a == 1 )
 	then
-		System.println("TEST");
+		System.out.println("TEST");
 end
+
+rule "Equivalent rule"
+	when
+		RedundancyPattern( a == 1 )
+		RedundancyPattern2( a == 1 )
+	then
+		System.out.println("NOT A TEST");
+end




More information about the jboss-svn-commits mailing list