Skip to content

Commit 37e9708

Browse files
committed
Fix SA2.0 (query->select) in galaxy.tools
1 parent 49fee79 commit 37e9708

7 files changed

Lines changed: 59 additions & 51 deletions

File tree

lib/galaxy/tools/__init__.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
from lxml import etree
3131
from mako.template import Template
3232
from packaging.version import Version
33+
from sqlalchemy import (
34+
delete,
35+
func,
36+
select,
37+
)
3338

3439
from galaxy import (
3540
exceptions,
@@ -346,9 +351,9 @@ def __init__(self, app):
346351

347352
def reset_tags(self):
348353
log.info(
349-
f"removing all tool tag associations ({str(self.sa_session.query(self.app.model.ToolTagAssociation).count())})"
354+
f"removing all tool tag associations ({str(self.sa_session.scalar(select(func.count(self.app.model.ToolTagAssociation))))})"
350355
)
351-
self.sa_session.query(self.app.model.ToolTagAssociation).delete()
356+
self.sa_session.execute(delete(self.app.model.ToolTagAssociation))
352357
with transaction(self.sa_session):
353358
self.sa_session.commit()
354359

@@ -359,7 +364,8 @@ def handle_tags(self, tool_id, tool_definition_source):
359364
for tag_name in tag_names:
360365
if tag_name == "":
361366
continue
362-
tag = self.sa_session.query(self.app.model.Tag).filter_by(name=tag_name).first()
367+
stmt = select(self.app.model.Tag).filter_by(name=tag_name).limit(1)
368+
tag = self.sa_session.scalars(stmt).first()
363369
if not tag:
364370
tag = self.app.model.Tag(name=tag_name)
365371
self.sa_session.add(tag)
@@ -618,7 +624,7 @@ def _load_workflow(self, workflow_id):
618624
which is encoded in the tool panel.
619625
"""
620626
id = self.app.security.decode_id(workflow_id)
621-
stored = self.app.model.context.query(self.app.model.StoredWorkflow).get(id)
627+
stored = self.app.model.context.get(self.app.model.StoredWorkflow, id)
622628
return stored.latest_workflow
623629

624630
def __build_tool_version_select_field(self, tools, tool_id, set_selected):
@@ -3121,7 +3127,7 @@ def exec_after_process(self, app, inp_data, out_data, param_dict, job=None, **kw
31213127
self.sa_session.commit()
31223128

31233129
def job_failed(self, job_wrapper, message, exception=False):
3124-
job = job_wrapper.sa_session.query(model.Job).get(job_wrapper.job_id)
3130+
job = job_wrapper.sa_session.get(model.Job, job_wrapper.job_id)
31253131
if job:
31263132
inp_data = {}
31273133
for dataset_assoc in job.input_datasets:
@@ -3168,7 +3174,7 @@ def exec_after_process(self, app, inp_data, out_data, param_dict, job=None, **kw
31683174

31693175
def job_failed(self, job_wrapper, message, exception=False):
31703176
super().job_failed(job_wrapper, message, exception=exception)
3171-
job = job_wrapper.sa_session.query(model.Job).get(job_wrapper.job_id)
3177+
job = job_wrapper.sa_session.get(model.Job, job_wrapper.job_id)
31723178
self.__remove_interactivetool_by_job(job)
31733179

31743180

lib/galaxy/tools/actions/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ def handle_output(name, output, hidden=None):
481481
if async_tool and name in incoming:
482482
# HACK: output data has already been created as a result of the async controller
483483
dataid = incoming[name]
484-
data = trans.sa_session.query(app.model.HistoryDatasetAssociation).get(dataid)
484+
data = trans.sa_session.get(app.model.HistoryDatasetAssociation, dataid)
485485
assert data is not None
486486
out_data[name] = data
487487
else:
@@ -745,7 +745,7 @@ def _remap_job_on_rerun(self, trans, galaxy_session, rerun_remap_job_id, current
745745
input datasets to be those of the job that is being rerun.
746746
"""
747747
try:
748-
old_job = trans.sa_session.query(trans.app.model.Job).get(rerun_remap_job_id)
748+
old_job = trans.sa_session.get(trans.app.model.Job, rerun_remap_job_id)
749749
assert old_job is not None, f"({rerun_remap_job_id}/{current_job.id}): Old job id is invalid"
750750
assert (
751751
old_job.tool_id == current_job.tool_id

lib/galaxy/tools/actions/upload_common.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
Optional,
1414
)
1515

16+
from sqlalchemy import select
1617
from sqlalchemy.orm import joinedload
1718
from webob.compat import cgi_FieldStorage
1819

@@ -94,12 +95,12 @@ def handle_library_params(
9495
# See if we have any template field contents
9596
template_field_contents = {}
9697
template_id = params.get("template_id", None)
97-
folder = trans.sa_session.query(LibraryFolder).get(folder_id)
98+
folder = trans.sa_session.get(LibraryFolder, folder_id)
9899
# We are inheriting the folder's info_association, so we may have received inherited contents or we may have redirected
99100
# here after the user entered template contents ( due to errors ).
100101
template: Optional[FormDefinition] = None
101102
if template_id not in [None, "None"]:
102-
template = trans.sa_session.query(FormDefinition).get(template_id)
103+
template = trans.sa_session.get(FormDefinition, template_id)
103104
assert template
104105
for field in template.fields:
105106
field_name = field["name"]
@@ -108,7 +109,7 @@ def handle_library_params(
108109
template_field_contents[field_name] = field_value
109110
roles: List[Role] = []
110111
for role_id in util.listify(params.get("roles", [])):
111-
role = trans.sa_session.query(Role).get(role_id)
112+
role = trans.sa_session.get(Role, role_id)
112113
roles.append(role)
113114
tags = params.get("tags", None)
114115
return LibraryParams(
@@ -436,10 +437,11 @@ def active_folders(trans, folder):
436437
# Stolen from galaxy.web.controllers.library_common (importing from which causes a circular issues).
437438
# Much faster way of retrieving all active sub-folders within a given folder than the
438439
# performance of the mapper. This query also eagerloads the permissions on each folder.
439-
return (
440-
trans.sa_session.query(LibraryFolder)
440+
stmt = (
441+
select(LibraryFolder)
441442
.filter_by(parent=folder, deleted=False)
442443
.options(joinedload(LibraryFolder.actions))
443-
.order_by(LibraryFolder.table.c.name)
444-
.all()
444+
.unique()
445+
.order_by(LibraryFolder.name)
445446
)
447+
return trans.sa_session.scalars(stmt).all()

lib/galaxy/tools/errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ def __init__(self, hda, app):
137137
if not isinstance(hda, model.HistoryDatasetAssociation):
138138
hda_id = hda
139139
try:
140-
hda = sa_session.query(model.HistoryDatasetAssociation).get(hda_id)
140+
hda = sa_session.get(model.HistoryDatasetAssociation, hda_id)
141141
assert hda is not None, ValueError("No HDA yet")
142142
except Exception:
143-
hda = sa_session.query(model.HistoryDatasetAssociation).get(app.security.decode_id(hda_id))
143+
hda = sa_session.get(model.HistoryDatasetAssociation, app.security.decode_id(hda_id))
144144
assert isinstance(hda, model.HistoryDatasetAssociation), ValueError(f"Bad value provided for HDA ({hda}).")
145145
self.hda = hda
146146
# Get the associated job

lib/galaxy/tools/imp_exp/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import shutil
55
from typing import Optional
66

7+
from sqlalchemy import select
8+
79
from galaxy import model
810
from galaxy.model import store
911
from galaxy.model.base import transaction
@@ -49,7 +51,8 @@ def cleanup_after_job(self):
4951
# Import history.
5052
#
5153

52-
jiha = self.sa_session.query(model.JobImportHistoryArchive).filter_by(job_id=self.job_id).first()
54+
stmt = select(model.JobImportHistoryArchive).filter_by(job_id=self.job_id).limit(1)
55+
jiha = self.sa_session.scalars(stmt).first()
5356
if not jiha:
5457
return None
5558
user = jiha.job.user

lib/galaxy/tools/parameters/basic.py

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,13 +1943,13 @@ def single_to_python(value):
19431943
if isinstance(value, dict) and "src" in value:
19441944
id = value["id"] if isinstance(value["id"], int) else app.security.decode_id(value["id"])
19451945
if value["src"] == "dce":
1946-
return app.model.context.query(DatasetCollectionElement).get(id)
1946+
return app.model.context.get(DatasetCollectionElement, id)
19471947
elif value["src"] == "hdca":
1948-
return app.model.context.query(HistoryDatasetCollectionAssociation).get(id)
1948+
return app.model.context.get(HistoryDatasetCollectionAssociation, id)
19491949
elif value["src"] == "ldda":
1950-
return app.model.context.query(LibraryDatasetDatasetAssociation).get(id)
1950+
return app.model.context.get(LibraryDatasetDatasetAssociation, id)
19511951
else:
1952-
return app.model.context.query(HistoryDatasetAssociation).get(id)
1952+
return app.model.context.get(HistoryDatasetAssociation, id)
19531953

19541954
if isinstance(value, dict) and "values" in value:
19551955
if hasattr(self, "multiple") and self.multiple is True:
@@ -1963,21 +1963,21 @@ def single_to_python(value):
19631963
return None
19641964
if isinstance(value, str) and value.find(",") > -1:
19651965
return [
1966-
app.model.context.query(HistoryDatasetAssociation).get(int(v))
1966+
app.model.context.get(HistoryDatasetAssociation, int(v))
19671967
for v in value.split(",")
19681968
if v not in none_values
19691969
]
19701970
elif str(value).startswith("__collection_reduce__|"):
19711971
decoded_id = str(value)[len("__collection_reduce__|") :]
19721972
if not decoded_id.isdigit():
19731973
decoded_id = app.security.decode_id(decoded_id)
1974-
return app.model.context.query(HistoryDatasetCollectionAssociation).get(int(decoded_id))
1974+
return app.model.context.get(HistoryDatasetCollectionAssociation, int(decoded_id))
19751975
elif str(value).startswith("dce:"):
1976-
return app.model.context.query(DatasetCollectionElement).get(int(value[len("dce:") :]))
1976+
return app.model.context.get(DatasetCollectionElement, int(value[len("dce:") :]))
19771977
elif str(value).startswith("hdca:"):
1978-
return app.model.context.query(HistoryDatasetCollectionAssociation).get(int(value[len("hdca:") :]))
1978+
return app.model.context.get(HistoryDatasetCollectionAssociation, int(value[len("hdca:") :]))
19791979
else:
1980-
return app.model.context.query(HistoryDatasetAssociation).get(int(value))
1980+
return app.model.context.get(HistoryDatasetAssociation, int(value))
19811981

19821982
def validate(self, value, trans=None):
19831983
def do_validate(v):
@@ -2097,17 +2097,17 @@ def from_json(self, value, trans, other_values=None):
20972097
if isinstance(single_value, dict) and "src" in single_value and "id" in single_value:
20982098
if single_value["src"] == "hda":
20992099
decoded_id = trans.security.decode_id(single_value["id"])
2100-
rval.append(trans.sa_session.query(HistoryDatasetAssociation).get(decoded_id))
2100+
rval.append(trans.sa_session.get(HistoryDatasetAssociation, decoded_id))
21012101
elif single_value["src"] == "hdca":
21022102
found_hdca = True
21032103
decoded_id = trans.security.decode_id(single_value["id"])
2104-
rval.append(trans.sa_session.query(HistoryDatasetCollectionAssociation).get(decoded_id))
2104+
rval.append(trans.sa_session.get(HistoryDatasetCollectionAssociation, decoded_id))
21052105
elif single_value["src"] == "ldda":
21062106
decoded_id = trans.security.decode_id(single_value["id"])
2107-
rval.append(trans.sa_session.query(LibraryDatasetDatasetAssociation).get(decoded_id))
2107+
rval.append(trans.sa_session.get(LibraryDatasetDatasetAssociation, decoded_id))
21082108
elif single_value["src"] == "dce":
21092109
decoded_id = trans.security.decode_id(single_value["id"])
2110-
rval.append(trans.sa_session.query(DatasetCollectionElement).get(decoded_id))
2110+
rval.append(trans.sa_session.get(DatasetCollectionElement, decoded_id))
21112111
else:
21122112
raise ValueError(f"Unknown input source {single_value['src']} passed to job submission API.")
21132113
elif isinstance(
@@ -2126,7 +2126,7 @@ def from_json(self, value, trans, other_values=None):
21262126
# support that for integer column types.
21272127
log.warning("Encoded ID where unencoded ID expected.")
21282128
single_value = trans.security.decode_id(single_value)
2129-
rval.append(trans.sa_session.query(HistoryDatasetAssociation).get(single_value))
2129+
rval.append(trans.sa_session.get(HistoryDatasetAssociation, single_value))
21302130
if found_hdca:
21312131
for val in rval:
21322132
if not isinstance(val, HistoryDatasetCollectionAssociation):
@@ -2139,26 +2139,26 @@ def from_json(self, value, trans, other_values=None):
21392139
elif isinstance(value, dict) and "src" in value and "id" in value:
21402140
if value["src"] == "hda":
21412141
decoded_id = trans.security.decode_id(value["id"])
2142-
rval.append(trans.sa_session.query(HistoryDatasetAssociation).get(decoded_id))
2142+
rval.append(trans.sa_session.get(HistoryDatasetAssociation, decoded_id))
21432143
elif value["src"] == "hdca":
21442144
decoded_id = trans.security.decode_id(value["id"])
2145-
rval.append(trans.sa_session.query(HistoryDatasetCollectionAssociation).get(decoded_id))
2145+
rval.append(trans.sa_session.get(HistoryDatasetCollectionAssociation, decoded_id))
21462146
elif value["src"] == "dce":
21472147
decoded_id = trans.security.decode_id(value["id"])
2148-
rval.append(trans.sa_session.query(DatasetCollectionElement).get(decoded_id))
2148+
rval.append(trans.sa_session.get(DatasetCollectionElement, decoded_id))
21492149
else:
21502150
raise ValueError(f"Unknown input source {value['src']} passed to job submission API.")
21512151
elif str(value).startswith("__collection_reduce__|"):
21522152
encoded_ids = [v[len("__collection_reduce__|") :] for v in str(value).split(",")]
21532153
decoded_ids = map(trans.security.decode_id, encoded_ids)
21542154
rval = []
21552155
for decoded_id in decoded_ids:
2156-
hdca = trans.sa_session.query(HistoryDatasetCollectionAssociation).get(decoded_id)
2156+
hdca = trans.sa_session.get(HistoryDatasetCollectionAssociation, decoded_id)
21572157
rval.append(hdca)
21582158
elif isinstance(value, HistoryDatasetCollectionAssociation) or isinstance(value, DatasetCollectionElement):
21592159
rval.append(value)
21602160
else:
2161-
rval.append(trans.sa_session.query(HistoryDatasetAssociation).get(value))
2161+
rval.append(trans.sa_session.get(HistoryDatasetAssociation, value))
21622162
dataset_matcher_factory = get_dataset_matcher_factory(trans)
21632163
dataset_matcher = dataset_matcher_factory.dataset_matcher(self, other_values)
21642164
for v in rval:
@@ -2443,28 +2443,24 @@ def from_json(self, value, trans, other_values=None):
24432443
rval = value
24442444
elif isinstance(value, dict) and "src" in value and "id" in value:
24452445
if value["src"] == "hdca":
2446-
rval = trans.sa_session.query(HistoryDatasetCollectionAssociation).get(
2447-
trans.security.decode_id(value["id"])
2448-
)
2446+
rval = trans.sa_session.get(HistoryDatasetCollectionAssociation, trans.security.decode_id(value["id"]))
24492447
elif isinstance(value, list):
24502448
if len(value) > 0:
24512449
value = value[0]
24522450
if isinstance(value, dict) and "src" in value and "id" in value:
24532451
if value["src"] == "hdca":
2454-
rval = trans.sa_session.query(HistoryDatasetCollectionAssociation).get(
2455-
trans.security.decode_id(value["id"])
2452+
rval = trans.sa_session.get(
2453+
HistoryDatasetCollectionAssociation, trans.security.decode_id(value["id"])
24562454
)
24572455
elif value["src"] == "dce":
2458-
rval = trans.sa_session.query(DatasetCollectionElement).get(
2459-
trans.security.decode_id(value["id"])
2460-
)
2456+
rval = trans.sa_session.get(DatasetCollectionElement, trans.security.decode_id(value["id"]))
24612457
elif isinstance(value, str):
24622458
if value.startswith("dce:"):
2463-
rval = trans.sa_session.query(DatasetCollectionElement).get(value[len("dce:") :])
2459+
rval = trans.sa_session.get(DatasetCollectionElement, value[len("dce:") :])
24642460
elif value.startswith("hdca:"):
2465-
rval = trans.sa_session.query(HistoryDatasetCollectionAssociation).get(value[len("hdca:") :])
2461+
rval = trans.sa_session.get(HistoryDatasetCollectionAssociation, value[len("hdca:") :])
24662462
else:
2467-
rval = trans.sa_session.query(HistoryDatasetCollectionAssociation).get(value)
2463+
rval = trans.sa_session.get(HistoryDatasetCollectionAssociation, value)
24682464
if rval and isinstance(rval, HistoryDatasetCollectionAssociation):
24692465
if rval.deleted:
24702466
raise ParameterValueError("the previously selected dataset collection has been deleted", self.name)
@@ -2634,8 +2630,9 @@ def to_python(self, value, app, other_values=None, validate=False):
26342630
else:
26352631
lst = []
26362632
break
2637-
lda = app.model.context.query(LibraryDatasetDatasetAssociation).get(
2638-
lda_id if isinstance(lda_id, int) else app.security.decode_id(lda_id)
2633+
lda = app.model.context.get(
2634+
LibraryDatasetDatasetAssociation,
2635+
lda_id if isinstance(lda_id, int) else app.security.decode_id(lda_id),
26392636
)
26402637
if lda is not None:
26412638
lst.append(lda)

lib/galaxy/tools/parameters/meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def __expand_collection_parameter(trans, input_key, incoming_val, collections_to
265265
encoded_hdc_id = incoming_val
266266
subcollection_type = None
267267
hdc_id = trans.app.security.decode_id(encoded_hdc_id)
268-
hdc = trans.sa_session.query(model.HistoryDatasetCollectionAssociation).get(hdc_id)
268+
hdc = trans.sa_session.get(model.HistoryDatasetCollectionAssociation, hdc_id)
269269
collections_to_match.add(input_key, hdc, subcollection_type=subcollection_type, linked=linked)
270270
if subcollection_type is not None:
271271
subcollection_elements = subcollections.split_dataset_collection_instance(hdc, subcollection_type)

0 commit comments

Comments
 (0)