Thanks to Greg for sending out a simplified example. I've one more query. Is there any operators to do calculation on fixed time window? Here is the scenario. My data will stream into the engine starting from second 0.
0,0,0,0,1,1,1,1,.......60,61.......120,121................180,181..... If I want to find average between 0 to 60 sec, that is the previous minute of 61 to 120, how can I achieve this? I feel sliding window will not help me. Suggestions are welcomed. 2009/7/28 Greg Barton <[email protected]> > 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, [email protected] <[email protected]> wrote: > > > From: [email protected] <[email protected]> > > Subject: Re: [rules-users] Using eval in LHS > > To: "Rules Users List" <[email protected]> > > 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 <[email protected]> > > 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 <[email protected]> > > wrote: > > > > > From: PriyaSha <[email protected]> > > > Subject: [rules-users] Using eval in LHS > > > To: [email protected] > > > 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 > > > [email protected] > > > https://lists.jboss.org/mailman/listinfo/rules-users > > > > > > > > > > > > > _______________________________________________ > > rules-users mailing list > > [email protected] > > https://lists.jboss.org/mailman/listinfo/rules-users > > > > > > _______________________________________________ > > rules-users mailing list > > [email protected] > > https://lists.jboss.org/mailman/listinfo/rules-users > > > > > > > _______________________________________________ > rules-users mailing list > [email protected] > https://lists.jboss.org/mailman/listinfo/rules-users > > -- Regards, PriyaKathan
_______________________________________________ rules-users mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-users
