'Updates the event_backward_extremities tables based on the new/updated
events being persisted.
This is called for new events *and* for events that were outliers, but
are now being persisted as non-outliers.
Forward extremities are handled when we first start persisting the events.'

def _update_backward_extremeties(self, txn, events):

    events_by_room = {}
    for ev in events:
        events_by_room.setdefault(ev.room_id, []).append(ev)
    query = 'INSERT    INTO    event_backward_extremities    (event_id,    room_id)    SELECT    ?,    ?    WHERE    NOT    EXISTS    (    SELECT    1    FROM    event_backward_extremities    WHERE    event_id    =    ?    AND    room_id    =    ?    )    AND    NOT    EXISTS    (    SELECT    1    FROM    events    WHERE    event_id    =    ?    AND    room_id    =    ?        AND    outlier    =    ?    )'
    txn.executemany(query, [(e_id, ev.room_id, e_id, ev.room_id, e_id, ev.room_id, False) for ev in events for (e_id, _) in ev.prev_events if (not ev.internal_metadata.is_outlier())])
    query = 'DELETE    FROM    event_backward_extremities    WHERE    event_id    =    ?    AND    room_id    =    ?'
    txn.executemany(query, [(ev.event_id, ev.room_id) for ev in events if (not ev.internal_metadata.is_outlier())])
