1414
1515import groups
1616from util import *
17+ from util .misc import split_string_list_by_total_length
1718
1819__all__ = ['api_resource_browse_group_data' ,
1920 'api_resource_monthly_category_stats' ,
@@ -406,7 +407,7 @@ def get_resource_monthly_category_stats(ctx: rule.Context) -> Dict:
406407 if group not in group_storage :
407408 # This can happen if we have a group without a matching group collection
408409 log .write (ctx , f"Warning: ignoring group { group } for category statistics, because storage data not found "
409- + "(possibly a group without a group collection?)" )
410+ + "(possibly a group without a group collection?)" )
410411 continue
411412 elif len (group_storage [group ]) == record_count :
412413 group_storage [group ].append (0 )
@@ -685,7 +686,7 @@ def get_user_groups_for_stats(ctx: rule.Context, search_filter: str = "", user_n
685686
686687 :returns: All groups of current session's user
687688 """
688- groups_list = []
689+ groups = set ()
689690
690691 user_name = user .name (ctx ) if user_name is None else user_name
691692 user_zone = user .zone (ctx ) if zone_name is None else zone_name
@@ -696,42 +697,33 @@ def get_user_groups_for_stats(ctx: rule.Context, search_filter: str = "", user_n
696697
697698 if user .is_rodsadmin (ctx , f"{ user_name } #{ user_zone } " ):
698699 # All groups in zone
699- groups_list = list (genquery .Query (ctx ,
700+ groups . update ( list (genquery .Query (ctx ,
700701 "ORDER(USER_GROUP_NAME)" ,
701- group_filter + zone_filter + search_filter ))
702+ group_filter + zone_filter + search_filter )))
702703 else :
703704 # Groups the user is member of
704705 user_filter = f"AND USER_NAME = '{ user_name } ' "
705- group_member = list (genquery .Query (ctx ,
706- "ORDER(USER_GROUP_NAME)" ,
707- group_filter + user_filter + search_filter ))
708-
709- for grp in group_member :
710- if grp not in groups_list :
711- groups_list .append (grp )
706+ groups .update (list (genquery .Query (ctx ,
707+ "ORDER(USER_GROUP_NAME)" ,
708+ group_filter + user_filter + search_filter )))
712709
713710 # Groups the user is datamanager of
714711 dmgroup_member = list (genquery .Query (ctx ,
715712 "ORDER(USER_GROUP_NAME)" ,
716713 "USER_GROUP_NAME LIKE 'datamanager-%' " + user_filter ))
714+ categories = [group .replace ("datamanager-" , "" , 1 ) for group in dmgroup_member ]
717715
718- categories = []
719- for grp in dmgroup_member :
720- cat = grp .replace ("datamanager-" , "" , 1 )
721- categories .append (cat )
722-
723- if len (categories ) > 0 :
724- quoted_categories = [f"'{ e } '" for e in categories ]
716+ # Limit batch size so that it does not exceed maximum GenQuery size. We're using 14000 rather
717+ # than 16000 so that we have a bit of slack for other parts of the query, like search filters.
718+ category_batches = split_string_list_by_total_length (categories , 14000 , add_item_length = 3 )
719+ for category_batch in category_batches :
720+ quoted_categories = [f"'{ e } '" for e in category_batch ]
725721 categories_string = f"({ ',' .join (quoted_categories )} )"
726- group_dm = list (genquery .Query (ctx ,
727- "ORDER(USER_GROUP_NAME)" ,
728- group_filter + search_filter + f"AND META_USER_ATTR_NAME = 'category' AND META_USER_ATTR_VALUE IN { categories_string } " ))
729-
730- for grp in group_dm :
731- if grp not in groups_list :
732- groups_list .append (grp )
722+ groups .update (list (genquery .Query (ctx ,
723+ "ORDER(USER_GROUP_NAME)" ,
724+ group_filter + search_filter + f"AND META_USER_ATTR_NAME = 'category' AND META_USER_ATTR_VALUE IN { categories_string } " )))
733725
734- return groups_list
726+ return sorted ( groups )
735727
736728
737729def rule_resource_research (rule_args , callback , rei ):
0 commit comments