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(a)yahoo.com> wrote:
From: Greg Barton <greg_barton(a)yahoo.com>
Subject: Re: [rules-users] Using eval in LHS
To: "Rules Users List" <rules-users(a)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/t...
--- 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