<?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_Geneva</id>
	<title>Drools Geneva - 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_Geneva"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Geneva&amp;action=history"/>
	<updated>2026-04-21T08:52:35Z</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_Geneva&amp;diff=43860&amp;oldid=prev</id>
		<title>Filip Stachecki at 17:35, 5 October 2016</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Geneva&amp;diff=43860&amp;oldid=prev"/>
		<updated>2016-10-05T17:35:51Z</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;Exercise 1 - all Salgrade facts &amp;quot;&lt;br /&gt;
enabled false&lt;br /&gt;
when &lt;br /&gt;
	$s: Salgrade()&lt;br /&gt;
then    &lt;br /&gt;
	System.out.format(&amp;quot;%d %d %d\n&amp;quot;, $s.grade, $s.losal, $s.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 false&lt;br /&gt;
when &lt;br /&gt;
  $e : Emp(sal &amp;gt;= 1000, sal &amp;lt;= 2000)&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; &lt;br /&gt;
                             + $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;
==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.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 &lt;br /&gt;
                             + &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()&lt;br /&gt;
	$e2 : Emp(id == $e.mgr) &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;
==EX5==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// Select manager’s annual remuneration. &lt;br /&gt;
rule &amp;quot;Exercise 5&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp(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.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;.LA.*&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;
==EX7==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 7&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
	$e : Emp(name matches &amp;#039;.*N&amp;#039;, name contains &amp;#039;T&amp;#039;) &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;
==EX8==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 8&amp;quot; &lt;br /&gt;
when &lt;br /&gt;
  $e : Emp((job == &amp;#039;MANAGER&amp;#039; &amp;amp;&amp;amp; deptno != 10) || (job != &amp;#039;MANAGER&amp;#039; &amp;amp;&amp;amp; deptno == 10) )&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name+&amp;quot; &amp;quot;+ $e.deptno )&lt;br /&gt;
&lt;br /&gt;
end&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: Select the name of the employee and the city (LOC column in DEPT table) in which they work.&amp;quot;  enabled false&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp()&lt;br /&gt;
 $d : Dept(deptno == $e.deptno)&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.name + &amp;quot;\t\t&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; enabled false&lt;br /&gt;
when &lt;br /&gt;
 e : Emp()&lt;br /&gt;
 d : Dept(deptno == e.deptno) &lt;br /&gt;
&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;
// Select the names of the employees, their salary and salary grade, but only those whose salary is more than 2000. &lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 33&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
   d :Dept()&lt;br /&gt;
   e :Emp(d.deptno == e.deptno)&lt;br /&gt;
   s :Salgrade(e.sal &amp;gt;= 2000, 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; + s.grade)&lt;br /&gt;
end&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;
// Select employees working in London.&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 34&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
   d :Dept()&lt;br /&gt;
   e :Emp(d.deptno == e.deptno, d.loc == &amp;quot;LONDON&amp;quot;)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(e.name + &amp;quot;\t&amp;quot; + d.loc)&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;
	$e : Emp()&lt;br /&gt;
	$s : Salgrade(losal &amp;lt;= $e.sal, hisal &amp;gt; $e.sal) &lt;br /&gt;
	$d : Dept(loc != &amp;#039;LONDON&amp;#039;, $e.deptno == deptno) &lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.name + &amp;quot;\t&amp;quot; + $s.grade + &amp;quot;\t&amp;quot; + $d.loc)&lt;br /&gt;
end&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;
// 36. Exercise&lt;br /&gt;
// Find departments without employees. &lt;br /&gt;
rule &amp;quot;36. Exercise&amp;quot;  enabled false&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;
&lt;br /&gt;
// 37. *Exercise&lt;br /&gt;
// Select an employee’s name and his/her boss’s name &lt;br /&gt;
rule &amp;quot;37. Exercise&amp;quot;  enabled false&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( m.name + &amp;quot; boss of &amp;quot; + e.name   )&lt;br /&gt;
end&lt;br /&gt;
&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;
// Select employees who doesn&amp;#039;t have a boss.&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 38&amp;quot; enabled false  &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;
  //enabled false&lt;br /&gt;
when&lt;br /&gt;
  $m : Emp()&lt;br /&gt;
  not (Emp(mgr == $m.id))&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($m.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; enabled false &lt;br /&gt;
when &lt;br /&gt;
 e : Emp($hd : hiredate)&lt;br /&gt;
 m : Emp(e.mgr == id &amp;amp;&amp;amp; $hd&amp;lt;hiredate)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(e.name + &amp;#039; was hired in &amp;#039; + e.hiredate + &amp;#039;, her boss &amp;#039; + m.name + &amp;#039; was hired in &amp;#039; + 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, 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;
// Find the minimal, maximal and average salaries of people employed in 1981. &lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 23&amp;quot; enabled false&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;
// Find the difference between maximal and minimal salary.&lt;br /&gt;
rule &amp;quot;Exercise 24&amp;quot;&lt;br /&gt;
  //enabled false&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; &lt;br /&gt;
when &lt;br /&gt;
 accumulate (e:Emp(job == &amp;#039;MANAGER&amp;#039;), $count : count(e))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(&amp;#039;count &amp;#039; + $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&amp;gt;&lt;br /&gt;
declare JobType&lt;br /&gt;
  job : String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 25&amp;quot;&lt;br /&gt;
  enabled false&lt;br /&gt;
when&lt;br /&gt;
  Emp($j : job)&lt;br /&gt;
  not JobType($j == job)&lt;br /&gt;
  accumulate ($e : Emp(job == $j),&lt;br /&gt;
    $avgsal : average($e.sal)&lt;br /&gt;
  )&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($j + &amp;quot;\t&amp;quot; + $avgsal)&lt;br /&gt;
  insert(new JobType($j))&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;
// Find the average annual salaries in departments.&lt;br /&gt;
&lt;br /&gt;
declare AvgYearlySalPerDept&lt;br /&gt;
   deptno: int&lt;br /&gt;
   avgsal: Double&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 27&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
	Emp($d: deptno) and not AvgYearlySalPerDept($d == deptno)&lt;br /&gt;
	accumulate (e :Emp(deptno == $d), $avg : average(e.sal * 12))&lt;br /&gt;
then&lt;br /&gt;
   System.out.println($d + &amp;quot;\t|\t&amp;quot; + $avg)&lt;br /&gt;
   insert (new AvgYearlySalPerDept($d, $avg))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 27 - average annual salaries in departments&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  Dept($d: deptno) and&lt;br /&gt;
  accumulate (e :Emp(deptno == $d), $avg : average(e.sal * 12))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(   $d + &amp;quot;: &amp;quot; + $avg )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// lj:&lt;br /&gt;
rule &amp;quot;Exercise 27&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
	$d : Dept($dept : deptno) &lt;br /&gt;
	accumulate (f: Emp($sal : sal, deptno == $dept),&lt;br /&gt;
		$avg : average(12 * $sal)&lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($d.deptno + &amp;quot; &amp;quot; + $avg)&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&amp;gt;&lt;br /&gt;
declare CountByJob&lt;br /&gt;
  job : String&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 43&amp;quot; &lt;br /&gt;
when &lt;br /&gt;
 em: Emp(j : job)&lt;br /&gt;
 exists Emp(job == j &amp;amp;&amp;amp; (hiredate==1982)) &lt;br /&gt;
 exists Emp(job == j &amp;amp;&amp;amp; (hiredate==1983))&lt;br /&gt;
 not (CountByJob(job == j))&lt;br /&gt;
 accumulate (e:Emp(job == j) , $count : count())&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(em.job + &amp;#039; &amp;#039; + $count)&lt;br /&gt;
  insert (new CountByJob(em.job))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
//lj:&lt;br /&gt;
rule &amp;quot;Exercise 43&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
	$e : Emp(hiredate == 1982, $job: job)&lt;br /&gt;
	exists(Emp(hiredate == 1983, job == $job)) &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;
==EX28==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 28&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
    Dept($deptno: deptno)&lt;br /&gt;
	accumulate (e :Emp(deptno == $deptno), $cnt: count(e))&lt;br /&gt;
	Number($cnt &amp;gt; 3) from $cnt&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($deptno + &amp;quot; &amp;quot; + $cnt)&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&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
	Number($avg : longValue) from accumulate (m :Emp(job == &amp;#039;MANAGER&amp;#039;), average(m.sal)) &lt;br /&gt;
	$e : Emp(sal &amp;gt; $avg)&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.name + &amp;quot;\t&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&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
	$e : Emp()&lt;br /&gt;
	not (Emp(sal &amp;gt; $e.sal, job == $e.job))&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.name + &amp;quot;\t&amp;quot; + $e.sal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
declare MaxJob&lt;br /&gt;
	name: String&lt;br /&gt;
	max: long&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 46 BIS&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e : Emp($job : job) 	&lt;br /&gt;
	Number($max : longValue) from accumulate (m :Emp(job == $job), max(m.sal))&lt;br /&gt;
	not(MaxJob(name == $job))&lt;br /&gt;
then    &lt;br /&gt;
	insert(new MaxJob($job, $max))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 46 BIS - 2&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$m : MaxJob()&lt;br /&gt;
	$e : Emp(job == $m.name, sal == $m.max)&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($e.name + &amp;quot;\t&amp;quot; + $e.job + &amp;quot;\t&amp;quot; + $e.sal)&lt;br /&gt;
end&lt;br /&gt;
&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;
rule &amp;quot;Exercise 51 - employees earning more than the average salary in their department.&amp;quot;&lt;br /&gt;
enabled false&lt;br /&gt;
when&lt;br /&gt;
  $e: Emp()&lt;br /&gt;
  Number($avg : longValue) from  accumulate (e:Emp(deptno == $e.deptno), average(e.sal))&lt;br /&gt;
  exists Emp($avg &amp;lt;= sal, $e.id == id)&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;
==EX55==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
declare DeptAvg&lt;br /&gt;
   dept : String&lt;br /&gt;
   avg: double&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55 - Find the maximum average salary of departments. (1/2)&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  $d: Dept()&lt;br /&gt;
  accumulate (e:Emp(deptno == $d.deptno), $avg: average(e.sal))&lt;br /&gt;
then    &lt;br /&gt;
  insert(new DeptAvg($d.dname, $avg))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55 - Find the maximum average salary of departments. (2/2)&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  $da: DeptAvg()&lt;br /&gt;
  not DeptAvg(avg &amp;gt; $da.avg)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(   $da.dept + &amp;quot; &amp;quot; + $da.avg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
declare AvgJob&lt;br /&gt;
	deptno: Number&lt;br /&gt;
	avg: double&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e : Dept($deptno : deptno) 	&lt;br /&gt;
	Number($avg : doubleValue) from accumulate (m :Emp(deptno == $deptno), average(m.sal))&lt;br /&gt;
	not(AvgJob(deptno == $deptno))&lt;br /&gt;
then    &lt;br /&gt;
	insert(new AvgJob($deptno, $avg))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55 B&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	accumulate (a :AvgJob(), &lt;br /&gt;
  	$max : max(a.avg)&lt;br /&gt;
  	) &lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// two accumulate functions&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;55. Find the maximum average salary of departments.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	Number($max : doubleValue) from accumulate(&lt;br /&gt;
		$dep : Dept($depId : deptno)&lt;br /&gt;
		and&lt;br /&gt;
		Number($avg : doubleValue) &lt;br /&gt;
			from accumulate($emp : Emp(deptno == $depId),&lt;br /&gt;
		   		average($emp.sal)&lt;br /&gt;
			),&lt;br /&gt;
		max($avg)&lt;br /&gt;
	)&lt;br /&gt;
    d:Dept()&lt;br /&gt;
    Number($avgOfDept : doubleValue) from accumulate(e:Emp(deptno == d.deptno), average(e.sal))&lt;br /&gt;
    Number(doubleValue == $max) from $avgOfDept&lt;br /&gt;
then   &lt;br /&gt;
  	System.out.println(d.deptno + &amp;quot; Salary: &amp;quot; + $max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
///&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55 B&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	 $max : Number() from accumulate(&lt;br /&gt;
	     $e : Dept($deptno : deptno) and&lt;br /&gt;
         $avg: Number() from accumulate(&lt;br /&gt;
         	m :Emp(deptno == $deptno), average(m.sal)&lt;br /&gt;
         ),&lt;br /&gt;
         max( $avg ) &lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println($max)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX29==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
declare NotUnique&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 29&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e: Emp()&lt;br /&gt;
	exists(Emp(id == $e.id &amp;amp;&amp;amp; this != $e))&lt;br /&gt;
then    &lt;br /&gt;
	insert(new NotUnique())	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;isUnique&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	not(NotUnique())&lt;br /&gt;
then    &lt;br /&gt;
	System.out.println(&amp;quot;All Un1que!&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
declare EmpUnique&lt;br /&gt;
   id : long&lt;br /&gt;
   cnt : int&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 29 - Every Id is unique&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  	$e: Emp()&lt;br /&gt;
  	accumulate (e: Emp(id == $e.id), $cnt : count(e))&lt;br /&gt;
then    &lt;br /&gt;
  insert(new EmpUnique($e.id, $cnt))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 29 - Every Id is unique (check)&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  	forall(EmpUnique(cnt == 1))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(&amp;quot;Every Id is unique&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// ----&lt;br /&gt;
&lt;br /&gt;
declare EmpType&lt;br /&gt;
  id : long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 29&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  $e : Emp()&lt;br /&gt;
  accumulate ($e2 : Emp(id == $e.id),&lt;br /&gt;
    $count : count()&lt;br /&gt;
  )&lt;br /&gt;
  Number(longValue != 1) from $count &lt;br /&gt;
  not EmpType(id == $e.id)&lt;br /&gt;
then&lt;br /&gt;
  insert(new EmpType($e.id))&lt;br /&gt;
  System.out.println($e.id + &amp;quot;\t&amp;quot; + $count)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Shopping Example=&lt;br /&gt;
==Fact Model==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==rules==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Notify about purchase&amp;quot;&lt;br /&gt;
no-loop true&lt;br /&gt;
when&lt;br /&gt;
    $p : Purchase()&lt;br /&gt;
then&lt;br /&gt;
    System.out.format(&amp;quot;Customer %s just purchased a %s\n&amp;quot;, $p.customer.name, $p.product.name);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Check apply discount&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
    $c : Customer()&lt;br /&gt;
    accumulate (pur: Purchase(customer == $c), $sum: sum(pur.product.price))&lt;br /&gt;
    Number(intValue &amp;gt;= 1000) from $sum&lt;br /&gt;
    not Discount(customer == $c)&lt;br /&gt;
then&lt;br /&gt;
    System.out.format(&amp;quot;Customer %s for your purchase you received a discount of 10 \n&amp;quot;, $c.name);&lt;br /&gt;
    insert(new Discount($c, 10));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify client about discount removal&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
   $c : Customer()&lt;br /&gt;
   accumulate (pur: Purchase(customer == $c), $sum: sum(pur.product.price))&lt;br /&gt;
   Number(intValue &amp;lt; 1000) from $sum&lt;br /&gt;
   $d: Discount(customer == $c)&lt;br /&gt;
then    &lt;br /&gt;
    System.out.format(&amp;quot;Customer %s you lost your discount.\n&amp;quot;, $c.name);&lt;br /&gt;
	retract($d)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// -------------&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify about Purchase&amp;quot;&lt;br /&gt;
	no-loop true&lt;br /&gt;
    when&lt;br /&gt;
        $p : Purchase()&lt;br /&gt;
    then    	&lt;br /&gt;
        System.out.printf(&amp;quot;%1$s just purchased %2$s.\n&amp;quot;,$p.getCustomer(),$p.getProduct())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Give discount&amp;quot;&lt;br /&gt;
	no-loop true&lt;br /&gt;
    when    	&lt;br /&gt;
        $c : Customer()               &lt;br /&gt;
        $total: Float() from accumulate(&lt;br /&gt;
        	$p : Purchase(customer == $c) and&lt;br /&gt;
        	$m : Product(this == $p.getProduct()),         		&lt;br /&gt;
         	sum( $m.getPrice() ) &lt;br /&gt;
        )&lt;br /&gt;
        Number($total &amp;gt; 1000) from $total&lt;br /&gt;
    then    	&lt;br /&gt;
    	insertLogical(new Discount($c, 10))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify on discount&amp;quot;&lt;br /&gt;
	no-loop true&lt;br /&gt;
    when    	&lt;br /&gt;
        $d : Discount()               &lt;br /&gt;
    then    	&lt;br /&gt;
    	System.out.printf(&amp;quot;%1$s just got awarded %2$s%% discount.\n&amp;quot;,$d.getCustomer(),$d.getAmount())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==jUnit test==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
public class TestScenario {&lt;br /&gt;
	private KieSession ks;&lt;br /&gt;
	&lt;br /&gt;
	@Before&lt;br /&gt;
	public void setUp() {&lt;br /&gt;
		KieServices ksvr = KieServices.Factory.get();&lt;br /&gt;
		KieContainer kContainer = ksvr.getKieClasspathContainer();&lt;br /&gt;
		this.ks = kContainer.newKieSession(&amp;quot;ksession-rules&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@After&lt;br /&gt;
	public void tearDown() {&lt;br /&gt;
		ks.dispose();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testCase() {&lt;br /&gt;
		KnowledgeRuntimeLogger logger =&lt;br /&gt;
				KnowledgeRuntimeLoggerFactory.newFileLogger((KnowledgeRuntimeEventManager) ks, &amp;quot;/tmp/shopping_model&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		Customer customer1 = new Customer(&amp;quot;Test&amp;quot;, 10);&lt;br /&gt;
		ks.insert(customer1);&lt;br /&gt;
		&lt;br /&gt;
		Product product1 = new Product(&amp;quot;Laser&amp;quot;, 600);&lt;br /&gt;
		Product product2 = new Product(&amp;quot;Shower Gel&amp;quot;, 600);&lt;br /&gt;
		ks.insert(product1);&lt;br /&gt;
		ks.insert(product2);&lt;br /&gt;
		&lt;br /&gt;
		Purchase purchase1 = new Purchase(customer1, product1);&lt;br /&gt;
		Purchase purchase2 = new Purchase(customer1, product2);&lt;br /&gt;
		FactHandle fh = ks.insert(purchase1);&lt;br /&gt;
		ks.insert(purchase2);&lt;br /&gt;
		&lt;br /&gt;
		ks.fireAllRules();&lt;br /&gt;
		&lt;br /&gt;
		ks.delete(fh);&lt;br /&gt;
		&lt;br /&gt;
		ks.fireAllRules();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Test&lt;br /&gt;
	public void noDiscountNotification() {&lt;br /&gt;
		KnowledgeRuntimeLogger logger =&lt;br /&gt;
				KnowledgeRuntimeLoggerFactory.newFileLogger((KnowledgeRuntimeEventManager) ks, &amp;quot;/tmp/shopping_model&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		Customer customer1 = new Customer(&amp;quot;Test&amp;quot;, 10);&lt;br /&gt;
		ks.insert(customer1);&lt;br /&gt;
		&lt;br /&gt;
		Product product1 = new Product(&amp;quot;Laser&amp;quot;, 600);&lt;br /&gt;
		ks.insert(product1);&lt;br /&gt;
		&lt;br /&gt;
		Purchase purchase1 = new Purchase(customer1, product1);&lt;br /&gt;
		FactHandle fh = ks.insert(purchase1);&lt;br /&gt;
		&lt;br /&gt;
		ks.fireAllRules();&lt;br /&gt;
		&lt;br /&gt;
		ks.delete(fh);&lt;br /&gt;
		&lt;br /&gt;
		ks.fireAllRules();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// -------------------------------------&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Utility method to assert on discounts.&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;unchecked&amp;quot;)&lt;br /&gt;
	private static Collection&amp;lt;Discount&amp;gt; getDiscounts(KieSession kSession) {&lt;br /&gt;
		return (Collection&amp;lt;Discount&amp;gt;) kSession.getObjects(new ObjectFilter() {&lt;br /&gt;
			@Override&lt;br /&gt;
			public boolean accept(Object o) {&lt;br /&gt;
				return o instanceof Discount;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------&lt;br /&gt;
&lt;br /&gt;
kSession.addEventListener(new RuleRuntimeEventListener() {				&lt;br /&gt;
				@Override&lt;br /&gt;
				public void objectUpdated(ObjectUpdatedEvent arg0) {					&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				@Override&lt;br /&gt;
				public void objectInserted(ObjectInsertedEvent arg0) {&lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				@Override&lt;br /&gt;
				public void objectDeleted(ObjectDeletedEvent arg0) {&lt;br /&gt;
					Object obj = arg0.getOldObject();&lt;br /&gt;
					if(obj instanceof Discount) {&lt;br /&gt;
						Discount discount = (Discount) obj;&lt;br /&gt;
						System.out.printf(&amp;quot;Discount was removed from %1$s.\n&amp;quot;,discount.getCustomer());&lt;br /&gt;
					}										&lt;br /&gt;
				}&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>