Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Inline simple_search_list/simple_search_list_txn. (#16434)
Browse files Browse the repository at this point in the history
This only has a single use and is over abstracted. Inline it so that
we can improve type hints.
  • Loading branch information
clokep authored Oct 10, 2023
1 parent b6cb610 commit f1e4301
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 73 deletions.
1 change: 1 addition & 0 deletions changelog.d/16434.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Reduce memory allocations.
13 changes: 12 additions & 1 deletion synapse/rest/admin/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -842,7 +842,18 @@ async def on_GET(
logger.info("term: %s ", term)

ret = await self.store.search_users(term)
return HTTPStatus.OK, ret
results = [
{
"name": name,
"password_hash": password_hash,
"is_guest": bool(is_guest),
"admin": bool(admin),
"user_type": user_type,
}
for name, password_hash, is_guest, admin, user_type in ret
]

return HTTPStatus.OK, results


class UserAdminServlet(RestServlet):
Expand Down
62 changes: 0 additions & 62 deletions synapse/storage/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -2476,68 +2476,6 @@ def simple_select_list_paginate_txn(

return txn.fetchall()

async def simple_search_list(
self,
table: str,
term: Optional[str],
col: str,
retcols: Collection[str],
desc: str = "simple_search_list",
) -> Optional[List[Dict[str, Any]]]:
"""Executes a SELECT query on the named table, which may return zero or
more rows, returning the result as a list of dicts.
Args:
table: the table name
term: term for searching the table matched to a column.
col: column to query term should be matched to
retcols: the names of the columns to return
Returns:
A list of dictionaries or None.
"""

return await self.runInteraction(
desc,
self.simple_search_list_txn,
table,
term,
col,
retcols,
db_autocommit=True,
)

@classmethod
def simple_search_list_txn(
cls,
txn: LoggingTransaction,
table: str,
term: Optional[str],
col: str,
retcols: Iterable[str],
) -> Optional[List[Dict[str, Any]]]:
"""Executes a SELECT query on the named table, which may return zero or
more rows, returning the result as a list of dicts.
Args:
txn: Transaction object
table: the table name
term: term for searching the table matched to a column.
col: column to query term should be matched to
retcols: the names of the columns to return
Returns:
None if no term is given, otherwise a list of dictionaries.
"""
if term:
sql = "SELECT %s FROM %s WHERE %s LIKE ?" % (", ".join(retcols), table, col)
termvalues = ["%%" + term + "%%"]
txn.execute(sql, termvalues)
else:
return None

return cls.cursor_to_dict(txn)


def make_in_list_sql_clause(
database_engine: BaseDatabaseEngine, column: str, iterable: Collection[Any]
Expand Down
46 changes: 36 additions & 10 deletions synapse/storage/databases/main/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# limitations under the License.

import logging
from typing import TYPE_CHECKING, List, Optional, Tuple, cast
from typing import TYPE_CHECKING, List, Optional, Tuple, Union, cast

from synapse.api.constants import Direction
from synapse.config.homeserver import HomeServerConfig
Expand Down Expand Up @@ -296,23 +296,49 @@ def get_users_paginate_txn(
"get_users_paginate_txn", get_users_paginate_txn
)

async def search_users(self, term: str) -> Optional[List[JsonDict]]:
async def search_users(
self, term: str
) -> List[
Tuple[str, Optional[str], Union[int, bool], Union[int, bool], Optional[str]]
]:
"""Function to search users list for one or more users with
the matched term.
Args:
term: search term
Returns:
A list of dictionaries or None.
A list of tuples of name, password_hash, is_guest, admin, user_type or None.
"""
return await self.db_pool.simple_search_list(
table="users",
term=term,
col="name",
retcols=["name", "password_hash", "is_guest", "admin", "user_type"],
desc="search_users",
)

def search_users(
txn: LoggingTransaction,
) -> List[
Tuple[str, Optional[str], Union[int, bool], Union[int, bool], Optional[str]]
]:
search_term = "%%" + term + "%%"

sql = """
SELECT name, password_hash, is_guest, admin, user_type
FROM users
WHERE name LIKE ?
"""
txn.execute(sql, (search_term,))

return cast(
List[
Tuple[
str,
Optional[str],
Union[int, bool],
Union[int, bool],
Optional[str],
]
],
txn.fetchall(),
)

return await self.db_pool.runInteraction("search_users", search_users)


def check_database_before_upgrade(
Expand Down

0 comments on commit f1e4301

Please sign in to comment.