From 4f270e15db1e876d0ad77a8e9291a2e371b0e6d2 Mon Sep 17 00:00:00 2001 From: Matt Garber Date: Mon, 4 Dec 2023 12:46:10 -0500 Subject: [PATCH] Docs cleanup, query tests --- .../template_sql/statistics/psm_templates.py | 59 +------ cumulus_mhg_dev_db | Bin 0 -> 1323008 bytes docs/third-party-software-citations.md | 17 ++ tests/test_psm_templates.py | 153 ++++++++++++++++++ tests/test_templates.py | 7 +- 5 files changed, 174 insertions(+), 62 deletions(-) create mode 100644 cumulus_mhg_dev_db create mode 100644 docs/third-party-software-citations.md create mode 100644 tests/test_psm_templates.py diff --git a/cumulus_library/template_sql/statistics/psm_templates.py b/cumulus_library/template_sql/statistics/psm_templates.py index 4da0206d..0a43793f 100644 --- a/cumulus_library/template_sql/statistics/psm_templates.py +++ b/cumulus_library/template_sql/statistics/psm_templates.py @@ -9,37 +9,6 @@ from cumulus_library.errors import CumulusLibraryError -class ExtensionConfig(object): - """convenience class for holding parameters for generating extension tables. - - :param source_table: the table to extract extensions from - :param source_id: the id column to treat as a foreign key - :param target_table: the name of the table to create - :param target_col_prefix: the string to prepend code/display column names with - :param fhir_extension: the URL of the FHIR resource to select - :param code_systems: a list of codes, in preference order, to use to select data - :param is_array: a boolean indicating if the targeted field is an array type - """ - - def __init__( - self, - source_table: str, - source_id: str, - target_table: str, - target_col_prefix: str, - fhir_extension: str, - ext_systems: List[str], - is_array: bool = False, - ): - self.source_table = source_table - self.source_id = source_id - self.target_table = target_table - self.target_col_prefix = target_col_prefix - self.fhir_extension = fhir_extension - self.ext_systems = ext_systems - self.is_array = is_array - - def get_distinct_ids( columns: list[str], source_table: str, join_id: str = None, filter_table: str = None ) -> str: @@ -79,7 +48,7 @@ def get_create_covariate_table( neg_source_table: str, primary_ref: str, dependent_variable: str, - join_cols_by_table: dict = {}, + join_cols_by_table: dict, count_ref: str = None, count_table: str = None, ) -> str: @@ -116,29 +85,3 @@ def get_create_covariate_table( count_table=count_table, join_cols_by_table=join_cols_by_table, ) - - -def get_extension_denormalize_query(config: ExtensionConfig) -> str: - """extracts target extension from a table into a denormalized table - - This function is targeted at a complex extension element that is at the root - of a FHIR resource - as an example, see the 5 codes at the root node of - http://hl7.org/fhir/us/core/STU6/StructureDefinition-us-core-patient.html. - The template will create a new table with the extension data, in arrays, - mapped 1-1 to the table id. You can specify multiple systems - in the ExtensionConfig passed to this function. For each patient, we'll - take the data from the first extension coding system we find for each patient. - - :param config: An instance of ExtensionConfig. - """ - path = Path(__file__).parent - with open(f"{path}/extension_denormalize.sql.jinja") as extension_denormalize: - return Template(extension_denormalize.read()).render( - source_table=config.source_table, - source_id=config.source_id, - target_table=config.target_table, - target_col_prefix=config.target_col_prefix, - fhir_extension=config.fhir_extension, - ext_systems=config.ext_systems, - is_array=config.is_array, - ) diff --git a/cumulus_mhg_dev_db b/cumulus_mhg_dev_db new file mode 100644 index 0000000000000000000000000000000000000000..4a78c37ca53a127f95accb27598fa3cd96b4ffb6 GIT binary patch literal 1323008 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 literal 0 HcmV?d00001 diff --git a/docs/third-party-software-citations.md b/docs/third-party-software-citations.md new file mode 100644 index 00000000..5b2c30cc --- /dev/null +++ b/docs/third-party-software-citations.md @@ -0,0 +1,17 @@ +--- +title: Third party software citations +parent: Library +nav_order: 8 +# audience: Clinical researchers interested in publications +# type: reference +--- + +# Third party software citations + +This file contains a list of third party software libraries associated with +publications that are used by Cumulus library. These are generally domain +specific to clinical research. + +## (PsmPy)[https://github.com/adriennekline/psmpy] + +A. Kline and Y. Luo, PsmPy: A Package for Retrospective Cohort Matching in Python, 2022 44th Annual International Conference of the IEEE Engineering in Medicine & Biology Society (EMBC), 2022, pp. 1354-1357, doi: 10.1109/EMBC48229.2022.9871333. diff --git a/tests/test_psm_templates.py b/tests/test_psm_templates.py new file mode 100644 index 00000000..f66ec4c5 --- /dev/null +++ b/tests/test_psm_templates.py @@ -0,0 +1,153 @@ +from contextlib import nullcontext as does_not_raise + +import pytest + +from cumulus_library.errors import CumulusLibraryError +from cumulus_library.template_sql.statistics.psm_templates import ( + get_distinct_ids, + get_create_covariate_table, +) + + +@pytest.mark.parametrize( + "columns,source_table,join_id,filter_table,expected,raises", + [ + ( + ["a", "b"], + "source", + "ref_id", + "filter", + """SELECT DISTINCT + "source"."a", + "source"."b" +FROM source +WHERE "source"."ref_id" NOT IN ( + SELECT "filter"."ref_id" + FROM filter +)""", + does_not_raise(), + ), + ( + ["a", "b"], + "source", + None, + None, + """SELECT DISTINCT + "source"."a", + "source"."b" +FROM source""", + does_not_raise(), + ), + (["a", "b"], "source", "ref_id", None, "", pytest.raises(CumulusLibraryError)), + ], +) +def test_get_distinct_ids( + columns, source_table, join_id, filter_table, expected, raises +): + with raises: + query = get_distinct_ids(columns, source_table, join_id, filter_table) + assert query == expected + + +@pytest.mark.parametrize( + "target,pos_source,neg_source,primary_ref,dep_var,join_cols_by_table,count_ref,count_table,expected,raises", + [ + ( + "target", + "pos_table", + "neg_table", + "subject_id", + "has_flu", + {}, + None, + None, + """CREATE TABLE target AS ( + SELECT + DISTINCT sample_cohort."subject_id", + sample_cohort."has_flu", + neg_table.code + FROM "pos_table_sampled_ids" AS sample_cohort, + "neg_table", + WHERE sample_cohort."subject_id" = "neg_table"."subject_id" + -- AND c.recordeddate <= sample_cohort.enc_end_date + ORDER BY sample_cohort."subject_id" +)""", + does_not_raise(), + ), + ( + "target", + "pos_table", + "neg_table", + "subject_id", + "has_flu", + { + "join_table": { + "join_id": "enc_ref", + "included_cols": [["a"], ["b", "c"]], + } + }, + "enc_ref", + "join_table", + """CREATE TABLE target AS ( + SELECT + DISTINCT sample_cohort."subject_id", + sample_cohort."has_flu", + ( + SELECT COUNT( DISTINCT subject_id ) + FROM "join_table" + WHERE sample_cohort."enc_ref" = "join_table"."enc_ref" + --AND sample_cohort.enc_end_date >= "join_table".recordeddate + ) AS instance_count, + "join_table"."a", + "join_table"."b" AS "c", + neg_table.code + FROM "pos_table_sampled_ids" AS sample_cohort, + "neg_table", + "join_table" + WHERE sample_cohort."subject_id" = "neg_table"."subject_id" + AND sample_cohort."enc_ref" = "join_table"."enc_ref" + -- AND c.recordeddate <= sample_cohort.enc_end_date + ORDER BY sample_cohort."subject_id" +)""", + does_not_raise(), + ), + ( + "target", + "pos_table", + "neg_table", + "subject_id", + "has_flu", + {}, + "join_table", + None, + "", + pytest.raises(CumulusLibraryError), + ), + ], +) +def test_create_covariate_table( + target, + pos_source, + neg_source, + primary_ref, + dep_var, + join_cols_by_table, + count_ref, + count_table, + expected, + raises, +): + with raises: + query = get_create_covariate_table( + target, + pos_source, + neg_source, + primary_ref, + dep_var, + join_cols_by_table, + count_ref, + count_table, + ) + with open("output.sql", "w") as f: + f.write(query) + assert query == expected diff --git a/tests/test_templates.py b/tests/test_templates.py index d0d5e330..1a41641e 100644 --- a/tests/test_templates.py +++ b/tests/test_templates.py @@ -368,11 +368,10 @@ def test_ctas_query_creation(): expected = """CREATE TABLE "test_schema"."test_table" AS ( SELECT * FROM ( VALUES - ((cast('foo' AS varchar),cast('foo' AS varchar))), - ((cast('bar' AS varchar),cast('bar' AS varchar))) + (cast('foo' AS varchar),cast('foo' AS varchar)), + (cast('bar' AS varchar),cast('bar' AS varchar)) ) - AS t - ("a","b") + AS t ("a","b") );""" query = get_ctas_query( schema_name="test_schema",