<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Drools_Waterford</id>
	<title>Drools Waterford - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Drools_Waterford"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Waterford&amp;action=history"/>
	<updated>2026-04-21T08:54:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Drools_Waterford&amp;diff=55392&amp;oldid=prev</id>
		<title>Filip Stachecki at 23:03, 4 June 2017</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Waterford&amp;diff=55392&amp;oldid=prev"/>
		<updated>2017-06-04T23:03:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:private]]&lt;br /&gt;
=Basic=&lt;br /&gt;
==EX1==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Ex1. List Salaries&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
	$sal : Salgrade()&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($sal.grade + &amp;quot;\t&amp;quot; + $sal.losal + &amp;quot;\t&amp;quot; + $sal.hisal)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX2==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 2&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp(sal &amp;gt;= 1000, sal &amp;lt;= 2000) &lt;br /&gt;
&lt;br /&gt;
then   &lt;br /&gt;
  	System.out.println($e.id + &amp;quot;\t&amp;quot; + $e.name + &amp;quot;\t&amp;quot; + $e.job + &amp;quot;\t&amp;quot; + $e.mgr + &amp;quot;\t&amp;quot; + $e.hiredate + &amp;quot;\t&amp;quot; + $e.sal + &amp;quot;\t&amp;quot; + $e.deptno  )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX3==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 3&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 	$e : Emp(deptno == 20, job == &amp;quot;CLERK&amp;quot;) &lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.mgr + &amp;quot; &amp;quot; + $e.hiredate + &amp;quot; &amp;quot; + $e.sal + &amp;quot; &amp;quot; + $e.deptno) &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX4==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 4&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 	$e : Emp(id: mgr != &amp;quot;&amp;quot;) &lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.id + &amp;quot; &amp;quot; + $e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.mgr + &amp;quot; &amp;quot; + $e.hiredate + &amp;quot; &amp;quot; + $e.sal + &amp;quot; &amp;quot; + $e.deptno) &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 4 - Select employees who have a boss.&amp;quot;&lt;br /&gt;
//enabled false&lt;br /&gt;
when &lt;br /&gt;
 //$v : Emp(mgr &amp;gt; 0)&lt;br /&gt;
 // try rather where mgr id not an employee id&lt;br /&gt;
 &lt;br /&gt;
 $a : Emp()&lt;br /&gt;
 $b : Emp(mgr == $a.id) // only emps with mgrs listed (exists an emp whose id is their mgr id)&lt;br /&gt;
  &lt;br /&gt;
then    &lt;br /&gt;
  // requires an overload toString() in Emp&lt;br /&gt;
  System.out.println($b.toString() + &amp;quot;\tmgrNm=&amp;quot; + $a.name )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX5==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 5&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 	$e : Emp(id: job == &amp;quot;MANAGER&amp;quot;) &lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.id + &amp;quot; &amp;quot; + $e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.mgr + &amp;quot; &amp;quot; + $e.hiredate + &amp;quot; &amp;quot; + $e.sal*12 + &amp;quot; &amp;quot; + $e.deptno) &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX6==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 6&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp(name matches &amp;quot;.L.*&amp;quot; &amp;amp;&amp;amp; matches &amp;quot;..A.*&amp;quot;)&lt;br /&gt;
then    &lt;br /&gt;
 System.out.println($e.name);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 6, 2nd=L, 3rd=A&amp;quot;&lt;br /&gt;
enabled false&lt;br /&gt;
when &lt;br /&gt;
 $v : Emp(name matches &amp;quot;.LA.*&amp;quot;)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($v.toString() )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX7==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 7 employees whose name ends with N and contains T.&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp( name matches &amp;quot;.*T.*N&amp;quot; )&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.id + &amp;quot; &amp;quot; + $e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.mgr + &amp;quot; &amp;quot; + $e.hiredate + &amp;quot; &amp;quot; + $e.sal * 12 + &amp;quot; &amp;quot; + $e.deptno)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX8==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 8 employees who either work as managers or work in department no 10, but not both.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp ((job == &amp;quot;MANAGER&amp;quot; || deptno == 10) &amp;amp;&amp;amp; !(job == &amp;quot;MANAGER&amp;quot; &amp;amp;&amp;amp; deptno == 10) )&lt;br /&gt;
