use client id to avoid self-flocking

This commit is contained in:
rgarcia-herrera 2022-07-05 13:49:08 -05:00
parent f1ccf681be
commit 3bdd4be474
2 changed files with 22 additions and 12 deletions

View File

@ -2,7 +2,7 @@
Object-Document Map for bike model Object-Document Map for bike model
""" """
from mongoengine import Document, DateTimeField, GeoPointField, \ from mongoengine import Document, DateTimeField, GeoPointField, \
FloatField, connection FloatField, StringField, connection
import bson import bson
import datetime import datetime
from LatLon23 import LatLon, Latitude, Longitude from LatLon23 import LatLon, Latitude, Longitude
@ -54,6 +54,7 @@ class Bike(Document):
speed = FloatField(default=0) speed = FloatField(default=0)
bearing = FloatField(default=0) bearing = FloatField(default=0)
last_update = DateTimeField(default=datetime.datetime.utcnow) last_update = DateTimeField(default=datetime.datetime.utcnow)
client_id = StringField(required=True)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(Document, self).__init__(*args, **kwargs) super(Document, self).__init__(*args, **kwargs)
@ -121,7 +122,9 @@ class Bike(Document):
'coordinates': self.point}, 'coordinates': self.point},
'$maxDistance': local_radius}}, '$maxDistance': local_radius}},
'last_update': { 'last_update': {
'$gte': datetime.datetime.now() - datetime.timedelta(seconds=min_age)}, '$gte': (datetime.datetime.now()
- datetime.timedelta(seconds=min_age))},
'client_id': {'$ne': self.client_id},
'_id': {'$ne': bson.objectid.ObjectId(self.id)}})] '_id': {'$ne': bson.objectid.ObjectId(self.id)}})]
local_ids = set([bike['_id'] for bike in local]) local_ids = set([bike['_id'] for bike in local])
@ -134,14 +137,18 @@ class Bike(Document):
{'$geometry': {'type': 'Point', {'$geometry': {'type': 'Point',
'coordinates': self.destination}, 'coordinates': self.destination},
'$maxDistance': destination_radius}}, '$maxDistance': destination_radius}},
'client_id': {'$ne': self.client_id},
'_id': {'$ne': bson.objectid.ObjectId(self.id)},
'last_update': { 'last_update': {
'$gte': datetime.datetime.now() - datetime.timedelta(seconds=min_age)} '$gte': (datetime.datetime.now()
})] - datetime.timedelta(seconds=min_age))}
})]
remote_ids = set([bike['_id'] for bike in remote]) remote_ids = set([bike['_id'] for bike in remote])
# intersect them! # intersect them!
flock_ids = local_ids.intersection(remote_ids) flock_ids = local_ids.intersection(remote_ids)
# return bikes, not bike ids
return (bike for bike in local if bike['_id'] in flock_ids) return (bike for bike in local if bike['_id'] in flock_ids)
def flock_data(self): def flock_data(self):

View File

@ -11,15 +11,17 @@ db = MongoEngine(app)
# TODO: at registration give current location # TODO: at registration give current location
@app.route("/register/") @app.route("/register/")
def register(): def register():
dest_lat = request.args.get('dest_lat', None)
dest_lon = request.args.get('dest_lon', None) dest_lon = request.args.get('dest_lon', None)
dest_lat = request.args.get('dest_lat', None)
client_id = request.args.get('client_id', None)
assert dest_lat is not None and dest_lon is not None assert dest_lat is not None and dest_lon is not None and client_id is not None
dest = (float(dest_lon), float(dest_lat)) dest = (float(dest_lon), float(dest_lat))
bike = Bike(point=(0, 0), bike = Bike(point=(0, 0),
destination=dest) destination=dest,
client_id=client_id)
bike.save() bike.save()
@ -36,12 +38,13 @@ def update(bike_id):
lon = float(request.args.get('lon', None)) lon = float(request.args.get('lon', None))
speed = float(request.args.get('speed', None)) speed = float(request.args.get('speed', None))
bearing = float(request.args.get('bearing', None)) bearing = float(request.args.get('bearing', None))
client_id = request.args.get('client_id', None)
local_altruism = float(request.args.get('local_altruism', 0.1)) # TODO: maybe client tunes these?
dest_altruism = float(request.args.get('dest_altruism', 0.2)) # local_altruism = float(request.args.get('local_altruism', 0.1))
# dest_altruism = float(request.args.get('dest_altruism', 0.2))
bike.update(lat, lon, speed, bearing, client_id)
bike.update(lat, lon, speed, bearing)
return jsonify(last_update=bike.last_update.isoformat(), return jsonify(last_update=bike.last_update.isoformat(),
**bike.flock_data()) **bike.flock_data())