package org.drools.pmml.pmml_4_1; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.RuleBaseConfiguration; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.conf.EventProcessingOption; import org.drools.io.ResourceFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.QueryResults; import org.drools.runtime.rule.Variable; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class PMMLUsageDemoTest { private StatefulKnowledgeSession kSession; private static final String pmmlSource = "org/drools/pmml/pmml_4_1/mock_cold_simple.xml"; @Before public void setupSession() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( pmmlSource ), ResourceType.PMML ); if ( kbuilder.hasErrors() ) { fail( kbuilder.getErrors().toString() ); } RuleBaseConfiguration conf = new RuleBaseConfiguration(); conf.setEventProcessingMode( EventProcessingOption.STREAM ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( conf ); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); // Create kSession and initialize it kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); } @After public void disposeSession() { if ( kSession != null ) { kSession.dispose(); } } @Test public void invokePmmlWithRawData() { // One entry-point per input field // field name "xyz" => entry point name "in_Xyz" kSession.getWorkingMemoryEntryPoint( "in_Temp" ).insert( 22.0 ); kSession.fireAllRules(); // Query results // output field name --> query name // model name --> first arg // value --> second arg ( Variable.v for output, any value for testing ) QueryResults qrs = kSession.getQueryResults( "Cold", "MockCold", Variable.v ); assertTrue( qrs.iterator().hasNext() ); Object val = qrs.iterator().next().get( "$result" ); assertEquals( 0.56, val ); QueryResults qrs2 = kSession.getQueryResults( "Cold", "MockCold", 0.56 ); assertTrue( qrs2.iterator().hasNext() ); QueryResults qrs3 = kSession.getQueryResults( "Cold", "MockCold", 0.99 ); assertFalse( qrs3.iterator().hasNext() ); } @Test public void invokePmmlWithTrait() { String extraDrl = "package org.drools.pmml.pmml_4_1.test;" + "" + "import org.drools.factmodel.traits.Entity;" + "" + "rule \"Init\" " + "when " + " $s : String( this == \"trigger\" ) " + "then " + " System.out.println( \"Trig\" ); " + " Entity o = new Entity(); " + " insert( o ); \n" + "" + // don an object with the default input trait ( modelName + "Input" ) // both soft and hard fields will be used to feed data into the model "" + " MockColdInput input = don( o, MockColdInput.class ); " + " modify( input ) { " + " setTemp( 22.0 );" + " } " + "end " + "" + "" + "rule Log when $x : MockColdInput() then System.out.println( \"IN \" + $x ); end " + "rule Log2 when $x : Cold() then System.out.println( \"OUT \" + $x ); end " ; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( kSession.getKnowledgeBase() ); kbuilder.add( ResourceFactory.newByteArrayResource( extraDrl.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { fail( kbuilder.getErrors().toString() ); } kSession.getKnowledgeBase().addKnowledgePackages( kbuilder.getKnowledgePackages() ); kSession.insert( "trigger" ); kSession.fireAllRules(); QueryResults qrs = kSession.getQueryResults( "Cold", "MockCold", Variable.v ); assertTrue( qrs.iterator().hasNext() ); Object val = qrs.iterator().next().get( "$result" ); } }