&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.id + &amp;quot; &amp;quot; + $e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.mgr + &amp;quot; &amp;quot; + $e.hiredate + &amp;quot; &amp;quot; + $e.sal + &amp;quot; &amp;quot; + $e.deptno)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 8&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp( (job == &amp;quot;MANAGER&amp;quot; &amp;amp;&amp;amp; deptno != 10) || (deptno == 10 &amp;amp;&amp;amp; job != &amp;quot;MANAGER&amp;quot;))&lt;br /&gt;
 //fall manager not in dept 10 and all non managers in dept 10&lt;br /&gt;
then  &lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.deptno);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Advanced=&lt;br /&gt;
==EX31==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 31&amp;quot; &lt;br /&gt;
//Select the name of the employee and the city (LOC column in DEPT table) in which they work.&lt;br /&gt;
when&lt;br /&gt;
	$e : Emp()&lt;br /&gt;
	$d : Dept($e.deptno == deptno)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($e.name + &amp;quot; &amp;quot; + $d.loc)&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX32==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 32&amp;quot;&lt;br /&gt;
//Select the names of the employees, and the name and number of their department. &lt;br /&gt;
when&lt;br /&gt;
	$e : Emp()&lt;br /&gt;
	$d : Dept($e.deptno == deptno)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($e.name + &amp;quot; &amp;quot; + $d.dname + &amp;quot; &amp;quot; + $d.deptno)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX33==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 33&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $s :Salgrade()&lt;br /&gt;
 $e :Emp(sal &amp;gt;= $s.losal &amp;amp;&amp;amp; &amp;lt;= $s.hisal &amp;amp;&amp;amp; sal &amp;gt;2000)&lt;br /&gt;
then  &lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; + $e.sal + &amp;quot; &amp;quot; + $s.grade);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 33&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp( sal &amp;gt;2000 ) ;&lt;br /&gt;
 $sg : Salgrade($e.sal &amp;gt;= losal, $e.sal &amp;lt;= hisal);&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name + &amp;quot;\t&amp;quot; + $e.sal + &amp;quot;\t&amp;quot; + $sg.grade )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX34==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 34&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $d :Dept($d.loc== &amp;quot;LONDON&amp;quot;)&lt;br /&gt;
 $e :Emp($d.deptno == $e.deptno)&lt;br /&gt;
then  &lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; + $d.dname + &amp;quot; &amp;quot; + $d.deptno);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX35==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 35&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $s :Salgrade()&lt;br /&gt;
 $e :Emp(sal &amp;gt;= $s.losal &amp;amp;&amp;amp; &amp;lt;= $s.hisal)&lt;br /&gt;
 $d :Dept($d.loc!= &amp;quot;LONDON&amp;quot; &amp;amp;&amp;amp; $d.deptno == $e.deptno)&lt;br /&gt;
then  &lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; + $d.loc + &amp;quot; &amp;quot; + $s.grade);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 36 mvel lhs advanced, emp and salgrade when not london :) &amp;quot;&lt;br /&gt;
//enabled false&lt;br /&gt;
when &lt;br /&gt;
 $d : Dept(loc != &amp;quot;LONDON&amp;quot;)&lt;br /&gt;
 $e : Emp(deptno == $d.deptno)&lt;br /&gt;
 $s : Salgrade(losal &amp;lt;= $e.sal, hisal &amp;gt;= $e.sal)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name +&amp;quot;\t-\t&amp;quot;+ $d.loc +&amp;quot;\t-\t&amp;quot;+ $s.grade)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX36==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 36&amp;quot; &lt;br /&gt;
when&lt;br /&gt;
   d :Dept()&lt;br /&gt;
   not (Emp(deptno == d.deptno))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println( d.dname )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX37==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 37&amp;quot; 	&lt;br /&gt;
when&lt;br /&gt;
   e :Emp()&lt;br /&gt;
   m :Emp(m.id == e.mgr)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println( e.name + &amp;quot; boss is &amp;quot; + m.name )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX38==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 38&amp;quot; 	&lt;br /&gt;
when&lt;br /&gt;
   e :Emp()&lt;br /&gt;
   not (Emp(id == e.mgr))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println( e.name )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX39==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 39&amp;quot; 	&lt;br /&gt;
when&lt;br /&gt;
   e :Emp()&lt;br /&gt;
   not (Emp(mgr == e.id))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println( e.name )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX41==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 41&amp;quot; 	&lt;br /&gt;
when&lt;br /&gt;
   e :Emp()&lt;br /&gt;
   m :Emp(m.id == e.mgr &amp;amp;&amp;amp; e.hiredate &amp;lt; m.hiredate)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println( e.name + &amp;quot; was hired in &amp;quot; + e.hiredate + &amp;quot;, her boss &amp;quot; + m.name + &amp;quot; who was hired in &amp;quot; + m.hiredate)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX44==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 44&amp;quot; 	&lt;br /&gt;
