drools5 community training module 3 drools expert drl syntax
DESCRIPTION
for more information visit: http://salaboy.wordpress.com/2011/02/23/drools-5-community-training-announced-roadmap/TRANSCRIPT
Drools5 Community Training Sponsored by Plugtree
Module 3: Drools Expert DRL Syntax
Drools5 Community Trainingversion: 1.0-SNAPSHOT
Release Date: 03/16/2011Under The Creative Common License
Module 3: Drools Expert DRL Syntax
Drools5 Community Training Course by Mauricio "Salaboy" Salatino and Esteban Aliverti is licensed under a Creative Commons Attribution 3.0
Unported License.Based on a work at salaboy.wordpress.
com.Permissions beyond the scope of this
license may be available at http://salaboy.wordpress.com/.
Agenda
● Introduction to Drools Expert● Drools DRL syntax introduction
○ LHS Conditional Elements ○ RHS○ Rules attributes○ Queries
● Drools 5.x APIs introduction
Drools Expert Introduction
● Drools Expert is the rule engine core ● Lets us express Business Rules● It will be in charge of making inferences to get new
conclusions
Components interaction
Rules Execution Cycle
Business Rule Structure
package ...import ...global ... rule "My Rule" <Attributes> when <LHS> Song(genre == "Jazz") <CEs> then <RHS> System.out.println("Hi John!");end
LHS - Conditional Elements
● Pattern
● e.g. Song(genre == "Jazz") $song: Song(genre == "Jazz" || == "Avantgarde") $song: Song(duration > 360, $genre: genre == "Jazz")
LHS - Conditional Elements
● Field Operators
● e.g.
Song( lyrics matches "AZ-az[drink]" ) Song( authors contains "John Zorn" ) Song( author memberof $greatMusicians )
LHS - Conditional Elements
● AND
e.g. Person( name == "John" ) AND Pet(type == "cat")● OR
e.g. Policewoman (age > 30) OR Fireman(age > 31)
LHS - Conditional Elements
● eval
e.g. eval( song.isJazz() )● not
e.g. not( Song( genre == "Pop") )
LHS - Conditional Elements
● exists
e.g. exists ( Song(genre == "Jazz"))● forall
e.g. forall ( Song() Song(genre == "Jazz") )
LHS - Conditional Elements
from CE
● e.g.
$playlist: Playlist() Song() from $playlist.songs $playlist: Playlist() Song(genre == "Jazz") from $playlist.songs
LHS - Conditional Elements
● from
● e.g. global HibernateSession hbn;
$playlist: Playlist() Song() from hbn.namedQuery("SongByArtist") .setParameter("artist","John Zorn") .getResultList();
LHS - Conditional Elements
● Collect
● e.g. $songs: ArrayList() from collect (Song(genre == "Jazz", year > 2000))
LHS - Conditional Elements
● Accumulate
LHS - Conditional Elements
● Accumulate CE: <result pattern> from accumulate( <source pattern>, init( <init code> ), action( <action code> ), reverse( <reverse code> ), result( <result expression>))
● e.g. $playlist: Playlist() $jazzSongs: Number( doubleValue > 100 ) from accumulate( Song(playlist == $playlist, genre == "Jazz"), init( double total = 0; ), action( total += 1; ), reverse( total -= 1; ), result( total ))
LHS - Conditional Elements
● Accumulate Function Examples $playlist: Playlist() $total: Number( doubleValue > 100 ) from accumulate( $song: Song( playlist == $playlist, genre == "Jazz"), count($song))
LHS - Conditional Elements
● Accumulate out-of-the-box Functions ○ average○ min○ max○ count○ sum
LHS - Conditional Elements
● Accumulate custom function $playlist: Playlist() $total: Number( doubleValue > 100 ) from accumulate( $song: Song( playlist == $playlist), myCustomFc($song.duration))
● We can plug our custom function here. We just need to implement the AccumulateFunction interface.
Nesting CEs
● Drools support nested CEs $petshop: PetShop() $total: Number( doubleValue > 10 ) from accumulate( $pet: Pet(petshop == $petshop, type == PetType.Cat) from $hbm.getNamedQuery("getPetsFromPetshopId") .setParamenter("petshopid",$petshop.getId()) .list(), count ($pet) )
Right Hand Side
● Set of actions● MVEL or Java (http://mvel.codehaus.org/)● We will have a set of methods to modify the working
memory status○ insert()○ modify() / update ()○ retract()
rule "Fire ! ! !" when Fire() then insert(new Alarm()); end
Rule Attributes
Rule Attributes - no loop
● no-loop i.e. rule "infinite activation loop" no-loop true when $person: Person(age > 21) then update($person){ setName("John"); } end
Rule Attributes - salience
● salience (higher priority first)rule "rule with priority" salience 10 when $song: Song() then System.out.println("Rule with higher priority Fired!");endrule "rule with less priority" salience 5 when $song: Song() then System.out.println("Rule with lower priority Fired!");end
Rule Attributes - agenda-group
rule "Playlist ready" agenda-group "Create Playlist" when Playlist(size == 3) then //Set the focus to "Play playlist" agenda-group kcontext.getKnowledgeRuntime().getAgenda() .getAgendaGroup("Play playlist").setFocus(); end
rule "Play playlist" agenda-group "Play playlist" when $pl : Playlist() then $pl.play(); end
Rule Attributes - lock-on-active
rule "Number Songs" salience 2 lock-on-active agenda-group "Create Playlist" when $song : Song() then modify($song){ setName( index.getAndIncrement()+ "_"+ $song.getName()); }end
rule "Fill playlist" salience 1 lock-on-active agenda-group "Create Playlist" when $pl : Playlist() $song : Song() then modify($pl){ addSong($song); }end
Queries
Example
query "Get Persons by Name" (String name) Person(name = :name) end
Drools Expert APIs
KnowledgeBuilder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); // Add our rules kbuilder.add(new ClassPathResource("rules.drl"), ResourceType.DRL); //Check for errors during the compilation of the rules KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); }
KnowledgeBase
// Create the Knowledge Base KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); // Add the binary packages (compiled rules) to the Knowledge Base kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
KnowledgeSession
// Create a StatefulSession using the KnowledgeBase that // contains the compiled knowledge StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); // We can add a runtime logger to understand what is going on // inside the Engine KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession); // Insert a new Fact inside my world FactHandle myFactHandle = ksession.insert(new Person("Myself")); // Update a Fact using the FactHandle ksession.update(myFactHandle, new Person("Salaboy!")); // Retract/Remove from my world the Fact ksession.retract(myFactHandle);
Full Picture
Hands on Labs
Projects: ● 01 :: Drools Expert Introduction ● 02 :: Drools Expert Conditional Elements● 03 :: Drools Expert Rule Attributes
Briefing Up
● Covered Topics:○ Rules Execution Lifecycle○ DRL Syntax
■ Conditional Elements in the LHS■ Actions in the RHS
Questions?
Enjoy! Questions and Feedback are always appreciated!Stay Tuned!
Contact us atwww.plugtree.com