<?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_Konstanz</id>
	<title>Drools Konstanz - 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_Konstanz"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Konstanz&amp;action=history"/>
	<updated>2026-04-19T11:53:14Z</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_Konstanz&amp;diff=34467&amp;oldid=prev</id>
		<title>Filip Stachecki at 17:32, 14 May 2016</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Konstanz&amp;diff=34467&amp;oldid=prev"/>
		<updated>2016-05-14T17:32:24Z</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;
Drools solutions&lt;br /&gt;
=Basic=&lt;br /&gt;
==EX1==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;List Salaries&amp;quot; enabled true&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX2==&lt;br /&gt;
===Suggestion===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;employees who earn between 1000 and 2000&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	e : Emp(sal &amp;gt;= 1000 &amp;amp;&amp;amp; &amp;lt;= 2000)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(e.id + &amp;quot; &amp;quot; + e.name + &amp;quot;\t&amp;quot; + e.job  &lt;br /&gt;
    + &amp;quot;   \t&amp;quot; +  e.mgr  + &amp;quot;\t&amp;quot; + e.hiredate + &amp;quot; &amp;quot; + e.sal&lt;br /&gt;
     + &amp;quot; &amp;quot; + e.deptno );&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
7934 ELISON	CLERK   	7782	1982 1300 10&lt;br /&gt;
7876 FORD	CLERK   	7788	1983 1100 20&lt;br /&gt;
7521 WALTON	SALESMAN   	7698	1981 1250 30&lt;br /&gt;
7844 GATES	SALESMAN   	7698	1981 1500 30&lt;br /&gt;
7499 BAROSSO	SALESMAN   	7698	1981 1600 30&lt;br /&gt;
7654 CHIRACK	SALESMAN   	7698	1981 1250 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX3==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;3&amp;quot; enabled true&lt;br /&gt;
 when&lt;br /&gt;
 e : Emp( deptno == 20 &amp;amp;&amp;amp; job == &amp;quot;CLERK&amp;quot;)&lt;br /&gt;
 then&lt;br /&gt;
     System.out.println(&lt;br /&gt;
       e.id + &amp;quot; &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; &amp;quot; +        e.sal + &amp;quot; &amp;quot; +        e.deptno );&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
7876 FORD	CLERK   	7788	1983 1100 20&lt;br /&gt;
7369 THATCHER	CLERK   	7902	1980 800 20&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX4==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 rule &amp;quot;Exercise4&amp;quot; enabled true&lt;br /&gt;
 when&lt;br /&gt;
     $e : Emp(mgr &amp;gt; 0 )&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;\t&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Suggestion 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Select employees who have a boss.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	e : Emp($bossId : mgr)&lt;br /&gt;
	Emp(id == $bossId)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(e.id + &amp;quot; &amp;quot; + e.name + &amp;quot;\t&amp;quot; + e.job  &lt;br /&gt;
    + &amp;quot;   \t&amp;quot; +  e.mgr  + &amp;quot;\t&amp;quot; + e.hiredate + &amp;quot; &amp;quot; + e.sal&lt;br /&gt;
     + &amp;quot; &amp;quot; + e.deptno );&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== OUTPUT ===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
7934 ELISON CLERK	7782 1982 1300 10&lt;br /&gt;
7876 FORD CLERK	7788 1983 1100 20&lt;br /&gt;
7788 CARNEGIE ANALYST	7566 1982 3000 20&lt;br /&gt;
7369 THATCHER CLERK	7902 1980 800 20&lt;br /&gt;
7902 TOOSK ANALYST	7566 1981 3000 20&lt;br /&gt;
7521 WALTON SALESMAN	7698 1981 1250 30&lt;br /&gt;
7900 BUFFETT CLERK	7698 1981 950 30&lt;br /&gt;
7844 GATES SALESMAN	7698 1981 1500 30&lt;br /&gt;
7499 BAROSSO SALESMAN	7698 1981 1600 30&lt;br /&gt;
7654 CHIRACK SALESMAN	7698 1981 1250 30&lt;br /&gt;
7566 PUTIN MANAGER	7839 1981 2975 20&lt;br /&gt;
7782 MERKEL MANAGER	7839 1981 2450 10&lt;br /&gt;
7698 BLAIR MANAGER	7839 1981 2850 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX5==&lt;br /&gt;
===Suggestion===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Select manager’s annual remuneration.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	e : Emp(job == &amp;quot;MANAGER&amp;quot;, $sal : sal)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(e.id + &amp;quot; &amp;quot; + e.name + &amp;quot;\t&amp;quot; + e.job  &lt;br /&gt;
    + &amp;quot;   \t&amp;quot; +  e.mgr  + &amp;quot;\t&amp;quot; + e.hiredate + &amp;quot; &amp;quot; + $sal*12&lt;br /&gt;
     + &amp;quot; &amp;quot; + e.deptno );&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