when&lt;br /&gt;
   	e :Emp(deptno == 10)&lt;br /&gt;
   	not (Emp(job == e.job &amp;amp;&amp;amp; deptno == 20))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(e.job)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX23==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 23&amp;quot; enabled false&lt;br /&gt;
//Find the minimal, maximal and average salaries of people employed in 1981. &lt;br /&gt;
when&lt;br /&gt;
  accumulate (e :Emp(hiredate == 1981), &lt;br /&gt;
  	$avg : average(e.sal),&lt;br /&gt;
  	$min : min(e.sal),&lt;br /&gt;
  	$max : max(e.sal)&lt;br /&gt;
  	) &lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(&lt;br /&gt;
   &amp;quot;Average salary: &amp;quot; + $avg + &amp;quot;\n&amp;quot; +&lt;br /&gt;
  &amp;quot;Min salary: &amp;quot; + $min + &amp;quot;\n&amp;quot; +&lt;br /&gt;
  &amp;quot;Max salary: &amp;quot; + $max + &amp;quot;\n&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX24==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 24&amp;quot; enabled false&lt;br /&gt;
//Find the difference between maximal and minimal salary. &lt;br /&gt;
when&lt;br /&gt;
  accumulate (e :Emp(), &lt;br /&gt;
  	$min : min(e.sal),&lt;br /&gt;
  	$max : max(e.sal)&lt;br /&gt;
  	) 	&lt;br /&gt;
then&lt;br /&gt;
	System.out.println(&amp;quot;Salary range: &amp;quot; + ($max - $min))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX26==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 26&amp;quot;   enabled true&lt;br /&gt;
when&lt;br /&gt;
  accumulate (e :Emp(job ==&amp;quot;MANAGER&amp;quot;), &lt;br /&gt;
  	$count : count ()&lt;br /&gt;
  	) &lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(&amp;quot;MANAGER &amp;quot; + $count)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX25==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
declare SalByJob&lt;br /&gt;
   job : String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;25. Find the average salary for every post.&amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
   	Emp($job: job) and&lt;br /&gt;
   	not SalByJob($job == job)&lt;br /&gt;
   	accumulate (&lt;br /&gt;
   		e :Emp(job == $job),&lt;br /&gt;
   		$avg : average(e.sal)&lt;br /&gt;
	) &lt;br /&gt;
then    &lt;br /&gt;
   System.out.println(&amp;quot;Position: &amp;quot; + $job + &amp;quot; average salary: &amp;quot; + $avg)&lt;br /&gt;
   insert(new SalByJob($job))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX27==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
declare SalByDep&lt;br /&gt;
   id : Integer&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;27. Find the average annual salaries in departments.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$dep : Dept($depId : deptno)&lt;br /&gt;
	not SalByDep(id == $depId)&lt;br /&gt;
	accumulate($emp : Emp(deptno == $depId),&lt;br /&gt;
   		$avg : average($emp.sal)&lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Department &amp;quot; + $dep.dname + &amp;quot; has annual average: &amp;quot; + ($avg*12))&lt;br /&gt;
  	insert(new SalByDep($depId))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX43==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
declare xJob&lt;br /&gt;
   name : String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 43&amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
  $e1:Emp($job:job &amp;amp;&amp;amp; hiredate == 1982)&lt;br /&gt;
  $e2:Emp(job == $job &amp;amp;&amp;amp; hiredate == 1983)&lt;br /&gt;
  not(xJob(name == $job))&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($job)&lt;br /&gt;
  insert(new xJob($job));&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;43. Find post filled in 1982 and 1983.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	Emp($job : job, hiredate == 1982)&lt;br /&gt;
	Emp(job == $job, hiredate == 1983)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Job: &amp;quot; + $job)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// Find post filled in 1982 and 1983&lt;br /&gt;
