mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2025-05-05 04:14:56 -04:00
Add a thread relation type per MSC3440. (#11088)
Adds experimental support for MSC3440's `io.element.thread` relation type (and the aggregation for it).
This commit is contained in:
parent
2d91b6256e
commit
ba00e20234
8 changed files with 119 additions and 8 deletions
|
@ -13,7 +13,7 @@
|
|||
# limitations under the License.
|
||||
|
||||
import logging
|
||||
from typing import Optional
|
||||
from typing import Optional, Tuple
|
||||
|
||||
import attr
|
||||
|
||||
|
@ -269,6 +269,63 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
|
||||
return await self.get_event(edit_id, allow_none=True)
|
||||
|
||||
@cached()
|
||||
async def get_thread_summary(
|
||||
self, event_id: str
|
||||
) -> Tuple[int, Optional[EventBase]]:
|
||||
"""Get the number of threaded replies, the senders of those replies, and
|
||||
the latest reply (if any) for the given event.
|
||||
|
||||
Args:
|
||||
event_id: The original event ID
|
||||
|
||||
Returns:
|
||||
The number of items in the thread and the most recent response, if any.
|
||||
"""
|
||||
|
||||
def _get_thread_summary_txn(txn) -> Tuple[int, Optional[str]]:
|
||||
# Fetch the count of threaded events and the latest event ID.
|
||||
# TODO Should this only allow m.room.message events.
|
||||
sql = """
|
||||
SELECT event_id
|
||||
FROM event_relations
|
||||
INNER JOIN events USING (event_id)
|
||||
WHERE
|
||||
relates_to_id = ?
|
||||
AND relation_type = ?
|
||||
ORDER BY topological_ordering DESC, stream_ordering DESC
|
||||
LIMIT 1
|
||||
"""
|
||||
|
||||
txn.execute(sql, (event_id, RelationTypes.THREAD))
|
||||
row = txn.fetchone()
|
||||
if row is None:
|
||||
return 0, None
|
||||
|
||||
latest_event_id = row[0]
|
||||
|
||||
sql = """
|
||||
SELECT COALESCE(COUNT(event_id), 0)
|
||||
FROM event_relations
|
||||
WHERE
|
||||
relates_to_id = ?
|
||||
AND relation_type = ?
|
||||
"""
|
||||
txn.execute(sql, (event_id, RelationTypes.THREAD))
|
||||
count = txn.fetchone()[0]
|
||||
|
||||
return count, latest_event_id
|
||||
|
||||
count, latest_event_id = await self.db_pool.runInteraction(
|
||||
"get_thread_summary", _get_thread_summary_txn
|
||||
)
|
||||
|
||||
latest_event = None
|
||||
if latest_event_id:
|
||||
latest_event = await self.get_event(latest_event_id, allow_none=True)
|
||||
|
||||
return count, latest_event
|
||||
|
||||
async def has_user_annotated_event(
|
||||
self, parent_id: str, event_type: str, aggregation_key: str, sender: str
|
||||
) -> bool:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue