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(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