<?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_Hattingen</id>
	<title>Drools Hattingen - 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_Hattingen"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Hattingen&amp;action=history"/>
	<updated>2026-04-21T08:54:17Z</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_Hattingen&amp;diff=39312&amp;oldid=prev</id>
		<title>Filip Stachecki at 08:41, 22 August 2016</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_Hattingen&amp;diff=39312&amp;oldid=prev"/>
		<updated>2016-08-22T08:41:38Z</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;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Select Salgrade&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 $s : Salgrade()&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println( $s.grade + &amp;quot; &amp;quot; + $s.losal + &amp;quot; &amp;quot; + $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;e2&amp;quot; enabled false&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(&lt;br /&gt;
       $e.id + &amp;quot; &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; &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;example 3&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e : Emp(job == &amp;quot;CLERK&amp;quot; &amp;amp;&amp;amp; deptno == 20)&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;
==EX4==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Excercise 04&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e: Emp(job != &amp;quot;PRESIDENT&amp;quot;)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($e.id + &amp;quot; &amp;quot; + $e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.mgr + &amp;quot; &amp;quot; + $e.hiredate + &amp;quot; &amp;quot; + $e.sal + &amp;quot; &amp;quot; + $e.deptno)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX5==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;5a&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp(job == &amp;quot;MANAGER&amp;quot; &amp;amp;&amp;amp; $y: (sal*12))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; + $y)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;5b&amp;quot; enabled false&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.name + &amp;quot; &amp;quot; + ($e.sal *12))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX6==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Find employees with second letter “L” and third “A”.&amp;quot; enabled true&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;Select ends with N and contains T&amp;quot; &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; + &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; &amp;quot; + &lt;br /&gt;
       e.sal * 12 + &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;
==EX8==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;e8&amp;quot;&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp(job == &amp;quot;MANAGER&amp;quot; &amp;amp;&amp;amp; deptno != 10) or&lt;br /&gt;
 $e : Emp(job != &amp;quot;MANAGER&amp;quot; &amp;amp;&amp;amp; deptno == 10)&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;\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; &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;
