@@ -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+
271330async 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