diff options
author | Andrew Morgan <andrew@amorgan.xyz> | 2021-03-17 18:10:14 +0000 |
---|---|---|
committer | Andrew Morgan <andrew@amorgan.xyz> | 2021-03-18 16:35:21 +0000 |
commit | e5b7f22953df90b186a308effc36487af9aa3197 (patch) | |
tree | 06f77ecc29cf269134e535ba1e7ebb0d20666b1e | |
parent | Add a func to ModuleApi to send all local online user presence to a set of users (diff) | |
download | synapse-e5b7f22953df90b186a308effc36487af9aa3197.tar.xz |
Add an exclude_keyvalues option to simple_select_list_paginate_txn
Essentially does the same as the existing keyvalues option, but excludes rows with the given column and value.
-rw-r--r-- | synapse/storage/database.py | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/synapse/storage/database.py b/synapse/storage/database.py index f1ba529a2d..d56f3a93ed 100644 --- a/synapse/storage/database.py +++ b/synapse/storage/database.py @@ -1906,6 +1906,7 @@ class DatabasePool: retcols: Iterable[str], filters: Optional[Dict[str, Any]] = None, keyvalues: Optional[Dict[str, Any]] = None, + exclude_keyvalues: Optional[Dict[str, Any]] = None, order_direction: str = "ASC", ) -> List[Dict[str, Any]]: """ @@ -1929,7 +1930,10 @@ class DatabasePool: apply a WHERE ? LIKE ? clause. keyvalues: column names and values to select the rows with, or None to not - apply a WHERE clause. + apply a WHERE key = value clause. + exclude_keyvalues: + column names and values to exclude rows with, or None to not + apply a WHERE key != value clause. order_direction: Whether the results should be ordered "ASC" or "DESC". Returns: @@ -1938,7 +1942,7 @@ class DatabasePool: if order_direction not in ["ASC", "DESC"]: raise ValueError("order_direction must be one of 'ASC' or 'DESC'.") - where_clause = "WHERE " if filters or keyvalues else "" + where_clause = "WHERE " if filters or keyvalues or exclude_keyvalues else "" arg_list = [] # type: List[Any] if filters: where_clause += " AND ".join("%s LIKE ?" % (k,) for k in filters) @@ -1947,6 +1951,9 @@ class DatabasePool: if keyvalues: where_clause += " AND ".join("%s = ?" % (k,) for k in keyvalues) arg_list += list(keyvalues.values()) + if exclude_keyvalues: + where_clause += " AND ".join("%s != ?" % (k,) for k in exclude_keyvalues) + arg_list += list(exclude_keyvalues.values()) sql = "SELECT %s FROM %s %s ORDER BY %s %s LIMIT ? OFFSET ?" % ( ", ".join(retcols), |