/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.compiler.integrationtests; import static org.junit.Assert.assertFalse; 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 org.drools.core.common.DroolsObjectInputStream; import org.drools.core.common.DroolsObjectOutputStream; import org.drools.compiler.compiler.DrlParser; import org.drools.compiler.compiler.DroolsParserException; import org.drools.compiler.lang.descr.PackageDescr; import org.kie.api.io.ResourceType; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.builder.conf.LanguageLevelOption; import org.kie.internal.io.ResourceFactory; /** * 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 < 1; i++) { String name = "x" + i; int status = i; String r = getTemplate1(name, status); buf.append(r); } KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource(buf.toString().getBytes()), ResourceType.DRL ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); File f = new File("foo.rulebase"); if (f.exists()) f.delete(); ObjectOutput out = new DroolsObjectOutputStream(new FileOutputStream(f)); out.writeObject(kbase); out.flush(); out.close(); ObjectInputStream in = new DroolsObjectInputStream(new FileInputStream(f)); KnowledgeBase rb_ = (KnowledgeBase) in.readObject(); } public static String getHeader() { return "package org.kie.test; \n " + "import org.drools.compiler.Person; \n " + "import org.drools.compiler.Cheese; \n " + "import org.drools.compiler.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, eval( $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"; } }