@@ -124,13 +124,25 @@ def validate_wide_dataset(*, database_url: str, dataset_id: str) -> dict[str, An
124124 if not variables :
125125 raise ValueError ("A conforming dataset needs at least one source variable." )
126126 expected_columns = {"__case_ordinal" , * (item ["physical_name" ] for item in variables )}
127- 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 }
127+ reflected_table = Table (dataset ["data_table" ], MetaData (), autoload_with = create_engine (database_url ))
128+ reflected_columns = {column .name : column for column in reflected_table .columns }
129+ actual_columns = set (reflected_columns )
128130 if actual_columns != expected_columns :
129131 raise ValueError ("Data-table columns do not match the registered source variables." )
130132 if dataset ["case_count" ] != len (rows ):
131133 raise ValueError ("Registered case count does not match the data table." )
132134 if len ({item ["physical_name" ] for item in variables }) != len (variables ):
133135 raise ValueError ("Registered physical variable names are not unique." )
136+ case_ordinal = reflected_columns ["__case_ordinal" ]
137+ if not isinstance (case_ordinal .type , BigInteger ) or case_ordinal .nullable :
138+ raise ValueError ("Reserved case ordinal must be a non-null BIGINT column." )
139+ for item in variables :
140+ column = reflected_columns [item ["physical_name" ]]
141+ if item ["storage_kind" ] == "numeric" :
142+ if not isinstance (column .type , Float ) or not column .nullable :
143+ raise ValueError (f"Numeric variable { item ['source_name' ]!r} must be a nullable binary64 column." )
144+ elif not isinstance (column .type , Text ) or column .nullable :
145+ raise ValueError (f"String variable { item ['source_name' ]!r} must be a non-null text column." )
134146 if [row ["__case_ordinal" ] for row in rows ] != list (range (1 , len (rows ) + 1 )):
135147 raise ValueError ("Case ordinals are not contiguous source order." )
136148 return {"dataset_id" : dataset ["dataset_id" ], "valid" : True , "case_count" : len (rows ), "variable_count" : len (variables )}
0 commit comments