[rules-users] Using eval in LHS

Greg Barton greg_barton at yahoo.com
Fri Jul 24 12:22:44 EDT 2009


heh.  I shouldn't reply to posts while doing three other things. :)  I didn't see your use of collect and insertion of VehicleLocation objects below.

What you need is an intermediate object, something like CollisionLocation, with all of the attributes you use to create the counters in the HashMap constructed in the rule functions.  The CollisionLocation should also include a list of the vehicles participating in the collision.  When that list gets longer than three vehicles, trigger the action.

--- On Fri, 7/24/09, Greg Barton <greg_barton at yahoo.com> wrote:

> From: Greg Barton <greg_barton at yahoo.com>
> Subject: Re: [rules-users] Using eval in LHS
> To: "Rules Users List" <rules-users at lists.jboss.org>
> Date: Friday, July 24, 2009, 11:08 AM
> 
> 1) You are completely circumventing the need for rules by
> putting business logic in the functions.  If you want
> to do this, there's no reason to use rules at all.
> 2) To do it properly insert the VehicleLocation objects
> into working memory and use the "accumulate" keyword to
> determine if there are three of them that fit your
> criteria.  See section "4.8.2.10. Conditional Element
> accumulate" here:
> 
> https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-expert/html_single/index.html
> 
> --- On Fri, 7/24/09, PriyaSha <nash.8103 at gmail.com>
> wrote:
> 
> > From: PriyaSha <nash.8103 at gmail.com>
> > Subject: [rules-users]  Using eval in LHS
> > To: rules-users at 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 at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> > 
> 
> 
>       
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
> 


      




More information about the rules-users mailing list