[jboss-svn-commits] JBL Code SVN: r15354 - in labs/jbossrules/trunk/experimental/drools-analytics/src: main/java/org/drools/analytics/accumulateFunction and 9 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Sep 25 01:55:23 EDT 2007
Author: Rikkola
Date: 2007-09-25 01:55:22 -0400 (Tue, 25 Sep 2007)
New Revision: 15354
Added:
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/FindMissingNumber.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRange.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRangesReportVisitor.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportVisitor.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/UrlFactory.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRange.htm
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRanges.htm
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/ranges.htm
Modified:
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/ValidatePattern.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisError.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisMessage.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisNote.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisWarning.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportModeller.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportVisitor.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/Gap.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingNumberPattern.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/RangeCheckCause.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportModeller.java
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/field.htm
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/header.htm
labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/packages.htm
labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java
labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java
labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java
labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java
labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/TestBase.java
labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/accumulateFunction/ValidatePatternTest.java
labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/Misc.drl
labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/MissingRangesForDoubles.drl
Log:
Added range checks to html report and fixed some bugs.
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,13 +1,13 @@
package org.drools.analytics;
-import java.io.File;
import java.util.Collection;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.analytics.dao.AnalyticsData;
-import org.drools.analytics.dao.AnalyticsDataMaps;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.result.AnalysisResult;
import org.drools.analytics.result.AnalysisResultNormal;
import org.drools.analytics.result.ComponentsReportModeller;
import org.drools.analytics.result.ReportModeller;
@@ -20,7 +20,7 @@
*/
public class Analyzer {
- private AnalysisResultNormal result = new AnalysisResultNormal();
+ private AnalysisResult result = new AnalysisResultNormal();
public void addPackageDescr(PackageDescr descr) {
try {
@@ -36,7 +36,7 @@
public void fireAnalysis() {
try {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
System.setProperty("drools.accumulate.function.validatePattern",
"org.drools.analytics.accumulateFunction.ValidatePattern");
@@ -51,6 +51,7 @@
}
// Object that returns the results.
+ workingMemory.setGlobal("data", data);
workingMemory.setGlobal("result", result);
workingMemory.fireAllRules();
@@ -83,10 +84,7 @@
* @return Analysis results as HTML
*/
public void writeComponentsHTML(String path) {
-
-
-
- ComponentsReportModeller.writeHTML(path);
+ ComponentsReportModeller.writeHTML(path, result);
}
/**
@@ -103,7 +101,7 @@
*
* @return Analysis result
*/
- public AnalysisResultNormal getResult() {
+ public AnalysisResult getResult() {
return result;
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -28,7 +28,7 @@
import org.drools.analytics.components.Variable;
import org.drools.analytics.components.VariableRestriction;
import org.drools.analytics.dao.AnalyticsData;
-import org.drools.analytics.dao.AnalyticsDataMaps;
+import org.drools.analytics.dao.AnalyticsDataFactory;
import org.drools.lang.descr.AccessorDescr;
import org.drools.lang.descr.AccumulateDescr;
import org.drools.lang.descr.AndDescr;
@@ -74,7 +74,7 @@
private Field currentField = null;
public void insert(PackageDescr packageDescr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
RulePackage rulePackage = data.getRulePackageByName(packageDescr
.getName());
@@ -82,7 +82,7 @@
rulePackage = new RulePackage();
rulePackage.setName(packageDescr.getName());
- data.insert(rulePackage);
+ data.save(rulePackage);
}
currentPackage = rulePackage;
@@ -317,7 +317,7 @@
}
private void flatten(RuleDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
AnalyticsRule rule = new AnalyticsRule();
rule.setRuleName(descr.getName());
@@ -326,7 +326,7 @@
rule.setLineNumber(descr.getLine());
rule.setPackageId(currentPackage.getId());
- data.insert(rule);
+ data.save(rule);
currentPackage.getRules().add(rule);
currentRule = rule;
@@ -353,13 +353,13 @@
}
private int flatten(PatternDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
AnalyticsClass clazz = data.getClassByName(descr.getObjectType());
if (clazz == null) {
clazz = new AnalyticsClass();
clazz.setName(descr.getObjectType());
- data.insert(clazz);
+ data.save(clazz);
}
currentClass = clazz;
@@ -371,7 +371,7 @@
pattern.setPatternExists(solvers.getRuleSolver().isExists());
pattern.setPatternForall(solvers.getRuleSolver().isForall());
- data.insert(pattern);
+ data.save(pattern);
currentPattern = pattern;
if (descr.getIdentifier() != null) {
@@ -383,7 +383,7 @@
variable.setObjectId(clazz.getId());
variable.setObjectName(descr.getObjectType());
- data.insert(variable);
+ data.save(variable);
}
// flatten source.
@@ -403,14 +403,14 @@
}
private void flatten(FieldConstraintDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
Field field = data.getFieldByClassAndFieldName(currentClass.getName(),
descr.getFieldName());
if (field == null) {
field = createField(descr.getFieldName(), descr.getLine(),
currentClass.getId(), currentClass.getName());
- data.insert(field);
+ data.save(field);
}
currentField = field;
@@ -422,7 +422,7 @@
constraint.setPatternIsNot(currentPattern.isPatternNot());
constraint.setFieldId(field.getId());
- data.insert(constraint);
+ data.save(constraint);
currentConstraint = constraint;
@@ -440,7 +440,7 @@
* @param descr
*/
private void flatten(FieldBindingDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
Variable variable = new Variable();
variable.setRuleId(currentRule.getId());
@@ -448,7 +448,7 @@
variable.setObjectType(AnalyticsComponentType.FIELD);
- data.insert(variable);
+ data.save(variable);
}
/**
@@ -460,7 +460,7 @@
* @param descr
*/
private void flatten(VariableRestrictionDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
Variable variable = data.getVariableByRuleAndVariableName(currentRule
.getRuleName(), descr.getIdentifier());
@@ -479,7 +479,7 @@
// Set field value, if it is unset.
currentField.setFieldType(Field.FieldType.VARIABLE);
- data.insert(restriction);
+ data.save(restriction);
solvers.addRestriction(restriction);
}
@@ -489,7 +489,7 @@
* @param descr
*/
private void flatten(ReturnValueRestrictionDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
ReturnValueRestriction restriction = new ReturnValueRestriction();
@@ -504,7 +504,7 @@
restriction.setContent(descr.getContent());
restriction.setDeclarations(descr.getDeclarations());
- data.insert(restriction);
+ data.save(restriction);
solvers.addRestriction(restriction);
}
@@ -515,7 +515,7 @@
* @param descr
*/
private void flatten(LiteralRestrictionDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
LiteralRestriction restriction = new LiteralRestriction();
@@ -532,7 +532,7 @@
// Set field value, if it is unset.
currentField.setFieldType(restriction.getValueType());
- data.insert(restriction);
+ data.save(restriction);
solvers.addRestriction(restriction);
}
@@ -542,7 +542,7 @@
* @param descr
*/
private void flatten(QualifiedIdentifierRestrictionDescr descr) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
String text = descr.getText();
Variable variable = data.getVariableByRuleAndVariableName(currentRule
@@ -565,7 +565,7 @@
variable.setObjectType(AnalyticsComponentType.FIELD);
- data.insert(restriction);
+ data.save(restriction);
solvers.addRestriction(restriction);
}
@@ -582,13 +582,13 @@
}
private void formPossibilities() {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
for (PatternPossibility possibility : solvers.getPatternPossibilities()) {
- data.insert(possibility);
+ data.save(possibility);
}
for (RulePossibility possibility : solvers.getRulePossibilities()) {
- data.insert(possibility);
+ data.save(possibility);
}
}
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -52,6 +52,8 @@
.getResourceAsStream("rangeChecks/Patterns.drl")));
list.add(new InputStreamReader(RuleLoader.class
.getResourceAsStream("rangeChecks/Variables.drl")));
+ list.add(new InputStreamReader(RuleLoader.class
+ .getResourceAsStream("rangeChecks/Clean.drl")));
// list.add(new InputStreamReader(RuleLoader.class
// .getResourceAsStream("redundancy/Possibilities.drl")));
@@ -62,8 +64,8 @@
// .getResourceAsStream("redundancy/Restrictions.drl")));
// list.add(new InputStreamReader(RuleLoader.class
// .getResourceAsStream("redundancy/Rules.drl")));
- // list.add(new InputStreamReader(RuleLoader.class
- // .getResourceAsStream("reports/RangeCheckReports.drl")));
+ list.add(new InputStreamReader(RuleLoader.class
+ .getResourceAsStream("reports/RangeCheckReports.drl")));
return list;
}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/FindMissingNumber.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/FindMissingNumber.java (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/FindMissingNumber.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,160 @@
+package org.drools.analytics.accumulateFunction;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.drools.analytics.components.Field;
+import org.drools.analytics.components.LiteralRestriction;
+
+public class FindMissingNumber {
+
+ public static final int MIN_NUMBER_OF_RESTRICTIONS = 4;
+
+ /**
+ * Test if the values in constraints are in pattern.
+ *
+ * @param restrictions
+ * @return false if can't find a pattern or constraints list is null or size
+ * of the list is under 3.
+ */
+ public static Number testForPattern(
+ Collection<LiteralRestriction> restrictions) {
+
+ if (restrictions == null
+ || restrictions.size() < MIN_NUMBER_OF_RESTRICTIONS) {
+ return null;
+ }
+
+ BigDecimal[] numbers = new BigDecimal[restrictions.size()];
+
+ int index = 0;
+ for (LiteralRestriction restriction : restrictions) {
+ if (restriction.getValueType() == Field.FieldType.DOUBLE) {
+ numbers[index++] = BigDecimal.valueOf(restriction
+ .getDoubleValue());
+ } else if (restriction.getValueType() == Field.FieldType.INT) {
+ numbers[index++] = BigDecimal
+ .valueOf(restriction.getIntValue());
+ }
+ }
+
+ Arrays.sort(numbers);
+
+ Number missingNumber = findSumPattern(numbers);
+ if (missingNumber != null) {
+ return missingNumber;
+ } else {
+ missingNumber = findMultiplicationPattern(numbers);
+ if (missingNumber != null) {
+ return missingNumber;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Looks for sum pattern, on each step x is added or removed. -x is the same
+ * as +(-x) so this works for both.
+ *
+ * @param numbers
+ * @return true if pattern is found.
+ */
+ protected static Number findSumPattern(BigDecimal[] numbers) {
+ if (numbers == null || numbers.length < MIN_NUMBER_OF_RESTRICTIONS) {
+ return null;
+ }
+ BigDecimal gap = null;
+ Number missingNumber = null;
+
+ BigDecimal a = numbers[0];
+ BigDecimal b = numbers[1];
+ BigDecimal c = numbers[2];
+ BigDecimal d = numbers[3];
+
+ // Uses first four numbers to check if there is a pattern and to
+ // calculate the gap between them. One missing value is allowed.
+ if (b.subtract(a).equals(c.subtract(b))) {
+ gap = b.subtract(a);
+ } else if (c.subtract(b).equals(d.subtract(c))) {
+ gap = c.subtract(b);
+ } else if (b.subtract(a).equals(d.subtract(c))) {
+ gap = b.subtract(a);
+ } else {
+ // No pattern found.
+ return null;
+ }
+
+ for (int i = 0; i < (numbers.length - 1); i++) {
+ BigDecimal first = numbers[i];
+ BigDecimal second = numbers[i + 1];
+
+ if (missingNumber == null && !second.subtract(first).equals(gap)) {
+ missingNumber = second.subtract(gap);
+ } else if (!second.subtract(first).equals(gap)
+ && missingNumber != null) {
+ // Happends if there is no pattern found, or more than 1
+ // missing number.
+ return null;
+ }
+ }
+
+ return missingNumber;
+ }
+
+ /**
+ * Looks for multiplication pattern, on each step x multiplied or divided.
+ * *x is the same as *(1/x) so this works for both.
+ *
+ * @param numbers
+ * @return true if pattern is found.
+ */
+ protected static Number findMultiplicationPattern(BigDecimal[] numbers) {
+ if (numbers == null || numbers.length < MIN_NUMBER_OF_RESTRICTIONS) {
+ return null;
+ }
+ try {
+
+ BigDecimal gap = null;
+ Number missingNumber = null;
+
+ BigDecimal a = numbers[0];
+ BigDecimal b = numbers[1];
+ BigDecimal c = numbers[2];
+ BigDecimal d = numbers[3];
+
+ // Uses first four numbers to check if there is a pattern and to
+ // calculate the gap between them. One missing value is allowed.
+ if (b.divide(a).equals(c.divide(b))) {
+ gap = b.divide(a);
+ } else if (c.divide(b).equals(d.divide(c))) {
+ gap = c.divide(b);
+ } else if (b.divide(a).equals(d.divide(c))) {
+ gap = b.divide(a);
+ } else {
+ // No pattern found.
+ return null;
+ }
+
+ BigDecimal first = null;
+ BigDecimal second = null;
+ for (int i = 0; i < (numbers.length - 1); i++) {
+ first = numbers[i];
+ second = numbers[i + 1];
+
+ if (missingNumber == null && !second.divide(first).equals(gap)) {
+ missingNumber = first.multiply(gap);
+ } else if (!second.divide(first).equals(gap)
+ && missingNumber != null) {
+ // Happends if there is no pattern found, or more than 1
+ // missing number.
+ return null;
+ }
+ }
+ return missingNumber;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/ValidatePattern.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/ValidatePattern.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/accumulateFunction/ValidatePattern.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -8,23 +8,20 @@
import org.drools.analytics.components.LiteralRestriction;
import org.drools.base.accumulators.AccumulateFunction;
-
-
/**
*
* @author Toni Rikkola
*/
public class ValidatePattern implements AccumulateFunction {
- private static final int MIN_NUMBER_OF_CONSTRAINTS = 4;
- private static List<LiteralRestriction> restrictions = new ArrayList<LiteralRestriction>();
+ private static List<LiteralRestriction> restrictions;
public Object createContext() {
return restrictions;
}
public void init(Object context) throws Exception {
- // constraints = new ArrayList<Constraint>();
+ restrictions = new ArrayList<LiteralRestriction>();
}
public void accumulate(Object context, Object value) {
@@ -37,9 +34,7 @@
List<LiteralRestriction> list = (List<LiteralRestriction>) context;
ValidatePatternResult result = new ValidatePatternResult();
- if (list != null && list.size() >= MIN_NUMBER_OF_CONSTRAINTS) {
- result.setValue(testForPattern(list));
- }
+ result.setValue(FindMissingNumber.testForPattern(list));
return result;
}
@@ -52,143 +47,4 @@
public boolean supportsReverse() {
return false;
}
-
- /**
- * Test if the values in constraints are in pattern.
- *
- * @param constraints
- * @return false if can't find a pattern or constraints list is null or size
- * of the list is under 3.
- */
- protected static Number testForPattern(List<LiteralRestriction> constraints) {
-
- if (constraints == null || constraints.size() < 4) {
- return null;
- }
-
- BigDecimal[] numbers = new BigDecimal[constraints.size()];
-
- int index = 0;
- for (LiteralRestriction restriction : restrictions) {
- numbers[index++] = BigDecimal.valueOf(restriction.getDoubleValue());
- }
-
- Arrays.sort(numbers);
-
- Number missingNumber = findSumPattern(numbers);
- if (missingNumber != null) {
- return missingNumber;
- } else {
- missingNumber = findMultiplicationPattern(numbers);
- if (missingNumber != null) {
- return missingNumber;
- }
- }
-
- return null;
- }
-
- /**
- * Looks for sum pattern, on each step x is added or removed. -x is the same
- * as +(-x) so this works for both.
- *
- * @param numbers
- * @return true if pattern is found.
- */
- protected static Number findSumPattern(BigDecimal[] numbers) {
- if (numbers == null || numbers.length < MIN_NUMBER_OF_CONSTRAINTS) {
- return null;
- }
- BigDecimal gap = null;
- Number missingNumber = null;
-
- BigDecimal a = numbers[0];
- BigDecimal b = numbers[1];
- BigDecimal c = numbers[2];
- BigDecimal d = numbers[3];
-
- // Uses first four numbers to check if there is a pattern and to
- // calculate the gap between them. One missing value is allowed.
- if (b.subtract(a).equals(c.subtract(b))) {
- gap = b.subtract(a);
- } else if (c.subtract(b).equals(d.subtract(c))) {
- gap = c.subtract(b);
- } else if (b.subtract(a).equals(d.subtract(c))) {
- gap = b.subtract(a);
- } else {
- // No pattern found.
- return null;
- }
-
- for (int i = 0; i < (numbers.length - 1); i++) {
- BigDecimal first = numbers[i];
- BigDecimal second = numbers[i + 1];
-
- if (missingNumber == null && !second.subtract(first).equals(gap)) {
- missingNumber = second.subtract(gap);
- } else if (!second.subtract(first).equals(gap)
- && missingNumber != null) {
- // Happends if there is no pattern found, or more than 1
- // missing number.
- return null;
- }
- }
-
- return missingNumber;
- }
-
- /**
- * Looks for multiplication pattern, on each step x multiplied or divided.
- * *x is the same as *(1/x) so this works for both.
- *
- * @param numbers
- * @return true if pattern is found.
- */
- protected static Number findMultiplicationPattern(BigDecimal[] numbers) {
- if (numbers == null || numbers.length < MIN_NUMBER_OF_CONSTRAINTS) {
- return null;
- }
- try {
-
- BigDecimal gap = null;
- Number missingNumber = null;
-
- BigDecimal a = numbers[0];
- BigDecimal b = numbers[1];
- BigDecimal c = numbers[2];
- BigDecimal d = numbers[3];
-
- // Uses first four numbers to check if there is a pattern and to
- // calculate the gap between them. One missing value is allowed.
- if (b.divide(a).equals(c.divide(b))) {
- gap = b.divide(a);
- } else if (c.divide(b).equals(d.divide(c))) {
- gap = c.divide(b);
- } else if (b.divide(a).equals(d.divide(c))) {
- gap = b.divide(a);
- } else {
- // No pattern found.
- return null;
- }
-
- BigDecimal first = null;
- BigDecimal second = null;
- for (int i = 0; i < (numbers.length - 1); i++) {
- first = numbers[i];
- second = numbers[i + 1];
-
- if (missingNumber == null && !second.divide(first).equals(gap)) {
- missingNumber = first.multiply(gap);
- } else if (!second.divide(first).equals(gap)
- && missingNumber != null) {
- // Happends if there is no pattern found, or more than 1
- // missing number.
- return null;
- }
- }
- return missingNumber;
- } catch (Exception e) {
- return null;
- }
- }
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -4,13 +4,13 @@
import java.util.Date;
import java.util.Locale;
-import org.drools.analytics.result.RangeCheckCause;
+import org.drools.analytics.result.Cause;
/**
*
* @author Toni Rikkola
*/
-public class LiteralRestriction extends Restriction implements RangeCheckCause {
+public class LiteralRestriction extends Restriction implements Cause {
private Field.FieldType valueType;
@@ -28,10 +28,6 @@
return stringValue;
}
- public String getStringValue() {
- return stringValue;
- }
-
public double getDoubleValue() {
return doubleValue;
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,7 +1,6 @@
package org.drools.analytics.components;
import org.drools.analytics.result.Cause;
-import org.drools.analytics.result.Cause.CauseType;
/**
*
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -13,6 +13,9 @@
import org.drools.analytics.components.RulePackage;
import org.drools.analytics.components.RulePossibility;
import org.drools.analytics.components.Variable;
+import org.drools.analytics.result.Gap;
+import org.drools.analytics.result.MissingNumberPattern;
+import org.drools.analytics.result.RangeCheckCause;
/**
*
@@ -20,28 +23,34 @@
*/
public interface AnalyticsData {
- public void insert(AnalyticsClass clazz);
+ public void save(AnalyticsClass clazz);
- public void insert(Field field);
+ public void save(Field field);
- public void insert(Variable variable);
+ public void save(Variable variable);
- public void insert(AnalyticsRule rule);
+ public void save(AnalyticsRule rule);
- public void insert(Pattern pattern);
+ public void save(Pattern pattern);
- public void insert(Constraint constraint);
+ public void save(Constraint constraint);
- public void insert(Restriction restriction);
+ public void save(Restriction restriction);
- public void insert(FieldClassLink link);
+ public void save(FieldClassLink link);
- public void insert(PatternPossibility possibility);
+ public void save(PatternPossibility possibility);
- public void insert(RulePossibility possibility);
+ public void save(RulePossibility possibility);
- public void insert(RulePackage rulePackage);
+ public void save(RulePackage rulePackage);
+ public void save(Gap gap);
+
+ public void remove(Gap gap);
+
+ public void save(MissingNumberPattern missingNumberPattern);
+
public AnalyticsClass getClassByName(String name);
public AnalyticsClass getClassById(int id);
@@ -71,5 +80,15 @@
public Collection<AnalyticsRule> getRulesByFieldId(int id);
+ public Collection<Field> getFieldsWithGaps();
+
+ public Collection<Gap> getGapsByFieldId(int fieldId);
+
public RulePackage getRulePackageByName(String name);
+
+ public Collection<Restriction> getRestrictionsByFieldId(int id);
+
+ public Collection<RangeCheckCause> getRangeCheckCauses();
+
+ public Collection<RangeCheckCause> getRangeCheckCausesByFieldId(int id);
}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,13 @@
+package org.drools.analytics.dao;
+
+public class AnalyticsDataFactory {
+
+ private static AnalyticsDataMaps map;
+
+ public static AnalyticsData getAnalyticsData() {
+ if (map == null) {
+ map = new AnalyticsDataMaps();
+ }
+ return map;
+ }
+}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -2,11 +2,11 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
import org.drools.analytics.components.AnalyticsClass;
import org.drools.analytics.components.AnalyticsRule;
@@ -19,54 +19,50 @@
import org.drools.analytics.components.RulePackage;
import org.drools.analytics.components.RulePossibility;
import org.drools.analytics.components.Variable;
+import org.drools.analytics.result.Gap;
+import org.drools.analytics.result.MissingNumberPattern;
+import org.drools.analytics.result.RangeCheckCause;
/**
*
* @author Toni Rikkola
*/
-public class AnalyticsDataMaps implements AnalyticsData {
+class AnalyticsDataMaps implements AnalyticsData {
- private Map<Integer, RulePackage> packagesById = new HashMap<Integer, RulePackage>();
- private Map<String, RulePackage> packagesByName = new HashMap<String, RulePackage>();
+ private Map<Integer, RulePackage> packagesById = new TreeMap<Integer, RulePackage>();
+ private Map<String, RulePackage> packagesByName = new TreeMap<String, RulePackage>();
- private Map<Integer, AnalyticsClass> classesById = new HashMap<Integer, AnalyticsClass>();
- private Map<String, AnalyticsClass> classesByName = new HashMap<String, AnalyticsClass>();
- private Map<String, Field> fieldsByClassAndFieldName = new HashMap<String, Field>();
- private Map<Integer, Field> fieldsById = new HashMap<Integer, Field>();
- private Map<Integer, Set<Field>> fieldsByClassId = new HashMap<Integer, Set<Field>>();
- private Map<String, FieldClassLink> fieldClassLinkByIds = new HashMap<String, FieldClassLink>();
+ private Map<Integer, AnalyticsClass> classesById = new TreeMap<Integer, AnalyticsClass>();
+ private Map<String, AnalyticsClass> classesByName = new TreeMap<String, AnalyticsClass>();
+ private Map<String, Field> fieldsByClassAndFieldName = new TreeMap<String, Field>();
+ private Map<Integer, Field> fieldsById = new TreeMap<Integer, Field>();
+ private Map<Integer, Set<Field>> fieldsByClassId = new TreeMap<Integer, Set<Field>>();
+ private Map<String, FieldClassLink> fieldClassLinkByIds = new TreeMap<String, FieldClassLink>();
- private Map<Integer, AnalyticsRule> rulesById = new HashMap<Integer, AnalyticsRule>();
- private Map<Integer, Pattern> patternsById = new HashMap<Integer, Pattern>();
- private Map<Integer, Set<Pattern>> patternsByClassId = new HashMap<Integer, Set<Pattern>>();
- private Map<String, Set<Pattern>> patternsByRuleName = new HashMap<String, Set<Pattern>>();
- private Map<Integer, Constraint> constraintsById = new HashMap<Integer, Constraint>();
- private Map<Integer, Restriction> restrictionsById = new HashMap<Integer, Restriction>();
- private Map<Integer, Set<Restriction>> restrictionsByFieldId = new HashMap<Integer, Set<Restriction>>();
+ private Map<Integer, AnalyticsRule> rulesById = new TreeMap<Integer, AnalyticsRule>();
+ private Map<Integer, Pattern> patternsById = new TreeMap<Integer, Pattern>();
+ private Map<Integer, Set<Pattern>> patternsByClassId = new TreeMap<Integer, Set<Pattern>>();
+ private Map<String, Set<Pattern>> patternsByRuleName = new TreeMap<String, Set<Pattern>>();
+ private Map<Integer, Constraint> constraintsById = new TreeMap<Integer, Constraint>();
+ private Map<Integer, Restriction> restrictionsById = new TreeMap<Integer, Restriction>();
+ private Map<Integer, Set<Restriction>> restrictionsByFieldId = new TreeMap<Integer, Set<Restriction>>();
- private Map<String, Variable> variablesByRuleAndVariableName = new HashMap<String, Variable>();
+ private Map<String, Variable> variablesByRuleAndVariableName = new TreeMap<String, Variable>();
- private Map<Integer, PatternPossibility> patternPossibilitiesById = new HashMap<Integer, PatternPossibility>();
- private Map<Integer, RulePossibility> rulePossibilitiesById = new HashMap<Integer, RulePossibility>();
+ private Map<Integer, PatternPossibility> patternPossibilitiesById = new TreeMap<Integer, PatternPossibility>();
+ private Map<Integer, RulePossibility> rulePossibilitiesById = new TreeMap<Integer, RulePossibility>();
- private static AnalyticsDataMaps map;
+ private Map<Integer, Gap> gapsById = new TreeMap<Integer, Gap>();
+ private Map<Integer, Set<Gap>> gapsByFieldId = new TreeMap<Integer, Set<Gap>>();
+ private Map<Integer, MissingNumberPattern> missingNumberPatternsById = new TreeMap<Integer, MissingNumberPattern>();
+ private Map<Integer, Set<MissingNumberPattern>> missingNumberPatternsByFieldId = new TreeMap<Integer, Set<MissingNumberPattern>>();
- private AnalyticsDataMaps() {
- }
-
- public static AnalyticsDataMaps getAnalyticsDataMaps() {
- if (map == null) {
- map = new AnalyticsDataMaps();
- }
- return map;
- }
-
- public void insert(AnalyticsClass clazz) {
+ public void save(AnalyticsClass clazz) {
classesById.put(Integer.valueOf(clazz.getId()), clazz);
classesByName.put(clazz.getName(), clazz);
}
- public void insert(Field field) {
+ public void save(Field field) {
AnalyticsClass clazz = classesById.get(Integer.valueOf(field
.getClassId()));
fieldsByClassAndFieldName.put(clazz.getName() + "." + field.getName(),
@@ -85,18 +81,18 @@
}
}
- public void insert(Variable variable) {
+ public void save(Variable variable) {
AnalyticsRule rule = rulesById.get(Integer
.valueOf(variable.getRuleId()));
variablesByRuleAndVariableName.put(rule.getRuleName() + "."
+ variable.getName(), variable);
}
- public void insert(AnalyticsRule rule) {
+ public void save(AnalyticsRule rule) {
rulesById.put(Integer.valueOf(rule.getId()), rule);
}
- public void insert(Pattern pattern) {
+ public void save(Pattern pattern) {
patternsById.put(Integer.valueOf(pattern.getId()), pattern);
// Save by class id.
@@ -120,11 +116,11 @@
}
}
- public void insert(Constraint constraint) {
+ public void save(Constraint constraint) {
constraintsById.put(Integer.valueOf(constraint.getId()), constraint);
}
- public void insert(Restriction restriction) {
+ public void save(Restriction restriction) {
restrictionsById.put(restriction.getId(), restriction);
// Save by field id.
@@ -139,7 +135,7 @@
}
}
- public void insert(FieldClassLink link) {
+ public void save(FieldClassLink link) {
fieldClassLinkByIds.put(link.getFieldId() + "." + link.getClassId(),
link);
}
@@ -166,11 +162,11 @@
return rulesById.values();
}
- public void insert(PatternPossibility possibility) {
+ public void save(PatternPossibility possibility) {
patternPossibilitiesById.put(possibility.getId(), possibility);
}
- public void insert(RulePossibility possibility) {
+ public void save(RulePossibility possibility) {
rulePossibilitiesById.put(possibility.getId(), possibility);
}
@@ -246,7 +242,7 @@
return packagesById.values();
}
- public void insert(RulePackage rulePackage) {
+ public void save(RulePackage rulePackage) {
packagesById.put(rulePackage.getId(), rulePackage);
packagesByName.put(rulePackage.getName(), rulePackage);
}
@@ -254,4 +250,90 @@
public RulePackage getRulePackageByName(String name) {
return packagesByName.get(name);
}
+
+ public void save(Gap gap) {
+ gapsById.put(gap.getId(), gap);
+
+ // Save by field id.
+ if (gapsByFieldId.containsKey(gap.getField().getId())) {
+ Set<Gap> set = gapsByFieldId.get(gap.getField().getId());
+ set.add(gap);
+ } else {
+ Set<Gap> set = new HashSet<Gap>();
+ set.add(gap);
+ gapsByFieldId.put(gap.getField().getId(), set);
+ }
+ }
+
+ public void remove(Gap gap) {
+ gapsById.remove(gap.getId());
+
+ if (gapsByFieldId.containsKey(gap.getField().getId())) {
+ Set<Gap> set = gapsByFieldId.get(gap.getField().getId());
+ set.add(gap);
+
+ if (set.isEmpty()) {
+ gapsByFieldId.remove(gap.getField().getId());
+ }
+ }
+ }
+
+ public Collection<Field> getFieldsWithGaps() {
+ Set<Integer> set = gapsByFieldId.keySet();
+ Collection<Field> fields = new ArrayList<Field>();
+
+ for (Integer i : set) {
+ fields.add(fieldsById.get(i));
+ }
+
+ return fields;
+ }
+
+ public Collection<Gap> getGapsByFieldId(int fieldId) {
+ return gapsByFieldId.get(fieldId);
+ }
+
+ public Collection<Restriction> getRestrictionsByFieldId(int id) {
+ return restrictionsByFieldId.get(id);
+ }
+
+ public Collection<RangeCheckCause> getRangeCheckCauses() {
+ Collection<RangeCheckCause> result = new ArrayList<RangeCheckCause>();
+
+ result.addAll(gapsById.values());
+ result.addAll(missingNumberPatternsById.values());
+
+ return result;
+ }
+
+ public void save(MissingNumberPattern missingNumberPattern) {
+ missingNumberPatternsById.put(missingNumberPattern.getId(),
+ missingNumberPattern);
+
+ // Save by field id.
+ if (missingNumberPatternsByFieldId.containsKey(missingNumberPattern
+ .getField().getId())) {
+ Set<MissingNumberPattern> set = missingNumberPatternsByFieldId
+ .get(missingNumberPattern.getField().getId());
+ set.add(missingNumberPattern);
+ } else {
+ Set<MissingNumberPattern> set = new HashSet<MissingNumberPattern>();
+ set.add(missingNumberPattern);
+ missingNumberPatternsByFieldId.put(missingNumberPattern.getField()
+ .getId(), set);
+ }
+ }
+
+ public Collection<RangeCheckCause> getRangeCheckCausesByFieldId(int id) {
+ Collection<RangeCheckCause> result = new ArrayList<RangeCheckCause>();
+
+ if (gapsByFieldId.containsKey(id)) {
+ result.addAll(gapsByFieldId.get(id));
+ }
+ if (missingNumberPatternsByFieldId.containsKey(id)) {
+ result.addAll(missingNumberPatternsByFieldId.get(id));
+ }
+
+ return result;
+ }
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisError.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisError.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisError.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -3,6 +3,8 @@
import java.io.Serializable;
import java.util.List;
+import org.drools.analytics.components.AnalyticsComponent;
+
/**
*
* @author Toni Rikkola
@@ -12,8 +14,9 @@
private static int errorIndex = 0;
- public AnalysisError(String ruleName, String message, List<Cause> reasons) {
- super(ruleName, message, reasons);
+ public AnalysisError(AnalyticsComponent faulty, String message,
+ List<Cause> reasons) {
+ super(faulty, message, reasons);
id = errorIndex++;
}
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisMessage.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisMessage.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisMessage.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,8 +1,10 @@
package org.drools.analytics.result;
import java.io.Serializable;
-import java.util.List;
+import java.util.Collection;
+import org.drools.analytics.components.AnalyticsComponent;
+
/**
*
* @author Toni Rikkola
@@ -11,14 +13,14 @@
protected int id;
- protected String ruleName;
+ protected AnalyticsComponent faulty;
protected String message;
- protected List<Cause> causes;
+ protected Collection<Cause> causes;
- public AnalysisMessage(String ruleName, String message, List<Cause> reasons) {
- this.ruleName = ruleName;
+ public AnalysisMessage(AnalyticsComponent faulty, String message, Collection<Cause> causes) {
+ this.faulty= faulty;
this.message = message;
- this.causes = reasons;
+ this.causes = causes;
}
public int getId() {
@@ -37,19 +39,19 @@
this.message = message;
}
- public String getRuleName() {
- return ruleName;
+ public AnalyticsComponent getFaulty() {
+ return faulty;
}
- public void setRuleName(String ruleName) {
- this.ruleName = ruleName;
+ public void setFaulty(AnalyticsComponent faulty) {
+ this.faulty = faulty;
}
- public List<Cause> getCauses() {
+ public Collection<Cause> getCauses() {
return causes;
}
- public void setCauses(List<Cause> reasons) {
+ public void setCauses(Collection<Cause> reasons) {
this.causes = reasons;
}
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisNote.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisNote.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisNote.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -3,6 +3,8 @@
import java.io.Serializable;
import java.util.List;
+import org.drools.analytics.components.AnalyticsComponent;
+
/**
*
* @author Toni Rikkola
@@ -12,8 +14,9 @@
private static int noteIndex = 0;
- public AnalysisNote(String ruleName, String message, List<Cause> reasons) {
- super(ruleName, message, reasons);
+ public AnalysisNote(AnalyticsComponent faulty, String message,
+ List<Cause> reasons) {
+ super(faulty, message, reasons);
id = noteIndex++;
}
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisWarning.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisWarning.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/AnalysisWarning.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,8 +1,10 @@
package org.drools.analytics.result;
import java.io.Serializable;
-import java.util.List;
+import java.util.Collection;
+import org.drools.analytics.components.AnalyticsComponent;
+
/**
*
* @author Toni Rikkola
@@ -12,8 +14,9 @@
private static int warningIndex = 0;
- public AnalysisWarning(String ruleName, String message, List<Cause> reasons) {
- super(ruleName, message, reasons);
+ public AnalysisWarning(AnalyticsComponent faulty, String message,
+ Collection<Cause> causes) {
+ super(faulty, message, causes);
id = warningIndex++;
}
@@ -22,9 +25,9 @@
str.append(id);
str.append(":\n");
- if (ruleName != null) {
+ if (faulty.getRuleName() != null) {
str.append("in rule ");
- str.append(ruleName);
+ str.append(faulty.getRuleName());
str.append(": ");
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportModeller.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportModeller.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportModeller.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -3,38 +3,36 @@
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
+import java.util.Collection;
import org.drools.analytics.components.AnalyticsClass;
import org.drools.analytics.components.AnalyticsRule;
import org.drools.analytics.components.Field;
import org.drools.analytics.dao.AnalyticsData;
-import org.drools.analytics.dao.AnalyticsDataMaps;
+import org.drools.analytics.dao.AnalyticsDataFactory;
public class ComponentsReportModeller {
- public static void writeHTML(String path) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ public static void writeHTML(String path, AnalysisResult result) {
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
// Source folder
- File sourceFolder = new File(path
- + ComponentsReportVisitor.SOURCE_FOLDER);
+ File sourceFolder = new File(path + UrlFactory.SOURCE_FOLDER);
sourceFolder.mkdir();
// Base files
// index.htm
- writeToFile(path + ComponentsReportVisitor.SOURCE_FOLDER
- + File.separator + ComponentsReportVisitor.HTML_FILE_INDEX,
- ComponentsReportVisitor.visitObjectTypeCollection(data
- .getAllClasses()));
+ writeToFile(path + UrlFactory.SOURCE_FOLDER + File.separator
+ + UrlFactory.HTML_FILE_INDEX, ComponentsReportVisitor
+ .visitObjectTypeCollection(data.getAllClasses()));
// packages.htm
- writeToFile(path + ComponentsReportVisitor.SOURCE_FOLDER
- + File.separator + ComponentsReportVisitor.HTML_FILE_PACKAGES,
- ComponentsReportVisitor.visitRulePackageCollection(data
- .getAllRulePackages()));
+ writeToFile(path + UrlFactory.SOURCE_FOLDER + File.separator
+ + UrlFactory.HTML_FILE_PACKAGES, ComponentsReportVisitor
+ .visitRulePackageCollection(data.getAllRulePackages()));
// rules
- String ruleFolder = path + ComponentsReportVisitor.SOURCE_FOLDER
- + File.separator + ComponentsReportVisitor.RULE_FOLDER;
+ String ruleFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+ + UrlFactory.RULE_FOLDER;
File rulesFolder = new File(ruleFolder);
rulesFolder.mkdir();
for (AnalyticsRule rule : data.getAllRules()) {
@@ -43,8 +41,8 @@
}
// ObjectTypes
- String objectTypeFolder = path + ComponentsReportVisitor.SOURCE_FOLDER
- + File.separator + ComponentsReportVisitor.OBJECT_TYPE_FOLDER;
+ String objectTypeFolder = path + UrlFactory.SOURCE_FOLDER
+ + File.separator + UrlFactory.OBJECT_TYPE_FOLDER;
File objectTypesFolder = new File(objectTypeFolder);
objectTypesFolder.mkdir();
for (AnalyticsClass objectType : data.getAllClasses()) {
@@ -54,8 +52,8 @@
}
// Fields
- String fieldFolder = path + ComponentsReportVisitor.SOURCE_FOLDER
- + File.separator + ComponentsReportVisitor.FIELD_FOLDER;
+ String fieldFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+ + UrlFactory.FIELD_FOLDER;
File fieldsFolder = new File(fieldFolder);
fieldsFolder.mkdir();
for (Field field : data.getAllFields()) {
@@ -63,19 +61,22 @@
ComponentsReportVisitor.visitField(field));
}
+ // Gap warnings
+ Collection<RangeCheckCause> rangeCheckCauses = data
+ .getRangeCheckCauses();
+ writeToFile(path + UrlFactory.SOURCE_FOLDER + File.separator
+ + UrlFactory.HTML_FILE_GAPS, MissingRangesReportVisitor
+ .visitRangeCheckCauseCollection(rangeCheckCauses));
+
// css files
- String cssFolder = path + ComponentsReportVisitor.SOURCE_FOLDER
- + File.separator + ComponentsReportVisitor.CSS_FOLDER;
+ String cssFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+ + UrlFactory.CSS_FOLDER;
File cssesFolder = new File(cssFolder);
cssesFolder.mkdir();
- writeToFile(cssFolder + File.separator
- + ComponentsReportVisitor.CSS_FILE_DETAILS,
- ComponentsReportVisitor
- .getCss(ComponentsReportVisitor.CSS_FILE_DETAILS));
- writeToFile(cssFolder + File.separator
- + ComponentsReportVisitor.CSS_FILE_LIST,
- ComponentsReportVisitor
- .getCss(ComponentsReportVisitor.CSS_FILE_LIST));
+ writeToFile(cssFolder + File.separator + UrlFactory.CSS_FILE_DETAILS,
+ ComponentsReportVisitor.getCss(UrlFactory.CSS_FILE_DETAILS));
+ writeToFile(cssFolder + File.separator + UrlFactory.CSS_FILE_LIST,
+ ComponentsReportVisitor.getCss(UrlFactory.CSS_FILE_LIST));
}
private static void writeToFile(String fileName, String text) {
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportVisitor.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportVisitor.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportVisitor.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,8 +1,5 @@
package org.drools.analytics.result;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -10,68 +7,27 @@
import org.drools.analytics.components.AnalyticsClass;
import org.drools.analytics.components.AnalyticsRule;
import org.drools.analytics.components.Field;
+import org.drools.analytics.components.Restriction;
import org.drools.analytics.components.RulePackage;
import org.drools.analytics.dao.AnalyticsData;
-import org.drools.analytics.dao.AnalyticsDataMaps;
+import org.drools.analytics.dao.AnalyticsDataFactory;
import org.mvel.TemplateInterpreter;
-public class ComponentsReportVisitor {
+public class ComponentsReportVisitor extends ReportVisitor {
- public static final String THIS_FOLDER = ".";
- public static final String PREVIOUS_FOLDER = "..";
-
- public static final String SOURCE_FOLDER = "report";
- public static final String OBJECT_TYPE_FOLDER = "objectTypes";
- public static final String FIELD_FOLDER = "fields";
- public static final String RULE_FOLDER = "rules";
- public static final String PACKAGE_FOLDER = "packages";
- public static final String CSS_FOLDER = "css";
-
- public static final String CSS_FILE_LIST = "relationsList.css";
- public static final String CSS_FILE_DETAILS = "relationsDetails.css";
-
- public static final String HTML_FILE_INDEX = "index.htm";
- public static final String HTML_FILE_PACKAGES = "packages.htm";
-
- private static String readFile(String fileName) {
- StringBuffer str = new StringBuffer("");
- try {
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(ComponentsReportVisitor.class
- .getResourceAsStream(fileName)));
- String line = null;
- while ((line = reader.readLine()) != null) {
- str.append(line);
- str.append("\n");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return str.toString();
- }
-
public static String getCss(String fileName) {
return readFile(fileName);
}
- private static String createStyleTag(String path) {
- StringBuffer str = new StringBuffer("");
-
- str.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"");
- str.append(path);
- str.append("\" />");
-
- return str.toString();
- }
-
public static String visitRulePackageCollection(
Collection<RulePackage> packages) {
Map<String, Object> map = new HashMap<String, Object>();
- map.put("header", processHeader(THIS_FOLDER));
- map.put("sourceFolder", THIS_FOLDER);
- map.put("ruleFolder", RULE_FOLDER);
- map.put("packageFolder", PACKAGE_FOLDER);
- map.put("cssStyle", createStyleTag(CSS_FOLDER + "/" + CSS_FILE_LIST));
+ map.put("header", processHeader(UrlFactory.THIS_FOLDER));
+ map.put("sourceFolder", UrlFactory.THIS_FOLDER);
+ map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+ map.put("packageFolder", UrlFactory.PACKAGE_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.CSS_FOLDER + "/"
+ + UrlFactory.CSS_FILE_LIST));
map.put("rulePackages", packages);
@@ -85,11 +41,12 @@
public static String visitObjectTypeCollection(
Collection<AnalyticsClass> objectTypes) {
Map<String, Object> map = new HashMap<String, Object>();
- map.put("header", processHeader(THIS_FOLDER));
- map.put("sourceFolder", THIS_FOLDER);
- map.put("objectTypeFolder", OBJECT_TYPE_FOLDER);
- map.put("fieldFolder", FIELD_FOLDER);
- map.put("cssStyle", createStyleTag(CSS_FOLDER + "/" + CSS_FILE_LIST));
+ map.put("header", processHeader(UrlFactory.THIS_FOLDER));
+ map.put("sourceFolder", UrlFactory.THIS_FOLDER);
+ map.put("objectTypeFolder", UrlFactory.OBJECT_TYPE_FOLDER);
+ map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.CSS_FOLDER + "/"
+ + UrlFactory.CSS_FILE_LIST));
map.put("objectTypes", objectTypes);
@@ -101,16 +58,16 @@
}
public static String visitRule(AnalyticsRule rule) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
Collection<AnalyticsClass> objectTypes = data.getClassesByRuleName(rule
.getRuleName());
Map<String, Object> map = new HashMap<String, Object>();
- map.put("header", processHeader(PREVIOUS_FOLDER));
- map.put("sourceFolder", PREVIOUS_FOLDER);
- map.put("objectTypeFolder", OBJECT_TYPE_FOLDER);
- map.put("cssStyle", createStyleTag(PREVIOUS_FOLDER + "/" + CSS_FOLDER
- + "/" + CSS_FILE_DETAILS));
+ map.put("header", processHeader(UrlFactory.PREVIOUS_FOLDER));
+ map.put("sourceFolder", UrlFactory.PREVIOUS_FOLDER);
+ map.put("objectTypeFolder", UrlFactory.OBJECT_TYPE_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.PREVIOUS_FOLDER + "/"
+ + UrlFactory.CSS_FOLDER + "/" + UrlFactory.CSS_FILE_DETAILS));
map.put("rule", rule);
map.put("objectTypes", objectTypes);
@@ -123,17 +80,17 @@
}
public static String visitObjectType(AnalyticsClass objectType) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
Collection<AnalyticsRule> rules = data.getRulesByClassId(objectType
.getId());
Map<String, Object> map = new HashMap<String, Object>();
- map.put("header", processHeader(PREVIOUS_FOLDER));
- map.put("sourceFolder", PREVIOUS_FOLDER);
- map.put("ruleFolder", RULE_FOLDER);
- map.put("fieldFolder", FIELD_FOLDER);
- map.put("cssStyle", createStyleTag(PREVIOUS_FOLDER + "/" + CSS_FOLDER
- + "/" + CSS_FILE_DETAILS));
+ map.put("header", processHeader(UrlFactory.PREVIOUS_FOLDER));
+ map.put("sourceFolder", UrlFactory.PREVIOUS_FOLDER);
+ map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+ map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.PREVIOUS_FOLDER + "/"
+ + UrlFactory.CSS_FOLDER + "/" + UrlFactory.CSS_FILE_DETAILS));
map.put("objectType", objectType);
map.put("rules", rules);
@@ -146,39 +103,41 @@
}
public static String visitField(Field field) {
- AnalyticsData data = AnalyticsDataMaps.getAnalyticsDataMaps();
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
AnalyticsClass objectType = data.getClassById(field.getClassId());
Collection<AnalyticsRule> rules = data.getRulesByFieldId(field.getId());
Map<String, Object> map = new HashMap<String, Object>();
- map.put("header", processHeader(PREVIOUS_FOLDER));
- map.put("sourceFolder", PREVIOUS_FOLDER);
- map.put("ruleFolder", RULE_FOLDER);
- map.put("objectTypeFolder", OBJECT_TYPE_FOLDER);
- map.put("fieldFolder", FIELD_FOLDER);
- map.put("cssStyle", createStyleTag(PREVIOUS_FOLDER + "/" + CSS_FOLDER
- + "/" + CSS_FILE_DETAILS));
+ map.put("header", processHeader(UrlFactory.PREVIOUS_FOLDER));
+ map.put("sourceFolder", UrlFactory.PREVIOUS_FOLDER);
+ map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+ map.put("objectTypeFolder", UrlFactory.OBJECT_TYPE_FOLDER);
+ map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.PREVIOUS_FOLDER + "/"
+ + UrlFactory.CSS_FOLDER + "/" + UrlFactory.CSS_FILE_DETAILS));
map.put("field", field);
map.put("objectType", objectType);
map.put("rules", rules);
+ if (field.getFieldType() == Field.FieldType.DOUBLE
+ || field.getFieldType() == Field.FieldType.DATE
+ || field.getFieldType() == Field.FieldType.INT) {
+ Collection<RangeCheckCause> causes = data
+ .getRangeCheckCausesByFieldId(field.getId());
+ Collection<Restriction> restrictions = data
+ .getRestrictionsByFieldId(field.getId());
+ map.put("ranges", "Ranges:"
+ + MissingRangesReportVisitor.visitRanges(
+ UrlFactory.PREVIOUS_FOLDER, restrictions, causes));
+ } else {
+ map.put("ranges", "");
+ }
+
String myTemplate = readFile("field.htm");
String result = TemplateInterpreter.evalToString(myTemplate, map);
return result;
}
-
- private static String processHeader(String folder) {
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("sourceFolder", folder);
-
- map.put("objectTypesFile", HTML_FILE_INDEX);
- map.put("packagesFile", HTML_FILE_PACKAGES);
-
- String myTemplate = readFile("header.htm");
-
- return TemplateInterpreter.evalToString(myTemplate, map);
- }
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/Gap.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/Gap.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/Gap.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,96 +1,81 @@
package org.drools.analytics.result;
import org.drools.analytics.components.Field;
+import org.drools.analytics.components.LiteralRestriction;
/**
*
* @author Toni Rikkola
*/
-public class Gap implements Cause {
+public class Gap extends MissingRange implements RangeCheckCause, Comparable {
- private static int index = 0;
+ private LiteralRestriction restriction;
- private int id = index++;
-
- private Field field;
- private RangeCheckCause cause;
- private String firedRuleName;
-
-
- public CauseType getCauseType() {
- return Cause.CauseType.GAP;
- }
-
- public Gap(Field field, RangeCheckCause cause, String firedRuleName) {
- this.field = field;
- this.cause = cause;
- this.firedRuleName = firedRuleName;
- }
-
- public int getId() {
- return id;
- }
-
- public String getRuleName() {
- return cause.getRuleName();
- }
-
/**
- * Evaluator is reversed unless the cause is MissingNumberPattern. For
- * others the evaluator needs to be turned in order to show the missing
- * range, not the the range that cause covers.
+ * Takes the given evaluator e, and returns a reversed version of it.
*
* @return evaluator
*/
- private String getCauseEvaluator() {
- if (cause instanceof MissingNumberPattern) {
- return cause.getEvaluator();
- } else {
- if (cause.getEvaluator().equals("!=")) {
- return "==";
- } else if (cause.getEvaluator().equals("==")) {
- return "!=";
- } else if (cause.getEvaluator().equals(">")) {
- return "<=";
- } else if (cause.getEvaluator().equals("<")) {
- return ">=";
- } else if (cause.getEvaluator().equals(">=")) {
- return "<";
- } else if (cause.getEvaluator().equals("<=")) {
- return ">";
- }
+ public static String getReversedEvaluator(String e) {
+ if (e.equals("!=")) {
+ return "==";
+ } else if (e.equals("==")) {
+ return "!=";
+ } else if (e.equals(">")) {
+ return "<=";
+ } else if (e.equals("<")) {
+ return ">=";
+ } else if (e.equals(">=")) {
+ return "<";
+ } else if (e.equals("<=")) {
+ return ">";
}
- return null;
+ return e;
}
- public Field getField() {
- return field;
+ public int compareTo(Object another) {
+ return super.compareTo(another);
}
- public void setField(Field field) {
+ public CauseType getCauseType() {
+ return Cause.CauseType.GAP;
+ }
+
+ /**
+ *
+ * @param field
+ * Field from where the value is missing.
+ * @param evaluator
+ * Evaluator for the missing value.
+ * @param cause
+ * The restriction that the gap begins from.
+ */
+ public Gap(Field field, String evaluator, LiteralRestriction restriction) {
this.field = field;
+ this.evaluator = evaluator;
+ this.restriction = restriction;
}
- public RangeCheckCause getRangeCheckCause() {
- return cause;
+ public String getRuleName() {
+ return restriction.getRuleName();
}
- public void setRangeCheckCause(RangeCheckCause cause) {
- this.cause = cause;
+ public LiteralRestriction getRestriction() {
+ return restriction;
}
- public String getFiredRuleName() {
- return firedRuleName;
+ public void setRestriction(LiteralRestriction restriction) {
+ this.restriction = restriction;
}
- public void setFiredRuleName(String firedRuleName) {
- this.firedRuleName = firedRuleName;
+ public String getValueAsString() {
+ return restriction.getValueAsString();
}
@Override
public String toString() {
- return "Gap: (" + field + ") " + getCauseEvaluator() + " "
- + cause.getValueAsString();
+ return "Gap: (" + field + ") " + getEvaluator() + " "
+ + getValueAsString();
}
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingNumberPattern.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingNumberPattern.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingNumberPattern.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,42 +1,30 @@
package org.drools.analytics.result;
+import org.drools.analytics.components.Field;
/**
*
* @author Toni Rikkola
*/
-public class MissingNumberPattern implements RangeCheckCause {
+public class MissingNumberPattern extends MissingRange implements
+ RangeCheckCause, Comparable {
- private static int index = 0;
-
- private int id = index++;
-
- private int fieldId;
- private String evaluator;
private String value;
+ public int compareTo(Object another) {
+ return super.compareTo(another);
+ }
+
public CauseType getCauseType() {
return Cause.CauseType.RANGE_CHECK_CAUSE;
}
- public MissingNumberPattern(int fieldId, String evaluator, String value) {
- this.fieldId = fieldId;
+ public MissingNumberPattern(Field field, String evaluator, String value) {
+ this.field = field;
this.evaluator = evaluator;
this.value = value;
}
- public int getId() {
- return id;
- }
-
- public int getFieldId() {
- return fieldId;
- }
-
- public void setFieldId(int fieldId) {
- this.fieldId = fieldId;
- }
-
/**
* Returns alway null, because there is no rule that this is related to.
*/
@@ -44,10 +32,6 @@
return null;
}
- public String getEvaluator() {
- return evaluator;
- }
-
public String getValueAsString() {
return value;
}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRange.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRange.java (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRange.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,48 @@
+package org.drools.analytics.result;
+
+import org.drools.analytics.components.Field;
+
+public abstract class MissingRange implements Comparable {
+
+ private static int index = 0;
+ protected int id = index++;
+
+ protected Field field;
+ protected String evaluator;
+
+ private String firedRuleName;
+
+ public int compareTo(Object another) {
+ if (!(another instanceof MissingRange)) {
+ throw new ClassCastException("A MissingRange object expected.");
+ }
+
+ MissingRange anotherMissingRange = ((MissingRange) another);
+
+ return this.id - anotherMissingRange.getId();
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public Field getField() {
+ return field;
+ }
+
+ public void setField(Field field) {
+ this.field = field;
+ }
+
+ public String getEvaluator() {
+ return evaluator;
+ }
+
+ public String getFiredRuleName() {
+ return firedRuleName;
+ }
+
+ public void setFiredRuleName(String firedRuleName) {
+ this.firedRuleName = firedRuleName;
+ }
+}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRangesReportVisitor.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRangesReportVisitor.java (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/MissingRangesReportVisitor.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,143 @@
+package org.drools.analytics.result;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.drools.analytics.components.Field;
+import org.drools.analytics.components.LiteralRestriction;
+import org.drools.analytics.components.Restriction;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.mvel.TemplateInterpreter;
+
+public class MissingRangesReportVisitor extends ReportVisitor {
+
+ public static String visitRangeCheckCauseCollection(
+ Collection<RangeCheckCause> causes) {
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("header", processHeader(UrlFactory.THIS_FOLDER));
+ map.put("sourceFolder", UrlFactory.THIS_FOLDER);
+ map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+ map.put("packageFolder", UrlFactory.PACKAGE_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.CSS_FOLDER + "/"
+ + UrlFactory.CSS_FILE_LIST));
+
+ MapTree<Integer, RangeCheckCause> mapTree = new MapTree<Integer, RangeCheckCause>();
+ for (RangeCheckCause cause : causes) {
+ mapTree.put(cause.getField().getId(), cause);
+ }
+
+ Collection<String> lines = new ArrayList<String>();
+ for (Integer i : mapTree.map.keySet()) {
+ Set<RangeCheckCause> set = mapTree.map.get(i);
+ lines.add(processRangeCheckCollection(set));
+ }
+ map.put("lines", lines);
+
+ String myTemplate = readFile("missingRanges.htm");
+
+ String result = TemplateInterpreter.evalToString(myTemplate, map);
+
+ return result;
+ }
+
+ private static String processRangeCheckCollection(
+ Collection<RangeCheckCause> causes) {
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+
+ Field field = causes.iterator().next().getField();
+
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("header", processHeader(UrlFactory.THIS_FOLDER));
+ map.put("sourceFolder", UrlFactory.THIS_FOLDER);
+ map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+ map.put("objectTypeFolder", UrlFactory.OBJECT_TYPE_FOLDER);
+ map.put("packageFolder", UrlFactory.PACKAGE_FOLDER);
+ map.put("cssStyle", createStyleTag(UrlFactory.CSS_FOLDER + "/"
+ + UrlFactory.CSS_FILE_LIST));
+
+ map.put("field", field);
+ map.put("objectType", data.getClassById(field.getClassId()));
+ map.put("ranges", visitRanges(UrlFactory.THIS_FOLDER, data
+ .getRestrictionsByFieldId(field.getId()), causes));
+
+ String myTemplate = readFile("missingRange.htm");
+
+ String result = TemplateInterpreter.evalToString(myTemplate, map);
+
+ return result;
+ }
+
+ public static Collection<String> visitRestrictionsCollection(
+ String sourceFolder, Collection<Restriction> restrictions,
+ Collection<RangeCheckCause> causes) {
+ MapTree<String, String> map = new MapTree<String, String>();
+
+ for (RangeCheckCause cause : causes) {
+ map.put(cause.getValueAsString(), cause.getEvaluator() + " "
+ + cause.getValueAsString() + " is missing");
+ }
+
+ for (Restriction r : restrictions) {
+ if (r instanceof LiteralRestriction) {
+ LiteralRestriction restriction = (LiteralRestriction) r;
+ map.put(restriction.getValueAsString(), restriction
+ .getEvaluator()
+ + " "
+ + restriction.getValueAsString()
+ + " "
+ + UrlFactory.getRuleUrl(sourceFolder, restriction
+ .getRuleId(), restriction.getRuleName()));
+ }
+ }
+
+ return map.values();
+ }
+
+ public static String visitRanges(String sourceFolder,
+ Collection<Restriction> restrictions,
+ Collection<RangeCheckCause> causes) {
+ Map<String, Object> map = new HashMap<String, Object>();
+
+ map.put("lines", visitRestrictionsCollection(sourceFolder,
+ restrictions, causes));
+
+ String myTemplate = readFile("ranges.htm");
+
+ String result = TemplateInterpreter.evalToString(myTemplate, map);
+
+ return result;
+ }
+
+ static class MapTree<K, V> {
+ protected Map<K, Set<V>> map = new TreeMap<K, Set<V>>();
+
+ protected void put(K key, V value) {
+ if (map.containsKey(key)) {
+ Set<V> set = map.get(key);
+ set.add(value);
+ } else {
+ Set<V> set = new TreeSet<V>();
+ set.add(value);
+ map.put(key, set);
+ }
+ }
+
+ protected Collection<V> values() {
+ Collection<V> values = new ArrayList<V>();
+
+ for (Set<V> set : map.values()) {
+ for (V value : set) {
+ values.add(value);
+ }
+ }
+
+ return values;
+ }
+ }
+}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/RangeCheckCause.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/RangeCheckCause.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/RangeCheckCause.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -1,11 +1,15 @@
package org.drools.analytics.result;
+import org.drools.analytics.components.Field;
+
/**
*
* @author Toni Rikkola
*/
public interface RangeCheckCause extends Cause {
+ public Field getField();
+
public String getValueAsString();
public String getEvaluator();
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportModeller.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportModeller.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportModeller.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -16,7 +16,7 @@
private static String cssFile = "basic.css";
- public static String writeXML(AnalysisResultNormal result) {
+ public static String writeXML(AnalysisResult result) {
XStream xstream = new XStream();
xstream.alias("result", AnalysisResultNormal.class);
@@ -25,6 +25,7 @@
xstream.alias("warning", AnalysisWarning.class);
xstream.alias("Gap", Gap.class);
+ xstream.alias("MissingNumber", MissingNumberPattern.class);
xstream.alias("Field", org.drools.analytics.components.Field.class);
@@ -33,7 +34,7 @@
return "<?xml version=\"1.0\"?>\n" + xstream.toXML(result);
}
- public static String writePlainText(AnalysisResultNormal result) {
+ public static String writePlainText(AnalysisResult result) {
StringBuffer str = new StringBuffer();
@@ -66,7 +67,7 @@
return str.toString();
}
- public static String writeHTML(AnalysisResultNormal result) {
+ public static String writeHTML(AnalysisResult result) {
StringBuffer str = new StringBuffer("");
str.append("<html>\n");
str.append("<head>\n");
@@ -140,9 +141,9 @@
str.append(warning.getId());
str.append(":<BR>\n");
- if (warning.getRuleName() != null) {
+ if (warning.getFaulty().getRuleName() != null) {
str.append("in rule ");
- str.append(warning.getRuleName());
+ str.append(warning.getFaulty().getRuleName());
str.append(": ");
}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportVisitor.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportVisitor.java (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/ReportVisitor.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,52 @@
+package org.drools.analytics.result;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.mvel.TemplateInterpreter;
+
+abstract class ReportVisitor {
+
+ protected static String processHeader(String folder) {
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("sourceFolder", folder);
+
+ map.put("objectTypesFile", UrlFactory.HTML_FILE_INDEX);
+ map.put("packagesFile", UrlFactory.HTML_FILE_PACKAGES);
+ map.put("gapsFile", UrlFactory.HTML_FILE_GAPS);
+
+ String myTemplate = readFile("header.htm");
+
+ return TemplateInterpreter.evalToString(myTemplate, map);
+ }
+
+ protected static String readFile(String fileName) {
+ StringBuffer str = new StringBuffer("");
+ try {
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(ComponentsReportVisitor.class
+ .getResourceAsStream(fileName)));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ str.append(line);
+ str.append("\n");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return str.toString();
+ }
+
+ protected static String createStyleTag(String path) {
+ StringBuffer str = new StringBuffer("");
+
+ str.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"");
+ str.append(path);
+ str.append("\" />");
+
+ return str.toString();
+ }
+}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/UrlFactory.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/UrlFactory.java (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/java/org/drools/analytics/result/UrlFactory.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,26 @@
+package org.drools.analytics.result;
+
+class UrlFactory {
+
+ public static final String THIS_FOLDER = ".";
+ public static final String PREVIOUS_FOLDER = "..";
+
+ public static final String SOURCE_FOLDER = "report";
+ public static final String OBJECT_TYPE_FOLDER = "objectTypes";
+ public static final String FIELD_FOLDER = "fields";
+ public static final String RULE_FOLDER = "rules";
+ public static final String PACKAGE_FOLDER = "packages";
+ public static final String CSS_FOLDER = "css";
+
+ public static final String CSS_FILE_LIST = "relationsList.css";
+ public static final String CSS_FILE_DETAILS = "relationsDetails.css";
+
+ public static final String HTML_FILE_INDEX = "index.htm";
+ public static final String HTML_FILE_PACKAGES = "packages.htm";
+ public static final String HTML_FILE_GAPS = "missingRanges.htm";
+
+ static String getRuleUrl(String sourceFolder, int ruleId, String ruleName) {
+ return "<a href=\"" + sourceFolder + "/" + RULE_FOLDER + "/" + ruleId
+ + ".htm\">" + ruleName + "</a>";
+ }
+}
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,37 @@
+#created on: 24.9.2007
+package org.drools.analytics.rangeChecks.cleanUp
+
+import org.drools.analytics.result.Gap;
+import org.drools.analytics.result.MissingNumberPattern;
+
+import org.drools.analytics.dao.AnalyticsData;
+
+#declare any global variables here
+global AnalyticsData data;
+
+#
+# Removes useless gaps.
+# Type: None
+# Example: missing ( x >= 10 ) and ( x <= 10 ). This is the same as ( x == 10 )
+rule "Clean up gaps"
+ when
+ $g1 :Gap(
+ evaluator == ">="
+ )
+ $g2 :Gap(
+ id != $g1.id,
+ field == $g1.field,
+ evaluator == "<=",
+ valueAsString == $g1.valueAsString
+ )
+ then
+ data.remove( $g1 );
+ data.remove( $g2 );
+ retract( $g1 );
+ retract( $g2 );
+
+ MissingNumberPattern mnp = new MissingNumberPattern( $g1.getField(), "==", $g1.getValueAsString() );
+ mnp.setFiredRuleName( drools.getRule().getName() );
+ data.save( mnp );
+ insert( mnp );
+end
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -14,10 +14,11 @@
import java.util.Locale;
import java.util.Date;
+import org.drools.analytics.dao.AnalyticsData;
+
#declare any global variables here
-global AnalysisResult result
+global AnalyticsData data;
-
function String dateToString(Date date) {
String fmt = System.getProperty("drools.dateformat");
if (fmt == null) {
@@ -38,32 +39,59 @@
when
$f :Field( fieldType == Field.FieldType.DATE )
(
- $r :LiteralRestriction( fieldId == $f.id, evaluator == ">" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == ">"
+ )
and
- not LiteralRestriction( fieldId == $f.id, ( evaluator == "==" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue()) ) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()) )
+ )
) or (
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "<" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "<"
+ )
and
- not LiteralRestriction( fieldId == $f.id, ( evaluator == "==" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue()) ) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()) )
+ )
) or (
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "<=" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "<="
+ )
and
- not LiteralRestriction( fieldId == $f.id, evaluator == ">",
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue()) ) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == ">",
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()) )
+ )
) or (
- $r :LiteralRestriction( fieldId == $f.id, evaluator == ">=" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == ">="
+ )
and
- not LiteralRestriction( fieldId == $f.id, evaluator == "<",
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue()) ) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "<",
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()) )
+ )
)
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, Gap.getReversedEvaluator($r.getEvaluator()), $r);
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
# If all ranges are not checked for a field.
@@ -76,18 +104,28 @@
when
# Case Foo( bar == "27-Oct-2007" ) Foo( bar >= "27-Oct-2007" || > "27-Oct-2007" ).
$f :Field( fieldType == Field.FieldType.DATE )
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == ">" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue())) )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == ">" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()))
+ )
# Check if Foo( bar < "27-Oct-2007" || <= "27-Oct-2007" ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == "<" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue())) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "<" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()))
+ )
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, "<", $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
# If all ranges are not checked for a field.
@@ -100,16 +138,26 @@
when
# Case Foo( bar == "27-Oct-2007" ) Foo( bar <= "27-Oct-2007" || < "27-Oct-2007" ).
$f :Field( fieldType == Field.FieldType.DATE )
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == "<" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue())) )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "<" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()))
+ )
# Check if Foo( bar > "27-Oct-2007" || >= "27-Oct-2007" ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == ">" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- eval( dateValue.equals($r.getDateValue())) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == ">" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( dateValue.equals($r.getDateValue()))
+ )
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, ">", $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -8,13 +8,10 @@
import org.drools.analytics.result.AnalysisResult;
import org.drools.analytics.result.Gap;
-import java.util.ArrayList;
-import java.util.TreeSet;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
+import org.drools.analytics.dao.AnalyticsData;
#declare any global variables here
-global AnalysisResult result
+global AnalyticsData data;
# If all ranges are not checked for a field.
#
@@ -25,32 +22,59 @@
when
$f :Field( fieldType == Field.FieldType.DOUBLE )
(
- $r :LiteralRestriction( fieldId == $f.id, evaluator == ">" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == ">"
+ )
and
- not LiteralRestriction( fieldId == $f.id, ( evaluator == "==" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
) or (
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "<" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "<"
+ )
and
- not LiteralRestriction( fieldId == $f.id, ( evaluator == "==" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
) or (
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "<=" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "<="
+ )
and
- not LiteralRestriction( fieldId == $f.id, evaluator == ">",
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == ">",
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
) or (
- $r :LiteralRestriction( fieldId == $f.id, evaluator == ">=" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == ">="
+ )
and
- not LiteralRestriction( fieldId == $f.id, evaluator == "<",
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "<",
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
)
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, Gap.getReversedEvaluator($r.getEvaluator()), $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
# If all ranges are not checked for a field.
@@ -63,18 +87,28 @@
when
# Case Foo( bar == 42 ) Foo( bar >= 42 || > 42 ).
$f :Field( fieldType == Field.FieldType.DOUBLE )
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == ">" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == ">" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
# Check if Foo( bar < 42 || <= 42 ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == "<" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "<" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, "<", $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
# If all ranges are not checked for a field.
@@ -87,17 +121,27 @@
when
# Case Foo( bar == 42 ) Foo( bar <= 42 || < 42 ).
$f :Field( fieldType == Field.FieldType.DOUBLE )
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == "<" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "<" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
# Check if Foo( bar > 42 || >= 42 ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == ">" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- doubleValue == $r.doubleValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == ">" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ doubleValue == $r.doubleValue
+ )
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, ">", $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -13,6 +13,10 @@
import java.text.SimpleDateFormat;
import java.util.Locale;
+import org.drools.analytics.dao.AnalyticsData;
+
+global AnalyticsData data;
+
# If all ranges are not checked for a field.
#
# Type: Warning
@@ -22,38 +26,81 @@
when
$f :Field( fieldType == Field.FieldType.INT, $fieldId :id, $fieldName :name, $classId :classId )
(
- $r :LiteralRestriction( fieldId == $fieldId, evaluator == ">",
- $patternIsNot :patternIsNot, $value :intValue )
+ $r :LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == ">",
+ $patternIsNot :patternIsNot,
+ $value :intValue
+ )
and
- not LiteralRestriction( fieldId == $fieldId, ( evaluator == "==" || == "<=" ),
- patternIsNot == $patternIsNot, intValue == $value )
+ not LiteralRestriction(
+ fieldId == $fieldId,
+ ( evaluator == "==" || == "<=" ),
+ patternIsNot == $patternIsNot,
+ intValue == $value
+ )
) or (
- $r :LiteralRestriction( fieldId == $fieldId, evaluator == "<",
- $patternIsNot :patternIsNot, $value :intValue )
+ $r :LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == "<",
+ $patternIsNot :patternIsNot,
+ $value :intValue
+ )
and
- not LiteralRestriction( fieldId == $fieldId, ( evaluator == "==" || == ">=" ),
- patternIsNot == $patternIsNot, intValue == $value )
+ not LiteralRestriction(
+ fieldId == $fieldId,
+ ( evaluator == "==" || == ">=" ),
+ patternIsNot == $patternIsNot,
+ intValue == $value
+ )
) or (
- $r :LiteralRestriction( fieldId == $fieldId, evaluator == "<=",
- $patternIsNot :patternIsNot, $value :intValue )
+ $r :LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == "<=",
+ $patternIsNot :patternIsNot,
+ $value :intValue
+ )
and
- not LiteralRestriction( fieldId == $fieldId, evaluator == ">",
- patternIsNot == $patternIsNot, intValue == $value )
+ not LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == ">",
+ patternIsNot == $patternIsNot,
+ intValue == $value
+ )
and
- not LiteralRestriction( fieldId == $fieldId, evaluator == ">=",
- patternIsNot == $patternIsNot, eval( intValue == $value + 1 ) )
+ not LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == ">=",
+ patternIsNot == $patternIsNot,
+ eval( intValue == $value + 1 )
+ )
) or (
- $r :LiteralRestriction( fieldId == $fieldId, evaluator == ">=",
- $patternIsNot :patternIsNot, $value :intValue )
+ $r :LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == ">=",
+ $patternIsNot :patternIsNot,
+ $value :intValue
+ )
and
- not LiteralRestriction( fieldId == $fieldId, evaluator == "<",
- patternIsNot == $patternIsNot, intValue == $value )
+ not LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == "<",
+ patternIsNot == $patternIsNot,
+ intValue == $value
+ )
and
- not LiteralRestriction( fieldId == $fieldId, evaluator == "<=",
- patternIsNot == $patternIsNot, eval( intValue == $value - 1 ) )
+ not LiteralRestriction(
+ fieldId == $fieldId,
+ evaluator == "<=",
+ patternIsNot == $patternIsNot,
+ eval( intValue == $value - 1 )
+ )
)
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, Gap.getReversedEvaluator($r.getEvaluator()), $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
# If all ranges are not checked for a field.
@@ -68,35 +115,52 @@
# Case Foo( bar == 42 ) Foo( bar >= 43 || == 43 ).
$f :Field( fieldType == Field.FieldType.INT )
and
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
and
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == "==" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- eval( intValue == $r.getIntValue() + 1 ) )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( intValue == $r.getIntValue() + 1 )
+ )
) or (
# Case Foo( bar == 42 ) Foo( bar >= 42 || > 42 ).
$f :Field( fieldType == Field.FieldType.INT )
and
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
and
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == ">" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- intValue == $r.intValue )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == ">" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ intValue == $r.intValue
+ )
)
# Check if Foo( bar < 42 || <= 42 ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == "<" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- intValue == $r.intValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "<" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ intValue == $r.intValue
+ )
# Check if Foo( bar == 41 || <= 41 ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == "==" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- eval( intValue == $r.getIntValue() - 1 ) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( intValue == $r.getIntValue() - 1 )
+ )
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, "<", $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
# If all ranges are not checked for a field.
@@ -111,33 +175,50 @@
# Case Foo( bar == 42 ) Foo( bar <= 43 || == 43 ).
$f :Field( fieldType == Field.FieldType.INT )
and
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
and
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == "==" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- eval( intValue == $r.getIntValue() - 1 ) )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( intValue == $r.getIntValue() - 1 )
+ )
) or (
# Case Foo( bar == 42 ) Foo( bar <= 42 || < 42 ).
$f :Field( fieldType == Field.FieldType.INT )
and
- $r :LiteralRestriction( fieldId == $f.id, evaluator == "==" )
+ $r :LiteralRestriction(
+ fieldId == $f.id,
+ evaluator == "=="
+ )
and
- LiteralRestriction( fieldId == $f.id,
- ( evaluator == "<" || == "<=" ),
- patternIsNot == $r.patternIsNot,
- intValue == $r.intValue )
+ LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "<" || == "<=" ),
+ patternIsNot == $r.patternIsNot,
+ intValue == $r.intValue
+ )
)
# Check if Foo( bar > 42 || >= 42 ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == ">" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- intValue == $r.intValue )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == ">" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ intValue == $r.intValue
+ )
# Check if Foo( bar == 41 || >= 41 ) is missing.
- not LiteralRestriction( fieldId == $f.id,
- ( evaluator == "==" || == ">=" ),
- patternIsNot == $r.patternIsNot,
- eval( intValue == $r.getIntValue() + 1 ) )
+ not LiteralRestriction(
+ fieldId == $f.id,
+ ( evaluator == "==" || == ">=" ),
+ patternIsNot == $r.patternIsNot,
+ eval( intValue == $r.getIntValue() + 1 )
+ )
then
- insert( new Gap( $f, $r, drools.getRule().getName()) );
+ Gap gap = new Gap( $f, ">", $r );
+ gap.setFiredRuleName( drools.getRule().getName() );
+ data.save( gap );
+ insert( gap );
end
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -9,12 +9,15 @@
import org.drools.analytics.result.MissingNumberPattern;
import org.drools.analytics.result.Cause;
import org.drools.analytics.result.AnalysisWarning;
+import org.drools.analytics.accumulateFunction.FindMissingNumber;
import java.util.ArrayList;
import java.util.List;
+import org.drools.analytics.dao.AnalyticsData;
+
#declare any global variables here
-global AnalysisResult result
+global AnalyticsData data;
#
# If all pattern ranges are not checked for a field.
@@ -24,37 +27,74 @@
# then Foo( bar == 30 ) is missing.
rule "Range check for number patterns"
when
- $f :Field( ( fieldType == Field.FieldType.INT || == Field.FieldType.DOUBLE ),
- $fieldId :id, $fieldName :name, $classId :classId )
+ $f :Field(
+ ( fieldType == Field.FieldType.INT || == Field.FieldType.DOUBLE )
+ )
(
# Where pattern is false.
- $validationResult :ValidatePatternResult( value != null)
- from accumulate(
- $r :LiteralRestriction(
- fieldId == $fieldId,
+ $list :ArrayList( size > FindMissingNumber.MIN_NUMBER_OF_RESTRICTIONS )
+ from collect(
+ LiteralRestriction(
+ fieldId == $f.id,
patternIsNot == false,
- ( evaluator == "==" || == "!=" ),
- $evaluator :evaluator
- ),
- validatePattern( $r )
+ evaluator == "=="
+ )
)
) or (
# Where pattern is true.
- $validationResult :ValidatePatternResult( value != null)
- from accumulate(
- $r :LiteralRestriction(
- fieldId == $fieldId,
+ $list :ArrayList( size > FindMissingNumber.MIN_NUMBER_OF_RESTRICTIONS )
+ from collect(
+ LiteralRestriction(
+ fieldId == $f.id,
patternIsNot == true,
- ( evaluator == "==" || == "!=" ),
- $evaluator :evaluator
- ),
- validatePattern( $r )
+ evaluator == "=="
+ )
)
)
then
- List<Cause> list = new ArrayList<Cause>();
- list.add(
- new MissingNumberPattern( $f.getId(), "==", $validationResult.getValue().toString() ));
-
- result.add( new AnalysisWarning( $f.getRuleName(), $f + " is missing a number from pattern.", list ) );
+ Number number = FindMissingNumber.testForPattern( $list );
+ if( number != null ){
+ MissingNumberPattern mnp = new MissingNumberPattern( $f, "==", number.toString() );
+ data.save( mnp );
+ }
end
+
+#
+# If all pattern ranges are not checked for a field.
+#
+# Type: Warning
+# Example: in "Rule 1" Foo( bar == 10 ) and in "Rule 2" Foo( bar == 20 ) and in "Rule 3" Foo( bar == 40 )
+# then Foo( bar == 30 ) is missing.
+rule "Range check for number patterns, !="
+ when
+ $f :Field(
+ ( fieldType == Field.FieldType.INT || == Field.FieldType.DOUBLE )
+ )
+ (
+ # Where pattern is false.
+ $list :ArrayList( size > FindMissingNumber.MIN_NUMBER_OF_RESTRICTIONS )
+ from collect(
+ LiteralRestriction(
+ fieldId == $f.id,
+ patternIsNot == false,
+ evaluator == "!="
+ )
+ )
+ ) or (
+ # Where pattern is false.
+ $list :ArrayList( size > FindMissingNumber.MIN_NUMBER_OF_RESTRICTIONS )
+ from collect(
+ LiteralRestriction(
+ fieldId == $f.id,
+ patternIsNot == true,
+ evaluator == "!="
+ )
+ )
+ )
+ then
+ Number number = FindMissingNumber.testForPattern( $list );
+ if( number != null ){
+ MissingNumberPattern mnp = new MissingNumberPattern( $f, "!=", number.toString() );
+ data.save( mnp );
+ }
+end
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -5,7 +5,7 @@
import org.drools.analytics.components.Field;
import org.drools.analytics.result.AnalysisWarning;
import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.result.MissingRange;
import java.util.ArrayList;
@@ -15,10 +15,10 @@
rule "Collect gaps"
when
$f :Field()
- $list :ArrayList( size > 1)
+ $list :ArrayList( size > 0)
from collect(
- Gap( field == $f )
+ MissingRange( field == $f )
)
then
- result.add( new AnalysisWarning( $f.getRuleName(), $f + " has one or more gaps.", $list ) );
+ result.add( new AnalysisWarning( $f, $f + " has one or more gaps.", $list ) );
end
\ No newline at end of file
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/field.htm
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/field.htm 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/field.htm 2007-09-25 05:55:22 UTC (rev 15354)
@@ -28,6 +28,9 @@
@end{}
</ul>
</div>
+ <div>
+ @{ranges}
+ </div>
</div>
</body>
</html>
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/header.htm
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/header.htm 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/header.htm 2007-09-25 05:55:22 UTC (rev 15354)
@@ -7,6 +7,9 @@
<td><a href=
"@{sourceFolder}/@{packagesFile}">Rules by
Packages</a></td>
+
+ <td><a href=
+ "@{sourceFolder}/@{gapsFile}">Missing Ranges</a></td>
</tr>
</table>
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRange.htm
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRange.htm (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRange.htm 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+ <head>
+ <meta name="generator" content="HTML Tidy, see www.w3.org">
+
+ <title></title>
+ </head>
+
+ <body>
+ <table>
+ <tr>
+ <th><a href=
+ "@{sourceFolder}/@{objectTypeFolder}/@{objectType.id}.htm">
+ @{objectType.name}</a> <a href=
+ "@{sourceFolder}/@{fieldFolder}/@{field.id}.htm">@{field.name}</a></th>
+ </tr>
+
+ <tr>
+ <td>
+ @{ranges}
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
+
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRanges.htm
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRanges.htm (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/missingRanges.htm 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+
+<html>
+ <head>
+ <meta name="generator" content="HTML Tidy, see www.w3.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=iso-8859-1">
+
+ <title>Missing ranges</title>
+ @{cssStyle}
+ </head>
+
+ <body>
+ <div>@{header}</div>
+ <div>
+ <h1>Missing ranges</h1>
+ <table class="missingRanges">
+ @foreach{lines as line}
+ @{line}
+ @end{}
+ </table>
+ </div>
+ </body>
+</html>
+
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/packages.htm
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/packages.htm 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/packages.htm 2007-09-25 05:55:22 UTC (rev 15354)
@@ -18,8 +18,7 @@
<table class="rulePackages">
@foreach{rulePackages as rulePackage}
<tr>
- <th>@{rulePackage.name}</td>
- <th>
+ <th>@{rulePackage.name}</th>
</tr>
<tr>
<td>
Added: labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/ranges.htm
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/ranges.htm (rev 0)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/main/resources/org/drools/analytics/result/ranges.htm 2007-09-25 05:55:22 UTC (rev 15354)
@@ -0,0 +1,10 @@
+<ul>
+ @foreach{lines as line}
+ @if{line.endsWith("is missing")}
+ <li style="color:Red;">@{line}</li>
+ @elseif{!line.endsWith("is missing")}
+ <li>@{line}</li>
+ @end{}
+ @end{}
+</ul>
+
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -32,17 +32,14 @@
Analyzer a = new Analyzer();
a.addPackageDescr(descr);
- a.addPackageDescr(descr2);
- a.addPackageDescr(descr3);
- a.addPackageDescr(descr4);
+ // a.addPackageDescr(descr2);
+ // a.addPackageDescr(descr3);
+ // a.addPackageDescr(descr4);
a.addPackageDescr(descr5);
a.fireAnalysis();
// System.out.print(a.getResultAsPlainText());
// System.out.print(a.getResultAsXML());
- // System.out.print(a.getResultAsHTML());
- // System.out.print(a.getComponentsHTML());
a.writeComponentsHTML("C:\\");
- // writeToFile("C:\\report2.html", a.getResultAsHTML());
} catch (Throwable t) {
t.printStackTrace();
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -7,7 +7,8 @@
import org.drools.StatelessSession;
import org.drools.StatelessSessionResult;
-import org.drools.analytics.result.AnalysisResultNormal;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
import org.drools.analytics.result.Gap;
import org.drools.base.RuleNameMatchesAgendaFilter;
@@ -25,13 +26,14 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for dates, smaller and greater than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForDates.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session
+ .executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
@@ -87,13 +89,14 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for dates, equal and greater than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForDates.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session
+ .executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
@@ -123,13 +126,14 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for dates, equal and smaller than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForDates.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session
+ .executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -7,7 +7,8 @@
import org.drools.StatelessSession;
import org.drools.StatelessSessionResult;
-import org.drools.analytics.result.AnalysisResultNormal;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
import org.drools.analytics.result.Gap;
import org.drools.base.RuleNameMatchesAgendaFilter;
@@ -26,13 +27,13 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for doubles, smaller and greater than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForDoubles.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session.executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
@@ -88,13 +89,13 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for doubles, equal and greater than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForDoubles.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session.executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
@@ -124,13 +125,13 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for doubles, equal and smaller than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForDoubles.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session.executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -7,15 +7,15 @@
import org.drools.StatelessSession;
import org.drools.StatelessSessionResult;
-import org.drools.analytics.result.AnalysisResultNormal;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
import org.drools.analytics.result.Gap;
import org.drools.base.RuleNameMatchesAgendaFilter;
-
/**
*
* @author Toni Rikkola
- *
+ *
*/
public class RangeCheckIntegersTest extends TestBase {
@@ -26,13 +26,13 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for integers, smaller and greater than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForInts.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session.executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
@@ -42,7 +42,7 @@
if (o instanceof Gap) {
rulesThatHadErrors.add(((Gap) o).getRuleName());
}
- // System.out.println(o);
+// System.out.println(o);
}
assertTrue(rulesThatHadErrors.remove("Missing int range 1a, warning"));
@@ -84,13 +84,13 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for integers, equal and greater than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForInts.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session.executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
@@ -121,13 +121,13 @@
session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
"Range check for integers, equal and smaller than"));
- Collection<? extends Object> data = getTestData(this.getClass()
+ Collection<? extends Object> testData = getTestData(this.getClass()
.getResourceAsStream("MissingRangesForInts.drl"));
- AnalysisResultNormal analysisResult = new AnalysisResultNormal();
- session.setGlobal("result", analysisResult);
+ AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+ session.setGlobal("data", data);
- StatelessSessionResult sessionResult = session.executeWithResults(data);
+ StatelessSessionResult sessionResult = session.executeWithResults(testData);
Iterator iter = sessionResult.iterateObjects();
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/TestBase.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/TestBase.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/TestBase.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -12,7 +12,7 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatelessSession;
-import org.drools.analytics.dao.AnalyticsDataMaps;
+import org.drools.analytics.dao.AnalyticsDataFactory;
import org.drools.compiler.DrlParser;
import org.drools.compiler.PackageBuilder;
import org.drools.lang.descr.PackageDescr;
@@ -85,6 +85,6 @@
ruleFlattener.insert(descr);
// Rules with relations
- return AnalyticsDataMaps.getAnalyticsDataMaps().getAll();
+ return AnalyticsDataFactory.getAnalyticsData().getAll();
}
}
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/accumulateFunction/ValidatePatternTest.java
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/accumulateFunction/ValidatePatternTest.java 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/java/org/drools/analytics/accumulateFunction/ValidatePatternTest.java 2007-09-25 05:55:22 UTC (rev 15354)
@@ -2,80 +2,76 @@
import java.math.BigDecimal;
-import org.drools.analytics.accumulateFunction.ValidatePattern;
-
-
-
import junit.framework.TestCase;
public class ValidatePatternTest extends TestCase {
public void testfindSumPattern() {
// Sum +2 missing number 4
- assertTrue(ValidatePattern.findSumPattern(
+ assertTrue(FindMissingNumber.findSumPattern(
new BigDecimal[] { BigDecimal.valueOf(2),
BigDecimal.valueOf(6), BigDecimal.valueOf(8),
BigDecimal.valueOf(10) }).doubleValue() == 4);
// +10 missing number 50
- assertTrue(ValidatePattern.findSumPattern(
+ assertTrue(FindMissingNumber.findSumPattern(
new BigDecimal[] { BigDecimal.valueOf(10),
BigDecimal.valueOf(20), BigDecimal.valueOf(30),
BigDecimal.valueOf(40), BigDecimal.valueOf(60),
BigDecimal.valueOf(70) }).doubleValue() == 50);
// +66 missing number 308
- assertTrue(ValidatePattern.findSumPattern(
+ assertTrue(FindMissingNumber.findSumPattern(
new BigDecimal[] { BigDecimal.valueOf(110),
BigDecimal.valueOf(176), BigDecimal.valueOf(242),
BigDecimal.valueOf(374) }).doubleValue() == 308);
// Deduction -2 missing number 8
- assertTrue(ValidatePattern.findSumPattern(
+ assertTrue(FindMissingNumber.findSumPattern(
new BigDecimal[] { BigDecimal.valueOf(10),
BigDecimal.valueOf(6), BigDecimal.valueOf(4),
BigDecimal.valueOf(2) }).doubleValue() == 8);
// -337 missing number -11
- assertTrue(ValidatePattern.findSumPattern(
+ assertTrue(FindMissingNumber.findSumPattern(
new BigDecimal[] { BigDecimal.valueOf(663),
BigDecimal.valueOf(326), BigDecimal.valueOf(-348),
BigDecimal.valueOf(-685) }).doubleValue() == -11);
// -31 missing number 4350
- assertTrue(ValidatePattern.findSumPattern(
+ assertTrue(FindMissingNumber.findSumPattern(
new BigDecimal[] { BigDecimal.valueOf(4443),
BigDecimal.valueOf(4412), BigDecimal.valueOf(4381),
BigDecimal.valueOf(4319) }).doubleValue() == 4350);
// Not valid
// Not in pattern.
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(1), BigDecimal.valueOf(2),
BigDecimal.valueOf(4), BigDecimal.valueOf(6),
BigDecimal.valueOf(8), BigDecimal.valueOf(11) }) == null);
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(5), BigDecimal.valueOf(3),
BigDecimal.valueOf(54353), BigDecimal.valueOf(54554),
BigDecimal.valueOf(232), BigDecimal.valueOf(123) }) == null);
// No missing values.
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(2), BigDecimal.valueOf(4),
BigDecimal.valueOf(6), BigDecimal.valueOf(8),
BigDecimal.valueOf(10), BigDecimal.valueOf(12),
BigDecimal.valueOf(14) }) == null);
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(10), BigDecimal.valueOf(20),
BigDecimal.valueOf(30), BigDecimal.valueOf(40),
BigDecimal.valueOf(50), BigDecimal.valueOf(60) }) == null);
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(-15), BigDecimal.valueOf(-10),
BigDecimal.valueOf(-5), BigDecimal.valueOf(0),
BigDecimal.valueOf(5), BigDecimal.valueOf(10),
BigDecimal.valueOf(15) }) == null);
// Under 4 values always returns null.
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(2), BigDecimal.valueOf(4),
BigDecimal.valueOf(6) }) == null);
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] {
BigDecimal.valueOf(2), BigDecimal.valueOf(4) }) == null);
- assertTrue(ValidatePattern.findSumPattern(new BigDecimal[] { BigDecimal
+ assertTrue(FindMissingNumber.findSumPattern(new BigDecimal[] { BigDecimal
.valueOf(2) }) == null);
}
@@ -83,18 +79,18 @@
// Multiplication
// *2 missing number 4
- assertTrue(ValidatePattern.findMultiplicationPattern(
+ assertTrue(FindMissingNumber.findMultiplicationPattern(
new BigDecimal[] { BigDecimal.valueOf(2),
BigDecimal.valueOf(8), BigDecimal.valueOf(16),
BigDecimal.valueOf(32), BigDecimal.valueOf(64) })
.doubleValue() == 4);
// *17 missing number 383214
- assertTrue(ValidatePattern.findMultiplicationPattern(
+ assertTrue(FindMissingNumber.findMultiplicationPattern(
new BigDecimal[] { BigDecimal.valueOf(78),
BigDecimal.valueOf(1326), BigDecimal.valueOf(22542),
BigDecimal.valueOf(6514638) }).doubleValue() == 383214);
// *1,23 missing number 2016.6957
- assertTrue(ValidatePattern.findMultiplicationPattern(
+ assertTrue(FindMissingNumber.findMultiplicationPattern(
new BigDecimal[] { BigDecimal.valueOf(1333),
BigDecimal.valueOf(1639.59),
BigDecimal.valueOf(2480.535711),
@@ -102,14 +98,14 @@
// Division
// /2 (*0.5) missing number 128
- assertTrue(ValidatePattern.findMultiplicationPattern(
+ assertTrue(FindMissingNumber.findMultiplicationPattern(
new BigDecimal[] { BigDecimal.valueOf(256),
BigDecimal.valueOf(64), BigDecimal.valueOf(32),
BigDecimal.valueOf(16), BigDecimal.valueOf(8),
BigDecimal.valueOf(4), BigDecimal.valueOf(2) })
.doubleValue() == 128);
// /10 (*0.1) missing number 1
- assertTrue(ValidatePattern.findMultiplicationPattern(
+ assertTrue(FindMissingNumber.findMultiplicationPattern(
new BigDecimal[] { BigDecimal.valueOf(10000),
BigDecimal.valueOf(1000), BigDecimal.valueOf(100),
BigDecimal.valueOf(10), BigDecimal.valueOf(0.1),
@@ -117,11 +113,11 @@
// Not valid
// Not in pattern.
- assertTrue(ValidatePattern.findMultiplicationPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findMultiplicationPattern(new BigDecimal[] {
BigDecimal.valueOf(111.2), BigDecimal.valueOf(3323),
BigDecimal.valueOf(234.434), BigDecimal.valueOf(44343),
BigDecimal.valueOf(434) }) == null);
- assertTrue(ValidatePattern.findMultiplicationPattern(new BigDecimal[] {
+ assertTrue(FindMissingNumber.findMultiplicationPattern(new BigDecimal[] {
BigDecimal.valueOf(1), BigDecimal.valueOf(2),
BigDecimal.valueOf(3), BigDecimal.valueOf(4),
BigDecimal.valueOf(5), BigDecimal.valueOf(6),
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/Misc.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/Misc.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/Misc.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -2,6 +2,20 @@
import com.sample.DroolsTest.Message;
+rule "nro 1."
+ when
+ Foo( bar > 10 )
+ then
+ System.out.println("Test");
+end
+
+rule "nro 2."
+ when
+ Foo( bar < 10 )
+ then
+ System.out.println("Test");
+end
+
rule "Rule with patterns"
when
Foo1()
@@ -28,3 +42,37 @@
System.out.println( "Test" );
end
+rule "Numbers 1"
+ when
+ NumbersInPattern( x == 10 )
+ then
+ System.out.println( "Test" );
+end
+
+rule "Numbers 2"
+ when
+ NumbersInPattern( x == 20 )
+ then
+ System.out.println( "Test" );
+end
+
+rule "Numbers 3"
+ when
+ NumbersInPattern( x == 30 )
+ then
+ System.out.println( "Test" );
+end
+
+rule "Numbers 5"
+ when
+ NumbersInPattern( x == 50 )
+ then
+ System.out.println( "Test" );
+end
+
+rule "Numbers 6"
+ when
+ NumbersInPattern( x == 60 )
+ then
+ System.out.println( "Test" );
+end
Modified: labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/MissingRangesForDoubles.drl
===================================================================
--- labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/MissingRangesForDoubles.drl 2007-09-25 02:22:30 UTC (rev 15353)
+++ labs/jbossrules/trunk/experimental/drools-analytics/src/test/resources/org/drools/analytics/MissingRangesForDoubles.drl 2007-09-25 05:55:22 UTC (rev 15354)
@@ -327,21 +327,7 @@
then
System.out.println( "Test" );
end
-/* TODO: Rules to cover these kind of situations.
-rule "Double range 26a, no gap"
- when
- Foo26( value > 40.0 )
- then
- System.out.println( "Test" );
-end
-rule "Double range 26b, no gap"
- when
- Foo26( value < 42.0 )
- then
- System.out.println( "Test" );
-end
-*/
rule "Double range 27a, no gap"
when
Foo27( value > 0.0 )
More information about the jboss-svn-commits
mailing list