7566 PUTIN	MANAGER   	7839	1981 35700 20&lt;br /&gt;
7782 MERKEL	MANAGER   	7839	1981 29400 10&lt;br /&gt;
7698 BLAIR	MANAGER   	7839	1981 34200 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX6==&lt;br /&gt;
 rule &amp;quot;Exercise 6&amp;quot; enabled false&lt;br /&gt;
 when&lt;br /&gt;
 	 $e : Emp( name matches &amp;quot;.LA.*&amp;quot; )&lt;br /&gt;
 then&lt;br /&gt;
     annual = 12 * $e.sal&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 + &amp;quot; &amp;quot; +annual);&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 7698 BLAIR MANAGER 7839 1981 2850 30 34200&lt;br /&gt;
&lt;br /&gt;
==EX7==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 7&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(&lt;br /&gt;
       e.id + &amp;quot; &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; &amp;quot; + e.sal + &amp;quot; &amp;quot; + e.mgr + &amp;quot; &amp;quot; + e.deptno ); &lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
7521 WALTON	SALESMAN   	7698	1981 1250 7698 30&lt;br /&gt;
7566 PUTIN	MANAGER   	7839	1981 2975 7839 20&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX8==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
 rule &amp;quot;Sample8&amp;quot; //enabled false&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  + &amp;quot; &amp;quot; + e.job)&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Suggestion 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Find 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; &amp;amp;&amp;amp; deptno != 10)) &lt;br /&gt;
		or &lt;br /&gt;
	e: Emp((deptno == 10 &amp;amp;&amp;amp; 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;\t&amp;quot; + e.job  &lt;br /&gt;
    + &amp;quot;   \t&amp;quot; +  e.mgr  + &amp;quot;\t&amp;quot; + e.hiredate + &amp;quot; &amp;quot; + e.sal&lt;br /&gt;
     + &amp;quot; &amp;quot; + e.deptno );&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
7566 PUTIN	MANAGER   	7839	1981 2975 20&lt;br /&gt;
7698 BLAIR	MANAGER   	7839	1981 2850 30&lt;br /&gt;
7934 ELISON	CLERK   	7782	1982 1300 10&lt;br /&gt;
7839 BUSH	PRESIDENT   	0	1981 5000 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Advanced=&lt;br /&gt;
==EX31==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  rule &amp;quot;Exercise 31&amp;quot; enabled false&lt;br /&gt;
  when &lt;br /&gt;
    $dep : Dept()&lt;br /&gt;
    $e : Emp(deptno == $dep.deptno)&lt;br /&gt;
  then&lt;br /&gt;
    System.out.println($e.name + &amp;quot;\t&amp;quot; + $dep.loc);&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Suggestion 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;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($dep : deptno)&lt;br /&gt;
	Dept(deptno == $dep, $city : loc)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($e.name + &amp;quot;\t&amp;quot; + $city)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX32==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;32. Select the names of the employees, and the name and number of their department.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$e : Emp($dep : deptno)&lt;br /&gt;
	$d : Dept(deptno == $dep, $depName : dname)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($e.name + &amp;quot;\t\t&amp;quot; + $depName + &amp;quot;\t\t&amp;quot; + $dep)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
ELISON		ACCOUNTING		10&lt;br /&gt;
FORD		RESEARCH		20&lt;br /&gt;
CARNEGIE		RESEARCH		20&lt;br /&gt;
THATCHER		RESEARCH		20&lt;br /&gt;
TOOSK		RESEARCH		20&lt;br /&gt;
WALTON		SALES		30&lt;br /&gt;
BUFFETT		SALES		30&lt;br /&gt;
GATES		SALES		30&lt;br /&gt;
BAROSSO		SALES		30&lt;br /&gt;
CHIRACK		SALES		30&lt;br /&gt;
PUTIN		RESEARCH		20&lt;br /&gt;
MERKEL		ACCOUNTING		10&lt;br /&gt;
BLAIR		SALES		30&lt;br /&gt;
BUSH		ACCOUNTING		10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX33==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;33&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
 s : Salgrade()&lt;br /&gt;
 e : Emp(e.sal &amp;gt; 2000, e.sal &amp;lt;= s.hisal , e.sal &amp;gt;= s.losal)&lt;br /&gt;
then&lt;br /&gt;
     System.out.println(&lt;br /&gt;
       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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!ename&lt;br /&gt;
!sal&lt;br /&gt;
!grade&lt;br /&gt;
|-&lt;br /&gt;
|BLAIR	&lt;br /&gt;
|2850	&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|MERKEL	&lt;br /&gt;
|2450	&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|PUTIN	&lt;br /&gt;
|2975	&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|TOOSK	&lt;br /&gt;
|3000	&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|CARNEGIE	&lt;br /&gt;
|3000	&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|BUSH	&lt;br /&gt;
|5000	&lt;br /&gt;
|5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==EX34==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;34&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
 d : Dept()&lt;br /&gt;
 e : Emp(e.deptno == d.deptno, d.loc == &amp;quot;LONDON&amp;quot;)&lt;br /&gt;
then&lt;br /&gt;
     System.out.println(&lt;br /&gt;
       e.name + &amp;quot;\t&amp;quot; + d.loc);&lt;br /&gt;
end   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===     &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!ename&lt;br /&gt;
!loc&lt;br /&gt;
|-&lt;br /&gt;
|PUTIN	&lt;br /&gt;
|LONDON&lt;br /&gt;
|-&lt;br /&gt;
|TOOSK	&lt;br /&gt;
|LONDON&lt;br /&gt;
|-&lt;br /&gt;
|THATCHER	&lt;br /&gt;
|LONDON&lt;br /&gt;
|-&lt;br /&gt;
|CARNEGIE	&lt;br /&gt;
|LONDON&lt;br /&gt;
|-&lt;br /&gt;
|FORD	&lt;br /&gt;
|LONDON&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==EX35==&lt;br /&gt;
  rule &amp;quot;Exercise 35&amp;quot; &lt;br /&gt;
  when &lt;br /&gt;
    $e : Emp()&lt;br /&gt;
    $d : Dept(loc != &amp;#039;LONDON&amp;#039; &amp;amp;&amp;amp; deptno == $e.deptno)&lt;br /&gt;
    $s : Salgrade(losal &amp;lt;= $e.sal &amp;amp;&amp;amp; hisal &amp;gt;= $e.sal)&lt;br /&gt;
  then&lt;br /&gt;
    System.out.println($e.name + &amp;quot;\t&amp;quot; + $d.loc + &amp;quot;\t&amp;quot; + $s.grade);&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==EX36==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;36. Find departments without employees.&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
	$d : Dept($dep : deptno)&lt;br /&gt;
	not Emp($dep == deptno)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($d.dname + &amp;quot;\t&amp;quot; + $dep)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
OPERATIONS	40&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX37==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;37. Select an employee’s name and his/her boss’s name&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$emp : Emp($mgr : mgr)&lt;br /&gt;
	$boss : Emp(id == $mgr)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($boss.name + &amp;quot; is boss of &amp;quot; + $emp.name)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
BUSH is boss of BLAIR&lt;br /&gt;
BUSH is boss of MERKEL&lt;br /&gt;
BUSH is boss of PUTIN&lt;br /&gt;
BLAIR is boss of CHIRACK&lt;br /&gt;
BLAIR is boss of BAROSSO&lt;br /&gt;
BLAIR is boss of GATES&lt;br /&gt;
BLAIR is boss of BUFFETT&lt;br /&gt;
BLAIR is boss of WALTON&lt;br /&gt;
PUTIN is boss of TOOSK&lt;br /&gt;
TOOSK is boss of THATCHER&lt;br /&gt;
PUTIN is boss of CARNEGIE&lt;br /&gt;
CARNEGIE is boss of FORD&lt;br /&gt;
MERKEL is boss of ELISON&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX38==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;38. Select employees who doesn&amp;#039;t have a boss.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$emp : Emp($mgr : mgr)&lt;br /&gt;
	not Emp(id == $mgr)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($emp.name)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
BUSH&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX39==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;39. Show all employees who have no subordinates.&amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
	$emp : Emp($id : id)&lt;br /&gt;
	not Emp(mgr == $id)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($emp.name)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
CHIRACK&lt;br /&gt;
BAROSSO&lt;br /&gt;
GATES&lt;br /&gt;
BUFFETT&lt;br /&gt;
WALTON&lt;br /&gt;
THATCHER&lt;br /&gt;
FORD&lt;br /&gt;
ELISON&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX41==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;41. Select employees hired earlier than their bosses.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$emp : Emp($mgr : mgr, $empHireDate : hiredate)&lt;br /&gt;
	$boss : Emp(id == $mgr, $empHireDate &amp;lt; hiredate)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($emp.name + &amp;quot; hired in &amp;quot; + $empHireDate + &amp;quot; whose boss is &amp;quot; + $boss.name + &amp;quot; hired in &amp;quot; + $boss.hiredate)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
THATCHER hired in 1980 whose boss is TOOSK hired in 1981&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX44==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;44. Find jobs which are in department 10 but not in department 20.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$e : Emp(deptno == 10, $job : job)&lt;br /&gt;
	not Emp(deptno == 20, $job == job)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println($job)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
PRESIDENT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX23==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;23. Find the minimal, maximal and average salaries of people employed in 1981.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	accumulate($emp : Emp(hiredate == 1981),&lt;br /&gt;
		$min : min($emp.sal),&lt;br /&gt;
		$max : max($emp.sal),&lt;br /&gt;
		$avg : average($emp.sal)&lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Salary from Employees hired in 1981: avg: &amp;quot; + $avg + &amp;quot; min: &amp;quot; + $min + &amp;quot; max: &amp;quot; + $max)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Salary from Employees hired in 1981: avg: 2282.5 min: 950.0 max: 5000.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX24==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;24. Find the difference between maximal and minimal salary.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	accumulate($emp : Emp(),&lt;br /&gt;
		$min : min($emp.sal),&lt;br /&gt;
		$max : max($emp.sal)&lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Total difference: &amp;quot; + ($max - $min))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Total difference: 4200.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX26==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
 rule &amp;quot;26. How many managers work for the company?&amp;quot; enabled true&lt;br /&gt;
 when&lt;br /&gt;
  accumulate ($e :Emp(job == &amp;#039;MANAGER&amp;#039;), $cnt : count($e.job)) &lt;br /&gt;
 then    &lt;br /&gt;
  System.out.println(&amp;quot;How many managers work for the company: &amp;quot; + $cnt + &amp;quot;\n&amp;quot;);&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suggestion 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&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;), &lt;br /&gt;
    $count : count(e))&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Amount of managers: 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX25==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX27==&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Department ACCOUNTING has annual average: 35000.0&lt;br /&gt;
Department RESEARCH has annual average: 26100.0&lt;br /&gt;
Department SALES has annual average: 18800.0&lt;br /&gt;
Department OPERATIONS has annual average: 0.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX43==&lt;br /&gt;
=== Not know why===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;43+&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	e1 : Emp(hiredate == 1982)&lt;br /&gt;
	e2 : Emp(hiredate == 1983)&lt;br /&gt;
	exists (Emp(e1.job == job, e2.job == job))&lt;br /&gt;
then&lt;br /&gt;
   System.out.println( e1.job)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Suggestion 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Suggestion 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Output===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Job: CLERK&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX28==&lt;br /&gt;
=== Solution 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 28 Find departments with more than 3 workers.&amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
  $d : Dept()&lt;br /&gt;
  accumulate(e:Emp(deptno == $d.deptno), $wc : count(e))&lt;br /&gt;
  Number(doubleValue &amp;gt; 3) from $wc&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($d.deptno + &amp;quot;:&amp;quot; + $wc)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX45==&lt;br /&gt;
=== Solution 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX46==&lt;br /&gt;
=== Solution 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&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&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Solution 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
declare jobPost2&lt;br /&gt;
	job: String&lt;br /&gt;
	max: Double&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 46&amp;quot; &lt;br /&gt;
&lt;br /&gt;
when &lt;br /&gt;
	Emp(j:job)&lt;br /&gt;
	and not jobPost2(j == job)&lt;br /&gt;
	Number(max:doubleValue) from accumulate(Emp(s:sal, job==j), max(s)) &lt;br /&gt;
then&lt;br /&gt;
	insert(new jobPost2(j, max))&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Display&amp;quot;&lt;br /&gt;
&lt;br /&gt;
when&lt;br /&gt;
	jp: jobPost2(j: job, m: max)&lt;br /&gt;
	e: Emp (e.sal == m, e.job == j)&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Solution 3===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
declare JobToProcess&lt;br /&gt;
   job : String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;46. Select employees earning the maximum salaries in their positions (jobs). - Create jobs&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	Emp($job : job)&lt;br /&gt;
	not JobToProcess(job == $job)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Found job: &amp;quot; + $job)&lt;br /&gt;
  	insert(new JobToProcess($job))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;46. Select employees earning the maximum salaries in their positions (jobs). - Select based on declared type&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$jobToProcess : JobToProcess($job : job)&lt;br /&gt;
	Number($max : longValue) from accumulate($emp : Emp(job == $job),&lt;br /&gt;
   		max($emp.sal)&lt;br /&gt;
	)&lt;br /&gt;
	$empWithMax : Emp(job == $job, sal == $max)&lt;br /&gt;
then   &lt;br /&gt;
  	System.out.println(&amp;quot;Employee: &amp;quot; + $empWithMax.name + &amp;quot; salary: &amp;quot; + $empWithMax.sal + &amp;quot;  position: &amp;quot; + $job + &amp;quot; top: &amp;quot; + $max)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX51==&lt;br /&gt;
=== Solution 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
rule &amp;quot;Ex 51 Find employees earning more than the average salary in their department.&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	Dept(dn :deptno)&lt;br /&gt;
	Number($avg :longValue) from accumulate (Emp(s: sal,deptno == dn ), average(s))&lt;br /&gt;
	e : Emp(deptno == dn,sal &amp;gt; $avg)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(e.name + &amp;quot;\t&amp;quot; + e.deptno + &amp;quot;\t&amp;quot; + e.sal)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX55==&lt;br /&gt;
=== Solution 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
declare AvgSalaryOfDeptno&lt;br /&gt;
   avgSalary : double&lt;br /&gt;
   deptno : int&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55 Find the maximum average salary of departments. 1&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
  $e:Emp()&lt;br /&gt;
  accumulate (empOfDept:Emp(deptno == $e.deptno), $avgDep : average(empOfDept.sal))&lt;br /&gt;
  not(AvgSalaryOfDeptno(deptno == $e.deptno))&lt;br /&gt;
then&lt;br /&gt;
  insert(new AvgSalaryOfDeptno($avgDep, $e.deptno));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Exercise 55 Find the maximum average salary of departments. 2&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
  $avod : AvgSalaryOfDeptno()&lt;br /&gt;
  accumulate (depToCheck:AvgSalaryOfDeptno(), $maxAverage : max(depToCheck.avgSalary))&lt;br /&gt;
  Number(doubleValue == $avod.avgSalary) from $maxAverage&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($avod.deptno + &amp;quot;:&amp;quot; + $avod.avgSalary);&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Solution 2 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;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&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output ===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
10 Salary: 2916.6666666666665&amp;lt;/source&amp;gt;&lt;br /&gt;
=DSL=&lt;br /&gt;
==EX1==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
[condition][]There are employees earning more than {salary}=e:Emp(sal &amp;gt; {salary})&lt;br /&gt;
[*][]Show name and salary=System.out.println(&amp;quot;Name: &amp;quot; + e.name + &amp;quot; Salary: &amp;quot; + e.sal)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package rules1&lt;br /&gt;
import com.nobleprog.FactModel.*;&lt;br /&gt;
import java.lang.Math&lt;br /&gt;
dialect &amp;quot;mvel&amp;quot; &lt;br /&gt;
&lt;br /&gt;
expander  Exercise01.dsl&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Rule 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
when&lt;br /&gt;
 There are employees earning more than 2000&lt;br /&gt;
then&lt;br /&gt;
 Show name and salary&lt;br /&gt;
&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;
[condition][]There is a department which:=d:Dept()&lt;br /&gt;
[consequence][]Show department name=System.out.println(d.dname)&lt;br /&gt;
[condition][]has at least {c} employees working in it=accumulate(e:Emp(deptno == d.deptno), $countOfEmployees : count(e)) &amp;amp;&amp;amp; Number(intValue &amp;gt;= {c}) from $countOfEmployees&lt;br /&gt;
[condition][]average salary is greater than {sal}=accumulate(e2:Emp(deptno == d.deptno), $avgSal: average(e2.sal)) &amp;amp;&amp;amp;  Number(doubleValue &amp;gt; {sal}) from $avgSal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package rules2&lt;br /&gt;
import com.nobleprog.FactModel.*;&lt;br /&gt;
import java.lang.Math&lt;br /&gt;
dialect &amp;quot;mvel&amp;quot; &lt;br /&gt;
&lt;br /&gt;
expander  Exercise02.dsl&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Rule 2&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
 There is a department which:&lt;br /&gt;
   has at least 3 employees working in it&lt;br /&gt;
   average salary is greater than 2000&lt;br /&gt;
then&lt;br /&gt;
 Show department name&lt;br /&gt;
end&lt;br /&gt;
&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;
[condition][]There are departments where:=d : Dept()&lt;br /&gt;
[condition][]there are analysts working in=exists Emp(job == &amp;#039;ANALYST&amp;#039;, deptno == d.deptno)&lt;br /&gt;
[consequence][]Show department name=System.out.println(d.dname)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package rules3&lt;br /&gt;
import com.nobleprog.FactModel.*;&lt;br /&gt;
import java.lang.Math&lt;br /&gt;
dialect &amp;quot;mvel&amp;quot; &lt;br /&gt;
&lt;br /&gt;
expander Exercise03.dsl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Rule 3&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
// Make sure that the rule will work for both cases&lt;br /&gt;
 There are departments where:&lt;br /&gt;
//  There is a department where:&lt;br /&gt;
	there are analysts working in &lt;br /&gt;
	//also there is an anlyst working in it&lt;br /&gt;
then&lt;br /&gt;
 Show department name&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=ShoppingExample=&lt;br /&gt;
== Solution 1 ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package rules;&lt;br /&gt;
import com.nobleprog.*;&lt;br /&gt;
dialect &amp;quot;mvel&amp;quot; &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.println(&amp;quot;Purchase of &amp;quot;+p.customer.name+&amp;quot; for &amp;quot;+p.product.name);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Apply Discount of 10% if over 1000&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  c:Customer()&lt;br /&gt;
  accumulate (p:Purchase(), $allPurchases : sum(p.product.price))&lt;br /&gt;
  Number(doubleValue &amp;gt; 1000) from $allPurchases&lt;br /&gt;
then&lt;br /&gt;
  insertLogical(new Discount(c, 0.1*$allPurchases));&lt;br /&gt;
  c.discount = 0.1*$allPurchases;&lt;br /&gt;
  System.out.println(&amp;quot;Create new Discount for &amp;quot;+c.name+&amp;quot; over &amp;quot;+0.1*$allPurchases);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify when discoutn is awarded&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  c:Customer()&lt;br /&gt;
  exists(Discount(customer == c))&lt;br /&gt;
then&lt;br /&gt;
  System.out.println(&amp;quot;Customer &amp;quot;+c.name+ &amp;quot; is awarded&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify when customer has no more discount&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;
  System.out.println(&amp;quot;Customer &amp;quot;+c.name+ &amp;quot; has no discount&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Solution 2 ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;List Purchases&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	Purchase($customer : customer, $product : product)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Customer &amp;quot; + $customer.name + &amp;quot; just purchased &amp;quot; + $product.name)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Give Discount&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$customer : Customer($customerName : name)&lt;br /&gt;
	Number($sum : doubleValue, doubleValue &amp;gt; 1000) from accumulate(&lt;br /&gt;
		Purchase(customer == $customer, $product : product),&lt;br /&gt;
		sum($product.price)&lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Customer &amp;quot; + $customer.name + &amp;quot; receives discount for buying for a total amount of &amp;quot; + $sum)&lt;br /&gt;
  	insert(new Discount($customer, 10))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Take discount&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
	$discount : Discount($customer : customer, $customerName : customer.name)&lt;br /&gt;
	Number($sum : doubleValue, doubleValue &amp;lt; 1000) from accumulate(&lt;br /&gt;
		Purchase(customer == $customer, $product : product),&lt;br /&gt;
		sum($product.price)&lt;br /&gt;
	)&lt;br /&gt;
then    &lt;br /&gt;
  	System.out.println(&amp;quot;Discount of &amp;quot; + $customer.name + &amp;quot; is not available anymore, because of a total purchase sum of &amp;quot;+ $sum)&lt;br /&gt;
  	retract($discount)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Filip Stachecki</name></author>
	</entry>
</feed>