Thanks to Greg for sending out a simplified example.
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@gmail.com <nash.8103@gmail.com> wrote:
> From: nash.8103@gmail.com <nash.8103@gmail.com>
> Subject: Re: [rules-users] Using eval in LHS> To: "Rules Users List" <rules-users@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@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@gmail.com>
> wrote:
>
> > From: PriyaSha <nash.8103@gmail.com>
> > Subject: [rules-users] Using eval in LHS
> > To: rules-users@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@lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users