@@ -534,6 +534,60 @@ def _get_aggregation_groups_for_users_txn(
534534 "get_aggregation_groups_for_users" , _get_aggregation_groups_for_users_txn
535535 )
536536
537+ @cached ()
538+ async def get_references_for_event (self , event_id : str ) -> List [JsonDict ]:
539+ raise NotImplementedError ()
540+
541+ @cachedList (cached_method_name = "get_references_for_event" , list_name = "event_ids" )
542+ async def get_references_for_events (
543+ self , event_ids : Collection [str ]
544+ ) -> Mapping [str , Optional [List [_RelatedEvent ]]]:
545+ """Get a list of references to the given events.
546+
547+ Args:
548+ event_ids: Fetch events that relate to these event IDs.
549+
550+ Returns:
551+ A map of event IDs to a list of related event IDs (and their senders).
552+ """
553+
554+ clause , args = make_in_list_sql_clause (
555+ self .database_engine , "relates_to_id" , event_ids
556+ )
557+ args .append (RelationTypes .REFERENCE )
558+
559+ sql = f"""
560+ SELECT relates_to_id, ref.event_id, ref.sender
561+ FROM events AS ref
562+ INNER JOIN event_relations USING (event_id)
563+ INNER JOIN events AS parent ON
564+ parent.event_id = relates_to_id
565+ AND parent.room_id = ref.room_id
566+ WHERE
567+ { clause }
568+ AND relation_type = ?
569+ ORDER BY ref.topological_ordering, ref.stream_ordering
570+ """
571+
572+ def _get_references_for_events_txn (
573+ txn : LoggingTransaction ,
574+ ) -> Mapping [str , List [_RelatedEvent ]]:
575+ txn .execute (sql , args )
576+
577+ result : Dict [str , List [_RelatedEvent ]] = {}
578+ for relates_to_id , event_id , sender in cast (
579+ List [Tuple [str , str , str ]], txn
580+ ):
581+ result .setdefault (relates_to_id , []).append (
582+ _RelatedEvent (event_id , sender )
583+ )
584+
585+ return result
586+
587+ return await self .db_pool .runInteraction (
588+ "_get_references_for_events_txn" , _get_references_for_events_txn
589+ )
590+
537591 @cached ()
538592 def get_applicable_edit (self , event_id : str ) -> Optional [EventBase ]:
539593 raise NotImplementedError ()
0 commit comments