|
@@ -102,6 +102,13 @@ class RegistrationStore(RegistrationWorkerStore,
|
|
|
columns=["user_id", "device_id"],
|
|
|
)
|
|
|
|
|
|
+ self.register_background_index_update(
|
|
|
+ "users_creation_ts",
|
|
|
+ index_name="users_creation_ts",
|
|
|
+ table="users",
|
|
|
+ columns=["creation_ts"],
|
|
|
+ )
|
|
|
+
|
|
|
# we no longer use refresh tokens, but it's possible that some people
|
|
|
# might have a background update queued to build this index. Just
|
|
|
# clear the background update.
|
|
@@ -486,6 +493,35 @@ class RegistrationStore(RegistrationWorkerStore,
|
|
|
ret = yield self.runInteraction("count_users", _count_users)
|
|
|
defer.returnValue(ret)
|
|
|
|
|
|
+ def count_daily_user_type(self):
|
|
|
+ """
|
|
|
+ Counts 1) native non guest users
|
|
|
+ 2) native guests users
|
|
|
+ 3) bridged users
|
|
|
+ who registered on the homeserver in the past 24 hours
|
|
|
+ """
|
|
|
+ def _count_daily_user_type(txn):
|
|
|
+ yesterday = int(self._clock.time()) - (60 * 60 * 24)
|
|
|
+
|
|
|
+ sql = """
|
|
|
+ SELECT user_type, COALESCE(count(*), 0) AS count FROM (
|
|
|
+ SELECT
|
|
|
+ CASE
|
|
|
+ WHEN is_guest=0 AND appservice_id IS NULL THEN 'native'
|
|
|
+ WHEN is_guest=1 AND appservice_id IS NULL THEN 'guest'
|
|
|
+ WHEN is_guest=0 AND appservice_id IS NOT NULL THEN 'bridged'
|
|
|
+ END AS user_type
|
|
|
+ FROM users
|
|
|
+ WHERE creation_ts > ?
|
|
|
+ ) AS t GROUP BY user_type
|
|
|
+ """
|
|
|
+ results = {'native': 0, 'guest': 0, 'bridged': 0}
|
|
|
+ txn.execute(sql, (yesterday,))
|
|
|
+ for row in txn:
|
|
|
+ results[row[0]] = row[1]
|
|
|
+ return results
|
|
|
+ return self.runInteraction("count_daily_user_type", _count_daily_user_type)
|
|
|
+
|
|
|
@defer.inlineCallbacks
|
|
|
def count_nonbridged_users(self):
|
|
|
def _count_users(txn):
|