Package org.drools.integrationtests

Source Code of org.drools.integrationtests.BackwardChainingTest$Parent

package org.drools.integrationtests;

import static org.junit.Assert.*;
import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.List;

import org.drools.Address;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.Person;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.rule.Variable;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.QueryResults;
import org.drools.runtime.rule.QueryResultsRow;
import org.junit.Test;

import static org.drools.integrationtests.SerializationHelper.getSerialisedStatefulKnowledgeSession;
import static org.drools.rule.Variable.variable;


public class BackwardChainingTest {
    
    @Test
    public void testQueryPositional() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( String $name, String $likes, int $age ) \n" +
            "    Person( $name := name, $likes := likes, $age := age; ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    String( this == \"go1\" )\n" +
            //         output, output ,output
            "    ?peeps($name1, $likes1, $age1; )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";       
       
        str += "rule x2\n" +
            "when\n" +
            "    String( this == \"go2\" )\n" +
            //         output, input      ,output
            "    ?peeps($name1, \"stilton\", $age1; )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";

        str += "rule x3\n" +
            "when\n" +
            "    String( this == \"go3\" )\n" +
            "    $name1 : String() from \"darth\";\n "+
            //         input , input      ,output       
            "    ?peeps($name1, \"stilton\", $age1; )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";       
       
        str += "rule x4\n" +
            "when\n" +
            "    String( this == \"go4\" )\n" +
            "    $name1 : String() from \"darth\"\n "+
            "    $age1 : Integer() from 200;\n "+       
            //         input , input      ,input       
            "    ?peeps($name1, \"stilton\", $age1; )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";        

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
        Person p2 = new Person( "darth",
                                "stilton",
                                200 );       
        Person p3 = new Person( "yoda",
                                "stilton",
                                300 );
        Person p4 = new Person( "luke",
                                "brie",
                                300 );
        Person p5 = new Person( "bobba",
                                "cheddar",
                                300 );

