package org.drools.integrationtests;
import junit.framework.TestCase;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.drools.runtime.rule.QueryResults;
/**
* @author Damon
*
*/
public class TestQuery extends TestCase {
private KnowledgeBase knowledgeBase;
/**
* @throws java.lang.Exception
*/
public void setUp() throws Exception {
String text = "";
text += "package org.drools.integrationtests\n";
text += "import org.drools.integrationtests.TestQuery.Bar\n";
text += "import org.drools.integrationtests.TestQuery.Foo\n";
text += "import org.drools.integrationtests.TestQuery.Foo2\n";
text += "query \"testDifferent\"\n";
text += " foo : Foo();\n";
text += " bar : Bar(id == foo.id)\n";
text += "end\n";
text += "query \"testSame\"\n";
text += " foo : Foo();\n";
text += " foo2 : Foo(id == foo.id);\n";
text += "end\n";
text += "query \"testExtends\"\n";
text += " foo : Foo();\n";
text += " foo2 : Foo2(id == foo.id);\n";
text += "end\n";
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
knowledgeBuilder.add( ResourceFactory.newByteArrayResource( text.getBytes() ),
ResourceType.DRL );
assertFalse( knowledgeBuilder.hasErrors() );
knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages( knowledgeBuilder.getKnowledgePackages() );
}
private void doIt(Object o1,
Object o2,
String query,
int expected,
boolean doUpdate,
boolean doRetract) {
StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession();
try {
knowledgeSession.insert( o1 );
FactHandle handle2 = knowledgeSession.insert( o2 );
if ( doUpdate ) {
knowledgeSession.update( handle2,
o2 );
} else if ( doRetract ) {
knowledgeSession.retract( handle2 );
handle2 = knowledgeSession.insert( o2 );
}
QueryResults queryResults = knowledgeSession.getQueryResults( query );
assertEquals( expected,
queryResults.size() );
} finally {
knowledgeSession.dispose();
}
}
public void testDifferent() {
Foo foo = new Foo();
foo.setId( "x" );
Bar bar = new Bar();
bar.setId( "x" );
doIt( foo,
bar,
"testDifferent",
1,
false,
false );
}
public void testDifferentWithUpdate() {
Foo foo = new Foo();
foo.setId( "x" );
Bar bar = new Bar();
bar.setId( "x" );
doIt( foo,
bar,
"testDifferent",
1,
true,
false );
}
public void testSame() {
Foo foo = new Foo();
foo.setId( "x" );
Foo foo2 = new Foo();
foo2.setId( "x" );
doIt( foo,
foo2,
"testSame",
4,
false,
false );
}
public void testSameWithUpdate() {
Foo foo = new Foo();
foo.setId( "x" );
Foo foo2 = new Foo();
foo2.setId( "x" );
doIt( foo,
foo2,
"testSame",
4,
true,
false );
}
public void testExtends() {
Foo foo = new Foo();
foo.setId( "x" );
Foo2 foo2 = new Foo2();
foo2.setId( "x" );
doIt( foo,
foo2,
"testExtends",
2,
false,
false );
}
public void testExtendsWithUpdate() {
Foo foo = new Foo();
foo.setId( "x" );
Foo2 foo2 = new Foo2();
foo2.setId( "x" );
doIt( foo,
foo2,
"testExtends",
2,
true,
false );
}
public void testExtendsWithRetract() {
Foo foo = new Foo();
foo.setId( "x" );
Foo2 foo2 = new Foo2();
foo2.setId( "x" );
doIt( foo,
foo2,
"testExtends",
2,
false,
true );
}
public static class Bar {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public static class Foo {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public static class Foo2 extends Foo {
}
}