package org.drools.reteoo;
import java.io.StringReader;
import junit.framework.TestCase;
import org.drools.RuleBaseConfiguration;
import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.integrationtests.LargeRuleBase;
import org.drools.lang.descr.PackageDescr;
import org.drools.rule.Package;
import org.drools.rule.Rule;
/**
* Created by IntelliJ IDEA. User: SG0521861 Date: Mar 20, 2008 Time: 2:36:47 PM To change this template use File |
* Settings | File Templates.
*/
public class ReteooBuilderPerformanceTest extends TestCase {
private static final int RULE_COUNT = Integer.parseInt(System.getProperty("rule.count", "1000"));
private static final int RETEBUILDER_COUNT = Integer.parseInt(System.getProperty("retebuilder.count", "1"));
public void testReteBuilder() throws DroolsParserException {
addRules(generatePackage(RULE_COUNT));
}
private static void addRules(Package pkg) {
ReteooBuilder[] reteBuilders = getReteBuilders(RETEBUILDER_COUNT);
System.out.println("Adding rules to ReteBuilder");
long start = System.currentTimeMillis();
for (ReteooBuilder reteBuilder : reteBuilders) {
for (Rule rule : pkg.getRules())
reteBuilder.addRule(rule);
}
System.out.println("Added "+RULE_COUNT+" rules to each ReteBuilder's in "+
format(System.currentTimeMillis()-start));
}
private static ReteooBuilder[] getReteBuilders(int count) {
System.out.println("Creating "+count+" ReteBuilder's");
ReteooBuilder[] reteBuilders = new ReteooBuilder[count];
RuleBaseConfiguration conf = new RuleBaseConfiguration();
for (int i = 0; i < reteBuilders.length; i++) {
reteBuilders[i] = new ReteooBuilder(new ReteooRuleBase( conf ));
}
return reteBuilders;
}
private static Package generatePackage(int ruleCount) throws DroolsParserException {
StringReader reader = new StringReader(generateRules(ruleCount));
System.out.println("Parsing rules");
PackageDescr pkgDescr = new DrlParser().parse(reader);
System.out.println("Generating packages");
PackageBuilder pkgBuilder = new PackageBuilder(new PackageBuilderConfiguration());
pkgBuilder.addPackage(pkgDescr);
return pkgBuilder.getPackage();
}
private static String generateRules(int ruleCount) {
System.out.println("Generating "+ruleCount+" rules");
StringBuilder sb = new StringBuilder(LargeRuleBase.getHeader());
for (int i = 1; i <= ruleCount; i++) {
sb.append(LargeRuleBase.getTemplate1("testrule"+i, i));
}
return sb.toString();
}
private static final int MILLIS_IN_SECOND = 1000;
private static final int MILLIS_IN_MINUTE = MILLIS_IN_SECOND*60;
private static final int MILLIS_IN_HOUR = MILLIS_IN_MINUTE*60;
private static String format(long time) {
StringBuilder sb = new StringBuilder();
sb.append(time/MILLIS_IN_HOUR).append(':');
time = time % MILLIS_IN_HOUR;
sb.append(time/MILLIS_IN_MINUTE).append(':');
time = time % MILLIS_IN_MINUTE;
sb.append(time*1.0/MILLIS_IN_SECOND);
return sb.toString();
}
}