        ksession.insert( p1 );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.insert( p2 );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.insert( p3 );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.insert( p4 );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.insert( p5 );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );  
       
        ksession.insert( "go1" );
       
        // Make sure we can serialise query state
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );       
       
        ksession.fireAllRules();
        assertEquals( 5, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
        assertTrue( list.contains( "yoda : 300" ));
        assertTrue( list.contains( "luke : 300" ));
        assertTrue( list.contains( "bobba : 300" ));
       
        list.clear();       
        ksession.insert( "go2" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 3, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
        assertTrue( list.contains( "yoda : 300" ));
       
        list.clear();
        ksession.insert( "go3" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();  
        assertEquals( 2, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
       
        list.clear();       
        ksession.insert( "go4" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();          
        assertEquals( 1, list.size());
        assertTrue( list.contains( "darth : 200" ));       
    }     
   
    @Test
    public void testQueryNamed() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( String $name, String $likes, int $age ) \n" +
            "    Person( $name := name, $likes := likes, $age := age ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    String( this == \"go1\" )\n" +
            //         output        ,output          ,output
            "    ?peeps($name1 : $name, $likes1 : $likes, $age1 : $age )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";       
       
        str += "rule x2\n" +
            "when\n" +
            "    String( this == \"go2\" )\n" +
            //         output        ,output                ,output
            "    ?peeps($name1 : $name, $likes : \"stilton\", $age1 : $age )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";

        str += "rule x3\n" +
            "when\n" +
            "    String( this == \"go3\" )\n" +
            "    $name1 : String() from \"darth\";\n "+           
            //         input         ,input                ,output
            "    ?peeps($name1 : $name, $likes : \"stilton\", $age1 : $age )\n" +             
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";       
       
        str += "rule x4\n" +
            "when\n" +
            "    String( this == \"go4\" )\n" +
            "    $name1 : String() from \"darth\";\n "+
            "    $age1 : Integer() from 200;\n "+           
            //         input         ,input                ,input
            "    ?peeps($name1 : $name, $likes : \"stilton\", $age1 : $age )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";        

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
        Person p2 = new Person( "darth",
                                "stilton",
                                200 );       
        Person p3 = new Person( "yoda",
                                "stilton",
                                300 );
        Person p4 = new Person( "luke",
                                "brie",
                                300 );
        Person p5 = new Person( "bobba",
                                "cheddar",
                                300 );

        ksession.insert( p1 );
        ksession.insert( p2 );
        ksession.insert( p3 );
        ksession.insert( p4 );
        ksession.insert( p5 );
       
        ksession.insert( "go1" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 5, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
        assertTrue( list.contains( "yoda : 300" ));
        assertTrue( list.contains( "luke : 300" ));
        assertTrue( list.contains( "bobba : 300" ));
       
        list.clear();       
        ksession.insert( "go2" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 3, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
        assertTrue( list.contains( "yoda : 300" ));
       
        list.clear();
        ksession.insert( "go3" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();  
        assertEquals( 2, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
       
        list.clear();       
        ksession.insert( "go4" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();          
        assertEquals( 1, list.size());
        assertTrue( list.contains( "darth : 200" ));       
    }
   
    @Test
    public void testQueryMixed() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( String $name, String $likes, int $age ) \n" +
            "    Person( $name := name, $likes := likes, $age := age; ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    String( this == \"go1\" )\n" +
            //         output        ,output          ,output
            "    ?peeps($name1; $likes1 : $likes, $age1 : $age )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";       
       
        str += "rule x2\n" +
            "when\n" +
            "    String( this == \"go2\" )\n" +
            //         output        ,output                ,output
            "    ?peeps($name1, \"stilton\"; $age1 : $age )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";

        str += "rule x3\n" +
            "when\n" +
            "    String( this == \"go3\" )\n" +
            "    $name1 : String() from \"darth\";\n "+           
            //         input         ,input                ,output
            "    ?peeps($name1, \"stilton\"; $age1 : $age )\n" +             
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";       
       
        str += "rule x4\n" +
            "when\n" +
            "    String( this == \"go4\" )\n" +
            "    $name1 : String() from \"darth\"\n "+
            "    $age1 : Integer() from 200;\n "+           
            //         input         ,input                ,input
            "    ?peeps($name1; $likes : \"stilton\", $age1 : $age )\n" +
            "then\n" +
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";        

        System.out.println( str );
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
        Person p2 = new Person( "darth",
                                "stilton",
                                200 );       
        Person p3 = new Person( "yoda",
                                "stilton",
                                300 );
        Person p4 = new Person( "luke",
                                "brie",
                                300 );
        Person p5 = new Person( "bobba",
                                "cheddar",
                                300 );

        ksession.insert( p1 );
        ksession.insert( p2 );
        ksession.insert( p3 );
        ksession.insert( p4 );
        ksession.insert( p5 );
       
        ksession.insert( "go1" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 5, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
        assertTrue( list.contains( "yoda : 300" ));
        assertTrue( list.contains( "luke : 300" ));
        assertTrue( list.contains( "bobba : 300" ));
       
        list.clear();       
        ksession.insert( "go2" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 3, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
        assertTrue( list.contains( "yoda : 300" ));
       
        list.clear();
        ksession.insert( "go3" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();  
        assertEquals( 2, list.size());
        assertTrue( list.contains( "darth : 100" ));
        assertTrue( list.contains( "darth : 200" ));
       
        list.clear();       
        ksession.insert( "go4" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();          
        assertEquals( 1, list.size());
        assertTrue( list.contains( "darth : 200" ));       
    }    
   
    @Test
    public void testQueryPatternBindingAsResult() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( Person $p, String $name, String $likes, int $age ) \n" +
            "    $p := Person( $name := name, $likes := likes, $age := age; ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    String( this == \"go1\" )\n" +
            //     output, output, output          ,output
            "    ?peeps($p, $name1; $likes1 : $likes, $age1 : $age )\n" +
            "then\n" +
            "   list.add( $p );\n" +            
            "   list.add( $name1 + \" : \" + $age1 );\n" +
            "end \n";              

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
        Person p2 = new Person( "darth",
                                "stilton",
                                200 );       
        Person p3 = new Person( "yoda",
                                "stilton",
                                300 );
        Person p4 = new Person( "luke",
                                "brie",
                                300 );
        Person p5 = new Person( "bobba",
                                "cheddar",
                                300 );

        ksession.insert( p1 );
        ksession.insert( p2 );
        ksession.insert( p3 );
        ksession.insert( p4 );
        ksession.insert( p5 );
       
        ksession.insert( "go1" );
//        ksession = getSerialisedStatefulKnowledgeSession( ksession,
//                                                          true );          
        ksession.fireAllRules();
        assertEquals( 10, list.size());
        assertEquals( p1, list.get( list.indexOf( "darth : 100" ) - 1) );
        assertTrue( list.contains( "darth : 100" ));
        assertEquals( p2, list.get( list.indexOf( "darth : 200" ) - 1) );
        assertTrue( list.contains( "darth : 200" ));
        assertEquals( p3, list.get( list.indexOf( "yoda : 300" ) - 1) );
        assertTrue( list.contains( "yoda : 300" ));
        assertEquals( p4, list.get( list.indexOf( "luke : 300" ) - 1) );       
        assertTrue( list.contains( "luke : 300" ));
        assertEquals( p5, list.get( list.indexOf( "bobba : 300" ) - 1) );
        assertTrue( list.contains( "bobba : 300" ));
    }        
   
    @Test
    public void testQueriesWithNestedAcecssorsAllOutputs() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( String $name, String $likes, String $street ) \n" +
            "   Person( $name := name, $likes := likes, $street := address.street ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    String( this == \"go1\" )\n" +
            //         output, output,         ,output
            "    ?peeps($name1; $likes1 : $likes, $street1 : $street )\n" +
            "then\n" +          
            "   list.add( $name1 + \" : \" + $likes1 + \" : \" +  $street1 );\n" +
            "end \n";           
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
        p1.setAddress( new Address("s1") );
       
        Person p2 = new Person( "yoda",
                                "stilton",
                                300 );
        p2.setAddress( new Address("s2") );

        ksession.insert( p1 );
        ksession.insert( p2 );

        ksession.insert( "go1" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 2, list.size());
        assertTrue( list.contains( "darth : stilton : s1" ));
        assertTrue( list.contains( "yoda : stilton : s2" ));
    }   
   
    @Test
    public void testQueriesWithNestedAcecssorsMixedArgs() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( String $name, String $likes, String $street ) \n" +
            "   Person( $name := name, $likes := likes, $street := address.street ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    $s : String()\n" +
            //         output, output,         ,input
            "    ?peeps($name1; $likes1 : $likes, $street : $s )\n" +
            "then\n" +          
            "   list.add( $name1 + \" : \" + $likes1 + \" : \" +  $s );\n" +
            "end \n";           
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
        p1.setAddress( new Address("s1") );
       
        Person p2 = new Person( "yoda",
                                "stilton",
                                300 );
        p2.setAddress( new Address("s2") );

        ksession.insert( p1 );
        ksession.insert( p2 );

        ksession.insert( "s1" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 1, list.size());
        assertTrue( list.contains( "darth : stilton : s1" ));
       
        list.clear();
        ksession.insert( "s2" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 1, list.size());
        assertTrue( list.contains( "yoda : stilton : s2" ));       
    }       
   
    @Test
    public void testQueryWithDynamicData() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( Person $p, String $name, String $likes, int $age ) \n" +
            "    $p := Person( ) from new Person( $name, $likes, $age ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    $n1 : String( )\n" +
            //     output, input     ,input                 ,input
            "    ?peeps($p; $name : $n1, $likes : \"stilton\", $age : 100 )\n" +
            "then\n" +
            "   list.add( $p );\n" +
            "end \n";       
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
       
        Person p2 = new Person( "yoda",
                                "stilton",
                                100 );       
       
        ksession.insert( "darth" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 1, list.size());
        assertEquals( p1, list.get(0));    
       
        list.clear();
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.insert( "yoda" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 1, list.size());
        assertEquals( p2, list.get(0));         
    }        
   
    @Test
    public void testQueryWithDyanmicInsert() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
            "import org.drools.Person \n" +
            "global java.util.List list\n" +
            "query peeps( Person $p, String $name, String $likes, int $age ) \n" +
            "    $p := Person( ) from new Person( $name, $likes, $age ) \n"+
            "end\n";

        str += "rule x1\n" +
            "when\n" +
            "    $n1 : String( )\n" +
            "    not Person( name == 'darth' )\n "+
            //     output, input     ,input                 ,input
            "    ?peeps($p; $name : $n1, $likes : \"stilton\", $age : 100 )\n" +
            "then\n" +
            "   insert( $p );\n" +
            "end \n";
       
        str += "rule x2\n" +
            "when\n" +
            "    $p : Person( )\n" +
            "then\n" +
            "   list.add( $p );\n" +
            "end \n";       
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        Person p1 = new Person( "darth",
                                "stilton",
                                100 );
       
        Person p2 = new Person( "yoda",
                                "stilton",
                                100 );       
       
        ksession.insert( "darth" );
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();       
        ksession.insert( "yoda" ); // darth exists, so yoda won't get created
        ksession = getSerialisedStatefulKnowledgeSession( ksession,
                                                          true );          
        ksession.fireAllRules();
        assertEquals( 1, list.size());
        assertEquals( p1, list.get(0));         
   
   
    @Test
    public void testQueryWithOr() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +
           
            "import java.util.List\n" +
            "import java.util.ArrayList\n" +
           
            "global List list\n" +
           
            "dialect \"mvel\"\n" +           
            "\n" +
           
            "import org.drools.integrationtests.BackwardChainingTest.Q\n" +
            "import org.drools.integrationtests.BackwardChainingTest.R\n" +
            "import org.drools.integrationtests.BackwardChainingTest.S\n" +                     
           
//            "declare Q\n" +
//            "    value : int\n" +
//            "end \n" +
//            "\n" +
//            "declare R\n" +
//            "    value : int\n" +
//            "end \n" +
//            "\n" +
//            "declare S\n" +
//            "    value : int\n" +
//            "end \n" +
            "\n" +
            "query q(int x)\n" +
            "    Q( x := value; )\n" +
            "end\n" +
            "\n" +
            "query r(int x)\n" +
            "    R( x := value; )\n" +
            "end\n" +
            "\n" +
            "query s(int x)\n" +
            "    S( x := value; )    \n" +
            "end\n" +
            "\n" +
           
            "query p(int x)\n" +
            "    (?q(x;) and ?r(x;) ) \n" +
            "    or\n" +
            "    ?s(x;)\n" +
            "end\n" +
           
            "rule init when\n" +
            "then\n" +
            " insert( new Q(1) );\n " +
            " insert( new R(1) );\n " +
            " insert( new R(2) );\n " +
            " insert( new S(2) );\n " +
            " insert( new S(3) );\n " +
            "end\n"
           
//            "rule show when\n" +
//            "    o : Object()\n" +
//            "then\n" +
//            " System.out.println( o );\n " +
//            "end\n" +            
            "";       
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
       
        ksession.fireAllRules();

        QueryResults results = null;
        results = ksession.getQueryResults( "p", new Integer[] { 1 }  );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "result( " + result.get( "x" ) + " )" );
        }
       
        System.out.println( );
       
        results = ksession.getQueryResults( "p", new Integer[] { 2 }  );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "result( " + result.get( "x" ) + " )" );
        }
       
        System.out.println( );
       
        results = ksession.getQueryResults( "p", new Integer[] { 3 }  );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "result( " + result.get( "x" ) + " )" );
        }                
    }     
   
    @Test
    public void testGeneology() throws Exception {
        // from http://kti.mff.cuni.cz/~bartak/prolog/genealogy.html
           
        String str = "" +
            "package org.drools.test  \n" +
            "global java.util.List list\n" +
            "dialect \"mvel\"\n" +                  
                                   
            "query man( String name ) \n" +
            "   org.drools.integrationtests.BackwardChainingTest.Man( name := name ) \n"+
            "end\n" +
       
            "query woman( String name ) \n" +
            "   org.drools.integrationtests.BackwardChainingTest.Woman( name := name ) \n"+
            "end\n" +   
           
            "query parent( String parent, String child ) \n" +
            "   org.drools.integrationtests.BackwardChainingTest.Parent( parent := parent, child := child ) \n"+
            "end\n" +             
           
            "query father( String father, String child ) \n" +
            "   ?man( father; ) \n"+
            "   ?parent( father, child; ) \n"+
            "end\n" +
           
            "query mother( String mother, String child ) \n" +
            "   ?woman( mother; ) \n"+
            "   ?parent( mother, child; ) \n"+
            "end\n" +            
       
            "query son( String son, String parent ) \n" +
            "   ?man( son; ) \n"+
            "   ?parent( parent, son; ) \n"+
            "end\n" +
       
            "query daughter( String daughter, String parent ) \n" +
            "   ?woman( daughter; ) \n"+
            "   ?parent( parent, daughter; ) \n"+
            "end\n" +
           
            "query siblings( String c1, String c2 ) \n" +
            "   ?parent( $p, c1; ) \n" +
            "   ?parent( $p, c2; ) \n"+
            "   eval( !c1.equals( c2 ) )\n"+
            "end\n"+       
       
            "query fullSiblings( String c1, String c2 )\n" +
            "   ?parent( $p1, c1; ) ?parent( $p1, c2; )\n" +
            "   ?parent( $p2, c1; ) ?parent( $p2, c2; )\n" +
            "   eval( !c1.equals( c2 ) && !$p1.equals( $p2 )  )\n"+
            "end\n" +
           
            "query fullSiblings2( String c1, String c2 )\n" +
            "   ?father( $p1, c1; ) ?father( $p1, c2; )\n" +
            "   ?mother( $p2, c1; ) ?mother( $p2, c2; )\n" +
            "   eval( !c1.equals( c2 ) )\n"+
            "end\n" +   
   
            "query uncle( String uncle, String n )\n" +
            "   ?man( uncle; ) ?siblings( uncle, parent; )\n" +
            "   ?parent( parent, n; )\n " +
            "end\n" +  
       
            "query aunt( String aunt, String n )\n" +
            "   ?woman( aunt; ) ?siblings( aunt, parent; )\n" +
            "   ?parent( parent, n; )\n " +
            "end\n" +
           
            "query grantParents( String gp, String gc )\n" +
            "   ?parent( gp, p; ) ?parent( p, gc; )\n" +
            "end\n";           
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );
   
        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }
   
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
   
        kbase = SerializationHelper.serializeObject( kbase );
   
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );    

        // grand parents
        ksession.insert( new Man("john") );
        ksession.insert( new Woman("janet") );
       
        // parent
        ksession.insert( new Man("adam") );
        ksession.insertnew Parent( "john", "adam") );
        ksession.insertnew Parent( "janet", "adam") );
       
        ksession.insert( new Man("stan") );
        ksession.insertnew Parent( "john", "stan") );
        ksession.insertnew Parent( "janet", "stan") );       
       
        // grant parents
        ksession.insert( new Man("carl") );
        ksession.insert( new Woman("tina") );       
        // parent        
        ksession.insert( new Woman("eve") );       
        ksession.insertnew Parent( "carl", "eve") );
        ksession.insertnew Parent( "tina", "eve") );

       
        // parent        
        ksession.insert( new Woman("mary") )
        ksession.insertnew Parent( "carl", "mary") );
        ksession.insertnew Parent( "tina", "mary") );        
       
       
        ksession.insert( new Man("peter") );
        ksession.insert( new Parent( "adam", "peter" ) );       
        ksession.insert( new Parent( "eve", "peter" ) );
       
       
        ksession.insert( new Man("paul") );
        ksession.insert( new Parent( "adam", "paul" ) );
        ksession.insert( new Parent( "mary", "paul" ) );
               

        ksession.insert( new Woman("jill") );
        ksession.insert( new Parent( "adam", "jill" ) );       
        ksession.insert( new Parent( "eve", "jill" ) );
       
        QueryResults results = null;
       
        System.out.println("woman");        
        results = ksession.getQueryResults( "woman", new Object[] { variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + result.get( "name" ) );
        }
       
        System.out.println("\nman");       
        results = ksession.getQueryResults( "man", new Object[] { variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + result.get( "name" ) );
        }  
       
        System.out.println("\nfather");
        results = ksession.getQueryResults( "father", new Object[] {variable,  variable  } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "father( " + result.get( "father" ) + ", " + result.get( "child" ) + " )" );
        }      
       
        System.out.println("\nmother");
        results = ksession.getQueryResults( "mother", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "mother( " + result.get( "mother" ) + ", " + result.get( "child" ) + " )" );
        }   
       
        System.out.println("\nson");
        results = ksession.getQueryResults( "son", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "son( " + result.get( "son" ) + ", " + result.get( "parent" ) + " )" );
        }    
       
        System.out.println("\ndaughter");
        results = ksession.getQueryResults( "daughter", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "daughter( " + result.get( "daughter" ) + ", " + result.get( "parent" ) + " )" );
        }        
       
        System.out.println("\nsiblings");
        results = ksession.getQueryResults( "siblings", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "sibling( " + result.get( "c1" ) + ", " + result.get( "c2" ) + " )" );
        }    
       
        System.out.println("\nfullSiblings");
        results = ksession.getQueryResults( "fullSiblings", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "fullSiblings( " + result.get( "c1" ) + ", " + result.get( "c2" ) + " )" );
        }       

        System.out.println("\nfullSiblings2");
        results = ksession.getQueryResults( "fullSiblings", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "fullSiblings2( " + result.get( "c1" ) + ", " + result.get( "c2" ) + " )" );
       
       
        System.out.println("\nuncle");
        results = ksession.getQueryResults( "uncle", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "uncle( " + result.get( "uncle" ) + ", " + result.get( "n" ) + " )" );
        }       
       
        System.out.println("\naunt");
        results = ksession.getQueryResults( "aunt", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "aunt( " + result.get( "aunt" ) + ", " + result.get( "n" ) + " )" );
        }
       
        System.out.println("\ngrantParents");
        results = ksession.getQueryResults( "grantParents", new Object[] { variable,  variable } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + "grantParents( " + result.get( "gp" ) + ", " + result.get( "gc" ) + " )" );
        }         
    }
   
    @Test
    public void testNaniSearch() throws Exception {
        // http://www.amzi.com/AdventureInProlog/advtop.php
           
        String str = "" +
            "package org.drools.test  \n" +
           
            "import java.util.List\n" +
            "import java.util.ArrayList\n" +
           
            "global List list\n" +
           
            "dialect \"mvel\"\n" +  
           
            "declare Room" +
            "    name : String\n" +
            "end\n" +
            "\n" +
            "declare Location\n" +
            "    thing : String \n" +
            "    location : String \n" +
            "end" +
            "\n" +
            "declare Door\n" +
            "   fromLocation : String\n" +
            "   toLocation : String\n" +
            "end" +
            "\n" +
            "declare Edible\n" +
            "   thing : String\n" +
            "end" +    
            "\n" +
            "declare TastesYucky\n" +
            "   thing : String\n" +
            "end" +       
            "\n" +
            "declare TastesYucky\n" +
            "   thing : String\n" +
            "end\n" +
            "\n"
            "declare Here\n" +
            "   place : String \n" +
            "end\n" +
            "\n" +              
       
            "query whereFood( String thing, String location ) \n" +
            "    ( Location(thing, location;) and\n"+
            "      Edible(thing;) )\n " +
            "    or \n"+
            "    ( Location(thing, location;) and\n"+
            "      TastesYucky(thing;) ) \n"+           
            "end\n" +
            "\n" +  
       
            "query connect( String x, String y ) \n" +
            "    Door(x, y;)\n"+
            "    or \n"+
            "    Door(y, x;)\n"+         
            "end\n" +
            "\n" +    
            "\n" +
            "query isContainedIn( String x, String y ) \n" +
            "    Location(x, y;)\n"+
            "    or \n"+
            "    ( Location(z, y;) and ?isContainedIn(x, z;) )\n"+         
            "end\n" +           
            "\n" +             
            "query look(String place, List things, List food, List exits) \n" +
            "    Here(place;)\n"+           
            "    things := List() from accumulate( Location(thing, place;),\n" +
            "                                    collectList( thing ) )\n" +  
            "    food := List() from accumulate( ?whereFood(thing, place;) ," +
            "                                    collectList( thing ) )\n" +               
           
            "    exits := List() from accumulate( ?connect(place, exit;),\n" +
            "                                    collectList( exit ) )\n" +       
            "end\n" +
            "\n" +
            "rule reactiveLook when\n" +
            "    Here( place : place) \n"+
            "    ?look(place, things, food, exits;)\n"+
            "then\n" +
            "    System.out.println( \"You are in the \" + place);\n" +
            "    System.out.println( \"  You can see \" + things );\n" +
            "    System.out.println( \"  You can eat \" + food );\n" +            
            "    System.out.println( \"  You can go to \" + exits );\n" +
            "end\n" +
            "\n" +
            "rule init when\n" +
            "then\n" +
            "        insert( new Room(\"kitchen\") );\n" +
            "        insert( new Room(\"office\") );\n" +
            "        insert( new Room(\"hall\") );\n" +
            "        insert( new Room(\"dining room\") );\n" +
            "        insert( new Room(\"cellar\") );\n" +
            "        \n" +
            "        insert( new Location(\"apple\", \"kitchen\") );\n" +
           
            "        insert( new Location(\"desk\", \"office\") );\n" +            
            "        insert( new Location(\"flashlight\", \"desk\") );\n" +
            "        insert( new Location(\"envelope\", \"desk\") );\n" +
            "        insert( new Location(\"key\", \"envelope\") );\n" +
           
           
            "        insert( new Location(\"washing machine\", \"cellar\") );\n" +
            "        insert( new Location(\"nani\", \"washing machine\") );\n" +
            "        insert( new Location(\"broccoli\", \"kitchen\") );\n" +
            "        insert( new Location(\"crackers\", \"kitchen\") );\n" +
            "        insert( new Location(\"compuer\", \"office\") );\n" +
            "        \n" +
            "        insert( new Door(\"office\", \"hall\") );\n" +
            "        insert( new Door(\"kitchen\", \"office\") );\n" +
            "        insert( new Door(\"hall\", \"dining room\") );\n" +
            "        insert( new Door(\"kitchen\", \"cellar\") );\n" +
            "        insert( new Door(\"dining room\", \"kitchen\") );\n" +
            "        \n"
            "        insert( new Edible(\"apple\") );\n" +
            "        insert( new Edible(\"crackers\") );\n" +
            "        \n" +
            "        insert( new TastesYucky(\"broccoli\") );  " +
            "end\n" +
            "" +
            "rule go1 when\n" +
            "   String( this == 'go1' )\n" +
            "then\n" +
            "   insert( new Here(\"kitchen\") );\n" +
            "end\n" +
            "\n" +
            "rule go2 when\n" +
            "   String( this == 'go2' )\n" +
            "   $h : Here( place == \"kitchen\")" +
            "then\n" +
            "   modify( $h ) { place = \"office\" };\n" +
            "end\n"           
            ;           
           
        System.out.println( str );
       
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );
   
        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }       
   
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
   
        kbase = SerializationHelper.serializeObject( kbase );
   
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );          
       
        QueryResults results = null;
        ksession.fireAllRules();
       
        ksession.insert( "go1" );
        ksession.fireAllRules();   
       
        ksession.insert( "go2" );
        ksession.fireAllRules();      
       
        System.out.println("isContainedIn key in office");        
        results = ksession.getQueryResults( "isContainedIn", new Object[] { "key", "office" } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + result.get( "x" )+ ":"+ result.get( "y" ) );
        }
       
        System.out.println("isContainedIn apple in office");        
        results = ksession.getQueryResults( "isContainedIn", new Object[] { "apple", "office" } );
        for ( QueryResultsRow result : results ) {
            System.out.println( "  " + result.get( "x" )+ ":"+ result.get( "y" ) );
        }        
               
    }   
   
    public static class Man {
        private String name;     

        public Man(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }     
    }
   
    public static class Woman {
        private String name;     

        public Woman(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }     
    } 
   
    public static class Parent {
        private String parent;
        private String child;
       
        public Parent(String parent,
                      String child) {
            this.parent = parent;
            this.child = child;
        }
       
        public String getParent() {
            return parent;
        }
       
        public void setParent(String parent) {
            this.parent = parent;
        }
       
        public String getChild() {
            return child;
        }
       
        public void setChild(String child) {
            this.child = child;
        }
    }
   
