package org.drools.integrationtests;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.StringReader;
import junit.framework.Assert;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.common.DroolsObjectOutputStream;
import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.lang.descr.PackageDescr;
import org.drools.rule.Package;
/**
* This generates a large number of rules (complex ones) and then times
* compiling, serializing etc.
*/
public class LargeRuleBase {
private static final int RULE_COUNT = 20000;
public static void main(String[] args) throws Exception {
System.err.println(Runtime.getRuntime().freeMemory());
// bigBlobCompile();
realisticSmallBlobCompile();
System.gc();
Thread.sleep(5000);
System.err.println(Runtime.getRuntime().freeMemory());
}
private static void bigBlobCompile() throws DroolsParserException,
IOException, Exception {
StringBuilder buf = new StringBuilder();
buf.append(getHeader());
for (int i = 0; i < RULE_COUNT; i++) {
String name = "x" + i;
int status = i;
String r = getTemplate1(name, status);
buf.append(r);
}
/* love you */long time = System.currentTimeMillis();
DrlParser ps = new DrlParser();
PackageDescr pkg = ps.parse(new StringReader(buf.toString()));
System.err.println("Time taken for parsing: "
+ (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
PackageBuilder b = new PackageBuilder();
b.addPackage(pkg);
Assert.assertFalse(b.getErrors().toString(), b.hasErrors());
System.err.println("Time taken for compiling: "
+ (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
Package p = b.getPackage();
RuleBase rb = RuleBaseFactory.newRuleBase();
rb.addPackage(p);
System.err.println("Time taken rete building: "
+ (System.currentTimeMillis() - time));
File f = new File("foo.rulebase");
if (f.exists())
f.delete();
time = System.currentTimeMillis();
ObjectOutput out = new DroolsObjectOutputStream(new FileOutputStream(f));
out.writeObject(rb);
out.flush();
out.close();
System.err.println("Time taken serializing rulebase: "
+ (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
RuleBase rb_ = (RuleBase) in.readObject();
System.err.println("Time taken de-serializing rulebase: "
+ (System.currentTimeMillis() - time));
}
private static void smallBlobCompile() throws DroolsParserException,
IOException, Exception {
/* love you */long time = System.currentTimeMillis();
PackageBuilder b = new PackageBuilder();
b.addPackageFromDrl(new StringReader(getHeader()));
for (int i = 0; i < RULE_COUNT; i++) {
String name = "x" + i;
int status = i;
String r = getTemplate2(name, i, status);
b.addPackageFromDrl(new StringReader(r));
if (i % 1000 == 0)
System.err.println("Rule #" + i);
}
Assert.assertFalse(b.getErrors().toString(), b.hasErrors());
System.err.println("Time taken for compiling: "
+ (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
Package p = b.getPackage();
RuleBase rb = RuleBaseFactory.newRuleBase();
rb.addPackage(p);
System.err.println("Time taken rete building: "
+ (System.currentTimeMillis() - time));
}
private static void realisticSmallBlobCompile() throws DroolsParserException,
IOException, Exception {
/* love you */long time = System.currentTimeMillis();
PackageBuilder b = new PackageBuilder();
b.addPackageFromDrl(new StringReader(getHeader()));
int count = 0;
for (int i = 0; i < 2000; i++) {
String name = "x" + i;
for (int j = 0; j < 10; j++) {
count++;
int status = j;
String r = getTemplate2(name, count, status);
b.addPackageFromDrl(new StringReader(r));
if (count % 1000 == 0)
System.err.println("Rule #" + count);
}
}
Assert.assertFalse(b.getErrors().toString(), b.hasErrors());
System.err.println("Time taken for compiling: "
+ (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
Package p = b.getPackage();
RuleBase rb = RuleBaseFactory.newRuleBase();
rb.addPackage(p);
System.err.println("Time taken rete building: "
+ (System.currentTimeMillis() - time));
}
public static String getHeader() {
return "package org.drools.test; \n " + "import org.drools.Person; \n "
+ "import org.drools.Cheese; \n "
+ "import org.drools.Cheesery; \n "
+ " import java.util.List \n "
+ " global List list \n dialect 'mvel'\n ";
}
public static String getTemplate1(String name, int status) {
return "rule 'match Person "
+ name
+ "' \n"
+ " agenda-group \'xxx\' \n"
+ " salience ($age2 - $age1) \n "
+ " dialect 'mvel' \n"
+ " when \n "
+ " $person : Person(name=='"
+ name
+ "', $age1 : age ) \n "
+ " cheesery : Cheesery( cheeses contains $person, status == "
+ status + " ) \n "
+ " cheeses : List() from cheesery.getCheeses() \n "
+ " Person( age < ( $age1 ) ) \n "
+ " Person( $age2 : age -> ( $age1 == $age2 ) ) \n "
+ " eval( $age1 == $age2 ) \n " + " then \n "
+ " list.add( $person ); \n "
+ " $person.setStatus(\"match Person ok\"); \n " + " end \n";
}
private static String getTemplate2(String name, int num, int status) {
return "rule 'match Person "
+ num
+ "' \n"
+ " dialect 'mvel' \n"
+ " when \n "
+ " $person : Person(name=='"
+ name
+ "', $age1 : age ) \n "
+ " cheesery : Cheesery( cheeses contains $person, status == "
+ status + " ) \n "
+ " Person(age < " + num + ") \n"
+ " then \n "
+ " list.add( $person ); \n "
+ " $person.setStatus(\"match Person ok\"); \n " + " end \n";
}
}