declare jobInYear&lt;br /&gt;
	job: String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Excercise 43&amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
	Emp($j: job &amp;amp;&amp;amp; hiredate in (&amp;#039;1982&amp;#039;, &amp;#039;1983&amp;#039;)) and not jobInYear(job == $j);&lt;br /&gt;
then&lt;br /&gt;
	System.out.println(	  $j )&lt;br /&gt;
	insert(new jobInYear($j))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
declare Job&lt;br /&gt;
   job : String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 43&amp;quot; 	enabled false&lt;br /&gt;
when&lt;br /&gt;
   e: Emp(j: job &amp;amp;&amp;amp; hiredate == 1982) and&lt;br /&gt;
   exists  (Emp(job == e.job &amp;amp;&amp;amp; hiredate == 1983)) and&lt;br /&gt;
   not Job(j == job)&lt;br /&gt;
then    &lt;br /&gt;
   System.out.println(e.job)&lt;br /&gt;
   insert(new Job(j))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX28==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;28 Find departments with more than 3 workers. &amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  x: Dept(d: deptno) &lt;br /&gt;
  accumulate (e :Emp(deptno == d), &lt;br /&gt;
  	$count : count()&lt;br /&gt;
   	) &lt;br /&gt;
  Number(doubleValue &amp;gt; 3) from $count&lt;br /&gt;
then    &lt;br /&gt;
   System.out.println(x.deptno + &amp;quot;  &amp;quot; + $count&lt;br /&gt;
)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX45==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 45 Find employees earning more than the manager’s (job==&amp;#039;MANAGER&amp;#039;) average.&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
  Number($avgNumber : longValue) from accumulate (e:Emp(job==&amp;#039;MANAGER&amp;#039;), average(e.sal))&lt;br /&gt;
  $e:Emp(sal &amp;gt; $avgNumber)&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($e.name + &amp;quot;:&amp;quot; + $e.sal)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX46==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 46 Select employees earning the maximum salaries in their positions (jobs).&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
  $e:Emp()&lt;br /&gt;
  Number($max : longValue) from accumulate (e:Emp(job==$e.job), max(e.sal))&lt;br /&gt;
  Number(doubleValue == $e.sal) from $max&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; +$e.job + &amp;quot;:&amp;quot; + $e.sal)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX51==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX55==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=insertLogical=&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package _30_mvel&lt;br /&gt;
import com.nobleprog.FactModel.*&lt;br /&gt;
dialect &amp;quot;mvel&amp;quot; &lt;br /&gt;
&lt;br /&gt;
declare AccessToSecretFile&lt;br /&gt;
    emp : Emp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Grant access to employees of Dept. 10&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
    e : Emp( deptno == 10 )&lt;br /&gt;
then    &lt;br /&gt;
    insertLogical( new AccessToSecretFile(e) )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shopping Example=&lt;br /&gt;
==Fact Model==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.nobleprog;&lt;br /&gt;
&lt;br /&gt;
public class FactModel{&lt;br /&gt;
	&lt;br /&gt;
	   public static class Customer {&lt;br /&gt;
		   private String name;&lt;br /&gt;
		   private int    discount;&lt;br /&gt;
&lt;br /&gt;
	        public Customer(String name,&lt;br /&gt;
	                        int discount) {&lt;br /&gt;
	            this.name = name;&lt;br /&gt;
	            this.discount = discount;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public String getName() {&lt;br /&gt;
	            return name;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public int getDiscount() {&lt;br /&gt;
	            return discount;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public void setDiscount(int discount) {&lt;br /&gt;
	            this.discount = discount;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    public static class Discount {&lt;br /&gt;
	        private Customer customer;&lt;br /&gt;
	        private int      amount;&lt;br /&gt;
&lt;br /&gt;
	        public Discount(Customer customer,&lt;br /&gt;
	                        int amount) {&lt;br /&gt;
	            this.customer = customer;&lt;br /&gt;
	            this.amount = amount;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public Customer getCustomer() {&lt;br /&gt;
	            return customer;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public int getAmount() {&lt;br /&gt;
	            return amount;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    public static class Product {&lt;br /&gt;
	        private String name;&lt;br /&gt;
	        private float  price;&lt;br /&gt;
&lt;br /&gt;
	        public Product(String name,&lt;br /&gt;
	                       float price) {&lt;br /&gt;
	            this.name = name;&lt;br /&gt;
	            this.price = price;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public String getName() {&lt;br /&gt;
	            return name;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public float getPrice() {&lt;br /&gt;
	            return price;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    public static class Purchase {&lt;br /&gt;
	        private Customer customer;&lt;br /&gt;
	        private Product  product;&lt;br /&gt;
&lt;br /&gt;
	        public Purchase(Customer customer,&lt;br /&gt;
	                        Product product) {&lt;br /&gt;
	            this.customer = customer;&lt;br /&gt;
	            this.product = product;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public Customer getCustomer() {&lt;br /&gt;
	            return customer;&lt;br /&gt;
	        }&lt;br /&gt;
&lt;br /&gt;
	        public Product getProduct() {&lt;br /&gt;
	            return product;&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==rules==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package _30_mvel&lt;br /&gt;
import com.nobleprog.FactModel.*&lt;br /&gt;
import java.lang.Math&lt;br /&gt;
import java.util.ArrayList&lt;br /&gt;
dialect &amp;quot;mvel&amp;quot; &lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Purchase notification&amp;quot;&lt;br /&gt;
    //salience 10&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
        $c : Customer()&lt;br /&gt;
        $p : Purchase( customer == $c )&lt;br /&gt;
    then&lt;br /&gt;
        System.out.println( &amp;quot;Customer &amp;quot; + $c.name + &amp;quot; just purchased &amp;quot; + $p.product.name );&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
rule &amp;quot;Discount removed notification&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $c : Customer()&lt;br /&gt;
        not Discount( customer == $c )&lt;br /&gt;
    then&lt;br /&gt;
        $c.discount = 0;&lt;br /&gt;
        System.out.println( &amp;quot;Customer &amp;quot; + $c.name + &amp;quot; now has a discount of &amp;quot; + $c.discount );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Discount awarded notification&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $c : Customer()&lt;br /&gt;
        $d : Discount( customer == $c )&lt;br /&gt;
    then&lt;br /&gt;
        System.out.println( &amp;quot;Customer &amp;quot; + $c.name + &amp;quot; now has a discount of &amp;quot; + $d.amount );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Apply 10% discount if total purchases is over 100&amp;quot;&lt;br /&gt;
    no-loop true&lt;br /&gt;
    dialect &amp;quot;java&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $c : Customer()&lt;br /&gt;
        $i : Double(doubleValue &amp;gt; 100) from accumulate (&lt;br /&gt;
                Purchase( customer == $c, $price : product.price ),&lt;br /&gt;
                sum( $price )&lt;br /&gt;
        )&lt;br /&gt;
    then&lt;br /&gt;
        $c.setDiscount( 10 );&lt;br /&gt;
		insertLogical( new Discount( $c, 10 ) );&lt;br /&gt;
        System.out.println( &amp;quot;Customer &amp;quot; + $c.getName() + &amp;quot; now has a shopping total of &amp;quot; + $i );&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==jUnit==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.nobleprog;&lt;br /&gt;
&lt;br /&gt;
import com.nobleprog.*;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.kie.api.KieServices;&lt;br /&gt;
import org.kie.api.runtime.KieContainer;&lt;br /&gt;
import org.kie.api.runtime.KieSession;&lt;br /&gt;
import org.kie.api.runtime.rule.FactHandle;&lt;br /&gt;
&lt;br /&gt;
import com.nobleprog.FactModel.*;&lt;br /&gt;
&lt;br /&gt;
public class Test01 {&lt;br /&gt;
	@Test&lt;br /&gt;
	public void test1() {&lt;br /&gt;
		KieServices ks = KieServices.Factory.get();&lt;br /&gt;
		KieContainer kContainer = ks.getKieClasspathContainer();&lt;br /&gt;
		KieSession ksession = kContainer.newKieSession(&amp;quot;ksession-rules&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
		//KieSession ksession = kc.newKieSession(&amp;quot;ShoppingKS&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        Customer mark = new Customer( &amp;quot;mark&amp;quot;,&lt;br /&gt;
                                      0 );&lt;br /&gt;
        ksession.insert( mark );&lt;br /&gt;
&lt;br /&gt;
        Product shoes = new Product( &amp;quot;shoes&amp;quot;,&lt;br /&gt;
                                     60 );&lt;br /&gt;
        ksession.insert( shoes );&lt;br /&gt;
&lt;br /&gt;
        Product hat = new Product( &amp;quot;hat&amp;quot;,&lt;br /&gt;
                                   60 );&lt;br /&gt;
        ksession.insert( hat );&lt;br /&gt;
&lt;br /&gt;
        ksession.insert( new Purchase( mark,&lt;br /&gt;
                                       shoes ) );&lt;br /&gt;
&lt;br /&gt;
        FactHandle hatPurchaseHandle = ksession.insert( new Purchase( mark,&lt;br /&gt;
                                                                      hat ) );&lt;br /&gt;
&lt;br /&gt;
        ksession.fireAllRules();&lt;br /&gt;
&lt;br /&gt;
        ksession.delete( hatPurchaseHandle );&lt;br /&gt;
        System.out.println( &amp;quot;Customer mark has returned the hat&amp;quot; );&lt;br /&gt;
        ksession.fireAllRules();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Filip Stachecki</name></author>
	</entry>
</feed>