&amp;lt;source&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; , deptno != 10 ) or Emp(job != &amp;quot;MANAGER&amp;quot; , deptno == 10 ))&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name + &amp;quot; &amp;quot; + $e.job + &amp;quot; &amp;quot; + $e.deptno)&lt;br /&gt;
end&lt;br /&gt;
&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;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;
	$d : Dept()&lt;br /&gt;
	$e : Emp($d.deptno == 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;Excercise 32&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e: Emp()&lt;br /&gt;
	$d: Dept($e.deptno == deptno)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println($e.name + &amp;quot; &amp;quot; + $d.dname + &amp;quot; &amp;quot; + $d.deptno)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX33==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;33&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp($e.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.println($e.name + &amp;quot; &amp;quot; + $e.sal +&amp;quot; &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;
rule &amp;quot;34: Select employees working in London. &amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp()&lt;br /&gt;
 $d : Dept(deptno==$e.deptno , loc==&amp;quot;LONDON&amp;quot;)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name+&amp;quot; &amp;quot;+$d.loc)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX35==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;E35&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  s :Salgrade()&lt;br /&gt;
  d :Dept(loc != &amp;#039;LONDON&amp;#039;)&lt;br /&gt;
  e :Emp(d.deptno == deptno &amp;amp;&amp;amp; sal &amp;gt;= s.losal &amp;amp;&amp;amp; sal &amp;lt;= s.hisal)&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;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==EX36==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;e36&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;
==EX37==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Select an employee’s name and his/her boss’s name  &amp;quot; enabled 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($e.name + &amp;quot; boss is &amp;quot; + $m.name)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX38==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Excercise 38&amp;quot;&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(&amp;quot;E38 &amp;quot; + $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&amp;quot; enabled false&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp()&lt;br /&gt;
 not ( Emp($e.id == 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;
==EX41==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Select employees hired earlier than their bosses.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp()&lt;br /&gt;
 $eb: Emp($e.mgr == id , $e.hiredate &amp;lt; $eb.hiredate)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name + &amp;quot; was hired in &amp;quot; + $e.hiredate + &amp;quot;, her boss &amp;quot;+$eb.name+&amp;quot; who was hired in &amp;quot;+$eb.hiredate)&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;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;/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&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
 $e : Emp(deptno==10)&lt;br /&gt;
 not (Emp(deptno==20 , job==$e.job))&lt;br /&gt;
 &lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.job)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX23==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Find the minimal, maximal and average salaries of people employed in 1981. &amp;quot;&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;e24&amp;quot; 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(&lt;br /&gt;
   &amp;quot;Salary range: &amp;quot; + ($max - $min)&lt;br /&gt;
  )&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;
when&lt;br /&gt;
	accumulate (&lt;br /&gt;
		$e : Emp(job == &amp;quot;MANAGER&amp;quot;),&lt;br /&gt;
		$count: count($e.job)&lt;br /&gt;
	)&lt;br /&gt;
then&lt;br /&gt;
	System.out.println(&lt;br /&gt;
  		&amp;quot;Managers: &amp;quot; + $count + &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;
==EX25==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// Excercise 25&lt;br /&gt;
declare SalByJob&lt;br /&gt;
   job : String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Excercise 25&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
   $e: Emp(j: job) and&lt;br /&gt;
   not SalByJob(job == $e.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;E25 &amp;quot; + $e.job + &amp;quot; &amp;quot; + $avg)&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;
declare DeptNo&lt;br /&gt;
   no : int&lt;br /&gt;
end&lt;br /&gt;
rule &amp;quot;27&amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
   Emp(d:deptno) and  not DeptNo(no == d)&lt;br /&gt;
   accumulate (e :Emp(deptno == d), $avgSal : average(e.sal)) &lt;br /&gt;
then    &lt;br /&gt;
   System.out.println(  &amp;quot;Avg salary for deept &amp;quot; + d + &amp;quot; is &amp;quot; + ($avgSal*12) ) &lt;br /&gt;
   insert(new DeptNo(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 Jobs&lt;br /&gt;
	name: String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;43. *Exercise Find post filled in 1982 and 1983.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
&lt;br /&gt;
e: Emp(hiredate==1982)&lt;br /&gt;
e2: Emp(hiredate==1983)&lt;br /&gt;
ee: Emp(job==e.job , job==e2.job)&lt;br /&gt;
not Jobs(name==ee.job)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(ee.job)&lt;br /&gt;
  insert(new Jobs(ee.job))&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;
declare Depts&lt;br /&gt;
   dept : Integer&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Find departments with more than 3 workers.&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
  Emp(d: deptno) and  not Depts(d == dept)&lt;br /&gt;
  accumulate (e :Emp(deptno == d), &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.println(&amp;quot;deptno: &amp;quot; + d + &amp;quot; count: &amp;quot; + $c)   &lt;br /&gt;
    insert(new Depts(d))&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. Exercise Find employees earning more than the manager’s (job==&amp;#039;MANAGER&amp;#039;) average.&amp;quot; enabled true&lt;br /&gt;
when &lt;br /&gt;
Number(avg : longValue) from accumulate (Emp(job==&amp;quot;MANAGER&amp;quot; , s: sal),average(s))&lt;br /&gt;
e: Emp(sal &amp;gt; avg) &lt;br /&gt;
then    &lt;br /&gt;
  System.out.println(e.name+&amp;#039; earns &amp;#039;+e.sal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Exercise 45 Find employees earning more than the manager’s (job==&amp;#039;MANAGER&amp;#039;) average.&amp;quot; enabled false&lt;br /&gt;
when&lt;br /&gt;
  Number($avgNumber : longValue) from accumulate (e:Emp(job==&amp;#039;MANAGER&amp;#039;), average(e.sal))&lt;br /&gt;
  $e:Emp(sal &amp;gt; $avgNumber)&lt;br /&gt;
then&lt;br /&gt;
  System.out.println($e.name + &amp;quot;:&amp;quot; + $e.sal)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX46==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
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;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;46. Exercise* Select employees earning the maximum salaries in their positions. &amp;quot; enabled true&lt;br /&gt;
when&lt;br /&gt;
  Emp($job:job,$name:name)&lt;br /&gt;
  Number($max : longValue) from accumulate (Emp(job==$job,  $s: sal),max($s))&lt;br /&gt;
  $e : Emp(sal==$max, name==$name)&lt;br /&gt;
then    &lt;br /&gt;
  System.out.println($e.name+&amp;#039; as &amp;#039;+$e.job+&amp;#039; earns &amp;#039;+$e.sal)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EX51==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;e51&amp;quot; enabled false&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; &amp;quot; + e.deptno +&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 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;
&lt;br /&gt;
&amp;lt;source&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&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;
[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;
&amp;lt;source&amp;gt;&lt;br /&gt;
[condition][]There are employees=e : Emp()&lt;br /&gt;
[condition][]- earning more than {salary}=sal &amp;gt; {salary}&lt;br /&gt;
[consequence][]Show name and salary=System.out.println(e.name + &amp;quot;\t&amp;quot; + e.sal)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&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 &lt;br /&gt;
 - 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;
&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;
&lt;br /&gt;
=insertLogical=&lt;br /&gt;
==Ex5.2==&lt;br /&gt;
===rules===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
declare Department10&lt;br /&gt;
	emp: Emp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
declare AccessToSecretFiles&lt;br /&gt;
	emp: Emp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Is in department 10&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	$e: Emp(deptno == 10)&lt;br /&gt;
then&lt;br /&gt;
	insertLogical(new Department10($e))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Gets access to X Files&amp;quot;&lt;br /&gt;
when&lt;br /&gt;
	Department10($e: emp)&lt;br /&gt;
then&lt;br /&gt;
	insertLogical(new AccessToSecretFiles($e))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===jUnit===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Emp $blair = new Emp(7698, &amp;quot;BLAIR&amp;quot;, &amp;quot;MANAGER&amp;quot;, 7839, 1981, 2850, 10);&lt;br /&gt;
FactHandle $blairFH = ksession.insert($blair);&lt;br /&gt;
&lt;br /&gt;
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger((KnowledgeRuntimeEventManager) ksession, &amp;quot;/tmp/logicalinsert_exercise&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
ksession.fireAllRules();&lt;br /&gt;
$blair.setDeptno(30);&lt;br /&gt;
ksession.update($blairFH, $blair);&lt;br /&gt;
ksession.fireAllRules();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Shopping Example 1=&lt;br /&gt;
==JUNIT==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Customer customer = new Customer(&amp;quot;heinz&amp;quot;, 0);&lt;br /&gt;
kSession.insert(customer);&lt;br /&gt;
            &lt;br /&gt;
Product product1 = new Product(&amp;quot;tomaten&amp;quot;, 600);&lt;br /&gt;
kSession.insert(product1);&lt;br /&gt;
Product product2 = new Product(&amp;quot;äpfel&amp;quot;, 600);&lt;br /&gt;
kSession.insert(product2);&lt;br /&gt;
            &lt;br /&gt;
Purchase purchase1 = new Purchase(customer, product1);&lt;br /&gt;
kSession.insert(purchase1);&lt;br /&gt;
Purchase purchase2 = new Purchase(customer, product2);&lt;br /&gt;
FactHandle handle = kSession.insert(purchase2);&lt;br /&gt;
kSession.fireAllRules();&lt;br /&gt;
kSession.delete(handle);&lt;br /&gt;
kSession.fireAllRules();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RULES==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package com.sample&lt;br /&gt;
 &lt;br /&gt;
import com.sample.DroolsTest.*;&lt;br /&gt;
 &lt;br /&gt;
rule &amp;quot;Notify about Purchase&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        p : Purchase()&lt;br /&gt;
    then&lt;br /&gt;
        System.out.println( &amp;quot;New purchase &amp;quot; + p.getCustomer().getName() + &amp;quot; &amp;quot; + p.getProduct().getName() + &amp;quot; &amp;quot; + p.getProduct().getPrice() );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Set Discount&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
    	$customer : Customer()&lt;br /&gt;
        Number($sum : longValue &amp;gt; 1000) from accumulate (Purchase(customer == $customer, $price: product.price),sum($price))&lt;br /&gt;
    then&lt;br /&gt;
        System.out.println( &amp;quot;Total purchase is &amp;quot; + $sum + &amp;quot;, add discount&amp;quot; );&lt;br /&gt;
        insertLogical(new Discount($customer, 10));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify Discount&amp;quot;&lt;br /&gt;
	when&lt;br /&gt;
		d : Discount()&lt;br /&gt;
	then&lt;br /&gt;
		System.out.println( &amp;quot;Discount applied to &amp;quot; + d.getCustomer().getName() + &amp;quot; of &amp;quot; + d.getAmount() );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;Notify Discount removed&amp;quot;&lt;br /&gt;
	when&lt;br /&gt;
		not (Discount())&lt;br /&gt;
	then&lt;br /&gt;
		System.out.println( &amp;quot;Discount removed&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shopping Example 2=&lt;br /&gt;
==JUNIT==&lt;br /&gt;
&amp;lt;source&amp;gt;&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;
            // go !&lt;br /&gt;
        	Customer customer = new Customer(&amp;quot;Christian&amp;quot;, 99);&lt;br /&gt;
        	kSession.insert(customer);&lt;br /&gt;
        	&lt;br /&gt;
        	Product prod1 = new Product(&amp;quot;Product 1&amp;quot;, 600);&lt;br /&gt;
        	kSession.insert(prod1);&lt;br /&gt;
        	Product prod2 = new Product(&amp;quot;Product 2&amp;quot;, 600);&lt;br /&gt;
        	kSession.insert(prod2);&lt;br /&gt;
        	&lt;br /&gt;
        	Purchase purch1 = new Purchase(customer, prod1);&lt;br /&gt;
        	kSession.insert(purch1);&lt;br /&gt;
        	Purchase purch2 = new Purchase(customer, prod2);&lt;br /&gt;
        	FactHandle handle =kSession.insert(purch2);&lt;br /&gt;
            kSession.fireAllRules();&lt;br /&gt;
            &lt;br /&gt;
            kSession.delete(handle);&lt;br /&gt;
            kSession.fireAllRules();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RULES==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rule &amp;quot;Notify&amp;quot; &lt;br /&gt;
    no-loop true&lt;br /&gt;
    when&lt;br /&gt;
        c: Customer()&lt;br /&gt;
        p: Purchase(customer==c)&lt;br /&gt;
    then&lt;br /&gt;
        System.out.println(c.name+ &amp;quot; purchased &amp;quot; +p.product.name );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;2&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        c: Customer() &lt;br /&gt;
        accumulate (&lt;br /&gt;
        	u: Purchase(customer == c),&lt;br /&gt;
         	$sum: sum(u.product.price)&lt;br /&gt;
        )&lt;br /&gt;
        Number(intValue &amp;gt; 1000) from $sum&lt;br /&gt;
    then&lt;br /&gt;
    	c.setDiscount(10);&lt;br /&gt;
     	insertLogical(new Discount(c, 10));&lt;br /&gt;
        System.out.println( &amp;quot;Discount 10 for customer &amp;quot;+c.name );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;3&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        c: Customer() and&lt;br /&gt;
        not Discount()&lt;br /&gt;
    then&lt;br /&gt;
    	c.setDiscount(0);&lt;br /&gt;
        System.out.println( &amp;quot;Discount 10 removed for customer &amp;quot;+c.name );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CEP=&lt;br /&gt;
==rules==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package chapter06.cep;&lt;br /&gt;
&lt;br /&gt;
import org.drools.devguide.eshop.events.TransactionEvent;&lt;br /&gt;
&lt;br /&gt;
declare SuspiciousCustomerEvent&lt;br /&gt;
    @role(event)&lt;br /&gt;
    customerId: Long&lt;br /&gt;
    reason: String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
declare AlarmTriggered&lt;br /&gt;
    customerId: Long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;More than 10 transactions in an hour from one client&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $t1: TransactionEvent($cId: customerId)&lt;br /&gt;
        Number(intValue &amp;gt;= 10) from accumulate(&lt;br /&gt;
            $t2: TransactionEvent(&lt;br /&gt;
                this != $t1, &lt;br /&gt;
                customerId == $cId, &lt;br /&gt;
                this meets[1h] $t1&lt;br /&gt;
            ),&lt;br /&gt;
            count($t2)&lt;br /&gt;
        )&lt;br /&gt;
        not (SuspiciousCustomerEvent(customerId == $cId, reason == &amp;quot;Many transactions&amp;quot;))&lt;br /&gt;
    then&lt;br /&gt;
        insert(new SuspiciousCustomerEvent($cId, &amp;quot;Many transactions&amp;quot;));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;More than 1 transaction of 200 dollars in an hour from the same client&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $t1: TransactionEvent($cId: customerId, totalAmount &amp;gt;= 200.0)&lt;br /&gt;
        $t2: TransactionEvent(&lt;br /&gt;
            this != $t1, &lt;br /&gt;
            this meets[1h] $t1, &lt;br /&gt;
            customerId == $cId, &lt;br /&gt;
            totalAmount &amp;gt;= 200.0&lt;br /&gt;
        )&lt;br /&gt;
        not (SuspiciousCustomerEvent(customerId == $cId, reason == &amp;quot;Two large transactions&amp;quot;))&lt;br /&gt;
    then&lt;br /&gt;
        insert(new SuspiciousCustomerEvent($cId, &amp;quot;Two large transactions&amp;quot;));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;More than 3 suspicious cases in the day and we warn the owner&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        SuspiciousCustomerEvent($cId: customerId)&lt;br /&gt;
        not (AlarmTriggered(customerId == $cId))&lt;br /&gt;
        Number(intValue &amp;gt;= 2) from accumulate(&lt;br /&gt;
            $s: SuspiciousCustomerEvent(customerId == $cId),&lt;br /&gt;
            count($s)&lt;br /&gt;
        )&lt;br /&gt;
    then&lt;br /&gt;
        //warn the owner&lt;br /&gt;
        System.out.println(&amp;quot;WARNING: Suspicious fraud case. Client &amp;quot; + $cId);&lt;br /&gt;
        insert(new AlarmTriggered($cId));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;More than 10 transactions in an hour from small client portal&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $t1: TransactionEvent($cId: customerId) from entry-point &amp;quot;small-client-portal&amp;quot;&lt;br /&gt;
        Number(intValue &amp;gt;= 10) from accumulate(&lt;br /&gt;
            $t2: TransactionEvent(&lt;br /&gt;
                this != $t1, &lt;br /&gt;
                customerId == $cId, &lt;br /&gt;
                this meets[1h] $t1&lt;br /&gt;
            ) from entry-point &amp;quot;small-client-portal&amp;quot;,&lt;br /&gt;
            count($t2)&lt;br /&gt;
        )&lt;br /&gt;
        not (SuspiciousCustomerEvent(customerId == $cId, reason == &amp;quot;Many transactions&amp;quot;))&lt;br /&gt;
    then&lt;br /&gt;
        insert(new SuspiciousCustomerEvent($cId, &amp;quot;Many transactions&amp;quot;));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rule &amp;quot;More than 100 transactions in an hour from big client portal&amp;quot;&lt;br /&gt;
    when&lt;br /&gt;
        $t1: TransactionEvent($cId: customerId) from entry-point &amp;quot;big-client-portal&amp;quot;&lt;br /&gt;
        Number(intValue &amp;gt;= 100) from accumulate(&lt;br /&gt;
            $t2: TransactionEvent(&lt;br /&gt;
                this != $t1, &lt;br /&gt;
                customerId == $cId, &lt;br /&gt;
                this meets[1h] $t1&lt;br /&gt;
            ) from entry-point &amp;quot;big-client-portal&amp;quot;,&lt;br /&gt;
            count($t2)&lt;br /&gt;
        )&lt;br /&gt;
        not (SuspiciousCustomerEvent(customerId == $cId, reason == &amp;quot;Many transactions&amp;quot;))&lt;br /&gt;
    then&lt;br /&gt;
        insert(new SuspiciousCustomerEvent($cId, &amp;quot;Many transactions&amp;quot;));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==jUnit==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package org.drools.devguide;&lt;br /&gt;
&lt;br /&gt;
import org.drools.devguide.eshop.events.TransactionEvent;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.kie.api.runtime.KieSession;&lt;br /&gt;
&lt;br /&gt;
public class CEPRulesTest extends BaseTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testCEPRules() {&lt;br /&gt;
        KieSession ksession = createSession(&amp;quot;cepKsession&amp;quot;);&lt;br /&gt;
        Long customerId = 1L;&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 10.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 12.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 14.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 10.50));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 10.99));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 9.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 11.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 15.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 18.00));&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 201.00));&lt;br /&gt;
        long ruleFireCount = ksession.fireAllRules();&lt;br /&gt;
        System.out.println(ruleFireCount);&lt;br /&gt;
        ksession.insert(new TransactionEvent(customerId, 202.00));&lt;br /&gt;
        ruleFireCount = ksession.fireAllRules();&lt;br /&gt;
        System.out.println(ruleFireCount);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==fact model==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
package org.drools.devguide.eshop.events;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
&lt;br /&gt;
import org.kie.api.definition.type.Expires;&lt;br /&gt;
import org.kie.api.definition.type.Role;&lt;br /&gt;
import org.kie.api.definition.type.Timestamp;&lt;br /&gt;
&lt;br /&gt;
@Role(Role.Type.EVENT)&lt;br /&gt;
@Timestamp(&amp;quot;executionTime&amp;quot;)&lt;br /&gt;
@Expires(&amp;quot;2h30m&amp;quot;)&lt;br /&gt;
public class TransactionEvent implements Serializable {&lt;br /&gt;
&lt;br /&gt;
    private static final long serialVersionUID = 1L;&lt;br /&gt;
    private Date executionTime;&lt;br /&gt;
    private Long customerId;&lt;br /&gt;
    private Double totalAmount;&lt;br /&gt;
&lt;br /&gt;
    public TransactionEvent() {&lt;br /&gt;
        super();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public TransactionEvent(Long customerId, Double totalAmount) {&lt;br /&gt;
        super();&lt;br /&gt;
        this.executionTime = new Date();&lt;br /&gt;
        this.customerId = customerId;&lt;br /&gt;
        this.totalAmount = totalAmount;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public Date getExecutionTime() {&lt;br /&gt;
        return executionTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setExecutionTime(Date executionTime) {&lt;br /&gt;
        this.executionTime = executionTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Long getCustomerId() {&lt;br /&gt;
        return customerId;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCustomerId(Long customerId) {&lt;br /&gt;
        this.customerId = customerId;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Double getTotalAmount() {&lt;br /&gt;
        return totalAmount;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setTotalAmount(Double totalAmount) {&lt;br /&gt;
        this.totalAmount = totalAmount;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
[[:File:Mastering Drools_Code.zip]]&lt;/div&gt;</summary>
		<author><name>Filip Stachecki</name></author>
	</entry>
</feed>