Skip to content

Commit 04c8242

Browse files
authored
Merge pull request galaxyproject#21249 from mvdbeek/optimize_api_invocations_step_id
[25.1] Optimize /api/invocations/steps/{step_id}
2 parents 080640d + 306369f commit 04c8242

2 files changed

Lines changed: 39 additions & 8 deletions

File tree

lib/galaxy/model/__init__.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,7 +1641,17 @@ class Job(Base, JobLike, UsesCreateAndUpdateTime, Dictifiable, Serializable):
16411641
back_populates="job"
16421642
)
16431643

1644-
dict_collection_visible_keys = ["id", "state", "exit_code", "update_time", "create_time", "galaxy_version"]
1644+
dict_collection_visible_keys = [
1645+
"id",
1646+
"state",
1647+
"exit_code",
1648+
"update_time",
1649+
"create_time",
1650+
"galaxy_version",
1651+
"tool_id",
1652+
"tool_version",
1653+
"history_id",
1654+
]
16451655
dict_element_visible_keys = [
16461656
"id",
16471657
"state",
@@ -1652,6 +1662,9 @@ class Job(Base, JobLike, UsesCreateAndUpdateTime, Dictifiable, Serializable):
16521662
"command_version",
16531663
"copied_from_job_id",
16541664
"user_id",
1665+
"tool_id",
1666+
"tool_version",
1667+
"history_id",
16551668
]
16561669

16571670
_numeric_metric = JobMetricNumeric
@@ -2188,9 +2201,6 @@ def to_dict(self, view="collection", system_details=False):
21882201
rval = super().to_dict(view="collection")
21892202
else:
21902203
rval = super().to_dict(view=view)
2191-
rval["tool_id"] = self.tool_id
2192-
rval["tool_version"] = self.tool_version
2193-
rval["history_id"] = self.history_id
21942204
if system_details or view == "admin_job_list":
21952205
# System level details that only admins should have.
21962206
rval["external_id"] = self.job_runner_external_id
@@ -2825,6 +2835,17 @@ def job_list(self):
28252835
.all()
28262836
)
28272837

2838+
def get_job_attributes(self, attributes: list[str]):
2839+
session = required_object_session(self)
2840+
targets = [getattr(Job.table.columns, attr) for attr in attributes]
2841+
stmt = (
2842+
select(*targets)
2843+
.select_from(Job)
2844+
.join(ImplicitCollectionJobsJobAssociation, Job.id == ImplicitCollectionJobsJobAssociation.job_id)
2845+
.where(ImplicitCollectionJobsJobAssociation.implicit_collection_jobs_id == self.id)
2846+
)
2847+
return session.execute(stmt)
2848+
28282849
def _serialize(self, id_encoder, serialization_options):
28292850
rval = dict_for(
28302851
self,
@@ -10143,6 +10164,15 @@ def _serialize(self, id_encoder, serialization_options):
1014310164

1014410165
return step_attrs
1014510166

10167+
def get_jobs_dict(self):
10168+
if self.implicit_collection_jobs:
10169+
result = self.implicit_collection_jobs.get_job_attributes(Job.dict_collection_visible_keys)
10170+
return [{"model_class": "Job", **row._mapping} for row in result]
10171+
elif self.job:
10172+
return [self.job.to_dict()]
10173+
else:
10174+
return []
10175+
1014610176
def to_dict(self, view="collection", value_mapper=None):
1014710177
rval = super().to_dict(view=view, value_mapper=value_mapper)
1014810178
rval["order_index"] = self.workflow_step.order_index
@@ -10151,9 +10181,7 @@ def to_dict(self, view="collection", value_mapper=None):
1015110181
# Following no longer makes sense...
1015210182
# rval['state'] = self.job.state if self.job is not None else None
1015310183
if view == "element":
10154-
jobs = []
10155-
for job in self.jobs:
10156-
jobs.append(job.to_dict())
10184+
jobs = self.get_jobs_dict()
1015710185

1015810186
outputs = {}
1015910187
for output_assoc in self.output_datasets:

lib/galaxy/tools/execute.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,10 @@ def finalize_dataset_collections(self, trans):
541541
# We mark this here so that the job cache query in subsequent
542542
# jobs considers this to be a valid cached input.
543543
completed_job_ids = {job.id for job in self.completed_jobs.values() if job}
544-
if all(job.copied_from_job_id in completed_job_ids for job in self.implicit_collection_jobs.job_list):
544+
completed_implicit_jobs_copied_from = set(
545+
self.implicit_collection_jobs.get_job_attributes(["copied_from_job_id"]).all()
546+
)
547+
if completed_implicit_jobs_copied_from <= completed_job_ids:
545548
completed_collections = {
546549
jtodca.name: jtodca.dataset_collection_instance
547550
for jtodca in self.completed_jobs[0].output_dataset_collection_instances

0 commit comments

Comments
 (0)