[jboss-svn-commits] JBL Code SVN: r18174 - in labs/jbossrules/trunk/drools-analytics/src: main/resources/org/drools/analytics/subsumption and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jan 28 08:30:21 EST 2008
Author: Rikkola
Date: 2008-01-28 08:30:21 -0500 (Mon, 28 Jan 2008)
New Revision: 18174
Modified:
labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java
labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java
labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java
labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl
labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java
labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java
Log:
Rules can now find subsumption between rules.
Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java 2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java 2008-01-28 13:30:21 UTC (rev 18174)
@@ -1,6 +1,5 @@
package org.drools.analytics.report.components;
-
public class CauseType {
public static final CauseType RULE = new CauseType(0);
@@ -16,6 +15,7 @@
public static final CauseType PREDICATE = new CauseType(10);
public static final CauseType CONSTRAINT = new CauseType(11);
public static final CauseType CONSEQUENCE = new CauseType(12);
+ public static final CauseType SUBSUMPTION = new CauseType(13);
public final int index;
Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java 2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java 2008-01-28 13:30:21 UTC (rev 18174)
@@ -3,59 +3,29 @@
/**
* Presents a redundancy between two Causes. The link between them can be WEAK
* or STRONG.
- *
+ *
* WEAK redundancy is for example two AnalyticsRules, but not theyr's rule
* possibilities. STRONG redundancy includes possibilities.
- *
+ *
* @author Toni Rikkola
*/
-public class Redundancy implements Cause {
-
-
-
- private static int index = 0;
-
- private int id = index++;
+public class Redundancy extends Subsumption implements Cause {
// By default the redundancy is weak.
private RedundancyType type = RedundancyType.WEAK;
- private Cause left;
- private Cause right;
public Redundancy(Cause left, Cause right) {
- this.left = left;
- this.right = right;
+ super(left, right);
}
public Redundancy(RedundancyType type, Cause left, Cause right) {
+ super(left, right);
this.type = type;
- this.left = left;
- this.right = right;
}
public CauseType getCauseType() {
return CauseType.REDUNDANCY;
}
- public int getId() {
- return id;
- }
-
- public Cause getLeft() {
- return left;
- }
-
- public void setLeft(Cause left) {
- this.left = left;
- }
-
- public Cause getRight() {
- return right;
- }
-
- public void setRight(Cause right) {
- this.right = right;
- }
-
public RedundancyType getType() {
return type;
}
@@ -66,6 +36,7 @@
@Override
public String toString() {
- return "Redundancy between: (" + left + ") and (" + right + ").";
+ return "Redundancy between: (" + getLeft() + ") and (" + getRight()
+ + ").";
}
}
Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java 2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java 2008-01-28 13:30:21 UTC (rev 18174)
@@ -4,8 +4,12 @@
*
* @author Toni Rikkola
*/
-public class Subsumption {
+public class Subsumption implements Cause {
+ private static int index = 0;
+
+ private int id = index++;
+
private Cause left;
private Cause right;
@@ -14,6 +18,14 @@
this.right = right;
}
+ public int getId() {
+ return id;
+ }
+
+ public CauseType getCauseType() {
+ return CauseType.SUBSUMPTION;
+ }
+
public Cause getLeft() {
return left;
}
@@ -29,4 +41,10 @@
public void setRight(Cause right) {
this.right = right;
}
+
+ @Override
+ public String toString() {
+ return "Subsumption between: (" + getLeft() + ") and (" + getRight()
+ + ").";
+ }
}
Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl 2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl 2008-01-28 13:30:21 UTC (rev 18174)
@@ -34,7 +34,7 @@
this memberOf $pp1.items
)
- Redundancy(
+ Subsumption(
left == $r,
right memberOf $pp2.items
)
@@ -52,12 +52,12 @@
orderNumber > $r1.orderNumber
)
and
- not Redundancy(
+ not Subsumption(
left memberOf $pp1.items,
right == $r1
)
and
- Redundancy(
+ Subsumption(
left memberOf $pp1.items,
right == $r2
)
@@ -75,79 +75,82 @@
#
rule "Find subsumptant rule possibilities"
when
+
$redundancy :Redundancy(
- left.causeType == CauseType.RULE,
- $leftRuleId :left.id,
- $rightRuleId :right.id
+ left.causeType == CauseType.RULE
)
# Find two RulePossibilities.
$rp1 :RulePossibility(
- ruleId == $leftRuleId
+ eval( ruleId == $redundancy.getLeft().getId() )
)
$rp2 :RulePossibility(
- ruleId == $rightRuleId
+ eval( ruleId == $redundancy.getRight().getId() )
)
-
- # For every pattern possibility in $rp1 there is a redundant pattern possibility in $rp2.
+
+ # For every PatternPossibility in $rp1 there is a redundancy to PatternPossibility in $rp2.
forall(
$pp :PatternPossibility(
- ruleId == $rp1.ruleId,
this memberOf $rp1.items
)
- Redundancy(
- type == RedundancyType.STRONG,
+ Subsumption(
left == $pp,
right memberOf $rp2.items
)
)
-
- # There is at least one PatternPossibility in $rp2 that does not hava a redundancy to PatternPossibility in $rp1.
- $pp :PatternPossibility(
- ruleId == $rp2.ruleId,
- this memberOf $rp2.items
- )
- # XXX: Problem here, or splits the rule in to two.
- exists(
+ # There is no PatternPossibility on $rp2 that has no redundancy in $rp1
+ # and has a lower order number than an existing PatternPossibility from $rp2 to $rp1.
+ not(
+ $pp1 :PatternPossibility(
+ this memberOf $rp2.items
+ )
+ and
+ $pp2 :PatternPossibility(
+ this memberOf $rp2.items,
+ orderNumber > $pp1.orderNumber
+ )
+ and
+ not Subsumption(
+ left memberOf $rp1.items,
+ right == $pp1
+ )
+ and
Subsumption(
- left memberOf $rp2.items,
- right memberOf $rp1.items
+ left memberOf $rp1.items,
+ right == $pp2
)
- or
- Redundancy(
- type == RedundancyType.STRONG,
- left memberOf $rp2.items,
- right memberOf $rp1.items
- )
)
+ then
+ insert( new Subsumption( $rp1, $rp2 ) );
+end
+
+rule "XXX: test rule"
+ when
+ $redundancy :Redundancy(
+ left.causeType == CauseType.RULE
+ )
+
+ # Find two RulePossibilities.
+ $rp1 :RulePossibility(
+ eval( ruleId == $redundancy.getLeft().getId() )
+ )
+ $rp2 :RulePossibility(
+ eval( ruleId == $redundancy.getRight().getId() )
+ )
- # There is at least one PatternPossibility in $rp2 that does not hava a redundancy to PatternPossibility in $rp1.
- #not(
- # $pp :PatternPossibility(
- # ruleId == $rp2.ruleId,
- # this memberOf $rp2.items
- # )
- # and
- # forall (
- # Redundancy(
- # type == RedundancyType.STRONG,
- # (
- # left == $pp
- # &&
- # right memberOf $rp1.items
- # ) || (
- # left memberOf $rp1.items
- # &&
- # right == $pp
- # )
- # )
- # )
- #)
+ forall(
+ $pp :PatternPossibility(
+ this memberOf $rp1.items
+ )
+ Redundancy(
+ left == $pp,
+ right memberOf $rp2.items
+ )
+ )
then
- System.out.println("pim");
- insert( new Subsumption( $rp1, $rp2 ) );
+ System.out.println( "pim" );
end
Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java 2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java 2008-01-28 13:30:21 UTC (rev 18174)
@@ -15,8 +15,10 @@
import org.drools.analytics.components.RulePossibility;
import org.drools.analytics.dao.AnalyticsResult;
import org.drools.analytics.dao.AnalyticsResultFactory;
+import org.drools.analytics.report.components.Cause;
import org.drools.analytics.report.components.Redundancy;
import org.drools.analytics.report.components.RedundancyType;
+import org.drools.analytics.report.components.Subsumption;
import org.drools.base.RuleNameMatchesAgendaFilter;
public class SubsumptantPossibilitiesTest extends SubsumptionTestBase {
@@ -80,10 +82,10 @@
StatelessSessionResult sessionResult = session.executeWithResults(data);
- Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+ Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
.iterateObjects());
- assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
+ assertTrue(TestBase.causeMapContains(map, pp1, pp2));
if (!map.isEmpty()) {
fail("More redundancies than was expected.");
@@ -151,17 +153,17 @@
StatelessSessionResult sessionResult = session.executeWithResults(data);
- Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+ Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
.iterateObjects());
- assertFalse(TestBase.mapContains(map, ruleName1, ruleName2));
+ assertFalse(TestBase.causeMapContains(map, pp1, pp2));
if (!map.isEmpty()) {
fail("More redundancies than was expected.");
}
}
- public void FIXMEtestRulePossibilityRedundancy() throws Exception {
+ public void testRulePossibilityRedundancy1() throws Exception {
StatelessSession session = getStatelessSession(this.getClass()
.getResourceAsStream("Possibilities.drl"));
@@ -218,13 +220,88 @@
StatelessSessionResult sessionResult = session.executeWithResults(data);
- Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+ Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
.iterateObjects());
- assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
+ assertTrue(TestBase.causeMapContains(map, rp1, rp2));
if (!map.isEmpty()) {
fail("More redundancies than was expected.");
}
}
+
+ public void testRulePossibilityRedundancy2() throws Exception {
+ StatelessSession session = getStatelessSession(this.getClass()
+ .getResourceAsStream("Possibilities.drl"));
+
+ session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+ "Find subsumptant rule possibilities"));
+// session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+// "XXX: test rule"));
+
+ Collection<Object> data = new ArrayList<Object>();
+
+ AnalyticsResult result = AnalyticsResultFactory.createAnalyticsResult();
+ session.setGlobal("result", result);
+
+ /*
+ * First rules. These are subsumptant,
+ */
+ String ruleName1 = "Rule 1";
+ String ruleName2 = "Rule 2";
+
+ AnalyticsRule r1 = new AnalyticsRule();
+ r1.setRuleName(ruleName1);
+ AnalyticsRule r2 = new AnalyticsRule();
+ r2.setRuleName(ruleName2);
+
+ PatternPossibility pp1 = new PatternPossibility();
+ pp1.setRuleName(ruleName1);
+ PatternPossibility pp2 = new PatternPossibility();
+ pp2.setRuleName(ruleName1);
+ PatternPossibility pp3 = new PatternPossibility();
+ pp3.setRuleName(ruleName2);
+ PatternPossibility pp4 = new PatternPossibility();
+ pp4.setRuleName(ruleName2);
+
+ RulePossibility rp1 = new RulePossibility();
+ rp1.setRuleId(r1.getId());
+ rp1.setRuleName(ruleName1);
+ rp1.add(pp1);
+ rp1.add(pp2);
+
+ RulePossibility rp2 = new RulePossibility();
+ rp2.setRuleId(r2.getId());
+ rp2.setRuleName(ruleName2);
+ rp2.add(pp3);
+ rp2.add(pp4);
+
+ Redundancy possibilityredundancy = new Redundancy(
+ RedundancyType.STRONG, pp1, pp3);
+ Subsumption possibilitysubsupmtion = new Subsumption(pp2, pp4);
+ Redundancy ruleRedundancy = new Redundancy(r1, r2);
+
+ data.add(r1);
+ data.add(r2);
+ data.add(pp1);
+ data.add(pp2);
+ data.add(pp3);
+ data.add(possibilityredundancy);
+ data.add(possibilitysubsupmtion);
+ data.add(ruleRedundancy);
+ data.add(rp1);
+ data.add(rp2);
+
+ StatelessSessionResult sessionResult = session.executeWithResults(data);
+
+ Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
+ .iterateObjects());
+
+ assertTrue(TestBase.causeMapContains(map, rp1, rp2));
+ assertTrue(TestBase.causeMapContains(map, pp2, pp4));
+
+ if (!map.isEmpty()) {
+ fail("More redundancies than was expected.");
+ }
+ }
}
Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java 2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java 2008-01-28 13:30:21 UTC (rev 18174)
@@ -7,7 +7,8 @@
import java.util.Set;
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;
import org.drools.analytics.report.components.Subsumption;
/**
@@ -29,24 +30,23 @@
* @param iter
* @return
*/
- protected Map<String, Set<String>> createSubsumptionMap(
- Iterator<Object> iter) {
+ protected Map<Cause, Set<Cause>> createSubsumptionMap(Iterator<Object> iter) {
- Map<String, Set<String>> map = new HashMap<String, Set<String>>();
+ Map<Cause, Set<Cause>> map = new HashMap<Cause, Set<Cause>>();
while (iter.hasNext()) {
Object o = (Object) iter.next();
- if (o instanceof Subsumption) {
+ if (o instanceof Subsumption && !(o instanceof Redundancy)) {
Subsumption s = (Subsumption) o;
- AnalyticsComponent left = (AnalyticsComponent) s.getLeft();
- AnalyticsComponent right = (AnalyticsComponent) s.getRight();
+ Cause left = s.getLeft();
+ Cause right = s.getRight();
- if (map.containsKey(left.getRuleName())) {
- Set<String> set = map.get(left.getRuleName());
- set.add(right.getRuleName());
+ if (map.containsKey(left)) {
+ Set<Cause> set = map.get(left);
+ set.add(right);
} else {
- Set<String> set = new HashSet<String>();
- set.add(right.getRuleName());
- map.put(left.getRuleName(), set);
+ Set<Cause> set = new HashSet<Cause>();
+ set.add(right);
+ map.put(left, set);
}
}
}
More information about the jboss-svn-commits
mailing list