/* * 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.template.jdbc; import org.drools.core.WorkingMemory; import org.junit.Test; 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.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; import java.io.InputStream; import java.io.StringReader; import java.sql.*; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; /** * /** * <p>A simple example of using the ResultSetGenerator. * The template used is "Cheese.drt" the same used by SimpleRuleTemplateExample. * Rather than use the spreadsheet ExampleCheese.xls, this example reads the data * from an HSQL database (which is created in this example).</p> */ public class ResultSetGeneratorTest { @Test public void testResultSet() throws Exception { // setup the HSQL database with our rules. Class.forName("org.hsqldb.jdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:drools-templates", "sa", ""); try { update("CREATE TABLE cheese_rules ( id INTEGER IDENTITY, persons_age INTEGER, birth_date DATE, cheese_type VARCHAR(256), log VARCHAR(256) )", conn); update("INSERT INTO cheese_rules(persons_age,birth_date,cheese_type,log) VALUES(42, '1950-01-01', 'stilton', 'Old man stilton')", conn); update("INSERT INTO cheese_rules(persons_age,birth_date,cheese_type,log) VALUES(10, '2009-01-01', 'cheddar', 'Young man cheddar')", conn); } catch (SQLException e) { throw new IllegalStateException("Could not initialize in memory database", e); } // query the DB for the rule rows, convert them using the template. Statement sta = conn.createStatement(); ResultSet rs = sta.executeQuery("SELECT persons_age, cheese_type, log " + " FROM cheese_rules"); final ResultSetGenerator converter = new ResultSetGenerator(); final String drl = converter.compile(rs, getRulesStream()); System.out.println(drl); sta.close(); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL); assertFalse(kbuilder.hasErrors()); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); //now create some test data kSession.insert(new Cheese("stilton", 42)); kSession.insert(new Person("michael", "stilton", 42)); List<String> list = new ArrayList<String>(); kSession.setGlobal("list", list); kSession.fireAllRules(); assertEquals(1, list.size()); } /** * simple getter method looks up our template as a Resource * * @return the template as an InputStream */ private InputStream getRulesStream() { return this.getClass().getResourceAsStream("/templates/Cheese.drt"); } /** * An HSQL update wrapper from http://hsqldb.org/doc/guide/apb.html * * @param expression SQL expression * @throws SQLException just rethrowing all the errors for the example */ private void update(String expression, Connection conn) throws SQLException { Statement st; st = conn.createStatement(); int i = st.executeUpdate(expression); if (i == -1) { System.out.println("db error : " + expression); } st.close(); } }