From 4265dc4b62921dc7487b8657f444af851b951dce Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 10 May 2021 18:05:37 +0200 Subject: [PATCH] Move history audit pruning to HistroyAudit class --- lib/galaxy/celery/tasks.py | 18 +----------------- lib/galaxy/model/__init__.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/galaxy/celery/tasks.py b/lib/galaxy/celery/tasks.py index 2275420b603..a5238e8b7c1 100644 --- a/lib/galaxy/celery/tasks.py +++ b/lib/galaxy/celery/tasks.py @@ -1,9 +1,4 @@ from lagom import magic_bind_to_container -from sqlalchemy import ( - and_, - func, - tuple_ -) from sqlalchemy.orm.scoping import ( scoped_session, ) @@ -85,17 +80,6 @@ def export_history( @galaxy_task def prune_history_audit_table(sa_session: scoped_session): """Prune ever growing history_audit table.""" - history_audit_table = model.HistoryAudit.table - latest_subq = sa_session.query( - history_audit_table.c.history_id, - func.max(history_audit_table.c.update_time).label('max_update_time')).group_by(history_audit_table.c.history_id).subquery() - not_latest_query = sa_session.query( - history_audit_table.c.history_id, history_audit_table.c.update_time - ).select_from(latest_subq).join( - history_audit_table, and_( - history_audit_table.c.update_time < latest_subq.columns.max_update_time, - history_audit_table.c.history_id == latest_subq.columns.history_id)) - d = history_audit_table.delete() timer = ExecutionTimer() - sa_session.execute(d.where(tuple_(history_audit_table.c.history_id, history_audit_table.c.update_time).in_(not_latest_query))) + model.HistoryAudit.prune(sa_session) log.debug(f"Successfully pruned history_audit table {timer}") diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 1b6f8f233b8..af5c156ecf2 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -35,6 +35,7 @@ from sqlalchemy import ( select, text, true, + tuple_, type_coerce, types) from sqlalchemy.exc import OperationalError @@ -1850,6 +1851,21 @@ class HistoryAudit(RepresentById): self.history = history self.update_time = update_time + @classmethod + def prune(cls, sa_session): + history_audit_table = cls.table + latest_subq = sa_session.query( + history_audit_table.c.history_id, + func.max(history_audit_table.c.update_time).label('max_update_time')).group_by(history_audit_table.c.history_id).subquery() + not_latest_query = sa_session.query( + history_audit_table.c.history_id, history_audit_table.c.update_time + ).select_from(latest_subq).join( + history_audit_table, and_( + history_audit_table.c.update_time < latest_subq.columns.max_update_time, + history_audit_table.c.history_id == latest_subq.columns.history_id)) + d = history_audit_table.delete() + sa_session.execute(d.where(tuple_(history_audit_table.c.history_id, history_audit_table.c.update_time).in_(not_latest_query))) + class History(HasTags, Dictifiable, UsesAnnotations, HasName, RepresentById):