def location_update_cell(self, min_new=10, max_new=100, batch=10): cells = [] redis_client = self.app.redis_client with self.db_session() as session: emit_new_observation_metric(self.stats_client, session, self.shortname, Cell, min_new, max_new) query = (session.query(Cell).filter( Cell.new_measures >= min_new).filter( Cell.new_measures < max_new).limit(batch)) cells = query.all() if not cells: return 0 moving_cells = set() updated_lacs = set() for cell in cells: query = session.query( CellObservation.lat, CellObservation.lon, CellObservation.id).filter(*CellObservation.joinkey(cell)) # only take the last X new_measures query = query.order_by(CellObservation.created.desc()).limit( cell.new_measures) observations = query.all() if observations: moving = calculate_new_position(cell, observations, CELL_MAX_DIST_KM) if moving: moving_cells.add(cell) updated_lacs.add(CellArea.to_hashkey(cell)) if updated_lacs: session.on_post_commit(enqueue_lacs, redis_client, updated_lacs, UPDATE_KEY['cell_lac']) if moving_cells: # some cells found to be moving too much blacklist_and_remove_moving_cells(session, moving_cells) session.commit() return (len(cells), len(moving_cells))