<?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_Albuquerque</id>
	<title>Drools Albuquerque - 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_Albuquerque"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Albuquerque&amp;action=history"/>
	<updated>2026-04-21T08:52:39Z</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_Albuquerque&amp;diff=68636&amp;oldid=prev</id>
		<title>Fstachecki: /* insertLogical */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Albuquerque&amp;diff=68636&amp;oldid=prev"/>
		<updated>2018-09-13T15:32:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;insertLogical&lt;/span&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;01. Select all Salgrade facts&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $s : Salgrade()&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(&lt;br /&gt;
     $s.grade + &amp;quot;\t&amp;quot; +&lt;br /&gt;
     $s.losal + &amp;quot;\t&amp;quot; +&lt;br /&gt;
     $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;2 - Select shown data about employees who earn between 1000 and 2000.&amp;quot;&lt;br /&gt;
//	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(&lt;br /&gt;
			$e.id + &amp;quot; &amp;quot; + &lt;br /&gt;
			$e.name + &amp;quot; &amp;quot; +&lt;br /&gt;
			$e.job + &amp;quot; &amp;quot; + &lt;br /&gt;
			$e.mgr + &amp;quot; &amp;quot; +&lt;br /&gt;
			$e.hiredate + &amp;quot; &amp;quot; +&lt;br /&gt;
			$e.sal + &amp;quot; &amp;quot; +&lt;br /&gt;
			$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;Clerks in 20&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp($e.getJob() == &amp;quot;CLERK&amp;quot; , $e.getDeptno() == 20)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.getId() + &amp;quot; &amp;quot; + $e.getName() + &amp;quot;\t&amp;quot; + $e.getJob() &lt;br /&gt;
      + &amp;quot;\t&amp;quot; + $e.getMgr() + &amp;quot; &amp;quot; + $e.getHiredate() + &amp;quot; &amp;quot; + $e.getSal() + &amp;quot; &amp;quot; + $e.getDeptno())&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;04. Select employees who have a boss.&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 //$e : Emp( job in (&amp;#039;SALESMEN&amp;#039;, &amp;#039;CLERK&amp;#039;, &amp;#039;ANALYST&amp;#039;))&lt;br /&gt;
 $e : Emp( job not in (&amp;#039;PRESIDENT&amp;#039;, &amp;#039;MANAGER&amp;#039;))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.id + &amp;quot; &amp;quot; +&lt;br /&gt;
  					 $e.name + &amp;quot; &amp;quot; +&lt;br /&gt;
  					 $e.job + &amp;quot; &amp;quot; + &lt;br /&gt;
  					 $e.mgr + &amp;quot; &amp;quot; +&lt;br /&gt;
  					 $e.hiredate + &amp;quot; &amp;quot; +&lt;br /&gt;
  					 $e.sal + &amp;quot; &amp;quot; +&lt;br /&gt;
  					 $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;
/*&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;
*/&lt;br /&gt;
rule &amp;quot;05. Select manager&amp;#039;s annual remuneration&amp;quot;&lt;br /&gt;
enabled true&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;\t&amp;quot; &lt;br /&gt;
  			+ $e.name + &amp;quot;\t&amp;quot; &lt;br /&gt;
  			+ $e.job + &amp;quot;\t&amp;quot; &lt;br /&gt;
  			+ $e.mgr + &amp;quot;\t&amp;quot; &lt;br /&gt;
  			+ $e.hiredate + &amp;quot;\t&amp;quot; &lt;br /&gt;
  			+ ($e.sal*12) + &amp;quot;\t&amp;quot; &lt;br /&gt;
                        + $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;
/*Expected Output&lt;br /&gt;
+-------+&lt;br /&gt;
| name |&lt;br /&gt;
+-------+&lt;br /&gt;
| BLAIR |&lt;br /&gt;
+-------+&lt;br /&gt;
*/&lt;br /&gt;
rule &amp;quot;employees with second letter “L” and third “A”&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(&amp;quot;| &amp;quot; + $e.name + &amp;quot; |&amp;quot;)&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;7 - Find employees whose name ends with N and contains T.&amp;quot;&lt;br /&gt;
//	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.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;
/* EXPECTED OUTPUT:&lt;br /&gt;
+--------+-----------+--------+&lt;br /&gt;
| ename  | job       | deptno |&lt;br /&gt;
+--------+-----------+--------+&lt;br /&gt;
| BUSH   | PRESIDENT | 10     |&lt;br /&gt;
| BLAIR  | MANAGER   | 30     |&lt;br /&gt;
| PUTIN  | MANAGER   | 20     |&lt;br /&gt;
| ELISON | CLERK     | 10     |&lt;br /&gt;
+--------+-----------+--------+&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;08. Find employees who either work as managers or work in department no 10, but not both.&amp;quot;&lt;br /&gt;
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;
           (job != &amp;quot;MANAGER&amp;quot; &amp;amp;&amp;amp; deptno == 10) )&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(&amp;quot;+--------+-----------+--------+&amp;quot;);&lt;br /&gt;
  System.out.printf(&amp;quot;| %-6s | %-9s | %-6s |\n&amp;quot;, $e.name, $e.job, $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;31 - Select the name of the employee and the city (LOC column in DEPT table) in which they work&amp;quot;&lt;br /&gt;
//	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&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;Select the names of the employees, and the name and number of their department&amp;quot;&lt;br /&gt;
enabled true&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;\t&amp;quot; + $d.dname + &amp;quot;\t&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;
/* 33. EXPECTED OUTPUT:&lt;br /&gt;
+----------+---------+-------+&lt;br /&gt;
| ename    | sal     | grade |&lt;br /&gt;
+----------+---------+-------+&lt;br /&gt;
| BUSH     | 5000.00 | 5     |&lt;br /&gt;
| BLAIR    | 2850.00 | 4     |&lt;br /&gt;
| MERKEL   | 2450.00 | 4     |&lt;br /&gt;
| PUTIN    | 2975.00 | 4     |&lt;br /&gt;
| TOOSK    | 3000.00 | 4     |&lt;br /&gt;
| CARNEGIE | 3000.00 | 4     |&lt;br /&gt;
+----------+---------+-------+&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;33. Select the names of the employees, their salary and salary grade, but only those whose salary is more than 2000.&amp;quot;&lt;br /&gt;
enabled false&lt;br /&gt;
when &lt;br /&gt;
	e : Emp( sal &amp;gt; 2000 )&lt;br /&gt;
	s : Salgrade(e.sal &amp;gt;= losal &amp;amp;&amp;amp; e.sal &amp;lt;= hisal)&lt;br /&gt;
then    &lt;br /&gt;
	System.out.printf(&amp;quot;| %-8s | %-4s.00 | %-9s |\n&amp;quot;, e.name, e.sal, 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;
rule &amp;#039;London employees&amp;#039;&lt;br /&gt;
enabled true&lt;br /&gt;
when&lt;br /&gt;
	$e : Emp()&lt;br /&gt;
	$d : Dept($e.deptno == deptno &amp;amp;&amp;amp; loc == &amp;#039;LONDON&amp;#039;)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($e.name + &amp;#039;\t&amp;#039; + $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;35. Select employees and their salary grades except those from London.&amp;quot;&lt;br /&gt;
enabled true&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 &amp;amp;&amp;amp; $e.sal &amp;lt;= hisal)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($e.name + &amp;quot;\t&amp;quot; &lt;br /&gt;
  			+ $d.loc + &amp;quot;\t&amp;quot;&lt;br /&gt;
  			+ $s.grade)&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 lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/* Expected Output&lt;br /&gt;
OPERATIONS&lt;br /&gt;
*/&lt;br /&gt;
rule &amp;quot;Find departments without employees&amp;quot;&lt;br /&gt;
enabled true&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;#37 Employee and their boss&amp;quot;&lt;br /&gt;
// enable false&lt;br /&gt;
when&lt;br /&gt;
   $e :Emp()&lt;br /&gt;
   $m :Emp(id == $e.mgr)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($m.name + &amp;quot; manages &amp;quot; + $e.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;
/* 38. EXPECTED OUTPUT:&lt;br /&gt;
BUSH&lt;br /&gt;
*/&lt;br /&gt;
rule &amp;quot;38. Select employees who doesn&amp;#039;t have a boss. &amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when &lt;br /&gt;
	e : Emp()&lt;br /&gt;
	not (Emp(e.mgr == 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;
==EX39==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;39 - Show all employees who have no subordinates&amp;quot;&lt;br /&gt;
//	enabled false&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;
// Exercise 41&lt;br /&gt;
rule &amp;quot;Select employees hired earlier than their bosses&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e :Emp()&lt;br /&gt;
 $m :Emp($e.mgr == $m.id , $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&lt;br /&gt;
      + &amp;quot; the boss &amp;quot; + $m.name + &amp;quot; 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;44 - Find jobs which are in department 10 but not in department 20.&amp;quot;&lt;br /&gt;
//	enabled false&lt;br /&gt;
	when&lt;br /&gt;
		$e1: Emp( deptno==10 )&lt;br /&gt;
		not (Emp( deptno==20, job==$e1.job ))&lt;br /&gt;
//		NOTE: this isn&amp;#039;t the most stable:&lt;br /&gt;
//			If two employees, both in department 10, have the same job, and that job is not in department 20, it will be printed twice.&lt;br /&gt;
//			But we can do no better with what we&amp;#039;ve learned up until this point in the course.&lt;br /&gt;
	then&lt;br /&gt;
		System.out.println($e1.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;
// Exercise 23 &lt;br /&gt;
rule &amp;quot;Find the minimal, maximal and average salaries of people employed in 1981&amp;quot;&lt;br /&gt;
enabled true&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;Ex 24. Find the difference between maximal and minimal salary.&amp;quot;&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) + &amp;quot;.&amp;quot;);&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;How many managers work for the company?&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when &lt;br /&gt;
	 accumulate (e :Emp(job == &amp;quot;MANAGER&amp;quot;), numMgrs : count(e))&lt;br /&gt;
then&lt;br /&gt;
	System.out.println(&amp;quot;Company has &amp;quot; + numMgrs + &amp;quot; managers&amp;quot;)&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;
 +-----------+-------------+&lt;br /&gt;
 | job       | Average     |&lt;br /&gt;
 +-----------+-------------+&lt;br /&gt;
 | ANALYST   | 3000.000000 |&lt;br /&gt;
 | CLERK     | 1037.500000 |&lt;br /&gt;
 | MANAGER   | 2758.333333 |&lt;br /&gt;
 | PRESIDENT | 5000.000000 |&lt;br /&gt;
 | SALESMAN  | 1400.000000 |&lt;br /&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;&lt;br /&gt;
//enabled true&lt;br /&gt;
when&lt;br /&gt;
   Emp(j: job) and&lt;br /&gt;
   not SalByJob(j == job)&lt;br /&gt;
   accumulate (e :Emp(job == j), $avg : average(e.sal)) &lt;br /&gt;
then    &lt;br /&gt;
   System.out.println(&amp;quot;Position &amp;quot; + j + &amp;quot; has average salary: &amp;quot; + $avg + &amp;quot;.&amp;quot; )&lt;br /&gt;
   insert(new SalByJob(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;
/* 27. EXPECTED OUTPUT:&lt;br /&gt;
+--------+-----------------+&lt;br /&gt;
| deptno | Annual Salaries |&lt;br /&gt;
+--------+-----------------+&lt;br /&gt;
| 10     | 35000.000000    |&lt;br /&gt;
| 20     | 26100.000000    |&lt;br /&gt;
| 30     | 18800.000000    |&lt;br /&gt;
+--------+-----------------+&lt;br /&gt;
*/&lt;br /&gt;
declare Deps&lt;br /&gt;
   dn : int&lt;br /&gt;
end&lt;br /&gt;
rule &amp;quot;27. Find the average annual salaries in departments.&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when&lt;br /&gt;
   Emp( d : deptno ) and not Deps( d == dn )&lt;br /&gt;
   accumulate ( &lt;br /&gt;
     e : Emp( d == deptno ),&lt;br /&gt;
     avg : average((e.sal * 12))   	&lt;br /&gt;
   ) &lt;br /&gt;
then    &lt;br /&gt;
   System.out.printf(&amp;quot;| %s | %.2f |\n&amp;quot;, d, avg);&lt;br /&gt;
   insert(new Deps(d))&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 AlreadyFiredRule43&lt;br /&gt;
	job : String&lt;br /&gt;
end&lt;br /&gt;
rule &amp;quot;43 - Find post filled in 1982 and 1983.&amp;quot;&lt;br /&gt;
//	enabled false&lt;br /&gt;
	when&lt;br /&gt;
		Emp( $post: job, hiredate==1982)&lt;br /&gt;
			and not AlreadyFiredRule43( job==$post )&lt;br /&gt;
		Emp( job==$post, hiredate==1983)&lt;br /&gt;
	then&lt;br /&gt;
		System.out.println($post);&lt;br /&gt;
		insert(new AlreadyFiredRule43($post));&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source&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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX28==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
/* 28. EXPECTED OUTPUT:&lt;br /&gt;
+--------+----------+&lt;br /&gt;
| deptno | count(*) |&lt;br /&gt;
+--------+----------+&lt;br /&gt;
| 20     | 5        |&lt;br /&gt;
| 30     | 6        |&lt;br /&gt;
+--------+----------+&lt;br /&gt;
*/  &lt;br /&gt;
rule &amp;quot;28. Find departments with more than 3 workers.&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when&lt;br /&gt;
   Dept( d : deptno )&lt;br /&gt;
   accumulate ( &lt;br /&gt;
     e : Emp(d == deptno),&lt;br /&gt;
     c : count(e)   	&lt;br /&gt;
   ) &lt;br /&gt;
   Number(doubleValue &amp;gt; 3) from c&lt;br /&gt;
then    &lt;br /&gt;
   System.out.printf(&amp;quot;| %s | %s |\n&amp;quot;, d, c);&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;45 - Find employees earning more than the manager&amp;#039;s (job==&amp;#039;MANAGER&amp;#039;) average.&amp;quot;&lt;br /&gt;
//	enabled false&lt;br /&gt;
	when&lt;br /&gt;
		accumulate(&lt;br /&gt;
			$m : Emp ( job==&amp;quot;MANAGER&amp;quot;, $ss: sal ),&lt;br /&gt;
			$avg : average($ss)&lt;br /&gt;
		)&lt;br /&gt;
		$e: Emp( $s: sal&amp;gt;$avg.doubleValue(), $n: name )&lt;br /&gt;
	then&lt;br /&gt;
		System.out.println($n + &amp;quot; &amp;quot; + $s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX46==&lt;br /&gt;
solution 1&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
/* 46. EXPECTED OUTPUT:&lt;br /&gt;
+----------+-----------+---------+&lt;br /&gt;
| ename    | job       | sal     |&lt;br /&gt;
+----------+-----------+---------+&lt;br /&gt;
| ELISON   | CLERK     | 1300.00 |&lt;br /&gt;
| BAROSSO  | SALESMAN  | 1600.00 |&lt;br /&gt;
| PUTIN    | MANAGER   | 2975.00 |&lt;br /&gt;
| TOOSK    | ANALYST   | 3000.00 |&lt;br /&gt;
| CARNEGIE | ANALYST   | 3000.00 |&lt;br /&gt;
| BUSH     | PRESIDENT | 5000.00 |&lt;br /&gt;
+----------+-----------+---------+&lt;br /&gt;
*/  &lt;br /&gt;
rule &amp;quot;46. Select employees earning the maximum salaries in their positions (jobs). &amp;quot;&lt;br /&gt;
enabled false&lt;br /&gt;
when&lt;br /&gt;
   e : Emp()&lt;br /&gt;
   Number(max_sal : longValue) from accumulate (Emp(s: sal, job == e.job), max(s))&lt;br /&gt;
   Number(doubleValue == e.sal) from max_sal&lt;br /&gt;
then    &lt;br /&gt;
   System.out.printf(&amp;quot;| %-9s | %-10s | %s.00 |\n&amp;quot;, e.name, e.job, e.sal);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
solution 2 - doesn&amp;#039;t work&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
declare RichJobs&lt;br /&gt;
	job: String&lt;br /&gt;
	name: String&lt;br /&gt;
end&lt;br /&gt;
//Example 46&lt;br /&gt;
rule &amp;quot;Select employees earning the maximum salaries in their positions (jobs). &amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	Emp($job: job, $name: name, $sal: sal) and not RichJobs($job == job, $name == name)&lt;br /&gt;
	accumulate (&lt;br /&gt;
		$e: Emp(job == $job),&lt;br /&gt;
		$max: max($e.sal)&lt;br /&gt;
	)&lt;br /&gt;
	Number($sal == $max) from $max&lt;br /&gt;
then&lt;br /&gt;
	System.out.println(&lt;br /&gt;
  		$name + &amp;quot; | &amp;quot; + $job + &amp;quot; | &amp;quot; + $max + &amp;quot;\n&amp;quot;&lt;br /&gt;
  	)&lt;br /&gt;
  	insert(new RichJobs($job, $name))&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;
rule &amp;quot;51. Find employees earning more than the average salary in their department.&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when&lt;br /&gt;
	e : Emp()&lt;br /&gt;
    Number(longValue &amp;lt; e.sal) from accumulate (Emp(s : sal, deptno == e.deptno), average(s))&lt;br /&gt;
then    &lt;br /&gt;
   System.out.println(e.name + &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;
==EX55==&lt;br /&gt;
solution 1&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
declare AvgDep&lt;br /&gt;
	deptno: int&lt;br /&gt;
	avg: long&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
rule &amp;quot;55.a *Exercise Find the maximum average salary of departments. &amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
		$dept : Dept($deptno:deptno,$dname:dname)&lt;br /&gt;
		Number($avg : longValue) from accumulate (Emp(deptno==$deptno,  $s: sal),average($s))&lt;br /&gt;
then    &lt;br /&gt;
  insert(new AvgDep($deptno,$avg))&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
rule &amp;quot;55.b &amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
		Number($max : longValue) from accumulate (AvgDep($avg: avg),max($avg))&lt;br /&gt;
		AvgDep(avg==$max,$deptno:deptno)&lt;br /&gt;
		$d: Dept(deptno==$deptno)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($d.dname+&amp;#039; &amp;#039;+$d.deptno+&amp;#039; &amp;#039;+ $max)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
solution 2&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
/* 55. EXPECTED OUTPUT:&lt;br /&gt;
10     2916.666667&lt;br /&gt;
*/  &lt;br /&gt;
rule &amp;quot;55. Find the maximum average salary of departments.&amp;quot;&lt;br /&gt;
enabled true&lt;br /&gt;
when&lt;br /&gt;
  Number(max_val : doubleValue) from accumulate (&lt;br /&gt;
    Dept( d : deptno )&lt;br /&gt;
    and&lt;br /&gt;
    Number(avg_val : doubleValue) from accumulate (&lt;br /&gt;
      Emp(s: sal, deptno == d), average(s)&lt;br /&gt;
    ), max(avg_val)&lt;br /&gt;
  )&lt;br /&gt;
   	&lt;br /&gt;
then    &lt;br /&gt;
   System.out.printf(&amp;quot;%f\n&amp;quot;, max_val);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=insertLogical=&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;
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;
jUnit test&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 org.junit.Test;&lt;br /&gt;
import org.kie.api.KieServices;&lt;br /&gt;
import org.kie.api.event.KieRuntimeEventManager;&lt;br /&gt;
import org.kie.api.logger.KieRuntimeLogger;&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;
import org.kie.internal.logger.KnowledgeRuntimeLoggerFactory;&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;
                /**&lt;br /&gt;
                 * Prepare Data&lt;br /&gt;
                 */&lt;br /&gt;
                ksession.insert(new Emp(7839, &amp;quot;BUSH&amp;quot;, &amp;quot;PRESIDENT&amp;quot;, 0, 1981, 5000, 10));&lt;br /&gt;
                ksession.insert(new Emp(7782, &amp;quot;MERKEL&amp;quot;, &amp;quot;MANAGER&amp;quot;, 7839, 1981, 2450, 10));&lt;br /&gt;
                ksession.insert(new Emp(7566, &amp;quot;PUTIN&amp;quot;, &amp;quot;MANAGER&amp;quot;, 7839, 1981, 2975, 20));&lt;br /&gt;
                ksession.insert(new Emp(7654, &amp;quot;CHIRACK&amp;quot;, &amp;quot;SALESMAN&amp;quot;, 7698, 1981, 1250,30));&lt;br /&gt;
                ksession.insert(new Emp(7499, &amp;quot;BAROSSO&amp;quot;, &amp;quot;SALESMAN&amp;quot;, 7698, 1981, 1600,30));&lt;br /&gt;
                ksession.insert(new Emp(7844, &amp;quot;GATES&amp;quot;, &amp;quot;SALESMAN&amp;quot;, 7698, 1981, 1500, 30));&lt;br /&gt;
                ksession.insert(new Emp(7900, &amp;quot;BUFFETT&amp;quot;, &amp;quot;CLERK&amp;quot;, 7698, 1981, 950, 30));&lt;br /&gt;
                ksession.insert(new Emp(7521, &amp;quot;WALTON&amp;quot;, &amp;quot;SALESMAN&amp;quot;, 7698, 1981, 1250,30));&lt;br /&gt;
                ksession.insert(new Emp(7902, &amp;quot;TOOSK&amp;quot;, &amp;quot;ANALYST&amp;quot;, 7566, 1981, 3000, 20));&lt;br /&gt;
                ksession.insert(new Emp(7369, &amp;quot;THATCHER&amp;quot;, &amp;quot;CLERK&amp;quot;, 7902, 1980, 800, 20));&lt;br /&gt;
                ksession.insert(new Emp(7788, &amp;quot;CARNEGIE&amp;quot;, &amp;quot;ANALYST&amp;quot;, 7566, 1982, 3000,20));&lt;br /&gt;
                ksession.insert(new Emp(7876, &amp;quot;FORD&amp;quot;, &amp;quot;CLERK&amp;quot;, 7788, 1983, 1100, 20));&lt;br /&gt;
                ksession.insert(new Emp(7934, &amp;quot;ELISON&amp;quot;, &amp;quot;CLERK&amp;quot;, 7782, 1982, 1300, 10));&lt;br /&gt;
                ksession.insert(new Emp(7698, &amp;quot;BLAIR&amp;quot;, &amp;quot;MANAGER&amp;quot;, 7839, 1981, 2850, 30));&lt;br /&gt;
&lt;br /&gt;
        Emp elison = new Emp(7934, &amp;quot;ELISON&amp;quot;, &amp;quot;CLERK&amp;quot;, 7782, 1982, 1300, 10);&lt;br /&gt;
        FactHandle elisonFH = ksession.insert(elison);&lt;br /&gt;
        &lt;br /&gt;
                KieRuntimeLogger logger =&lt;br /&gt;
                                KnowledgeRuntimeLoggerFactory.newFileLogger((KieRuntimeEventManager) ksession, &amp;quot;/tmp/logicalinsert_exercise&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ksession.fireAllRules();&lt;br /&gt;
        elison.setDeptno(20);&lt;br /&gt;
        ksession.update(elisonFH, elison);&lt;br /&gt;
        ksession.fireAllRules();&lt;br /&gt;
        &lt;br /&gt;
                logger.close();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DSL=&lt;br /&gt;
==EX1==&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
[condition][]There (is (a|an)|are) {o} {cond}=$e: {o}( {cond} )&lt;br /&gt;
[consequence][]Show {f1} and {f2}=System.out.println($e.{f1} + &amp;quot;, &amp;quot; + $e.{f2});&lt;br /&gt;
[keyword][Emp]salary=sal&lt;br /&gt;
[keyword][]employees?=Emp&lt;br /&gt;
[keyword][Emp]earning more than {amt}=sal&amp;gt;{amt}&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;
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;
    there is an analyst working in it&lt;br /&gt;
then&lt;br /&gt;
 Show department name&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
[condition][]There (is a|are) departments? where:=$d :Dept()&lt;br /&gt;
[condition][]there (is an|are) analysts? working in( it)?=exists Emp($d.deptno == deptno , job == &amp;quot;ANALYST&amp;quot;)&lt;br /&gt;
[consequence][]Show department name=System.out.println($d.dname)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Shopping Example=&lt;br /&gt;
Fact Model&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package newpack;&lt;br /&gt;
&lt;br /&gt;
public class FactModel {&lt;br /&gt;
	&lt;br /&gt;
	public static class Customer {&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public String toString() {&lt;br /&gt;
			return &amp;quot;Customer [name=&amp;quot; + name + &amp;quot;, discount=&amp;quot; + discount + &amp;quot;]&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		public Customer(String name, double discount) {&lt;br /&gt;
			super();&lt;br /&gt;
			this.name = name;&lt;br /&gt;
			this.discount = discount;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private String name;&lt;br /&gt;
		private double discount;&lt;br /&gt;
		&lt;br /&gt;
		public String getName() {&lt;br /&gt;
			return name;&lt;br /&gt;
		}&lt;br /&gt;
		public void setName(String name) {&lt;br /&gt;
			this.name = name;&lt;br /&gt;
		}&lt;br /&gt;
		public double getDiscount() {&lt;br /&gt;
			return discount;&lt;br /&gt;
		}&lt;br /&gt;
		public void setDiscount(double discount) {&lt;br /&gt;
			this.discount = discount;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public static class Purchase {&lt;br /&gt;
		@Override&lt;br /&gt;
		public String toString() {&lt;br /&gt;
			return &amp;quot;Purchase [cust=&amp;quot; + cust + &amp;quot;, prod=&amp;quot; + prod + &amp;quot;]&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		public Purchase(Customer cust, Product prod) {&lt;br /&gt;
			super();&lt;br /&gt;
			this.cust = cust;&lt;br /&gt;
			this.prod = prod;&lt;br /&gt;
		}&lt;br /&gt;
		private Customer cust;&lt;br /&gt;
		private Product prod;&lt;br /&gt;
		public Customer getCust() {&lt;br /&gt;
			return cust;&lt;br /&gt;
		}&lt;br /&gt;
		public void setCust(Customer cust) {&lt;br /&gt;
			this.cust = cust;&lt;br /&gt;
		}&lt;br /&gt;
		public Product getProd() {&lt;br /&gt;
			return prod;&lt;br /&gt;
		}&lt;br /&gt;
		public void setProd(Product prod) {&lt;br /&gt;
			this.prod = prod;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public static class Discount {&lt;br /&gt;
		@Override&lt;br /&gt;
		public String toString() {&lt;br /&gt;
			return &amp;quot;Discount [cust=&amp;quot; + cust + &amp;quot;, discount=&amp;quot; + discount + &amp;quot;]&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		public Discount(Customer cust, double discount) {&lt;br /&gt;
			super();&lt;br /&gt;
			this.cust = cust;&lt;br /&gt;
			this.discount = discount;&lt;br /&gt;
		}&lt;br /&gt;
		private Customer cust;&lt;br /&gt;
		private double discount;&lt;br /&gt;
		public Customer getCust() {&lt;br /&gt;
			return cust;&lt;br /&gt;
		}&lt;br /&gt;
		public void setCust(Customer cust) {&lt;br /&gt;
			this.cust = cust;&lt;br /&gt;
		}&lt;br /&gt;
		public double getDiscount() {&lt;br /&gt;
			return discount;&lt;br /&gt;
		}&lt;br /&gt;
		public void setDiscount(double 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 Product {&lt;br /&gt;
		public Product(String name, double price) {&lt;br /&gt;
			super();&lt;br /&gt;
			this.name = name;&lt;br /&gt;
			this.price = price;&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public String toString() {&lt;br /&gt;
			return &amp;quot;Product [name=&amp;quot; + name + &amp;quot;, price=&amp;quot; + price + &amp;quot;]&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		public String getName() {&lt;br /&gt;
			return name;&lt;br /&gt;
		}&lt;br /&gt;
		public void setName(String name) {&lt;br /&gt;
			this.name = name;&lt;br /&gt;
		}&lt;br /&gt;
		public double getPrice() {&lt;br /&gt;
			return price;&lt;br /&gt;
		}&lt;br /&gt;
		public void setPrice(double price) {&lt;br /&gt;
			this.price = price;&lt;br /&gt;
		}&lt;br /&gt;
		private String name;&lt;br /&gt;
		private double price;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
rules&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
//created on: Aug 26, 2016&lt;br /&gt;
package rules&lt;br /&gt;
import newpack.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;Notify of purchase&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        p : Purchase()&lt;br /&gt;
    then&lt;br /&gt;
        System.out.printf(&amp;quot;New purchase made: %s\n&amp;quot;, p);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
declare AlreadyFoundCust&lt;br /&gt;
   customer : Customer&lt;br /&gt;
end &lt;br /&gt;
rule &amp;quot;Set discount for total purchase over 1000&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        c : Customer() and not AlreadyFoundCust(c == customer)&lt;br /&gt;
        accumulate( Purchase(product : prod &amp;amp;&amp;amp; c == cust), total : sum(product.price))&lt;br /&gt;
    then&lt;br /&gt;
        System.out.printf(&amp;quot;Total: %s\n&amp;quot;, total);  &lt;br /&gt;
        insert(new AlreadyFoundCust(c))      &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
jUnit&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package newpack;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&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;
&lt;br /&gt;
import newpack.FactModel.*;&lt;br /&gt;
@SuppressWarnings(&amp;quot;unused&amp;quot;)&lt;br /&gt;
public class TestSCRules {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void test() {&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;
		/**&lt;br /&gt;
		 * Prepare Data&lt;br /&gt;
		 */&lt;br /&gt;
		Customer cust = new Customer(&amp;quot;John&amp;quot;, 0.0);&lt;br /&gt;
		ksession.insert(cust);&lt;br /&gt;
		&lt;br /&gt;
		Product prod1 = new Product(&amp;quot;Foo&amp;quot;, 600);&lt;br /&gt;
		ksession.insert(prod1);&lt;br /&gt;
		Product prod2 = new Product(&amp;quot;Bar&amp;quot;, 600);&lt;br /&gt;
		ksession.insert(prod2);&lt;br /&gt;
		Product prod3 = new Product(&amp;quot;Baz&amp;quot;, 600);&lt;br /&gt;
		ksession.insert(prod3);&lt;br /&gt;
		&lt;br /&gt;
		Purchase pur1 = new Purchase(cust, prod1);&lt;br /&gt;
		ksession.insert(pur1);&lt;br /&gt;
		Purchase pur2 = new Purchase(cust, prod2);&lt;br /&gt;
		ksession.insert(pur2);&lt;br /&gt;
		&lt;br /&gt;
		ksession.fireAllRules();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fstachecki</name></author>
	</entry>
</feed>