Ejemplo n.º 1
0
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))