def test_simple(self): """Basic tests for the LinkMap.""" link_map = _LinkMap() link_map.add_link((1, 1), (2, 1), new=False) self.assertCountEqual(link_map.get_links_between(1, 2), [(1, 1)]) self.assertCountEqual(link_map.get_links_from((1, 1)), [(2, 1)]) self.assertCountEqual(link_map.get_additions(), []) self.assertTrue(link_map.exists_path_from((1, 5), (2, 1))) self.assertFalse(link_map.exists_path_from((1, 5), (2, 2))) self.assertTrue(link_map.exists_path_from((1, 5), (1, 1))) self.assertFalse(link_map.exists_path_from((1, 1), (1, 5))) # Attempting to add a redundant link is ignored. self.assertFalse(link_map.add_link((1, 4), (2, 1))) self.assertCountEqual(link_map.get_links_between(1, 2), [(1, 1)]) # Adding new non-redundant links works self.assertTrue(link_map.add_link((1, 3), (2, 3))) self.assertCountEqual(link_map.get_links_between(1, 2), [(1, 1), (3, 3)]) self.assertTrue(link_map.add_link((2, 5), (1, 3))) self.assertCountEqual(link_map.get_links_between(2, 1), [(5, 3)]) self.assertCountEqual(link_map.get_links_between(1, 2), [(1, 1), (3, 3)]) self.assertCountEqual(link_map.get_additions(), [(1, 3, 2, 3), (2, 5, 1, 3)])
def fetch_chains( self, events: List[EventBase] ) -> Tuple[Dict[str, Tuple[int, int]], _LinkMap]: # Fetch the map from event ID -> (chain ID, sequence number) rows = self.get_success( self.store.db_pool.simple_select_many_batch( table="event_auth_chains", column="event_id", iterable=[e.event_id for e in events], retcols=("event_id", "chain_id", "sequence_number"), keyvalues={}, ) ) chain_map = { row["event_id"]: (row["chain_id"], row["sequence_number"]) for row in rows } # Fetch all the links and pass them to the _LinkMap. rows = self.get_success( self.store.db_pool.simple_select_many_batch( table="event_auth_chain_links", column="origin_chain_id", iterable=[chain_id for chain_id, _ in chain_map.values()], retcols=( "origin_chain_id", "origin_sequence_number", "target_chain_id", "target_sequence_number", ), keyvalues={}, ) ) link_map = _LinkMap() for row in rows: added = link_map.add_link( (row["origin_chain_id"], row["origin_sequence_number"]), (row["target_chain_id"], row["target_sequence_number"]), ) # We shouldn't have persisted any redundant links self.assertTrue(added) return chain_map, link_map