See the attached project. You can run it using maven with this command:
mvn package exec:java -Dexec.mainClass="com.sample.DroolsTest"
There are three basic rules:
MakeCollision: Detect that a collision has happened
MatchCollision: Match vehicles to collisions
IdentifyLargeCollision: Find collisions that are "large"
rule "MakeCollision"
salience 10
when
s : Sighting( collision == null )
not Collision( direction == s.direction, position == s.position, lane == s.lane )
then
Collision c = new Collision( s.direction, s.position, s.lane );
c.getSightings().add( s );
s.setCollision( c );
System.out.println("Creating " + c);
update( s );
insert( c );
end
rule "MatchCollision"
salience 10
when
s : Sighting( collision == null )
c : Collision( direction == s.direction, position == s.position, lane == s.lane )
then
c.getSightings().add( s );
s.setCollision( c );
System.out.println("Matching " + s);
update( s );
update( c );
end
rule "IdentifyLargeCollision"
salience 5
when
num : Number ( intValue > 1 )
from accumulate (
Collision( sightings.size > 2 ),
init( int count = 0; ),
action( count++; ),
reverse( count--; ),
result( count )
);
then
System.out.println("Found " + num);
end
--- On Fri, 7/24/09, nash.8103(a)gmail.com <nash.8103(a)gmail.com> wrote:
From: nash.8103(a)gmail.com <nash.8103(a)gmail.com>
Subject: Re: [rules-users] Using eval in LHS
To: "Rules Users List" <rules-users(a)lists.jboss.org>
Date: Friday, July 24, 2009, 2:16 PM
Thanks Greg.....
The reason I chose HashMap is that an accident is said to
occur if and only if more than 1 vehicle contains four
consecutive position report as same. So in my hashmap key is
vehicle id and value is the no. Of times same position
report received... Can you suggest me a way to
1. Collect all vehicles stopped at some point and the
occurance of that event is reported more than thrice
2. Report accident if there are more than one vehicle found
in step 1
---Priya
-original message-
Subject: Re: [rules-users] Using eval in LHS
From: Greg Barton <greg_barton(a)yahoo.com>
Date: 24/07/2009 10:36 pm
Try this:
rule "Create Collision Location"
salience 90
no-loop true
when
vehLoc : VehicleLocation()
not CollisionLocation(xway == vehLoc.xway,
pos ==
vehLoc.pos, dir == vehLoc.dir, lane == vehLoc.lane)
then
CollisionLocation collisionLoc = new
CollisionLocation(vehLoc.getXway(),
vehLoc.getPos(), vehLoc.getDir(), vehLoc.getLane());
insert(collisionLoc);
end
rule "Collect Collided Vehicles"
salience 90
no-loop true
when
vehLoc : VehicleLocation()
$collisionLoc : CollisionLocation(xway ==
vehLoc.xway, pos ==
vehLoc.pos, dir == vehLoc.dir, lane == vehLoc.lane)
then
collisionLoc.getVehicleLocations().add(vehLoc);
update(collisionLoc);
end
And now, the rule that detects more than three coinciding
vehicle locations is simple:
rule "Detect Too Many"
when
CollisionLocation(vehicleLocations.size >
2)
then
...foo...
end
And, if you want to make the execution a bit more
efficient, put a reference in VehicleLocation to it's
associated CollisionLocation. That way you can have
"vehLoc : VehicleLocation(collisionLocation == null)" to
reduce partial matches.
--- On Fri, 7/24/09, PriyaSha <nash.8103(a)gmail.com>
wrote:
> From: PriyaSha <nash.8103(a)gmail.com>
> Subject: [rules-users] Using eval in LHS
> To: rules-users(a)lists.jboss.org
> Date: Friday, July 24, 2009, 10:45 AM
>
> Input:
> 0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
> 0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
> 0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
> 0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
> 0,0,109,20,0,0,0,19,100644,-1,-1,-1,-1,-1,-1
> 0,0,109,20,0,0,0,19,100644,-1,-1,-1,-1,-1,-1
> 0,0,106,28,0,0,0,26,137745,-1,-1,-1,-1,-1,-1
> 0,0,108,32,0,0,0,67,354281,-1,-1,-1,-1,-1,-1
> 0,0,105,30,0,0,1,94,501089,-1,-1,-1,-1,-1,-1
>
> Problem:
>
> Should find vehicles with same data (if it occurs more
than
> thrice).
>
> Though eval in rule 'Detect Accident' results in
true,
> consequence is not
> fired.
>
> Output:
>
> Added
> Not Found -- 107---2
> test---2----107
> Not Found -- 107---3
> test---3----107
> Not Found -- 107---4
> test---4----107
> no of veh : 1
> no of veh : 1
> no of veh : 1
> Not Found -- 109---5
> test---1----109
> Not Found -- 109---6
> test---2----109
> Not Found -- 106---7
>
> Please find the DRL below.
>
>
> package com.hp.hpl.CHAOS.LR;
>
> # importing classes
> import java.lang.Integer;
>
> import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.Iterator;
>
> import com.hp.hpl.CHAOS.Rules.VehicleLocation;
>
> global java.lang.String output
>
> declare VehicleLocation
> @role ( event )
> @expires ( 1m )
> end
>
> declare Statistics
> smashedcars : ArrayList
> stopped_cars : ArrayList
> accidents :
ArrayList
> collided_at : HashMap
> end
>
> rule "Setup statistics"
> salience 110
> no-loop true
> when
> not( Statistics( ) )
> vehLoc : VehicleLocation()
> then
> Statistics s = new Statistics();
> s.setSmashedcars (new ArrayList());
> s.setStopped_cars (new ArrayList());
> s.getStopped_cars().add(vehLoc);
> s.setCollided_at(new HashMap());
> insert( s );
>
> System.out.println("Added");
> end
>
> rule "Add to stopped cars"
> salience 100
> no-loop true
> when
> vehLoc : VehicleLocation()
> $stat : Statistics ()
> ((not( VehicleLocation(vid ==
> vehLoc.vid) from $stat.getSmashedcars())))
> then
> modify($stat) {
>
> getStopped_cars().add(vehLoc);
> }
> System.out.println("Not Found
-- " +
> vehLoc.getVid() + "---" +
> $stat.getStopped_cars().size());
> end
>
>
> rule "Identify Collided Vehicles"
> salience 90
> no-loop true
> when
> vehLoc : VehicleLocation()
> $stat : Statistics ()
> $allStoppedcars : ArrayList(
size > 0
> )
> from
> collect ( VehicleLocation(xway == vehLoc.xway, pos ==
> vehLoc.pos, dir == vehLoc.dir, lane == vehLoc.lane)
from
> $stat.stopped_cars)
> then
> System.out.println("test" +
"---" +
> $allStoppedcars.size() + "----" +
> vehLoc.getVid());
>
> modify($stat) {
>
> setCollided_at(collided_at($allStoppedcars,
> vehLoc.getXway(),
> vehLoc.getPos(), vehLoc.getDir(), vehLoc.getLane()));
> }
> retract (vehLoc);
> end
>
> rule "Detect Accident"
> salience 80
> no-loop true
> when
> vehLoc : VehicleLocation()
> $stat : Statistics ()
>
> eval(collision_occured($stat.getCollided_at()))
> then
> System.out.println("Detect
Accident");
> end
>
> function HashMap collided_at(ArrayList stopped_cars,
int x,
> int pos, int
> dir, int lane) {
> HashMap collided_at = new
HashMap();
> for (Iterator iterator =
> stopped_cars.iterator(); iterator.hasNext(); )
> {
> VehicleLocation
vehLoc =
> (VehicleLocation) iterator.next();
> if
(vehLoc.getXway() == x
>
&&
> vehLoc.getPos() == pos
>
&&
> vehLoc.getDir() == dir
>
&&
> vehLoc.getLane() == lane) {
>
>
int key =
> vehLoc.getVid();
>
if
> (!collided_at.containsKey(key)) {
>
> collided_at.put (key, new Integer(1));
>
> continue;
> }
>
collided_at.put
> (key,
> ((Integer)collided_at.get(key)).intValue()+1);
> }
> }
> return collided_at;
> }
>
> function boolean collision_occured(HashMap
> collided_vehicles) {
> java.util.Set entries =
> collided_vehicles.entrySet();
> int noOfCollidedVehicles = 0;
> java.util.Iterator iterator =
> entries.iterator();
>
> while ( iterator.hasNext() )
{
>
java.util.Map.Entry object =
> (java.util.Map.Entry) iterator.next();
> if
((Integer)object.getValue()
> > 3) {
>
> noOfCollidedVehicles += 1;
> }
> }
>
> if (noOfCollidedVehicles >
0) {
>
System.out.println("no of veh :
> " + noOfCollidedVehicles);
> return true;
> }
> return false;
> }
>
> Please let me know what should I correct here.
> --
> View this message in context:
http://www.nabble.com/Using-eval-in-LHS-tp24646946p24646946.html
> Sent from the drools - user mailing list archive at
>
Nabble.com.
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users