Skip to content

Commit c8dace5

Browse files
committed
Strengthen strict wide-table validation
1 parent d271f37 commit c8dace5

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

‎src/openstatspec/sql/wide.py‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,18 @@ def read_wide_dataset(*, database_url: str, dataset_id: str) -> tuple[dict[str,
106106

107107
def validate_wide_dataset(*, database_url: str, dataset_id: str) -> dict[str, Any]:
108108
dataset, variables, rows = read_wide_dataset(database_url=database_url, dataset_id=dataset_id)
109+
profile = profile_for_url(database_url)
110+
preflight(profile, len(variables))
109111
if not variables:
110112
raise ValueError("A conforming dataset needs at least one source variable.")
113+
expected_columns = {"__case_ordinal", *(item["physical_name"] for item in variables)}
114+
actual_columns = set(rows[0]) if rows else {column.name for column in Table(dataset["data_table"], MetaData(), autoload_with=create_engine(database_url)).columns}
115+
if actual_columns != expected_columns:
116+
raise ValueError("Data-table columns do not match the registered source variables.")
117+
if dataset["case_count"] != len(rows):
118+
raise ValueError("Registered case count does not match the data table.")
119+
if len({item["physical_name"] for item in variables}) != len(variables):
120+
raise ValueError("Registered physical variable names are not unique.")
111121
if [row["__case_ordinal"] for row in rows] != list(range(1, len(rows) + 1)):
112122
raise ValueError("Case ordinals are not contiguous source order.")
113123
return {"dataset_id": dataset["dataset_id"], "valid": True, "case_count": len(rows), "variable_count": len(variables)}

0 commit comments

Comments
 (0)