2121)
2222from mavedb .lib .mave .utils import is_csv_null
2323from mavedb .lib .validation .constants .general import null_values_list
24+ from mavedb .lib .validation .utilities import is_null as validate_is_null
2425from mavedb .models .contributor import Contributor
2526from mavedb .models .controlled_keyword import ControlledKeyword
2627from mavedb .models .doi_identifier import DoiIdentifier
@@ -311,6 +312,7 @@ def get_score_set_counts_as_csv(
311312 score_set : ScoreSet ,
312313 start : Optional [int ] = None ,
313314 limit : Optional [int ] = None ,
315+ download : Optional [bool ] = None ,
314316) -> str :
315317 assert type (score_set .dataset_columns ) is dict
316318 count_columns = [str (x ) for x in list (score_set .dataset_columns .get ("count_columns" , []))]
@@ -329,6 +331,9 @@ def get_score_set_counts_as_csv(
329331 variants = db .scalars (variants_query ).all ()
330332
331333 rows_data = variants_to_csv_rows (variants , columns = columns , dtype = type_column )
334+ if download :
335+ rows_data , columns = process_downloadable_data (rows_data , columns )
336+
332337 stream = io .StringIO ()
333338 writer = csv .DictWriter (stream , fieldnames = columns , quoting = csv .QUOTE_MINIMAL )
334339 writer .writeheader ()
@@ -341,6 +346,7 @@ def get_score_set_scores_as_csv(
341346 score_set : ScoreSet ,
342347 start : Optional [int ] = None ,
343348 limit : Optional [int ] = None ,
349+ download : Optional [bool ] = None ,
344350) -> str :
345351 assert type (score_set .dataset_columns ) is dict
346352 score_columns = [str (x ) for x in list (score_set .dataset_columns .get ("score_columns" , []))]
@@ -359,13 +365,38 @@ def get_score_set_scores_as_csv(
359365 variants = db .scalars (variants_query ).all ()
360366
361367 rows_data = variants_to_csv_rows (variants , columns = columns , dtype = type_column )
368+ if download :
369+ rows_data , columns = process_downloadable_data (rows_data , columns )
370+
362371 stream = io .StringIO ()
363372 writer = csv .DictWriter (stream , fieldnames = columns , quoting = csv .QUOTE_MINIMAL )
364373 writer .writeheader ()
365374 writer .writerows (rows_data )
366375 return stream .getvalue ()
367376
368377
378+ def process_downloadable_data (
379+ rows_data : Iterable [dict [str , Any ]],
380+ columns : list [str ]
381+ ) -> tuple [list [str ], list [dict [str , Any ]]]:
382+ """Process rows_data for downloadable CSV by removing empty columns."""
383+ # Convert map to list.
384+ rows_data = list (rows_data )
385+ columns_to_check = ["hgvs_nt" , "hgvs_splice" , "hgvs_pro" ]
386+ columns_to_remove = []
387+
388+ # Check if all values in a column are None or "NA"
389+ for col in columns_to_check :
390+ if all (validate_is_null (row [col ]) for row in rows_data ):
391+ columns_to_remove .append (col )
392+ for row in rows_data :
393+ row .pop (col , None ) # Remove column from each row
394+
395+ # Remove these columns from the header list
396+ columns = [col for col in columns if col not in columns_to_remove ]
397+ return rows_data , columns
398+
399+
369400null_values_re = re .compile (r"\s+|none|nan|na|undefined|n/a|null|nil" , flags = re .IGNORECASE )
370401
371402
0 commit comments