Support filtering the /messages API by relation type (MSC3874). (#14148)

Gated behind an experimental configuration flag.
This commit is contained in:
Patrick Cloke 2022-10-17 11:32:11 -04:00 committed by GitHub
parent 6b24235142
commit 4283bd1cf9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 212 additions and 177 deletions

View file

@ -357,6 +357,24 @@ def filter_to_clause(event_filter: Optional[Filter]) -> Tuple[str, List[str]]:
)
args.extend(event_filter.related_by_rel_types)
if event_filter.rel_types:
clauses.append(
"(%s)"
% " OR ".join(
"event_relation.relation_type = ?" for _ in event_filter.rel_types
)
)
args.extend(event_filter.rel_types)
if event_filter.not_rel_types:
clauses.append(
"((%s) OR event_relation.relation_type IS NULL)"
% " AND ".join(
"event_relation.relation_type != ?" for _ in event_filter.not_rel_types
)
)
args.extend(event_filter.not_rel_types)
return " AND ".join(clauses), args
@ -1278,8 +1296,8 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
# Multiple labels could cause the same event to appear multiple times.
needs_distinct = True
# If there is a filter on relation_senders and relation_types join to the
# relations table.
# If there is a relation_senders and relation_types filter join to the
# relations table to get events related to the current event.
if event_filter and (
event_filter.related_by_senders or event_filter.related_by_rel_types
):
@ -1294,6 +1312,13 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
LEFT JOIN events AS related_event ON (relation.event_id = related_event.event_id)
"""
# If there is a not_rel_types filter join to the relations table to get
# the event's relation information.
if event_filter and (event_filter.rel_types or event_filter.not_rel_types):
join_clause += """
LEFT JOIN event_relations AS event_relation USING (event_id)
"""
if needs_distinct:
select_keywords += " DISTINCT"