Skip to content

Commit 60e9556

Browse files
committed
simplify
1 parent fc1cd56 commit 60e9556

File tree

1 file changed

+98
-76
lines changed

1 file changed

+98
-76
lines changed

services/web/server/src/simcore_service_webserver/users/_accounts_repository.py

Lines changed: 98 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,65 @@ async def review_user_pre_registration(
268268
#
269269

270270

271+
def _build_left_outer_join_query(
272+
email_like: str | None,
273+
product_name: ProductName | None,
274+
columns: tuple,
275+
) -> sa.sql.Select | None:
276+
left_where_conditions = []
277+
if email_like is not None:
278+
left_where_conditions.append(
279+
users_pre_registration_details.c.pre_email.like(email_like)
280+
)
281+
join_condition = users.c.id == users_pre_registration_details.c.user_id
282+
if product_name:
283+
join_condition = join_condition & (
284+
users_pre_registration_details.c.product_name == product_name
285+
)
286+
left_outer_join = sa.select(*columns).select_from(
287+
users_pre_registration_details.outerjoin(users, join_condition)
288+
)
289+
290+
return (
291+
left_outer_join.where(sa.and_(*left_where_conditions))
292+
if left_where_conditions
293+
else None
294+
)
295+
296+
297+
def _build_right_outer_join_query(
298+
email_like: str | None,
299+
user_name_like: str | None,
300+
primary_group_id: int | None,
301+
product_name: ProductName | None,
302+
columns: tuple,
303+
) -> sa.sql.Select | None:
304+
right_where_conditions = []
305+
if email_like is not None:
306+
right_where_conditions.append(users.c.email.like(email_like))
307+
if user_name_like is not None:
308+
right_where_conditions.append(users.c.name.like(user_name_like))
309+
if primary_group_id is not None:
310+
right_where_conditions.append(users.c.primary_gid == primary_group_id)
311+
join_condition = users.c.id == users_pre_registration_details.c.user_id
312+
if product_name:
313+
join_condition = join_condition & (
314+
users_pre_registration_details.c.product_name == product_name
315+
)
316+
right_outer_join = sa.select(*columns).select_from(
317+
users.outerjoin(
318+
users_pre_registration_details,
319+
join_condition,
320+
)
321+
)
322+
323+
return (
324+
right_outer_join.where(sa.and_(*right_where_conditions))
325+
if right_where_conditions
326+
else None
327+
)
328+
329+
271330
async def search_merged_pre_and_registered_users(
272331
engine: AsyncEngine,
273332
connection: AsyncConnection | None = None,
@@ -288,87 +347,50 @@ async def search_merged_pre_and_registered_users(
288347
.label("invited_by")
289348
)
290349

291-
async with pass_or_acquire_connection(engine, connection) as conn:
292-
columns = (
293-
users_pre_registration_details.c.id,
294-
users.c.first_name,
295-
users.c.last_name,
296-
users.c.email,
297-
users.c.phone,
298-
users_pre_registration_details.c.pre_email,
299-
users_pre_registration_details.c.pre_first_name,
300-
users_pre_registration_details.c.pre_last_name,
301-
users_pre_registration_details.c.institution,
302-
users_pre_registration_details.c.pre_phone,
303-
users_pre_registration_details.c.address,
304-
users_pre_registration_details.c.city,
305-
users_pre_registration_details.c.state,
306-
users_pre_registration_details.c.postal_code,
307-
users_pre_registration_details.c.country,
308-
users_pre_registration_details.c.user_id,
309-
users_pre_registration_details.c.extras,
310-
users_pre_registration_details.c.account_request_status,
311-
users_pre_registration_details.c.account_request_reviewed_by,
312-
users_pre_registration_details.c.account_request_reviewed_at,
313-
users.c.status,
314-
invited_by,
315-
users_pre_registration_details.c.created,
316-
)
317-
318-
# Build where conditions for left outer join (pre-registered users)
319-
left_where_conditions = []
320-
if email_like is not None:
321-
left_where_conditions.append(
322-
users_pre_registration_details.c.pre_email.like(email_like)
323-
)
324-
325-
# Build join condition
326-
join_condition = users.c.id == users_pre_registration_details.c.user_id
327-
if product_name:
328-
join_condition = join_condition & (
329-
users_pre_registration_details.c.product_name == product_name
330-
)
350+
columns = (
351+
users_pre_registration_details.c.id,
352+
users.c.first_name,
353+
users.c.last_name,
354+
users.c.email,
355+
users.c.phone,
356+
users_pre_registration_details.c.pre_email,
357+
users_pre_registration_details.c.pre_first_name,
358+
users_pre_registration_details.c.pre_last_name,
359+
users_pre_registration_details.c.institution,
360+
users_pre_registration_details.c.pre_phone,
361+
users_pre_registration_details.c.address,
362+
users_pre_registration_details.c.city,
363+
users_pre_registration_details.c.state,
364+
users_pre_registration_details.c.postal_code,
365+
users_pre_registration_details.c.country,
366+
users_pre_registration_details.c.user_id,
367+
users_pre_registration_details.c.extras,
368+
users_pre_registration_details.c.account_request_status,
369+
users_pre_registration_details.c.account_request_reviewed_by,
370+
users_pre_registration_details.c.account_request_reviewed_at,
371+
users.c.status,
372+
invited_by,
373+
users_pre_registration_details.c.created,
374+
)
331375

332-
# Build where conditions for right outer join (registered users)
333-
right_where_conditions = []
334-
if email_like is not None:
335-
right_where_conditions.append(users.c.email.like(email_like))
336-
if user_name_like is not None:
337-
right_where_conditions.append(users.c.name.like(user_name_like))
338-
if primary_group_id is not None:
339-
# Join with user_to_groups to filter by primary group
340-
right_where_conditions.append(users.c.primary_gid == primary_group_id)
341-
342-
# Left outer join query (pre-registered users)
343-
left_outer_join = sa.select(*columns).select_from(
344-
users_pre_registration_details.outerjoin(users, join_condition)
345-
)
346-
if left_where_conditions:
347-
left_outer_join = left_outer_join.where(sa.and_(*left_where_conditions))
348-
349-
# Right outer join query (registered users)
350-
right_outer_join = sa.select(*columns).select_from(
351-
users.outerjoin(
352-
users_pre_registration_details,
353-
join_condition,
354-
)
355-
)
356-
if right_where_conditions:
357-
right_outer_join = right_outer_join.where(sa.and_(*right_where_conditions))
376+
left_outer_join = _build_left_outer_join_query(email_like, product_name, columns)
377+
right_outer_join = _build_right_outer_join_query(
378+
email_like, user_name_like, primary_group_id, product_name, columns
379+
)
358380

359-
# Only execute queries if we have meaningful search criteria
360-
queries = []
361-
if left_where_conditions:
362-
queries.append(left_outer_join)
363-
if right_where_conditions:
364-
queries.append(right_outer_join)
381+
queries = []
382+
if left_outer_join is not None:
383+
queries.append(left_outer_join)
384+
if right_outer_join is not None:
385+
queries.append(right_outer_join)
365386

366-
if not queries:
367-
# No search criteria provided, return empty result
368-
return []
387+
if not queries:
388+
# No search criteria provided, return empty result
389+
return []
369390

370-
final_query = queries[0] if len(queries) == 1 else sa.union(*queries)
391+
final_query = queries[0] if len(queries) == 1 else sa.union(*queries)
371392

393+
async with pass_or_acquire_connection(engine, connection) as conn:
372394
result = await conn.execute(final_query)
373395
return result.fetchall()
374396

0 commit comments

Comments
 (0)