Skip to content

Commit fee4be7

Browse files
authored
fix nested loading behavior (#1237)
* fix nested loading behavior * update openapi * test new behavior
1 parent 6fa9204 commit fee4be7

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

store/backend/neurostore/openapi

store/backend/neurostore/resources/data.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,7 @@ class BaseStudiesView(ObjectView, ListView):
10561056
"y": fields.Float(required=False, allow_none=True),
10571057
"z": fields.Float(required=False, allow_none=True),
10581058
"radius": fields.Float(required=False, allow_none=True),
1059+
**LIST_NESTED_ARGS,
10591060
}
10601061

10611062
_multi_search = ("name", "description")
@@ -1148,7 +1149,51 @@ def eager_load(self, q, args=None):
11481149
)
11491150

11501151
# Handle version and user loading
1151-
if args.get("info"):
1152+
if args.get("nested"):
1153+
q = q.options(
1154+
selectinload(BaseStudy.versions).options(
1155+
selectinload(Study.user)
1156+
.load_only(User.name, User.external_id)
1157+
.options(raiseload("*", sql_only=True)),
1158+
selectinload(Study.tables)
1159+
.load_only(Table.id)
1160+
.options(raiseload("*", sql_only=True)),
1161+
selectinload(Study.analyses).options(
1162+
raiseload("*", sql_only=True),
1163+
selectinload(Analysis.user)
1164+
.load_only(User.name, User.external_id)
1165+
.options(raiseload("*", sql_only=True)),
1166+
selectinload(Analysis.images).options(
1167+
raiseload("*", sql_only=True),
1168+
selectinload(Image.user)
1169+
.load_only(User.name, User.external_id)
1170+
.options(raiseload("*", sql_only=True)),
1171+
),
1172+
selectinload(Analysis.points).options(
1173+
raiseload("*", sql_only=True),
1174+
selectinload(Point.user)
1175+
.load_only(User.name, User.external_id)
1176+
.options(raiseload("*", sql_only=True)),
1177+
selectinload(Point.values).options(
1178+
raiseload("*", sql_only=True)
1179+
),
1180+
),
1181+
selectinload(Analysis.analysis_conditions).options(
1182+
raiseload("*", sql_only=True),
1183+
selectinload(AnalysisConditions.condition).options(
1184+
raiseload("*", sql_only=True),
1185+
selectinload(Condition.user)
1186+
.load_only(User.name, User.external_id)
1187+
.options(raiseload("*", sql_only=True)),
1188+
),
1189+
),
1190+
),
1191+
),
1192+
joinedload(BaseStudy.user)
1193+
.load_only(User.name, User.external_id)
1194+
.options(raiseload("*", sql_only=True)),
1195+
)
1196+
elif args.get("info"):
11521197
q = q.options(
11531198
joinedload(BaseStudy.versions).options(
11541199
raiseload("*", sql_only=True),

store/backend/neurostore/tests/api/test_base_studies.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,24 @@ def test_info_base_study(auth_client, ingest_neurosynth, session):
232232
assert isinstance(single_reg_resp.json()["versions"][0], str)
233233

234234

235+
def test_nested_base_study(auth_client, ingest_neurosynth, session):
236+
resp = auth_client.get("/api/base-studies/?nested=true")
237+
assert resp.status_code == 200
238+
239+
first_result = resp.json()["results"][0]
240+
first_version = first_result["versions"][0]
241+
242+
assert isinstance(first_version, dict)
243+
assert "username" in first_version
244+
assert "user" in first_version
245+
246+
if first_version.get("analyses"):
247+
first_analysis = first_version["analyses"][0]
248+
assert isinstance(first_analysis, dict)
249+
assert "username" in first_analysis
250+
assert "user" in first_analysis
251+
252+
235253
def test_has_coordinates_images(auth_client, session):
236254
# create an empty study
237255
doi_a = "abcd"

0 commit comments

Comments
 (0)