[rules-users] Using eval in LHS

Greg Barton greg_barton at yahoo.com
Fri Jul 24 12:08:10 EDT 2009


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
> 


      




More information about the rules-users mailing list