[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