//    public static class Room {
//        private String name;
//
//        public Room(String name) {
//            this.name = name;
//        }
//
//        public String getName() {
//            return name;
//        }
//
//        public void setName(String name) {
//            this.name = name;
//        }
//       
//    }
//   
//    public static class Location {
//        private String thing;
//        private String location;
//       
//        public Location(String thing,
//                        String location) {
//            this.thing = thing;
//            this.location = location;
//        }
//
//        public String getThing() {
//            return thing;
//        }
//
//        public void setThing(String thing) {
//            this.thing = thing;
//        }
//
//        public String getLocation() {
//            return location;
//        }
//
//        public void setLocation(String location) {
//            this.location = location;
//        }
//    }
//   
//    public static class Door {
//        private String fromLocation;
//        private String toLocation;
//       
//        public Door(String fromLocation,
//                    String toLocation) {
//            this.fromLocation = fromLocation;
//            this.toLocation = toLocation;
//        }
//        public String getFromLocation() {
//            return fromLocation;
//        }
//        public void setFromLocation(String fromLocation) {
//            this.fromLocation = fromLocation;
//        }
//        public String getToLocation() {
//            return toLocation;
//        }
//        public void setToLocation(String toLocation) {
//            this.toLocation = toLocation;
//        }  
//    }
//   
//    public static class Edible {
//        private String thing;
//
//        public Edible(String thing) {
//            this.thing = thing;
//        }
//
//        public String getThing() {
//            return thing;
//        }
//
//        public void setThing(String thing) {
//            this.thing = thing;
//        }       
//    }
//   
//    public static class TastesYucky {
//        private String thing;
//
//        public TastesYucky(String thing) {
//            this.thing = thing;
//        }
//
//        public String getThing() {
//            return thing;
//        }
//
//        public void setThing(String thing) {
//            this.thing = thing;
//        }       
//    }   
//   
//    public static class TurnedOff {
//        private String thing;
//
//        public TurnedOff(String thing) {
//            this.thing = thing;
//        }
//
//        public String getThing() {
//            return thing;
//        }
//
//        public void setThing(String thing) {
//            this.thing = thing;
//        }
//    }
//   
//    public static class Here {
//        private String location;
//
//        public Here(String location) {
//            this.location = location;
//        }
//
//        public String getLocation() {
//            return location;
//        }
//
//        public void setLocation(String location) {
//            this.location = location;
//        }
//    }
   
    public static class Q {
        int value;

        public Q(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
        public String toString() {
            return "Q" + value;
        }       
    }
   
    public static class R {
        int value;

        public R(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
        public String toString() {
            return "R" + value;
        }
    }   
   
    public static class S {
        int value;

        public S(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
        public String toString() {
            return "S" + value;
        }
    }   
   
   
}
TOP

Related Classes of org.drools.integrationtests.BackwardChainingTest$Parent

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.