diff options
author | Olivier Wilkinson (reivilibre) <olivier@librepush.net> | 2019-08-08 11:46:16 +0100 |
---|---|---|
committer | Olivier Wilkinson (reivilibre) <olivier@librepush.net> | 2019-08-08 11:46:16 +0100 |
commit | 4a3fec1f3b07e9616d47a565075d3091d32aeffd (patch) | |
tree | 83ca6667aec916c4603f7fc013aab5133e532e3f /synapse/storage | |
parent | Handle user registration and ensure they start accruing statistics (diff) | |
download | synapse-4a3fec1f3b07e9616d47a565075d3091d32aeffd.tar.xz |
Fix tests
Signed-off-by: Olivier Wilkinson (reivilibre) <olivier@librepush.net>
Diffstat (limited to 'synapse/storage')
-rw-r--r-- | synapse/storage/stats.py | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/synapse/storage/stats.py b/synapse/storage/stats.py index da3a869272..755faaaaa2 100644 --- a/synapse/storage/stats.py +++ b/synapse/storage/stats.py @@ -682,29 +682,67 @@ class StatsStore(StateDeltasStore): desc="update_room_state", ) - def get_deltas_for_room(self, room_id, start, size=100): + def get_statistics_for_subject(self, stats_type, stats_id, start, size=100): """ - Get statistics deltas for a given room. + Get statistics for a given subject. Args: - room_id (str) + stats_type (str): The type of subject + stats_id (str): The ID of the subject (e.g. room_id or user_id) start (int): Pagination start. Number of entries, not timestamp. size (int): How many entries to return. Returns: Deferred[list[dict]], where the dict has the keys of - ABSOLUTE_STATS_FIELDS["room"] and "ts". + ABSOLUTE_STATS_FIELDS[stats_type], and "bucket_size" and "end_ts". """ - return self._simple_select_list_paginate( - "room_stats", - {"room_id": room_id}, - "ts", + return self.runInteraction( + "get_statistics_for_subject", + self._get_statistics_for_subject_txn, + stats_type, + stats_id, start, size, - retcols=(list(ABSOLUTE_STATS_FIELDS["room"]) + ["ts"]), + ) + + # TODO fix and account for _current. + def _get_statistics_for_subject_txn( + self, txn, stats_type, stats_id, start, size=100 + ): + + table, id_col = TYPE_TO_TABLE[stats_type] + selected_columns = list( + ABSOLUTE_STATS_FIELDS[stats_type] + PER_SLICE_FIELDS[stats_type] + ) + + slice_list = self._simple_select_list_paginate_txn( + txn, + table + "_historical", + {id_col: stats_id}, + "end_ts", + start, + size, + retcols=selected_columns + ["bucket_size", "end_ts"], order_direction="DESC", ) + if len(slice_list) < size: + # also fetch the current row + current = self._simple_select_one_txn( + txn, + table + "_current", + {id_col: stats_id}, + retcols=selected_columns + ["start_ts", "end_ts"], + allow_none=True, + ) + + if current is not None and current["end_ts"] is not None: + # it is dirty, so contains new information, so should be included + current["bucket_size"] = current["end_ts"] - current["start_ts"] + del current["start_ts"] + return [current] + slice_list + return slice_list + def get_all_room_state(self): return self._simple_select_list( "room_state", None, retcols=("name", "topic", "canonical_alias") |