From 7abdba08302bee852a281cc305004a15eeabb93a Mon Sep 17 00:00:00 2001 From: jdhayhurst Date: Fri, 21 Jul 2023 12:26:56 +0100 Subject: [PATCH] get harmonised list --- harmonisationUtils/db.py | 29 +++++++++------ harmonisationUtils/queue_harmonisation.py | 43 +++++++++++++++++------ 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/harmonisationUtils/db.py b/harmonisationUtils/db.py index c5be321..49b91f0 100644 --- a/harmonisationUtils/db.py +++ b/harmonisationUtils/db.py @@ -79,17 +79,26 @@ def select_studies(self, studies: list) -> list: def select_by( self, study: Union[list, None], - harmonised_only: bool, - harmonisation_type: list, - limit: Union[int, None], - in_progress: bool, - priority: int + harmonised_only: Union[bool, None], + harmonisation_type: Union[list, None], + limit: int, + in_progress: Union[bool, None], + priority: Union[int, None] ) -> list: - args = [[harmonised_only], harmonisation_type, [in_progress], [priority]] - conditions = ["isHarm is ?", - f"harmType in ({','.join(['?']*len(harmonisation_type))})", - "inProg is ?", - f"priority <= ?"] + args = [] + conditions = [] + if harmonised_only is not None: + args.append([harmonised_only]) + conditions.append("isHarm is ?") + if harmonisation_type is not None: + args.append(harmonisation_type) + conditions.append(f"harmType in ({','.join(['?']*len(harmonisation_type))})") + if in_progress is not None: + args.append([in_progress]) + conditions.append("inProg is ?") + if priority is not None: + args.append([priority]) + conditions.append(f"priority <= ?") sql = f""" SELECT * FROM studies WHERE diff --git a/harmonisationUtils/queue_harmonisation.py b/harmonisationUtils/queue_harmonisation.py index db40e8b..a87000c 100644 --- a/harmonisationUtils/queue_harmonisation.py +++ b/harmonisationUtils/queue_harmonisation.py @@ -219,13 +219,27 @@ def rebuild_harmonisation_queue(self) -> None: self.db.insert_study(study=astuple(study)) self.db.reset_last_run(timestamp=generate_datestamp()) + def get_studies( self, - studies: Union[list, None] = None - ) -> List[Study]: - result = self.db.select_studies(studies=studies) + studies: Union[list, None] = None, + harmonised_only: Union[bool, None] = None, + harmonisation_type: List[HarmonisationType] = [e.value for e in HarmonisationType], + limit: int = 200, + in_progress: Union[bool, None] = None, + priority: int = 3 + ) -> List[Study]: + result = self.db.select_by(study=studies, + harmonised_only=harmonised_only, + harmonisation_type=harmonisation_type, + limit=limit, + in_progress=in_progress, + priority=priority) return self._db_study_to_object(result) + def get_harmonised_list(self) -> list: + return self.get_studies(harmonised_only=True) + def _get_from_db( self, studies: Union[list, None] = None, @@ -348,6 +362,7 @@ def arg_checker(args) -> bool: Returns: True if arguments are ok. """ + args_ok = True if args.action == 'refresh': args_ok = all([args.source_dir, args.harmonisation_dir, @@ -360,8 +375,6 @@ def arg_checker(args) -> bool: args_ok = all([args.source_dir, args.harmonisation_dir, args.ftp_dir]) - if args.action == 'status': - args_ok = all([args.study]) if args.action == 'update': args_ok = all([args.study]) return args_ok @@ -369,12 +382,13 @@ def arg_checker(args) -> bool: def main(): parser = argparse.ArgumentParser() - parser.add_argument('--action', type=str, choices=['refresh', 'release', 'add', 'rebuild', 'status', 'update'], + parser.add_argument('--action', type=str, choices=['refresh', 'release', 'rebuild', 'status', 'update', 'harmonised_list'], help=('refresh: update the harmonisation queue with newly submitted studies; ' 'release: release the next batch of files from the queue; ' 'rebuild: rebuild the entire harmonisation queue based on the files on the file system; ' 'status: get the status of a list of studies; ' - 'update: add/update a list of studies' + 'update: add/update a list of studies; ' + 'harmonised_list: list of harmonised studies' ), required=True) parser.add_argument('--study', nargs='*', help='Specific study accession ids.', default=None) @@ -398,7 +412,14 @@ def main(): if args.action == 'rebuild': queuer.rebuild_harmonisation_queue() if args.action == 'status': - studies = queuer.get_studies(studies=args.study) + if args.study: + studies = queuer.get_studies(studies=args.study) + else: + studies = queuer.get_studies(priority=args.priority, + harmonisation_type=[args.harmonisation_type], + harmonised_only=args.is_harmonised, + in_progress=args.in_progress, + limit=args.number) for study in studies: print(study) if args.action == 'update': @@ -418,8 +439,10 @@ def main(): limit=args.number) if args.action == 'refresh': queuer.update_harmonisation_queue() - - + if args.action == 'harmonised_list': + hl = queuer.get_harmonised_list() + for study in hl: + print(study) if __name__ == '__main__':