/*
* 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.factmodel.traits;
import org.drools.compiler.CommonTestMethodBase;
import org.drools.core.factmodel.traits.TraitFactory;
import org.drools.core.factmodel.traits.VirtualPropertyMode;
import org.junit.Test;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TraitMapCoreTest extends CommonTestMethodBase {
@Test(timeout=10000)
public void testMapCoreManyTraits( ) {
String source = "package org.drools.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"" +
"global List list;\n " +
"\n" +
"declare HashMap @Traitable end \n" +
"" +
"\n" +
"global List list; \n" +
"\n" +
"declare trait PersonMap\n" +
"@propertyReactive \n" +
" name : String \n" +
" age : int \n" +
" height : Double \n" +
"end\n" +
"\n" +
"declare trait StudentMap\n" +
"@propertyReactive\n" +
" ID : String\n" +
" GPA : Double = 3.0\n" +
"end\n" +
"\n" +
"rule Don \n" +
"no-loop \n" +
"when \n" +
" $m : Map( this[ \"age\"] == 18 )\n" +
"then \n" +
" Object obj1 = don( $m, PersonMap.class );\n" +
" Object obj2 = don( obj1, StudentMap.class );\n" +
" System.out.println( \"done: PersonMap\" );\n" +
"\n" +
"end\n" +
"\n";
StatefulKnowledgeSession ks = loadKnowledgeBaseFromString( source ).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ks.getKieBase() );
List list = new ArrayList();
ks.setGlobal( "list", list );
Map<String,Object> map = new HashMap<String, Object>( );
map.put( "name", "john" );
map.put( "age", 18 );
ks.insert( map );
ks.fireAllRules();
for ( Object o : ks.getObjects() ) {
System.err.println( o );
}
assertEquals( 3.0, map.get( "GPA" ) );
}
@Test(timeout=10000)
public void donMapTest() {
String source = "package org.drools.traits.test; \n" +
"import java.util.*\n;" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"" +
"global List list; \n" +
"" +
"declare HashMap @Traitable end \n" +
"" +
"declare trait PersonMap" +
"@propertyReactive \n" +
" name : String \n" +
" age : int \n" +
" height : Double \n" +
"end\n" +
"" +
"" +
"rule Don \n" +
"when \n" +
" $m : Map( this[ \"age\"] == 18 ) " +
"then \n" +
" don( $m, PersonMap.class );\n" +
"end \n" +
"" +
"rule Log \n" +
"when \n" +
" $p : PersonMap( name == \"john\", age > 10 ) \n" +
"then \n" +
" System.out.println( $p ); \n" +
" modify ( $p ) { \n" +
" setHeight( 184.0 ); \n" +
" }" +
" System.out.println( $p ); " +
"end \n";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString( source ).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ksession.getKieBase() );
List list = new ArrayList();
ksession.setGlobal( "list", list );
Map map = new HashMap();
map.put( "name", "john" );
map.put( "age", 18 );
ksession.insert( map );
ksession.fireAllRules();
assertTrue( map.containsKey( "height" ) );
assertEquals( map.get( "height"), 184.0 );
}
@Test(timeout=10000)
public void testMapCore2( ) {
String source = "package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"" +
"global List list;\n " +
"" +
"declare HashMap @Traitable end \n" +
"\n" +
"\n" +
"global List list; \n" +
"\n" +
"declare trait PersonMap\n" +
"@propertyReactive \n" +
" name : String \n" +
" age : int \n" +
" height : Double \n" +
"end\n" +
"\n" +
"declare trait StudentMap\n" +
"@propertyReactive\n" +
" ID : String\n" +
" GPA : Double = 3.0\n" +
"end\n" +
"\n" +
"rule Don \n" +
"when \n" +
" $m : Map( this[ \"age\"] == 18, this[ \"ID\" ] != \"100\" )\n" +
"then \n" +
" don( $m, PersonMap.class );\n" +
" System.out.println( \"done: PersonMap\" );\n" +
"\n" +
"end\n" +
"\n" +
"rule Log \n" +
"when \n" +
" $p : PersonMap( name == \"john\", age > 10 )\n" +
"then \n" +
" modify ( $p ) { \n" +
" setHeight( 184.0 ); \n" +
" }\n" +
" System.out.println(\"Log: \" + $p );\n" +
"end\n" +
"" +
"" +
"rule Don2\n" +
"salience -1\n" +
"when\n" +
" $m : Map( this[ \"age\"] == 18, this[ \"ID\" ] != \"100\" ) " +
"then\n" +
" don( $m, StudentMap.class );\n" +
" System.out.println( \"done2: StudentMap\" );\n" +
"end\n" +
"" +
"" +
"rule Log2\n" +
"salience -2\n" +
"no-loop\n" +
"when\n" +
" $p : StudentMap( $h : fields[ \"height\" ], GPA >= 3.0 ) " +
"then\n" +
" modify ( $p ) {\n" +
" setGPA( 4.0 ),\n" +
" setID( \"100\" );\n" +
" }\n" +
" System.out.println(\"Log2: \" + $p );\n" +
"end\n" +
"" +
"" +
"\n" +
"rule Shed1\n" +
"salience -5// it seams that the order of shed must be the same as applying don\n" +
"when\n" +
" $m : PersonMap()\n" +
"then\n" +
" shed( $m, PersonMap.class );\n" +
" System.out.println( \"shed: PersonMap\" );\n" +
"end\n" +
"\n" +
"rule Shed2\n" +
"salience -9\n" +
"when\n" +
" $m : StudentMap()\n" +
"then\n" +
" shed( $m, StudentMap.class );\n" +
" System.out.println( \"shed: StudentMap\" );\n" +
"end\n" +
"" +
"rule Last \n" +
"salience -99 \n" +
"when \n" +
" $m : Map( this not isA StudentMap.class )\n" +
"then \n" +
" System.out.println( \"Final\" );\n" +
" $m.put( \"final\", true );" +
"\n" +
"end\n" +
"\n" +
"\n";
StatefulKnowledgeSession ks = loadKnowledgeBaseFromString( source ).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ks.getKieBase() );
List list = new ArrayList();
ks.setGlobal( "list", list );
Map<String,Object> map = new HashMap<String, Object>( );
map.put( "name", "john" );
map.put( "age", 18 );
ks.insert( map );
ks.fireAllRules();
for ( Object o : ks.getObjects() ) {
System.err.println( o );
}
assertEquals( "100", map.get( "ID" ) );
assertEquals( 184.0, map.get( "height" ) );
assertEquals( 4.0, map.get( "GPA" ) );
assertEquals( true, map.get( "final" ) );
}
@Test(timeout=10000)
public void testMapCoreAliasing( ) {
String source = "package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.*;\n" +
"" +
"global List list;\n " +
"" +
"declare HashMap @Traitable() end \n" +
"\n" +
"global List list; \n" +
"\n" +
"declare trait PersonMap\n" +
"@propertyReactive \n" +
" name : String \n" +
" age : Integer @Alias( \"years\" ) \n" +
" eta : Integer @Alias( \"years\" ) \n" +
" height : Double @Alias( \"tall\" ) \n" +
" sen : String @Alias(\"years\") \n " +
"end\n" +
"\n" +
"rule Don \n" +
"when \n" +
" $m : Map()\n" +
"then \n" +
" don( $m, PersonMap.class );\n" +
"\n" +
"end\n" +
"\n" +
"rule Log \n" +
"when \n" +
" $p : PersonMap( name == \"john\", age > 10 && < 35 )\n" +
"then \n" +
" modify ( $p ) { \n" +
" setHeight( 184.0 ), \n" +
" setEta( 42 ); \n" +
" }\n" +
" System.out.println(\"Log: \" + $p );\n" +
"end\n" +
"" +
"\n";
StatefulKnowledgeSession ks = loadKnowledgeBaseFromString( source ).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ks.getKieBase() );
List list = new ArrayList();
ks.setGlobal( "list", list );
Map<String,Object> map = new HashMap<String, Object>( );
map.put( "name", "john" );
map.put( "years", new Integer( 18 ) );
ks.insert( map );
ks.fireAllRules();
for ( Object o : ks.getObjects() ) {
System.err.println( o );
}
assertEquals( 42, map.get( "years" ) );
assertEquals( 184.0, map.get( "tall" ) );
}
@Test(timeout=10000)
public void testMapCoreAliasingLogicalTrueWithTypeClash( ) {
String source = "package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.*;\n" +
"" +
"global List list;\n " +
"" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"global List list; \n" +
"\n" +
"declare trait PersonMap\n" +
"@propertyReactive \n" +
" name : String \n" +
" age : Integer @Alias( \"years\" ) \n" +
" eta : Integer @Alias( \"years\" ) \n" +
" height : Double @Alias( \"tall\" ) \n" +
" sen : String @Alias(\"years\") \n " +
"end\n" +
"\n" +
"rule Don \n" +
"when \n" +
" $m : Map()\n" +
"then \n" +
// will fail due to the alias "sen", typed String and incompatible with Int
" PersonMap pm = don( $m, PersonMap.class ); \n" +
" list.add ( pm ); \n" +
"\n" +
"end\n" +
"\n" +
"" +
"\n";
StatefulKnowledgeSession ks = loadKnowledgeBaseFromString( source ).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ks.getKieBase() );
List list = new ArrayList();
ks.setGlobal( "list", list );
Map<String,Object> map = new HashMap<String, Object>( );
map.put( "name", "john" );
map.put( "years", new Integer( 18 ) );
ks.insert( map );
ks.fireAllRules();
assertTrue( list.size() == 1 && list.get( 0 ) == null );
}
@Test
public void testDrools216(){
String drl = "" +
"\n" +
"\n" +
"package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.Alias\n" +
"\n" +
"global java.util.List list;\n" +
"\n" +
"declare HashMap @Traitable(logical=true) end \n" +
"\n" +
"declare trait Citizen\n" +
"@traitable\n" +
" citizenship : String = \"Unknown\"\n" +
"end\n" +
"\n" +
"declare trait Student extends Citizen\n" +
"@propertyReactive\n" +
" ID : String = \"412314\" @Alias(\"personID\")\n" +
" GPA : Double = 3.99\n" +
"end\n" +
"\n" +
"declare Person\n" +
"@Traitable\n" +
" personID : String\n" +
" isStudent : boolean\n" +
"end\n" +
"\n" +
"declare trait Worker\n" +
"@propertyReactive\n" +
" hasBenefits : Boolean = true\n" +
"end\n" +
"\n" +
"\n" +
"rule \"1\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Person p = new Person(\"1020\",true);\n" +
" Map map = new HashMap();\n" +
" map.put(\"isEmpty\",true);\n" +
" insert(p);\n" +
" insert(map);\n" +
" list.add(\"initialized\");\n" +
"end\n" +
"\n" +
"rule \"2\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $stu : Person(isStudent == true)\n" +
" $map : Map(this[\"isEmpty\"] == true)\n" +
"then\n" +
" Student s = don( $stu , Student.class );\n" +
" $map.put(\"worker\" , s);\n" +
" $map.put(\"isEmpty\" , false);\n" +
" update($map);\n" +
" System.out.println(\"don: Person -> Student \");\n" +
" list.add(\"student is donned\");\n" +
"end\n" +
"\n" +
"rule \"3\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $map : Map($stu : this[\"worker\"] isA Student.class)\n" +
"then\n" +
" Object obj = don( $map , Worker.class );\n" +
" System.out.println(\"don: Map -> Worker : \"+obj);\n" +
" list.add(\"worker is donned\");\n" +
"end\n";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal( "list", list );
ksession.fireAllRules();
assertTrue(list.contains("initialized"));
assertTrue(list.contains("student is donned"));
assertTrue(list.contains("worker is donned"));
}
@Test
public void testDrools217(){
String drl = "" +
"\n" +
"package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.Alias\n" +
"\n" +
"global java.util.List list;\n" +
"" +
"declare HashMap @Traitable(logical=true) end \n" +
"\n" +
"declare trait Citizen\n" +
"@traitable\n" +
" citizenship : String = \"Unknown\"\n" +
"end\n" +
"\n" +
"declare trait Student extends Citizen\n" +
"@propertyReactive\n" +
" ID : String = \"412314\" @Alias(\"personID\")\n" +
" GPA : Double = 3.99\n" +
"end\n" +
"\n" +
"declare Person\n" +
"@Traitable\n" +
" personID : String\n" +
" isStudent : boolean\n" +
"end\n" +
"\n" +
"declare trait Worker\n" +
"@propertyReactive\n" +
" hasBenefits : Boolean = true\n" +
"end\n" +
"\n" +
"\n" +
"rule \"1\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Person p = new Person(\"1020\",true);\n" +
" Map map = new HashMap();\n" +
" map.put(\"isEmpty\",true);\n" +
" insert(p);\n" +
" insert(map);\n" +
" list.add(\"initialized\");\n" +
"end\n" +
"\n" +
"rule \"2\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $stu : Person(isStudent == true)\n" +
" $map : Map(this[\"isEmpty\"] == true)\n" +
"then\n" +
" Student s = don( $stu , Student.class );\n" +
" $map.put(\"worker\" , s);\n" +
" $map.put(\"isEmpty\" , false);\n" +
" update($map);\n" +
" System.out.println(\"don: Person -> Student \");\n" +
" list.add(\"student is donned\");\n" +
"end\n" +
"\n" +
"rule \"3\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $map : Map($stu : this[\"worker\"], $stu isA Student.class)\n" +
"then\n" +
" Object obj = don( $map , Worker.class );\n" +
" System.out.println(\"don: Map -> Worker : \"+obj);\n" +
" list.add(\"worker is donned\");\n" +
"end\n";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list", list);
ksession.fireAllRules();
assertTrue(list.contains("initialized"));
assertTrue(list.contains("student is donned"));
assertTrue(list.contains("worker is donned"));
}
@Test
public void testDrools218(){
String drl = "" +
"\n" +
"package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.Alias\n" +
"\n" +
"global java.util.List list;\n" +
"\n" +
"declare trait Citizen\n" +
"@traitable\n" +
" citizenship : String = \"Unknown\"\n" +
"end\n" +
"\n" +
"declare HashMap @Traitable(logical=true) end \n" +
"" +
"" +
"declare trait Student extends Citizen\n" +
"@propertyReactive\n" +
" ID : String = \"412314\" @Alias(\"personID\")\n" +
" GPA : Double = 3.99\n" +
"end\n" +
"\n" +
"declare Person\n" +
"@Traitable\n" +
" personID : String\n" +
" isStudent : boolean\n" +
"end\n" +
"\n" +
"declare trait Worker\n" +
"@propertyReactive\n" +
" //customer : Citizen\n" +
" hasBenefits : Boolean = true\n" +
"end\n" +
"\n" +
"declare trait StudentWorker extends Worker\n" +
"@propertyReactive\n" +
" //currentStudent : Citizen @Alias(\"customer\")\n" +
" tuitionWaiver : Boolean @Alias(\"hasBenefits\")\n" +
"end\n" +
"\n" +
"rule \"1\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Person p = new Person(\"1020\",true);\n" +
" Map map = new HashMap();\n" +
" map.put(\"isEmpty\",true);\n" +
" insert(p);\n" +
" insert(map);\n" +
" list.add(\"initialized\");\n" +
"end\n" +
"\n" +
"rule \"2\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $stu : Person(isStudent == true)\n" +
" $map : Map(this[\"isEmpty\"] == true)\n" +
"then\n" +
" Student s = don( $stu , Student.class );\n" +
" $map.put(\"worker\" , s);\n" +
" $map.put(\"isEmpty\" , false);\n" +
" $map.put(\"hasBenefits\",null);\n" +
" update($map);\n" +
" System.out.println(\"don: Person -> Student \");\n" +
" list.add(\"student is donned\");\n" +
"end\n" +
"\n" +
"rule \"3\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $map : Map($stu : this[\"worker\"])\n" +
" Map($stu isA Student.class, this == $map)\n" +
"then\n" +
" Object obj = don( $map , Worker.class );\n" +
" System.out.println(\"don: Map -> Worker : \"+obj);\n" +
" list.add(\"worker is donned\");\n" +
"end\n" +
"\n" +
"rule \"4\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $stu : Student()\n" +
"then\n" +
" Object obj = don( $stu , StudentWorker.class );\n" +
" System.out.println(\"don: Map -> StudentWorker : \"+obj);\n" +
" list.add(\"studentworker is donned\");\n" +
"end\n" +
"\n" +
"rule \"5\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" StudentWorker(tuitionWaiver == true)\n" +
"then\n" +
" System.out.println(\"tuitionWaiver == true\");\n" +
" list.add(\"tuitionWaiver is true\");\n" +
"end\n" +
"\n";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal( "list", list );
ksession.fireAllRules();
assertTrue(list.contains("initialized"));
assertTrue(list.contains("student is donned"));
assertTrue(list.contains("worker is donned"));
assertTrue(list.contains("studentworker is donned"));
assertTrue(list.contains("tuitionWaiver is true"));
}
@Test
public void testDrools219(){
String drl = "" +
"\n" +
"\n" +
"package org.drools.core.factmodel.traits.test;\n" +
"\n" +
"import java.util.*;\n" +
"import org.drools.core.factmodel.traits.Alias\n" +
"\n" +
"global java.util.List list;\n" +
"\n" +
"\n" +
"declare trait Citizen\n" +
" citizenship : String = \"Unknown\"\n" +
" socialSecurity : String = \"0\"\n" +
"end\n" +
"\n" +
"declare trait Student extends Citizen\n" +
"@propertyReactive\n" +
" ID : String = \"412314\" @Alias(\"personID\") \n" +
" GPA : Double = 3.99\n" +
" SSN : String = \"888111155555\" @Alias(\"socialSecurity\")\n" +
"end\n" +
"\n" +
"declare Person\n" +
"@Traitable(logical=true)\n" +
" personID : String\n" +
" isStudent : boolean\n" +
"end\n" +
"\n" +
"rule \"1\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Person p = new Person( null, true );\n" +
" insert(p);\n" +
" list.add(\"initialized\");\n" +
"end\n" +
"\n" +
"rule \"2\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $stu : Person(isStudent == true)\n" +
"then\n" +
" Student s = don( $stu , Student.class );\n" +
" System.out.println(\"don: Person -> Student \" + s);\n" +
" list.add(\"student is donned\");\n" +
"end\n" +
"\n" +
"rule \"3\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $stu : Student(ID == \"412314\", SSN == \"888111155555\")\n" +
"then\n" +
" list.add(\"student has ID and SSN\");\n" +
"end\n" +
"\n" +
"rule \"4\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" Student(fields[\"personID\"] == \"412314\", fields[\"socialSecurity\"] == \"888111155555\")\n" +
"then\n" +
" list.add(\"student has personID and socialSecurity\");\n" +
"end\n" +
"\n" +
"rule \"5\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $ctz : Citizen(socialSecurity == \"888111155555\")\n" +
"then\n" +
" list.add(\"citizen has socialSecurity\");\n" +
"end\n" +
"\n" +
"rule \"6\"\n" +
"salience 1\n" +
"no-loop\n" +
"when\n" +
" $p : Person(personID == \"412314\")\n" +
"then\n" +
" list.add(\"person has personID\");\n" +
"end\n";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal( "list", list );
ksession.fireAllRules();
assertTrue(list.contains("initialized"));
assertTrue(list.contains("student is donned"));
assertTrue(list.contains("student has ID and SSN"));
assertTrue(list.contains("student has personID and socialSecurity"));
assertTrue(list.contains("citizen has socialSecurity"));
assertTrue(list.contains("person has personID"));
}
@Test
public void testMapTraitsMismatchTypes()
{
String drl = "" +
"package org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" +
"declare org.drools.factmodel.MapCore\n" +
"@Traitable( logical = true )\n" +
"end\n" +
"" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"\n" +
"declare trait ParentTrait\n" +
"@propertyReactive\n" +
" name : String\n" +
" id : int\n" +
"end\n" +
"\n" +
"declare trait ChildTrait\n" +
"@propertyReactive\n" +
" naam : String\n" +
" id : float \n" +
"end\n" +
"\n" +
"rule \"don1\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()\n" +
"then\n" +
// fails since current value for id is float, incompatible with int
" ParentTrait pt = don( $map , ParentTrait.class );\n" +
// success
" ChildTrait ct = don( $map , ChildTrait.class );\n" +
"" +
" System.out.println( $map ); \n" +
" list.add( pt );\n" +
" list.add( ct );\n" +
"end";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
Map<String,Object> map = new HashMap<String, Object>();
map.put( "name","hulu" );
map.put( "id", 3.4f );
ksession.insert( map );
ksession.fireAllRules();
assertEquals( 2, list.size() );
assertNull( list.get( 0 ) );
assertNotNull( list.get( 1 ) );
}
@Test
public void testMapTraitNoType()
{
String drl = "" +
"package openehr.test;//org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" +
"declare HashMap @Traitable end \n" +
"\n" +
"declare trait ChildTrait\n" +
"@propertyReactive\n" +
" naam : String = \"kudak\"\n" +
" id : int = 1020\n" +
"end\n" +
"\n" +
"rule \"don\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()" + //map is empty
"then\n" +
" don( $map , ChildTrait.class );\n" +
" list.add(\"correct1\");\n" +
"end\n" +
"\n" +
"rule \"check\"\n" +
"no-loop\n" +
"when\n" +
" $c : ChildTrait($n : naam == \"kudak\", id == 1020 )\n" +
" $p : Map( this[\"naam\"] == $n )\n" +
"then\n" +
" System.out.println($p);\n" +
" System.out.println($c);\n" +
" list.add(\"correct2\");\n" +
"end";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
Map<String,Object> map = new HashMap<String, Object>();
// map.put("name", "hulu");
ksession.insert(map);
ksession.fireAllRules();
assertTrue(list.contains("correct1"));
assertTrue(list.contains("correct2"));
}
@Test(timeout=10000)
public void testMapTraitMismatchTypes()
{
String drl = "" +
"package openehr.test;//org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" + "" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"\n" +
"declare trait ChildTrait\n" +
"@Trait( logical = true )" +
"@propertyReactive\n" +
" naam : String = \"kudak\"\n" +
" id : int = 1020\n" +
"end\n" +
"\n" +
"rule \"don\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()" +
"then\n" +
// fails because current name is Int, while ChildTrait tries to enforce String
" ChildTrait ct = don( $map , ChildTrait.class );\n" +
" list.add( ct );\n" +
"end\n" +
"\n" +
"";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
Map<String,Object> map = new HashMap<String, Object>();
map.put("naam", new Integer(12) );
ksession.insert(map);
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertEquals( null, list.get( 0 ) );
}
@Test
public void testMapTraitPossibilities1()
{
String drl = "" +
"package openehr.test;//org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" + "" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"declare ESM @Traitable( logical = true )\n" +
" val : String\n" +
"end\n" +
"\n" +
"declare trait TName\n" +
"//@Trait( logical = true )\n" +
" length : Integer\n" +
"end\n" +
"\n" +
"declare trait ChildTrait\n" +
"//@Trait( logical = true )\n" +
"@propertyReactive\n" +
" name : ESM\n" +
" id : int = 1002\n" +
"end\n" +
"\n" +
"rule \"init\"\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Map map = new HashMap();\n" +
" ESM esm = new ESM(\"ali\");\n" +
" TName tname = don( esm , TName.class );\n" +
" map.put(\"name\",tname);\n" +
" insert(map);\n" +
"end\n" +
"\n" +
"\n" +
"rule \"don\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()" +
"then\n" +
" ChildTrait ct = don( $map , ChildTrait.class );\n" +
" list.add( ct );\n" +
" System.out.println(ct);\n" +
"end\n" +
"\n" +
"";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertNotNull(list.get(0));
}
@Test
public void testMapTraitPossibilities2()
{
String drl = "" +
"package openehr.test;//org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" + "" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"declare ESM @Traitable( logical = true )\n" +
" val : String\n" +
"end\n" +
"\n" +
"declare trait TName\n" +
"//@Trait( logical = true )\n" +
" length : Integer\n" +
"end\n" +
"\n" +
"declare trait TEsm extends TName\n" +
"//@Trait( logical = true )\n" +
" isValid : boolean\n" +
"end\n" +
"\n" +
"declare trait ChildTrait\n" +
"//@Trait( logical = true )\n" +
"@propertyReactive\n" +
" name : ESM\n" +
" id : int = 1002\n" +
"end\n" +
"\n" +
"rule \"init\"\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Map map = new HashMap();\n" +
" ESM esm = new ESM(\"ali\");\n" +
" TName tname = don( esm , TName.class );\n" +
" TEsm tesm = don( esm , TEsm.class );\n" +
" map.put(\"name\",tesm);\n" +
" insert(map);\n" +
"end\n" +
"\n" +
"\n" +
"rule \"don\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()" +
"then\n" +
" ChildTrait ct = don( $map , ChildTrait.class );\n" +
" list.add( ct );\n" +
" System.out.println(ct);\n" +
"end\n" +
"\n" +
"";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertNotNull(list.get(0));
}
@Test
public void testMapTraitPossibilities3()
{
String drl = "" +
"package openehr.test;//org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" + "" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"declare ESM @Traitable( logical = true )\n" +
" val : String\n" +
"end\n" +
"\n" +
"declare trait TName\n" +
"//@Trait( logical = true )\n" +
" length : Integer\n" +
"end\n" +
"\n" +
"declare trait TEsm extends TName\n" +
"//@Trait( logical = true )\n" +
" isValid : boolean\n" +
"end\n" +
"\n" +
"declare trait ChildTrait\n" +
"//@Trait( logical = true )\n" +
"@propertyReactive\n" +
" name : TName\n" + //<<<<<
" id : int = 1002\n" +
"end\n" +
"\n" +
"rule \"init\"\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Map map = new HashMap();\n" +
" ESM esm = new ESM(\"ali\");\n" +
" TName tname = don( esm , TName.class );\n" +
" TEsm tesm = don( esm , TEsm.class );\n" +
" map.put(\"name\",tesm);\n" +
" insert(map);\n" +
"end\n" +
"\n" +
"\n" +
"rule \"don\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()" +
"then\n" +
" ChildTrait ct = don( $map , ChildTrait.class );\n" +
" list.add( ct );\n" +
" System.out.println(ct);\n" +
"end\n" +
"\n" +
"";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode(VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertNotNull(list.get(0));
}
@Test
public void testMapTraitPossibilities4()
{
String drl = "" +
"package openehr.test;//org.drools.core.factmodel.traits;\n" +
"\n" +
"import org.drools.core.factmodel.traits.Traitable;\n" +
"import org.drools.core.factmodel.traits.Trait;\n" +
"import org.drools.core.factmodel.traits.Alias;\n" +
"import java.util.*;\n" +
"\n" +
"global java.util.List list;\n" +
"\n" + "" +
"declare HashMap @Traitable( logical = true ) end \n" +
"\n" +
"declare ESM @Traitable( logical = true )\n" +
" val : String\n" +
"end\n" +
"\n" +
"declare NAAM @Traitable( logical = true )\n" + //<<<<<
" val : String\n" +
"end\n" +
"\n" +
"declare trait TName\n" +
"@Trait( logical = true )\n" + //<<<<<
" length : Integer\n" +
"end\n" +
"\n" +
"declare trait TEsm //extends TName\n" +
"//@Trait( logical = true )\n" +
" isValid : boolean\n" +
"end\n" +
"\n" +
"declare trait ChildTrait\n" +
"//@Trait( logical = true )\n" +
"@propertyReactive\n" +
" name : TName\n" +
" id : int = 1002\n" +
"end\n" +
"\n" +
"rule \"init\"\n" +
"no-loop\n" +
"when\n" +
"then\n" +
" Map map = new HashMap();\n" +
" ESM esm = new ESM(\"ali\");\n" +
" TEsm tesm = don( esm , TEsm.class );\n" +
" map.put(\"name\",tesm);\n" +
" insert(map);\n" +
"end\n" +
"\n" +
"\n" +
"rule \"don\"\n" +
"no-loop\n" +
"when\n" +
" $map : Map()" +
"then\n" +
" ChildTrait ct = don( $map , ChildTrait.class );\n" +
" list.add( ct );\n" +
" System.out.println(ct);\n" +
"end\n" +
"\n" +
"";
StatefulKnowledgeSession ksession = loadKnowledgeBaseFromString(drl).newStatefulKnowledgeSession();
TraitFactory.setMode( VirtualPropertyMode.MAP, ksession.getKieBase());
List list = new ArrayList();
ksession.setGlobal("list",list);
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertNotNull(list.get(0));
}
}