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