Skip to content

Commit beaf6ae

Browse files
committed
Prune empty response sets after variable deletion
1 parent 7fce8fa commit beaf6ae

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

‎src/openstatspec/sql/inplace_transform.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,11 @@ def _delete_variable_metadata(
315315
) -> None:
316316
"""Delete one variable and every normative catalog row owned by it."""
317317
variable_id = str(variable["variable_id"])
318+
response_set_ids = list(connection.execute(
319+
select(core.multiple_response_member.c.multiple_response_set_id).where(
320+
core.multiple_response_member.c.variable_id == variable_id
321+
)
322+
).scalars())
318323
label_set_id = connection.execute(
319324
select(core.variable_value_label_set.c.value_label_set_id).where(
320325
core.variable_value_label_set.c.variable_id == variable_id
@@ -329,6 +334,18 @@ def _delete_variable_metadata(
329334
connection.execute(delete(core.multiple_response_member).where(
330335
core.multiple_response_member.c.variable_id == variable_id
331336
))
337+
for response_set_id in response_set_ids:
338+
remaining_member = connection.execute(
339+
select(core.multiple_response_member.c.variable_id).where(
340+
core.multiple_response_member.c.multiple_response_set_id
341+
== response_set_id
342+
)
343+
).first()
344+
if remaining_member is None:
345+
connection.execute(delete(core.multiple_response_set).where(
346+
core.multiple_response_set.c.multiple_response_set_id
347+
== response_set_id
348+
))
332349
connection.execute(delete(core.variable_attribute).where(
333350
core.variable_attribute.c.variable_id == variable_id
334351
))

‎tests/test_inplace_transform.py‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,51 @@ def test_string_declaration_creates_column_and_catalog_variable(catalog) -> None
184184
)["valid"] is True
185185

186186

187+
def test_delete_prunes_an_empty_multiple_response_set(catalog) -> None:
188+
url, path, dataset_id, _table_name = catalog
189+
connection = sqlite3.connect(path)
190+
variable_id = connection.execute(
191+
"select variable_id from variable where dataset_id = ?",
192+
(dataset_id,),
193+
).fetchone()[0]
194+
response_set_id = "00000000-0000-0000-0000-000000000001"
195+
connection.execute(
196+
"insert into multiple_response_set "
197+
"(multiple_response_set_id, dataset_id, source_ordinal, set_name, "
198+
"set_kind, counted_value_kind, counted_numeric_value) "
199+
"values (?, ?, 1, '$scores', 'MD', 'numeric', 1.0)",
200+
(response_set_id, dataset_id),
201+
)
202+
connection.execute(
203+
"insert into multiple_response_member "
204+
"(multiple_response_set_id, variable_id, source_ordinal) "
205+
"values (?, ?, 1)",
206+
(response_set_id, variable_id),
207+
)
208+
connection.commit()
209+
connection.close()
210+
211+
openstatspec.apply_spss_in_place(
212+
database_url=url,
213+
dataset_id=dataset_id,
214+
source_text="COMPUTE other = score. DELETE VARIABLES score.",
215+
actor="test-agent",
216+
)
217+
218+
connection = sqlite3.connect(path)
219+
assert connection.execute(
220+
"select count(*) from multiple_response_set where dataset_id = ?",
221+
(dataset_id,),
222+
).fetchone() == (0,)
223+
assert connection.execute(
224+
"select count(*) from multiple_response_member"
225+
).fetchone() == (0,)
226+
connection.close()
227+
assert validate_wide_dataset(
228+
database_url=url, dataset_id=dataset_id,
229+
)["valid"] is True
230+
231+
187232
def test_delete_then_recreate_same_name_resolves_operations_in_order(catalog) -> None:
188233
url, path, dataset_id, table_name = catalog
189234

0 commit comments

Comments
 (0)