[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