diff --git a/flows/Load_OMOP_CDM_v53.json b/flows/Load_OMOP_CDM_v53.json index 31b49f7..52aa31a 100644 --- a/flows/Load_OMOP_CDM_v53.json +++ b/flows/Load_OMOP_CDM_v53.json @@ -85,7 +85,7 @@ "data": { "name": "IngestTables", "description": "Ingest into OMOP CDM tables", - "python_code": "from typing import Any, Dict, Optional\nimport pandas as pd\n\n\ndef exec(myinput: Dict[str, Any]) -> None:\n \"\"\"\n Ingest CDM DataFrames into their corresponding database tables.\n \n This function takes transformed OMOP CDM DataFrames and inserts them into\n the appropriate database schemas using SQLAlchemy's to_sql method.\n \n Args:\n myinput: Dictionary containing workflow results with:\n - 'LoadAndTransformFiles': Contains 'result' with Dict[str, pd.DataFrame]\n mapping table names to their DataFrames\n - 'TruncateTables': Contains 'result' with Dict[str, str] mapping\n table names to their schema names\n \n Returns:\n None\n \n Note:\n - Requires global variables: cdm_schema, vocab_schema, database_code\n - Requires DBDao class to be available in scope\n - Uses 'append' mode for table insertion\n - Disposes database connection after completion\n \"\"\"\n # Extract the dictionary of DataFrames from the LoadAndTransformFiles step\n df_list: Dict[str, pd.DataFrame] = myinput.get(\"LoadAndTransformFiles\").result\n \n # Extract the table-to-schema mapping from the TruncateTables step\n table_schema_map: Dict[str, str] = myinput.get(\"TruncateTables\").result\n\n # Get configuration from global variables\n database_code_var: str = database_code\n cdm_schema_var: str = cdm_schema \n vocab_schema_var: str = vocab_schema\n \n\n # Initialize database connection (not using cache database)\n dbdao = DBDao(use_cache_db=False, database_code=database_code_var)\n dbconn = dbdao.engine\n\n # Insert each DataFrame into its corresponding database table\n for table, df in df_list.items():\n # Insert DataFrame into the database table\n # - Uses the schema from table_schema_map\n # - Appends to existing data (table should already be truncated)\n # - Does not include DataFrame index as a column\n result: Optional[int] = df.to_sql(\n table, \n dbconn, \n schema=table_schema_map[table],\n if_exists='append',\n index=False\n )\n \n # Clean up database connection\n dbconn.dispose()" + "python_code": "from typing import Any, Dict, Optional\nimport pandas as pd\n\n\ndef exec(myinput: Dict[str, Any]) -> None:\n \"\"\"\n Ingest CDM DataFrames into their corresponding database tables.\n \n This function takes transformed OMOP CDM DataFrames and inserts them into\n the appropriate database schemas using SQLAlchemy's to_sql method.\n \n Args:\n myinput: Dictionary containing workflow results with:\n - 'LoadAndTransformFiles': Contains 'result' with Dict[str, pd.DataFrame]\n mapping table names to their DataFrames\n - 'TruncateTables': Contains 'result' with Dict[str, str] mapping\n table names to their schema names\n \n Returns:\n None\n \n Note:\n - Requires global variables: cdm_schema, vocab_schema, database_code\n - Requires DBDao class to be available in scope\n - Uses 'append' mode for table insertion\n - Disposes database connection after completion\n \"\"\"\n # Extract the dictionary of DataFrames from the LoadAndTransformFiles step\n df_list: Dict[str, pd.DataFrame] = myinput.get(\"LoadAndTransformFiles\").result\n \n # Extract the table-to-schema mapping from the TruncateTables step\n table_schema_map: Dict[str, str] = myinput.get(\"TruncateTables\").result\n\n # Get configuration from global variables\n database_code_var: str = database_code\n cdm_schema_var: str = cdm_schema \n vocab_schema_var: str = vocab_schema\n \n\n # Initialize database connection (not using cache database)\n dbdao = DBDao(database_code=database_code_var)\n dbconn = dbdao.engine\n\n # Insert each DataFrame into its corresponding database table\n for table, df in df_list.items():\n # Insert DataFrame into the database table\n # - Uses the schema from table_schema_map\n # - Appends to existing data (table should already be truncated)\n # - Does not include DataFrame index as a column\n result: Optional[int] = df.to_sql(\n table, \n dbconn, \n schema=table_schema_map[table],\n if_exists='append',\n index=False\n )\n \n # Clean up database connection\n dbconn.dispose()" }, "type": "python_node", "width": 350, diff --git a/flows/Load_OMOP_CDM_v54.json b/flows/Load_OMOP_CDM_v54.json index 8ddb48f..f271f41 100644 --- a/flows/Load_OMOP_CDM_v54.json +++ b/flows/Load_OMOP_CDM_v54.json @@ -85,7 +85,7 @@ "data": { "name": "IngestTables", "description": "Ingest into OMOP CDM tables", - "python_code": "from typing import Any, Dict, Optional\nimport pandas as pd\n\n\ndef exec(myinput: Dict[str, Any]) -> None:\n \"\"\"\n Ingest CDM DataFrames into their corresponding database tables.\n \n This function takes transformed OMOP CDM DataFrames and inserts them into\n the appropriate database schemas using SQLAlchemy's to_sql method.\n \n Args:\n myinput: Dictionary containing workflow results with:\n - 'LoadAndTransformFiles': Contains 'result' with Dict[str, pd.DataFrame]\n mapping table names to their DataFrames\n - 'TruncateTables': Contains 'result' with Dict[str, str] mapping\n table names to their schema names\n \n Returns:\n None\n \n Note:\n - Requires global variables: cdm_schema, vocab_schema, database_code\n - Requires DBDao class to be available in scope\n - Uses 'append' mode for table insertion\n - Disposes database connection after completion\n \"\"\"\n # Extract the dictionary of DataFrames from the LoadAndTransformFiles step\n df_list: Dict[str, pd.DataFrame] = myinput.get(\"LoadAndTransformFiles\").result\n \n # Extract the table-to-schema mapping from the TruncateTables step\n table_schema_map: Dict[str, str] = myinput.get(\"TruncateTables\").result\n\n # Get configuration from global variables\n database_code_var: str = database_code\n cdm_schema_var: str = cdm_schema \n vocab_schema_var: str = vocab_schema\n \n\n # Initialize database connection (not using cache database)\n dbdao = DBDao(use_cache_db=False, database_code=database_code_var)\n dbconn = dbdao.engine\n\n # Insert each DataFrame into its corresponding database table\n for table, df in df_list.items():\n # Insert DataFrame into the database table\n # - Uses the schema from table_schema_map\n # - Appends to existing data (table should already be truncated)\n # - Does not include DataFrame index as a column\n result: Optional[int] = df.to_sql(\n table, \n dbconn, \n schema=table_schema_map[table],\n if_exists='append',\n index=False\n )\n \n # Clean up database connection\n dbconn.dispose()" + "python_code": "from typing import Any, Dict, Optional\nimport pandas as pd\n\n\ndef exec(myinput: Dict[str, Any]) -> None:\n \"\"\"\n Ingest CDM DataFrames into their corresponding database tables.\n \n This function takes transformed OMOP CDM DataFrames and inserts them into\n the appropriate database schemas using SQLAlchemy's to_sql method.\n \n Args:\n myinput: Dictionary containing workflow results with:\n - 'LoadAndTransformFiles': Contains 'result' with Dict[str, pd.DataFrame]\n mapping table names to their DataFrames\n - 'TruncateTables': Contains 'result' with Dict[str, str] mapping\n table names to their schema names\n \n Returns:\n None\n \n Note:\n - Requires global variables: cdm_schema, vocab_schema, database_code\n - Requires DBDao class to be available in scope\n - Uses 'append' mode for table insertion\n - Disposes database connection after completion\n \"\"\"\n # Extract the dictionary of DataFrames from the LoadAndTransformFiles step\n df_list: Dict[str, pd.DataFrame] = myinput.get(\"LoadAndTransformFiles\").result\n \n # Extract the table-to-schema mapping from the TruncateTables step\n table_schema_map: Dict[str, str] = myinput.get(\"TruncateTables\").result\n\n # Get configuration from global variables\n database_code_var: str = database_code\n cdm_schema_var: str = cdm_schema \n vocab_schema_var: str = vocab_schema\n \n\n # Initialize database connection (not using cache database)\n dbdao = DBDao(database_code=database_code_var)\n dbconn = dbdao.engine\n\n # Insert each DataFrame into its corresponding database table\n for table, df in df_list.items():\n # Insert DataFrame into the database table\n # - Uses the schema from table_schema_map\n # - Appends to existing data (table should already be truncated)\n # - Does not include DataFrame index as a column\n result: Optional[int] = df.to_sql(\n table, \n dbconn, \n schema=table_schema_map[table],\n if_exists='append',\n index=False\n )\n \n # Clean up database connection\n dbconn.dispose()" }, "type": "python_node", "width": 350, diff --git a/flows/etlPatientToOMOPPerson.json b/flows/etlPatientToOMOPPerson.json index c9bca26..44a0ed9 100644 --- a/flows/etlPatientToOMOPPerson.json +++ b/flows/etlPatientToOMOPPerson.json @@ -1,5 +1,5 @@ { - "id": "e37ef214-e661-4d17-ae2f-e38cf5c03a7b", + "id": "3d71d576-1fe3-4a12-b640-ab2fde619d56", "name": "Transform FHIR Resource type Patient to OMOP Person", "cdmVersion": "5.4", "supportedDatabaseDialects": [ @@ -8,57 +8,17 @@ ], "Pre-requisites": [ ], - "edges": [ - { - "id": "reactflow__edge-9b834865-b421-4e6b-adb1-362db6e900a2source_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe-e696b11f-1d31-42ec-a3f2-370d3f958707target_e696b11f-1d31-42ec-a3f2-370d3f958707_any", - "source": "9b834865-b421-4e6b-adb1-362db6e900a2", - "target": "e696b11f-1d31-42ec-a3f2-370d3f958707", - "selected": false, - "sourceHandle": "source_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe", - "targetHandle": "target_e696b11f-1d31-42ec-a3f2-370d3f958707_any" - }, - { - "id": "reactflow__edge-e696b11f-1d31-42ec-a3f2-370d3f958707source_e696b11f-1d31-42ec-a3f2-370d3f958707_object-5630482b-10d0-42af-9cb9-fb324cd2bba2target_5630482b-10d0-42af-9cb9-fb324cd2bba2_object", - "source": "e696b11f-1d31-42ec-a3f2-370d3f958707", - "target": "5630482b-10d0-42af-9cb9-fb324cd2bba2", - "sourceHandle": "source_e696b11f-1d31-42ec-a3f2-370d3f958707_object", - "targetHandle": "target_5630482b-10d0-42af-9cb9-fb324cd2bba2_object" - }, - { - "id": "reactflow__edge-5630482b-10d0-42af-9cb9-fb324cd2bba2source_5630482b-10d0-42af-9cb9-fb324cd2bba2_dataframe-77408cc4-7c84-43a2-ab5a-26e2709bf062target_77408cc4-7c84-43a2-ab5a-26e2709bf062_dataframe", - "source": "5630482b-10d0-42af-9cb9-fb324cd2bba2", - "target": "77408cc4-7c84-43a2-ab5a-26e2709bf062", - "sourceHandle": "source_5630482b-10d0-42af-9cb9-fb324cd2bba2_dataframe", - "targetHandle": "target_77408cc4-7c84-43a2-ab5a-26e2709bf062_dataframe" - }, - { - "id": "reactflow__edge-77408cc4-7c84-43a2-ab5a-26e2709bf062source_77408cc4-7c84-43a2-ab5a-26e2709bf062_any-d8fa508e-1860-4c2b-85b9-1061c576534ftarget_d8fa508e-1860-4c2b-85b9-1061c576534f_any", - "source": "77408cc4-7c84-43a2-ab5a-26e2709bf062", - "target": "d8fa508e-1860-4c2b-85b9-1061c576534f", - "sourceHandle": "source_77408cc4-7c84-43a2-ab5a-26e2709bf062_any", - "targetHandle": "target_d8fa508e-1860-4c2b-85b9-1061c576534f_any" - }, - { - "id": "reactflow__edge-d7f46d76-5840-4248-bc64-351d53ce6e5dsource_d7f46d76-5840-4248-bc64-351d53ce6e5d_dataframe-9b834865-b421-4e6b-adb1-362db6e900a2target_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe", - "source": "d7f46d76-5840-4248-bc64-351d53ce6e5d", - "target": "9b834865-b421-4e6b-adb1-362db6e900a2", - "sourceHandle": "source_d7f46d76-5840-4248-bc64-351d53ce6e5d_dataframe", - "targetHandle": "target_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe" - } - ], "nodes": [ { "id": "d7f46d76-5840-4248-bc64-351d53ce6e5d", "data": { "name": "get_fhir_patients", - "error": false, - "database": "d2e_fhir", + "database": "fhir_db", "sqlquery": "select content from \"fhir\".\"Patient\"", "testdata": [ [] ], - "description": "Describe the task of node db_reader_node_0", - "errorMessage": null + "description": "Describe the task of node db_reader_node_0" }, "type": "db_reader_node", "width": 350, @@ -110,10 +70,8 @@ "id": "e696b11f-1d31-42ec-a3f2-370d3f958707", "data": { "name": "prepare_personIds", - "error": false, "description": "Describe the task of node python_node_0", - "python_code": "# Input: transform_to_person (dataframe) - transformed OMOP person rows from the mapping node\n# Output: result (dataframe) - person rows with stable/reused `person_id` values\n\ndef _normalize_fhir_id(value):\n if value is None:\n return None\n s = str(value).strip()\n return s.split(\"/\")[-1] if \"/\" in s else s\n\n\nDEFAULTS = {\n \"gender_concept_id\": 0,\n \"year_of_birth\": 0,\n \"race_concept_id\": 0,\n \"ethnicity_concept_id\": 0,\n}\n\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_person\").result\n\n if df is None or df.empty:\n return df\n\n if not database_code or not schema_name:\n raise ValueError(\"`database_code` and `schema_name` must be provided\")\n\n for col, default in DEFAULTS.items():\n if col not in df.columns:\n df[col] = default\n else:\n df[col] = df[col].fillna(default)\n\n dao = SqlAlchemyDao(use_cache_db=False, database_code=database_code)\n mapping_dao = DBDao(dialect=SupportedDatabaseDialects.TREX, use_cache_db=False, database_code=database_code)\n mapping_schema = f\"{database_code}_{schema_name}_fhir_mapping\"\n\n df[\"person_source_value\"] = df[\"person_source_value\"].apply(_normalize_fhir_id)\n df = df.dropna(subset=[\"person_source_value\"])\n if df.empty:\n return df\n\n fhir_ids = df[\"person_source_value\"].unique().tolist()\n\n # 1. Look up existing person_ids from data_source before deleting\n escaped_schema = mapping_schema.replace('\"', '\"\"')\n try:\n rows = mapping_dao.execute_sql(\n f\"\"\"\n SELECT DISTINCT ON (fhir_resource_id) fhir_resource_id, omop_id\n FROM \"{escaped_schema}\".\"data_source\"\n WHERE omop_table_name = 'person'\n AND omop_id IS NOT NULL\n ORDER BY fhir_resource_id, transformed_at DESC\n \"\"\",\n fetch=True,\n ) or []\n existing = {row[0]: int(row[1]) for row in rows if row[1] is not None}\n except Exception:\n existing = {}\n\n # 2. Delete existing person rows for these FHIR IDs\n omop_meta = sql.MetaData(schema=schema_name)\n person_table = sql.Table(\"person\", omop_meta, autoload_with=dao.engine)\n\n deleted = dao.execute_sqlalchemy_statement(\n person_table.delete().where(\n person_table.c.person_source_value.in_(fhir_ids)\n ),\n lambda r: r.rowcount,\n )\n print(f\"Deleted {deleted} rows from {schema_name}.person\")\n\n # 3. Get max_id from what remains in the table (after deletion)\n max_id = dao.execute_sqlalchemy_statement(\n sql.select(sql.func.coalesce(sql.func.max(person_table.c.person_id), 0)),\n lambda r: r.scalar(),\n )\n\n # 4. Assign person_ids — reuse existing, mint new for new records\n df = df.copy()\n next_id = max(max_id, max(existing.values(), default=0)) + 1\n assigned_ids = []\n for source_val in df[\"person_source_value\"]:\n if source_val in existing:\n assigned_ids.append(existing[source_val])\n else:\n assigned_ids.append(next_id)\n next_id += 1\n\n df[\"person_id\"] = assigned_ids\n reused = sum(1 for i in assigned_ids if i in existing.values())\n print(f\"Assigned person_ids: {reused} reused, {len(assigned_ids) - reused} new\")\n return df\n", - "errorMessage": null + "python_code": "# Input: transform_to_person (dataframe) - transformed OMOP person rows from the mapping node\n# Output: result (dataframe) - person rows with stable/reused `person_id` values\n\n\ndef _normalize_fhir_id(value):\n if value is None:\n return None\n s = str(value).strip()\n return s.split(\"/\")[-1] if \"/\" in s else s\n\n\nDEFAULTS = {\n \"gender_concept_id\": 0,\n \"year_of_birth\": 0,\n \"race_concept_id\": 0,\n \"ethnicity_concept_id\": 0,\n}\n\n\ndef _assign_person_ids(source_values, existing, max_id):\n next_id = max(max_id, max(existing.values(), default=0)) + 1\n assigned = {}\n assigned_ids = []\n\n for source_val in source_values:\n if source_val in existing:\n person_id = existing[source_val]\n elif source_val in assigned:\n person_id = assigned[source_val]\n else:\n person_id = next_id\n assigned[source_val] = person_id\n next_id += 1\n assigned_ids.append(person_id)\n\n return assigned_ids\n\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_person\").result\n database_code = dest_db\n schema_name = dest_schema\n\n if df is None or df.empty:\n return df\n\n if not database_code or not schema_name:\n raise ValueError(\"`database_code` and `schema_name` must be provided\")\n\n for col, default in DEFAULTS.items():\n if col not in df.columns:\n df[col] = default\n else:\n df[col] = df[col].fillna(default)\n\n dao = SqlAlchemyDao(database_code=database_code)\n mapping_dao = DBDao(dialect=SupportedDatabaseDialects.TREX, database_code=database_code)\n mapping_schema = f\"{database_code}_{schema_name}_fhir_mapping\"\n\n df[\"person_source_value\"] = df[\"person_source_value\"].apply(_normalize_fhir_id)\n df = df.dropna(subset=[\"person_source_value\"])\n if df.empty:\n return df\n\n fhir_ids = df[\"person_source_value\"].unique().tolist()\n\n # 1. Look up existing person_ids from data_source before deleting\n escaped_schema = mapping_schema.replace('\"', '\"\"')\n try:\n rows = mapping_dao.execute_sql(\n f\"\"\"\n SELECT DISTINCT ON (fhir_resource_id) fhir_resource_id, omop_id\n FROM \"{escaped_schema}\".\"data_source\"\n WHERE omop_table_name = 'person'\n AND omop_id IS NOT NULL\n ORDER BY fhir_resource_id, transformed_at DESC\n \"\"\",\n fetch=True,\n ) or []\n existing = {row[0]: int(row[1]) for row in rows if row[1] is not None}\n except Exception:\n existing = {}\n\n # 2. Delete existing person rows for these FHIR IDs\n omop_meta = sql.MetaData(schema=schema_name)\n person_table = sql.Table(\"person\", omop_meta, autoload_with=dao.engine)\n\n deleted = dao.execute_sqlalchemy_statement(\n person_table.delete().where(\n person_table.c.person_source_value.in_(fhir_ids)\n ),\n lambda r: r.rowcount,\n )\n print(f\"Deleted {deleted} rows from {schema_name}.person\")\n\n # 3. Get max_id from what remains in the table (after deletion)\n max_id = dao.execute_sqlalchemy_statement(\n sql.select(sql.func.coalesce(sql.func.max(person_table.c.person_id), 0)),\n lambda r: r.scalar(),\n )\n\n # 4. Assign person_ids — reuse existing, mint new for new records\n df = df.copy()\n assigned_ids = _assign_person_ids(df[\"person_source_value\"], existing, max_id)\n df[\"person_id\"] = assigned_ids\n reused = sum(1 for i in assigned_ids if i in existing.values())\n print(f\"Assigned person_ids: {reused} reused, {len(assigned_ids) - reused} new\")\n return df\n" }, "type": "python_node", "width": 350, @@ -123,7 +81,7 @@ "x": 610, "y": 70 }, - "selected": false, + "selected": true, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", @@ -136,15 +94,12 @@ "id": "77408cc4-7c84-43a2-ab5a-26e2709bf062", "data": { "name": "write_to_cdm_person", - "error": false, - "upsert": true, - "database": "demo_database", + "database": "dest_db", "truncate": true, "dataframe": "py2table_node", - "schemaname": "demo_cdm", + "schemaname": "dest_schema", "dbtablename": "person", - "description": "Describe the task of node db_writer_node_0", - "errorMessage": null + "description": "Describe the task of node db_writer_node_0" }, "type": "db_writer_node", "width": 354, @@ -154,7 +109,7 @@ "x": 1520, "y": 70 }, - "selected": true, + "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", @@ -197,11 +152,9 @@ "id": "d8fa508e-1860-4c2b-85b9-1061c576534f", "data": { "name": "fhir_mapping_node", - "error": false, "description": "Describe the task of node fhir_mapping_node_1", - "schema_name": "demo_cdm", - "errorMessage": null, - "database_code": "demo_database", + "schema_name": "dest_schema", + "database_code": "dest_db", "write_key_map": true, "omop_table_name": "person", "source_value_col": "person_source_value", @@ -225,20 +178,45 @@ } } ], - "variables": [ + "edges": [ + { + "id": "reactflow__edge-9b834865-b421-4e6b-adb1-362db6e900a2source_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe-e696b11f-1d31-42ec-a3f2-370d3f958707target_e696b11f-1d31-42ec-a3f2-370d3f958707_any", + "source": "9b834865-b421-4e6b-adb1-362db6e900a2", + "target": "e696b11f-1d31-42ec-a3f2-370d3f958707", + "selected": false, + "sourceHandle": "source_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe", + "targetHandle": "target_e696b11f-1d31-42ec-a3f2-370d3f958707_any" + }, { - "key": "database_code", - "value": "demo_database" + "id": "reactflow__edge-e696b11f-1d31-42ec-a3f2-370d3f958707source_e696b11f-1d31-42ec-a3f2-370d3f958707_object-5630482b-10d0-42af-9cb9-fb324cd2bba2target_5630482b-10d0-42af-9cb9-fb324cd2bba2_object", + "source": "e696b11f-1d31-42ec-a3f2-370d3f958707", + "target": "5630482b-10d0-42af-9cb9-fb324cd2bba2", + "sourceHandle": "source_e696b11f-1d31-42ec-a3f2-370d3f958707_object", + "targetHandle": "target_5630482b-10d0-42af-9cb9-fb324cd2bba2_object" + }, + { + "id": "reactflow__edge-5630482b-10d0-42af-9cb9-fb324cd2bba2source_5630482b-10d0-42af-9cb9-fb324cd2bba2_dataframe-77408cc4-7c84-43a2-ab5a-26e2709bf062target_77408cc4-7c84-43a2-ab5a-26e2709bf062_dataframe", + "source": "5630482b-10d0-42af-9cb9-fb324cd2bba2", + "target": "77408cc4-7c84-43a2-ab5a-26e2709bf062", + "sourceHandle": "source_5630482b-10d0-42af-9cb9-fb324cd2bba2_dataframe", + "targetHandle": "target_77408cc4-7c84-43a2-ab5a-26e2709bf062_dataframe" }, { - "key": "schema_name", - "value": "demo_cdm" + "id": "reactflow__edge-77408cc4-7c84-43a2-ab5a-26e2709bf062source_77408cc4-7c84-43a2-ab5a-26e2709bf062_any-d8fa508e-1860-4c2b-85b9-1061c576534ftarget_d8fa508e-1860-4c2b-85b9-1061c576534f_any", + "source": "77408cc4-7c84-43a2-ab5a-26e2709bf062", + "target": "d8fa508e-1860-4c2b-85b9-1061c576534f", + "sourceHandle": "source_77408cc4-7c84-43a2-ab5a-26e2709bf062_any", + "targetHandle": "target_d8fa508e-1860-4c2b-85b9-1061c576534f_any" }, { - "key": "fhir_id_col", - "value": "person_source_value" + "id": "reactflow__edge-d7f46d76-5840-4248-bc64-351d53ce6e5dsource_d7f46d76-5840-4248-bc64-351d53ce6e5d_dataframe-9b834865-b421-4e6b-adb1-362db6e900a2target_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe", + "source": "d7f46d76-5840-4248-bc64-351d53ce6e5d", + "target": "9b834865-b421-4e6b-adb1-362db6e900a2", + "sourceHandle": "source_d7f46d76-5840-4248-bc64-351d53ce6e5d_dataframe", + "targetHandle": "target_9b834865-b421-4e6b-adb1-362db6e900a2_dataframe" } ], + "variables": [], "importLibs": [ "import pandas as pd", "import psycopg2.sql as pg_sql", @@ -246,5 +224,21 @@ "from _shared_flow_utils.types import SupportedDatabaseDialects", "from _shared_flow_utils.dao.DBDao import DBDao", "from _shared_flow_utils.dao.sqlalchemydao import SqlAlchemyDao" + ], + "databases": [ + { + "code": "d2e_fhir", + "name": "fhir_db" + }, + { + "code": "demo_database", + "name": "dest_db" + } + ], + "schemas": [ + { + "name": "dest_schema", + "schema": "demo_cdm" + } ] -} +} \ No newline at end of file diff --git a/flows/etlQuestionnaireResponseEQ-5D-5L.json b/flows/etlQuestionnaireResponseEQ-5D-5L.json index a8ab49b..0dd2fb4 100644 --- a/flows/etlQuestionnaireResponseEQ-5D-5L.json +++ b/flows/etlQuestionnaireResponseEQ-5D-5L.json @@ -1,5 +1,5 @@ { - "id": "8da69c47-acc9-44b6-b4e3-2c6b131dfd07", + "id": "61a8b8cd-449d-408a-8e8d-1f59501c4dbd", "name": "Transform QuestionnaireResponse EQ-5D-5L to OMOP Measurement", "cdmVersion": "5.4", "supportedDatabaseDialects": [ @@ -9,76 +9,27 @@ "Pre-requisites": [ "Run ETL pipeline to transform FHIR resource type Patient to OMOP Person for the relevant project to have the person data in place before running this pipeline as it captures person_id from subject reference in QuestionnaireResponse resource and maps it to person_id field in Measurement table. You can use the 'Transform FHIR Resource type Patient to OMOP Person with cdm v5.4' template for that." ], - "edges": [ - { - "id": "reactflow__edge-a761976d-1b68-4fff-9d09-32d4fbb64f2dsource_a761976d-1b68-4fff-9d09-32d4fbb64f2d_dataframe-0ef53c18-cf39-400e-8237-dbc805cda74dtarget_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe", - "source": "a761976d-1b68-4fff-9d09-32d4fbb64f2d", - "target": "0ef53c18-cf39-400e-8237-dbc805cda74d", - "selected": false, - "sourceHandle": "source_a761976d-1b68-4fff-9d09-32d4fbb64f2d_dataframe", - "targetHandle": "target_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe" - }, - { - "id": "reactflow__edge-832800a3-c03f-44e0-8a99-9de1a5a3e080source_832800a3-c03f-44e0-8a99-9de1a5a3e080_dataframe-cacfa438-5766-4a57-bad2-71b3801bc1b8target_cacfa438-5766-4a57-bad2-71b3801bc1b8_dataframe", - "source": "832800a3-c03f-44e0-8a99-9de1a5a3e080", - "target": "cacfa438-5766-4a57-bad2-71b3801bc1b8", - "selected": false, - "sourceHandle": "source_832800a3-c03f-44e0-8a99-9de1a5a3e080_dataframe", - "targetHandle": "target_cacfa438-5766-4a57-bad2-71b3801bc1b8_dataframe" - }, - { - "id": "reactflow__edge-0ef53c18-cf39-400e-8237-dbc805cda74dsource_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe-4a0790fd-2758-470a-8fda-f3e8fdae71f3target_4a0790fd-2758-470a-8fda-f3e8fdae71f3_any", - "source": "0ef53c18-cf39-400e-8237-dbc805cda74d", - "target": "4a0790fd-2758-470a-8fda-f3e8fdae71f3", - "sourceHandle": "source_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe", - "targetHandle": "target_4a0790fd-2758-470a-8fda-f3e8fdae71f3_any" - }, - { - "id": "reactflow__edge-78d4b8a7-45ac-4139-87bb-fa3b8be3c0bdsource_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_object-832800a3-c03f-44e0-8a99-9de1a5a3e080target_832800a3-c03f-44e0-8a99-9de1a5a3e080_object", - "source": "78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd", - "target": "832800a3-c03f-44e0-8a99-9de1a5a3e080", - "sourceHandle": "source_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_object", - "targetHandle": "target_832800a3-c03f-44e0-8a99-9de1a5a3e080_object" - }, - { - "id": "reactflow__edge-4a0790fd-2758-470a-8fda-f3e8fdae71f3source_4a0790fd-2758-470a-8fda-f3e8fdae71f3_object-78d4b8a7-45ac-4139-87bb-fa3b8be3c0bdtarget_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_any", - "source": "4a0790fd-2758-470a-8fda-f3e8fdae71f3", - "target": "78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd", - "selected": false, - "sourceHandle": "source_4a0790fd-2758-470a-8fda-f3e8fdae71f3_object", - "targetHandle": "target_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_any" - }, - { - "id": "reactflow__edge-cacfa438-5766-4a57-bad2-71b3801bc1b8source_cacfa438-5766-4a57-bad2-71b3801bc1b8_any-987f7dcd-884e-464f-bba8-bad6d89b5db9target_987f7dcd-884e-464f-bba8-bad6d89b5db9_any", - "source": "cacfa438-5766-4a57-bad2-71b3801bc1b8", - "target": "987f7dcd-884e-464f-bba8-bad6d89b5db9", - "sourceHandle": "source_cacfa438-5766-4a57-bad2-71b3801bc1b8_any", - "targetHandle": "target_987f7dcd-884e-464f-bba8-bad6d89b5db9_any" - } - ], "nodes": [ { "id": "a761976d-1b68-4fff-9d09-32d4fbb64f2d", "data": { "name": "get_fhir_data", - "error": false, - "database": "d2e_fhir", - "sqlquery": "select qr.content\nfrom fhir.\"QuestionnaireResponse\" qr \njoin fhir.\"Project\" p \non qr.\"projectId\" = p.\"projectId\" \nwhere p.\"name\" = '73e16c3e-55f5-46ca-9a0f-888d6b5019f0'", + "database": "source_db", + "sqlquery": "select * from \"860c3790_89bb_411c_8f21_09f28ea3c322\".\"patient\"", "testdata": [ [] ], - "description": "Get QuestionnaireResponse fhir data from database", - "errorMessage": null + "description": "Get QuestionnaireResponse fhir data from database" }, "type": "db_reader_node", - "width": 350, - "height": 210, + "width": 354, + "height": 214, "dragging": false, "position": { "x": -1110, "y": -180 }, - "selected": false, + "selected": true, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", @@ -92,10 +43,9 @@ "data": { "id": "EQ-5D-5LMap", "name": "transform_fhir_to_omop", - "error": false, "dataframe": "get_fhir_data", "description": "Transforms fhir data to omop measurement using structure map", - "errorMessage": null, + "errorMessage": "No input data: the incoming dataframe from 'get_fhir_data' is empty", "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"EQ5D5L-to-OMOP-Measurement\",\n \"url\": \"http://example.org/StructureMap/EQ5D5L-to-OMOP-Measurement\",\n \"version\": \"1.0.0\",\n \"name\": \"EQ5D5L to OMOP Measurement\",\n \"status\": \"active\",\n \"date\": \"2026-04-16\",\n \"publisher\": \"D4L\",\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse\",\n \"mode\": \"source\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Measurement\",\n \"mode\": \"target\"\n }\n ],\n \"group\": [\n {\n \"name\": \"EQ5D5L_to_Measurement\",\n \"typeMode\": \"none\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"QuestionnaireResponse\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"Measurement\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"captureQrId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"qrId\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"mobility\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'mobility'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 0\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 44806412\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 5\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeLow\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_low\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setValueAsNumber\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer.valueCoding.code\",\n \"variable\": \"ansCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ansCode\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val1\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '1' or valueCoding.code = 'no-problems'\"\n },\n {\n \"context\": \"ans\",\n \"element\": \"valueCoding.code\",\n \"variable\": \"ansCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742346\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val2\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '2' or valueCoding.code = 'slight-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742347\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val3\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '3' or valueCoding.code = 'moderate-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742348\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val4\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '4' or valueCoding.code = 'severe-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742349\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val5\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '5' or valueCoding.code = 'unable'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742350\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"self_care\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'self-care' or linkId = 'selfCare'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 44806413\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 5\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeLow\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_low\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setValueAsNumber\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer.valueCoding.code\",\n \"variable\": \"ansCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ansCode\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val1\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '1' or valueCoding.code = 'no-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742351\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val2\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '2' or valueCoding.code = 'slight-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742352\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val3\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '3' or valueCoding.code = 'moderate-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742353\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val4\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '4' or valueCoding.code = 'severe-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742354\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val5\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '5' or valueCoding.code = 'unable'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742355\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"usual_activities\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'usual-activities' or linkId = 'usualActivities'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 2\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 44813555\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 5\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeLow\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_low\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setValueAsNumber\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer.valueCoding.code\",\n \"variable\": \"ansCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ansCode\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val1\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '1' or valueCoding.code = 'no-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742356\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val2\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '2' or valueCoding.code = 'slight-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742357\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val3\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '3' or valueCoding.code = 'moderate-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742358\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val4\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '4' or valueCoding.code = 'severe-problems'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742359\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val5\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '5' or valueCoding.code = 'unable'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742360\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"pain_discomfort\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'pain-discomfort' or linkId = 'painDiscomfort'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 3\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 44806414\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 5\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeLow\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_low\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setValueAsNumber\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer.valueCoding.code\",\n \"variable\": \"ansCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ansCode\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val1\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '1' or valueCoding.code = 'none'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742361\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val2\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '2' or valueCoding.code = 'slight'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742362\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val3\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '3' or valueCoding.code = 'moderate'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742363\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val4\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '4' or valueCoding.code = 'severe'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742364\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val5\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '5' or valueCoding.code = 'extreme'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742365\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"anxiety_depression\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'anxietyDepression' or linkId = 'anxiety-depression'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 4\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 44813556\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 5\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeLow\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_low\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setValueAsNumber\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer.valueCoding.code\",\n \"variable\": \"ansCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ansCode\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val1\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '1' or valueCoding.code = 'none'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742366\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val2\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '2' or valueCoding.code = 'slight'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742367\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val3\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '3' or valueCoding.code = 'moderate'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742368\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val4\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '4' or valueCoding.code = 'severe'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742369\n }\n ]\n }\n ]\n },\n {\n \"name\": \"val5\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\",\n \"condition\": \"valueCoding.code = '5' or valueCoding.code = 'extreme'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 742370\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"eq_vas\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'eq_vas' or linkId = 'health-today'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 5\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 42537274\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 100\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeLow\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_low\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 0\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setVasValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"extractVasInt\",\n \"source\": [\n {\n \"context\": \"ans\",\n \"element\": \"valueInteger\",\n \"variable\": \"vasValue\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"vasValue\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"indexValue\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"item\",\n \"variable\": \"qitem\",\n \"condition\": \"linkId = 'indexValue'\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"create\",\n \"parameter\": [\n {\n \"valueString\": \"Measurement\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"setMeasurementId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"authored\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 6\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setPersonId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDatetime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"dt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"dt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"authored\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setSourceValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"qrId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setTypeConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32862\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setConceptId\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 42537273\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setRangeHigh\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"linkId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"range_high\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 1\n }\n ]\n }\n ]\n },\n {\n \"name\": \"setIndexValue\",\n \"source\": [\n {\n \"context\": \"qitem\",\n \"element\": \"answer\",\n \"variable\": \"ans\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"extractIndexInt\",\n \"source\": [\n {\n \"context\": \"ans\",\n \"element\": \"valueInteger\",\n \"variable\": \"indexVal\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"indexVal\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", "output_omop_data": "" }, @@ -120,11 +70,12 @@ "id": "cacfa438-5766-4a57-bad2-71b3801bc1b8", "data": { "name": "insert_into_omop_table", - "database": "demo_database", + "database": "dest_db", + "truncate": false, "dataframe": "py2table", - "schemaname": "demo_cdm", + "schemaname": "dest_schema", "dbtablename": "measurement", - "description": "Insert the records into omop measurement table" + "description": "Insert the records into omop measurement table", }, "type": "db_writer_node", "width": 350, @@ -148,13 +99,11 @@ "data": { "map": {}, "name": "py2table", - "error": false, "uiMap": { "path": "$", "source": "prepare_measurement_ids" }, "description": "Describe the task of node py2table_node_0", - "errorMessage": null }, "type": "py2table_node", "width": 350, @@ -177,10 +126,8 @@ "id": "4a0790fd-2758-470a-8fda-f3e8fdae71f3", "data": { "name": "normalize_and_assign_person_id", - "error": false, "description": "Convert column wise data to tabular", - "python_code": "# Input: transform_fhir_to_omop (dataframe) - OMOP measurement records output from the FHIR-to-OMOP transform node\n# Output: result (dataframe) - Measurement records with resolved person_id and cleaned value_as_number\n\nEQ_VAS_CONCEPT_ID = 42537274\n\n\ndef _unwrap_input_value(value):\n return value.result if hasattr(value, \"result\") else value\n\n\ndef extract_patient_ref(value):\n if isinstance(value, dict):\n return value.get(\"reference\") or value.get(\"id\") or str(value)\n return str(value) if value is not None else None\n\n\ndef normalize_fhir_id(value):\n if value is None:\n return None\n s = str(value).strip()\n if not s:\n return None\n if \"/\" in s:\n s = s.split(\"/\")[-1]\n return s\n\n\ndef load_person_id_map(database_code: str, schema_name: str) -> dict[str, int]:\n mapping_schema = f\"{database_code}_{schema_name}_fhir_mapping\"\n dao = DBDao(\n dialect=SupportedDatabaseDialects.TREX,\n use_cache_db=False,\n database_code=database_code,\n )\n escaped_schema = mapping_schema.replace('\"', '\"\"')\n query = f\"\"\"\n SELECT fhir_id, omop_id\n FROM \"{escaped_schema}\".\"fhir_omop_key_map\"\n WHERE omop_table_name = 'person'\n AND omop_id IS NOT NULL\n \"\"\"\n rows = dao.execute_sql(query, fetch=True) or []\n result = {}\n for fhir_id, omop_id in rows:\n if fhir_id is None:\n continue\n try:\n omop_int = int(omop_id)\n except Exception:\n continue\n raw_key = str(fhir_id).strip()\n if raw_key:\n result[raw_key] = omop_int\n norm_key = normalize_fhir_id(fhir_id)\n if norm_key:\n result[norm_key] = omop_int\n print(f\"[fhir mapping] loaded {len(result)} person mappings from {mapping_schema}.fhir_omop_key_map\")\n return result\n\n\ndef exec(myinput):\n data = _unwrap_input_value(myinput.get(\"transform_fhir_to_omop\"))\n\n if data is None or data.empty:\n return pd.DataFrame()\n\n if not database_code or not cdm_schema:\n raise ValueError(\"Missing `database_code` or `cdm_schema`\")\n\n person_id_map = load_person_id_map(database_code, cdm_schema)\n if not person_id_map:\n raise ValueError(\n f\"No person mappings found in {database_code}_{cdm_schema}_fhir_mapping.fhir_omop_key_map — \"\n \"run the person pipeline before the measurement pipeline\"\n )\n\n print(f\"[normalize] columns: {list(data.columns)}, rows: {len(data)}\")\n\n result_rows = []\n skipped = []\n for _, row in data.iterrows():\n raw_ref = extract_patient_ref(row.get(\"person_id\"))\n normalized_ref = normalize_fhir_id(raw_ref)\n raw_ref_key = str(raw_ref).strip() if raw_ref is not None else None\n\n person_id = person_id_map.get(raw_ref_key) or person_id_map.get(normalized_ref)\n if person_id is None:\n skipped.append(raw_ref_key)\n continue\n\n entry = row.to_dict()\n entry[\"person_id\"] = person_id\n entry[\"value_as_number\"] = entry.get(\"value_as_number\") if entry.get(\"measurement_concept_id\") == EQ_VAS_CONCEPT_ID else None\n result_rows.append(entry)\n\n if skipped:\n print(f\"[normalize] skipped {len(skipped)} rows with no person mapping: {skipped[:10]}\")\n\n if not result_rows:\n raise ValueError(\n f\"All {len(data)} rows skipped — no person_id matches found in fhir_omop_key_map. \"\n f\"Sample unmatched refs: {skipped[:5]}\"\n )\n\n result_df = pd.DataFrame(result_rows)\n print(f\"[normalize] output shape: {result_df.shape}\")\n return result_df.reset_index(drop=True)\n", - "errorMessage": null + "python_code": "# Input: transform_fhir_to_omop (dataframe) - OMOP measurement records output from the FHIR-to-OMOP transform node\n# Output: result (dataframe) - Measurement records with resolved person_id and cleaned value_as_number\n\nEQ_VAS_CONCEPT_ID = 42537274\n\n\ndef _unwrap_input_value(value):\n return value.result if hasattr(value, \"result\") else value\n\n\ndef extract_patient_ref(value):\n if isinstance(value, dict):\n return value.get(\"reference\") or value.get(\"id\") or str(value)\n return str(value) if value is not None else None\n\n\ndef normalize_fhir_id(value):\n if value is None:\n return None\n s = str(value).strip()\n if not s:\n return None\n if \"/\" in s:\n s = s.split(\"/\")[-1]\n return s\n\n\ndef load_person_id_map(database_code: str, schema_name: str) -> dict[str, int]:\n mapping_schema = f\"{database_code}_{schema_name}_fhir_mapping\"\n dao = DBDao(\n dialect=SupportedDatabaseDialects.TREX,\n database_code=database_code,\n )\n escaped_schema = mapping_schema.replace('\"', '\"\"')\n query = f\"\"\"\n SELECT fhir_id, omop_id\n FROM \"{escaped_schema}\".\"fhir_omop_key_map\"\n WHERE omop_table_name = 'person'\n AND omop_id IS NOT NULL\n \"\"\"\n rows = dao.execute_sql(query, fetch=True) or []\n result = {}\n for fhir_id, omop_id in rows:\n if fhir_id is None:\n continue\n try:\n omop_int = int(omop_id)\n except Exception:\n continue\n raw_key = str(fhir_id).strip()\n if raw_key:\n result[raw_key] = omop_int\n norm_key = normalize_fhir_id(fhir_id)\n if norm_key:\n result[norm_key] = omop_int\n print(f\"[fhir mapping] loaded {len(result)} person mappings from {mapping_schema}.fhir_omop_key_map\")\n return result\n\n\ndef exec(myinput):\n data = _unwrap_input_value(myinput.get(\"transform_fhir_to_omop\"))\n\n if data is None or data.empty:\n return pd.DataFrame()\n\n if not dest_db or not dest_schema:\n raise ValueError(\"Missing `dest_db` or `dest_schema`\")\n\n person_id_map = load_person_id_map(dest_db, dest_schema)\n if not person_id_map:\n raise ValueError(\n f\"No person mappings found in {dest_db}_{dest_schema}_fhir_mapping.fhir_omop_key_map — \"\n \"run the person pipeline before the measurement pipeline\"\n )\n\n print(f\"[normalize] columns: {list(data.columns)}, rows: {len(data)}\")\n\n result_rows = []\n skipped = []\n for _, row in data.iterrows():\n raw_ref = extract_patient_ref(row.get(\"person_id\"))\n normalized_ref = normalize_fhir_id(raw_ref)\n raw_ref_key = str(raw_ref).strip() if raw_ref is not None else None\n\n person_id = person_id_map.get(raw_ref_key) or person_id_map.get(normalized_ref)\n if person_id is None:\n skipped.append(raw_ref_key)\n continue\n\n entry = row.to_dict()\n entry[\"person_id\"] = person_id\n entry[\"value_as_number\"] = entry.get(\"value_as_number\") if entry.get(\"measurement_concept_id\") == EQ_VAS_CONCEPT_ID else None\n result_rows.append(entry)\n\n if skipped:\n print(f\"[normalize] skipped {len(skipped)} rows with no person mapping: {skipped[:10]}\")\n\n if not result_rows:\n raise ValueError(\n f\"All {len(data)} rows skipped — no person_id matches found in fhir_omop_key_map. \"\n f\"Sample unmatched refs: {skipped[:5]}\"\n )\n\n result_df = pd.DataFrame(result_rows)\n print(f\"[normalize] output shape: {result_df.shape}\")\n return result_df.reset_index(drop=True)\n", }, "type": "python_node", "width": 350, @@ -203,10 +150,8 @@ "id": "78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd", "data": { "name": "prepare_measurement_ids", - "error": false, "description": "Clean the OMOP CDM tables", - "python_code": "# Input: normalize_and_assign_person_id (dataframe) - Measurement records with resolved person_id from the normalize_and_assign_person_id node\n# Output: result (dataframe) - Measurement records with assigned measurement_id values, ready for db insert\n\ndef exec(myinput):\n data = myinput.get(\"normalize_and_assign_person_id\").result\n\n if data is None or data.empty:\n return data\n\n data = data.dropna(subset=[\"measurement_source_value\"])\n if data.empty:\n return data\n\n dao = SqlAlchemyDao(database_code=database_code)\n fhir_ids = data[\"measurement_source_value\"].unique().tolist()\n\n omop_meta = sql.MetaData(schema=cdm_schema)\n measurement_table = sql.Table(\"measurement\", omop_meta, autoload_with=dao.engine)\n\n # 1. Look up existing (source_value, concept_id) → measurement_id BEFORE deleting\n existing_rows = dao.execute_sqlalchemy_statement(\n sql.select(\n measurement_table.c.measurement_source_value,\n measurement_table.c.measurement_concept_id,\n measurement_table.c.measurement_id,\n ).where(measurement_table.c.measurement_source_value.in_(fhir_ids)),\n lambda r: r.fetchall(),\n ) or []\n existing = {(row[0], row[1]): row[2] for row in existing_rows}\n print(f\"Found {len(existing)} existing measurement rows to reuse\")\n\n # 2. Delete existing measurement rows for these FHIR IDs\n deleted = dao.execute_sqlalchemy_statement(\n measurement_table.delete().where(\n measurement_table.c.measurement_source_value.in_(fhir_ids)\n ),\n lambda r: r.rowcount,\n )\n print(f\"Deleted {deleted} rows from {cdm_schema}.measurement\")\n\n # 3. Assign IDs — reuse by (source_value, concept_id), mint new for new records\n max_id = dao.execute_sqlalchemy_statement(\n sql.select(sql.func.coalesce(sql.func.max(measurement_table.c.measurement_id), 0)),\n lambda r: r.scalar(),\n )\n\n data = data.copy()\n next_id = max(max_id, max(existing.values(), default=0)) + 1\n assigned_ids = []\n for _, row in data.iterrows():\n key = (row[\"measurement_source_value\"], int(row[\"measurement_concept_id\"]))\n if key in existing:\n assigned_ids.append(existing[key])\n else:\n assigned_ids.append(next_id)\n next_id += 1\n\n data[\"measurement_id\"] = assigned_ids\n reused = sum(1 for i in assigned_ids if i in {v for v in existing.values()})\n print(f\"Assigned measurement_ids: {reused} reused, {len(assigned_ids) - reused} new\")\n return data\n", - "errorMessage": null + "python_code": "# Input: normalize_and_assign_person_id (dataframe) - Measurement records with resolved person_id from the normalize_and_assign_person_id node\n# Output: result (dataframe) - Measurement records with assigned measurement_id values, ready for db insert\n\ndef exec(myinput):\n data = myinput.get(\"normalize_and_assign_person_id\").result\n\n if data is None or data.empty:\n return data\n\n data = data.dropna(subset=[\"measurement_source_value\"])\n if data.empty:\n return data\n\n dao = SqlAlchemyDao(database_code=dest_db)\n fhir_ids = data[\"measurement_source_value\"].unique().tolist()\n\n omop_meta = sql.MetaData(schema=dest_schema)\n measurement_table = sql.Table(\"measurement\", omop_meta, autoload_with=dao.engine)\n\n # 1. Look up existing (source_value, concept_id) → measurement_id BEFORE deleting\n existing_rows = dao.execute_sqlalchemy_statement(\n sql.select(\n measurement_table.c.measurement_source_value,\n measurement_table.c.measurement_concept_id,\n measurement_table.c.measurement_id,\n ).where(measurement_table.c.measurement_source_value.in_(fhir_ids)),\n lambda r: r.fetchall(),\n ) or []\n existing = {(row[0], row[1]): row[2] for row in existing_rows}\n print(f\"Found {len(existing)} existing measurement rows to reuse\")\n\n # 2. Delete existing measurement rows for these FHIR IDs\n deleted = dao.execute_sqlalchemy_statement(\n measurement_table.delete().where(\n measurement_table.c.measurement_source_value.in_(fhir_ids)\n ),\n lambda r: r.rowcount,\n )\n print(f\"Deleted {deleted} rows from {dest_schema}.measurement\")\n\n # 3. Assign IDs — reuse by (source_value, concept_id), mint new for new records\n max_id = dao.execute_sqlalchemy_statement(\n sql.select(sql.func.coalesce(sql.func.max(measurement_table.c.measurement_id), 0)),\n lambda r: r.scalar(),\n )\n\n data = data.copy()\n next_id = max(max_id, max(existing.values(), default=0)) + 1\n assigned_ids = []\n for _, row in data.iterrows():\n key = (row[\"measurement_source_value\"], int(row[\"measurement_concept_id\"]))\n if key in existing:\n assigned_ids.append(existing[key])\n else:\n assigned_ids.append(next_id)\n next_id += 1\n\n data[\"measurement_id\"] = assigned_ids\n reused = sum(1 for i in assigned_ids if i in {v for v in existing.values()})\n print(f\"Assigned measurement_ids: {reused} reused, {len(assigned_ids) - reused} new\")\n return data\n", }, "type": "python_node", "width": 350, @@ -229,23 +174,25 @@ "id": "987f7dcd-884e-464f-bba8-bad6d89b5db9", "data": { "name": "fhir_mapping_node_0", + "error": false, "description": "Describe the task of node fhir_mapping_node_0", - "schema_name": "demo_cdm", - "database_code": "demo_database", + "schema_name": "dest_schema", + "errorMessage": null, + "database_code": "dest_db", "write_key_map": false, "omop_table_name": "measurement", "source_value_col": "measurement_source_value", "fhir_resource_type": "QuestionnaireResponse" }, "type": "fhir_mapping_node", - "width": 354, - "height": 214, + "width": 350, + "height": 210, "dragging": false, "position": { "x": 1530, "y": -190 }, - "selected": true, + "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", @@ -255,21 +202,77 @@ } } ], - "variables": [ + "edges": [ + { + "id": "reactflow__edge-a761976d-1b68-4fff-9d09-32d4fbb64f2dsource_a761976d-1b68-4fff-9d09-32d4fbb64f2d_dataframe-0ef53c18-cf39-400e-8237-dbc805cda74dtarget_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe", + "source": "a761976d-1b68-4fff-9d09-32d4fbb64f2d", + "target": "0ef53c18-cf39-400e-8237-dbc805cda74d", + "selected": false, + "sourceHandle": "source_a761976d-1b68-4fff-9d09-32d4fbb64f2d_dataframe", + "targetHandle": "target_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe" + }, + { + "id": "reactflow__edge-832800a3-c03f-44e0-8a99-9de1a5a3e080source_832800a3-c03f-44e0-8a99-9de1a5a3e080_dataframe-cacfa438-5766-4a57-bad2-71b3801bc1b8target_cacfa438-5766-4a57-bad2-71b3801bc1b8_dataframe", + "source": "832800a3-c03f-44e0-8a99-9de1a5a3e080", + "target": "cacfa438-5766-4a57-bad2-71b3801bc1b8", + "selected": false, + "sourceHandle": "source_832800a3-c03f-44e0-8a99-9de1a5a3e080_dataframe", + "targetHandle": "target_cacfa438-5766-4a57-bad2-71b3801bc1b8_dataframe" + }, + { + "id": "reactflow__edge-0ef53c18-cf39-400e-8237-dbc805cda74dsource_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe-4a0790fd-2758-470a-8fda-f3e8fdae71f3target_4a0790fd-2758-470a-8fda-f3e8fdae71f3_any", + "source": "0ef53c18-cf39-400e-8237-dbc805cda74d", + "target": "4a0790fd-2758-470a-8fda-f3e8fdae71f3", + "sourceHandle": "source_0ef53c18-cf39-400e-8237-dbc805cda74d_dataframe", + "targetHandle": "target_4a0790fd-2758-470a-8fda-f3e8fdae71f3_any" + }, { - "key": "database_code", - "value": "demo_database" + "id": "reactflow__edge-78d4b8a7-45ac-4139-87bb-fa3b8be3c0bdsource_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_object-832800a3-c03f-44e0-8a99-9de1a5a3e080target_832800a3-c03f-44e0-8a99-9de1a5a3e080_object", + "source": "78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd", + "target": "832800a3-c03f-44e0-8a99-9de1a5a3e080", + "sourceHandle": "source_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_object", + "targetHandle": "target_832800a3-c03f-44e0-8a99-9de1a5a3e080_object" }, { - "key": "cdm_schema", - "value": "demo_cdm" + "id": "reactflow__edge-4a0790fd-2758-470a-8fda-f3e8fdae71f3source_4a0790fd-2758-470a-8fda-f3e8fdae71f3_object-78d4b8a7-45ac-4139-87bb-fa3b8be3c0bdtarget_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_any", + "source": "4a0790fd-2758-470a-8fda-f3e8fdae71f3", + "target": "78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd", + "selected": false, + "sourceHandle": "source_4a0790fd-2758-470a-8fda-f3e8fdae71f3_object", + "targetHandle": "target_78d4b8a7-45ac-4139-87bb-fa3b8be3c0bd_any" + }, + { + "id": "reactflow__edge-cacfa438-5766-4a57-bad2-71b3801bc1b8source_cacfa438-5766-4a57-bad2-71b3801bc1b8_any-987f7dcd-884e-464f-bba8-bad6d89b5db9target_987f7dcd-884e-464f-bba8-bad6d89b5db9_any", + "source": "cacfa438-5766-4a57-bad2-71b3801bc1b8", + "target": "987f7dcd-884e-464f-bba8-bad6d89b5db9", + "sourceHandle": "source_cacfa438-5766-4a57-bad2-71b3801bc1b8_any", + "targetHandle": "target_987f7dcd-884e-464f-bba8-bad6d89b5db9_any" } ], + "variables": [], "importLibs": [ "from _shared_flow_utils.dao.DBDao import DBDao", "from _shared_flow_utils.dao.sqlalchemydao import SqlAlchemyDao", "import sqlalchemy as sql", "import pandas as pd", "from _shared_flow_utils.types import SupportedDatabaseDialects" + ], + "databases": [ + { + "code": "d2e_fhir", + "name": "source_db", + "schema": "fhir" + }, + { + "code": "demo_database", + "name": "dest_db", + "schema": "demo_cdm" + } + ], + "schemas": [ + { + "name": "dest_schema", + "schema": "demo_cdm" + } ] -} +} \ No newline at end of file diff --git a/flows/etlfhirtoomop.json b/flows/etlfhirtoomop.json index d852351..03ca655 100644 --- a/flows/etlfhirtoomop.json +++ b/flows/etlfhirtoomop.json @@ -1,1006 +1,1205 @@ { - "id": "e41057e7-9b5c-45e9-ab12-3bc9a92d98ea", + "id": "79b75e5e-c9d2-41df-9c3b-730d74e67800", "name": "ETL fhir to omop", - "edges": [ - { - "id": "reactflow__edge-bc7f2e99-5533-4719-b86a-1a9a83da684fsource_bc7f2e99-5533-4719-b86a-1a9a83da684f_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "bc7f2e99-5533-4719-b86a-1a9a83da684f", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "selected": false, - "sourceHandle": "source_bc7f2e99-5533-4719-b86a-1a9a83da684f_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" - }, + "nodes": [ { - "id": "reactflow__edge-b52d463b-e05c-44ad-90a9-7ac912b35314source_b52d463b-e05c-44ad-90a9-7ac912b35314_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "b52d463b-e05c-44ad-90a9-7ac912b35314", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "bc7f2e99-5533-4719-b86a-1a9a83da684f", + "data": { + "name": "AllergyIntolerance", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"AllergyIntolerance\"", + "testdata": [ + [] + ], + "description": "Get fhir data for AllergyIntolerance resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -930, + "y": -110 + }, "selected": false, - "sourceHandle": "source_b52d463b-e05c-44ad-90a9-7ac912b35314_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -930, + "y": -110 + } }, { - "id": "reactflow__edge-4a4209c6-84f1-4afe-85a6-2c3aecfee44bsource_4a4209c6-84f1-4afe-85a6-2c3aecfee44b_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "4a4209c6-84f1-4afe-85a6-2c3aecfee44b", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "5f6d6ed6-01e1-4186-89cc-6574cd046d40", + "data": { + "name": "insert_into_omop_observation", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_observation_1", + "schemaname": "dest_schema", + "dbtablename": "observation", + "description": "Insert into omop cdm database table" + }, + "type": "db_writer_node", + "width": 354, + "height": 214, + "dragging": false, + "position": { + "x": 3080, + "y": -210 + }, "selected": false, - "sourceHandle": "source_4a4209c6-84f1-4afe-85a6-2c3aecfee44b_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3080, + "y": -210 + } }, { - "id": "reactflow__edge-fcab0880-2901-49fb-8e3c-e73735a07030source_fcab0880-2901-49fb-8e3c-e73735a07030_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "fcab0880-2901-49fb-8e3c-e73735a07030", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "b52d463b-e05c-44ad-90a9-7ac912b35314", + "data": { + "name": "Patient", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"Patient\"", + "testdata": [ + [] + ], + "description": "Get fhir data for Patient resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -1140, + "y": 170 + }, "selected": false, - "sourceHandle": "source_fcab0880-2901-49fb-8e3c-e73735a07030_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -1140, + "y": 170 + } }, { - "id": "reactflow__edge-97d2d719-131e-4e91-9965-5dacc4f77bbasource_97d2d719-131e-4e91-9965-5dacc4f77bba_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "97d2d719-131e-4e91-9965-5dacc4f77bba", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "4b92d9e9-6a59-459f-8fc5-5a8ff5824bca", + "data": { + "name": "Insert_into_omop_person", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_person", + "schemaname": "dest_schema", + "dbtablename": "person", + "description": "Insert into cdm omop database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3130, + "y": 110 + }, "selected": false, - "sourceHandle": "source_97d2d719-131e-4e91-9965-5dacc4f77bba_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3130, + "y": 110 + } }, { - "id": "reactflow__edge-644c6dc1-72bf-4f5b-8a64-620407a36e3asource_644c6dc1-72bf-4f5b-8a64-620407a36e3a_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "644c6dc1-72bf-4f5b-8a64-620407a36e3a", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "4a4209c6-84f1-4afe-85a6-2c3aecfee44b", + "data": { + "name": "Condition", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"Condition\"", + "testdata": [ + [] + ], + "description": "Get fhir data for Condition resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -1180, + "y": 450 + }, "selected": false, - "sourceHandle": "source_644c6dc1-72bf-4f5b-8a64-620407a36e3a_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -1180, + "y": 450 + } }, { - "id": "reactflow__edge-140dffdd-9b98-46a7-ae23-b2b8a6a79a4esource_140dffdd-9b98-46a7-ae23-b2b8a6a79a4e_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "140dffdd-9b98-46a7-ae23-b2b8a6a79a4e", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "5b177aca-870c-4745-95e1-6305ee390261", + "data": { + "name": "Insert_into_omop_condition_occurrence", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_condition_occurrence", + "schemaname": "dest_schema", + "dbtablename": "condition_occurrence", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3130, + "y": 440 + }, "selected": false, - "sourceHandle": "source_140dffdd-9b98-46a7-ae23-b2b8a6a79a4e_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3130, + "y": 440 + } }, { - "id": "reactflow__edge-c1e62222-8885-4467-811f-52e80cf4e3b6source_c1e62222-8885-4467-811f-52e80cf4e3b6_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "c1e62222-8885-4467-811f-52e80cf4e3b6", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "fcab0880-2901-49fb-8e3c-e73735a07030", + "data": { + "name": "Encounter", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"Encounter\"", + "testdata": [ + [] + ], + "description": "Get fhir data for Encounter resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -1170, + "y": 700 + }, "selected": false, - "sourceHandle": "source_c1e62222-8885-4467-811f-52e80cf4e3b6_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -1170, + "y": 700 + } }, { - "id": "reactflow__edge-230782cf-935e-4354-9c89-db8a2f37bf99source_230782cf-935e-4354-9c89-db8a2f37bf99_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", - "source": "230782cf-935e-4354-9c89-db8a2f37bf99", - "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "c59e95aa-1642-4f04-a07d-c19a496aca91", + "data": { + "name": "Insert_into_omop_visit_occurrence", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_visit_occurrence", + "schemaname": "dest_schema", + "dbtablename": "visit_occurrence", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3110, + "y": 760 + }, "selected": false, - "sourceHandle": "source_230782cf-935e-4354-9c89-db8a2f37bf99_dataframe", - "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3110, + "y": 760 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-9658364f-9788-4bbd-91f4-2fb8fdde5d1btarget_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "9658364f-9788-4bbd-91f4-2fb8fdde5d1b", + "id": "97d2d719-131e-4e91-9965-5dacc4f77bba", + "data": { + "name": "Immunization", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"Immunization\"", + "testdata": [ + [] + ], + "description": "Get fhir data for Immunization resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -1150, + "y": 960 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -1150, + "y": 960 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-3c3f5888-5462-4fa6-8e9b-132d06e3e3d5target_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "3c3f5888-5462-4fa6-8e9b-132d06e3e3d5", - "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_object" - }, - { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-227a0e41-40fc-4219-90e5-2c46ea7b1879target_227a0e41-40fc-4219-90e5-2c46ea7b1879_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "227a0e41-40fc-4219-90e5-2c46ea7b1879", + "id": "b3e0cbd2-1680-4d5a-8a58-a74d636f1696", + "data": { + "name": "Insert_into_omop_drug_exposure_1", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_drug_exposure", + "schemaname": "dest_schema", + "dbtablename": "drug_exposure", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3210, + "y": 1030 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_227a0e41-40fc-4219-90e5-2c46ea7b1879_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3210, + "y": 1030 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-3c69d63f-131c-4ce0-a9cb-a735c1bfd8abtarget_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab", + "id": "644c6dc1-72bf-4f5b-8a64-620407a36e3a", + "data": { + "name": "Observation", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"Observation\"", + "testdata": [ + [] + ], + "description": "Get fhir data for Observation resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -1120, + "y": 1220 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -1120, + "y": 1220 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-e332b9d8-a600-4d2a-94cb-fff53ab01a5dtarget_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "e332b9d8-a600-4d2a-94cb-fff53ab01a5d", + "id": "9fff2d40-4802-46a6-9e9a-7615c47b7754", + "data": { + "name": "Insert_into_omop_measurement", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_measurement", + "schemaname": "dest_schema", + "dbtablename": "measurement", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3200, + "y": 1320 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3200, + "y": 1320 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-5d62e682-992f-4788-8855-5216eebad563target_5d62e682-992f-4788-8855-5216eebad563_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "5d62e682-992f-4788-8855-5216eebad563", + "id": "140dffdd-9b98-46a7-ae23-b2b8a6a79a4e", + "data": { + "name": "MedicationStatement", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"MedicationStatement\"", + "testdata": [ + [] + ], + "description": "Get fhir data for MedicationStatement resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -1030, + "y": 1520 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_5d62e682-992f-4788-8855-5216eebad563_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -1030, + "y": 1520 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-f67d926f-24be-4a64-848b-8f9e69a5e55etarget_f67d926f-24be-4a64-848b-8f9e69a5e55e_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "f67d926f-24be-4a64-848b-8f9e69a5e55e", + "id": "345c3710-002f-4c6d-843b-94e873927548", + "data": { + "name": "Insert_into_omop_drug_exposure", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_drug_exposure", + "schemaname": "dest_schema", + "dbtablename": "drug_exposure", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3230, + "y": 1590 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_f67d926f-24be-4a64-848b-8f9e69a5e55e_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3230, + "y": 1590 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-dbb730a1-1499-462e-9d67-4585bb9a9662target_dbb730a1-1499-462e-9d67-4585bb9a9662_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "dbb730a1-1499-462e-9d67-4585bb9a9662", + "id": "a51a4106-095e-49a8-a868-db5874ed60f5", + "data": { + "name": "Insert_into_omop_observation", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_observation", + "schemaname": "dest_schema", + "dbtablename": "observation", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3370, + "y": 1860 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_dbb730a1-1499-462e-9d67-4585bb9a9662_object" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3370, + "y": 1860 + } }, { - "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-f758c084-1da4-4a3c-8f96-af873953b6c6target_f758c084-1da4-4a3c-8f96-af873953b6c6_object", - "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", - "target": "f758c084-1da4-4a3c-8f96-af873953b6c6", + "id": "230782cf-935e-4354-9c89-db8a2f37bf99", + "data": { + "name": "Procedure", + "database": "fhir_db", + "sqlquery": "select content from \"fhir\".\"Procedure\"", + "testdata": [ + [] + ], + "description": "Get fhir data for Procedure resource" + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -890, + "y": 1920 + }, "selected": false, - "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", - "targetHandle": "target_f758c084-1da4-4a3c-8f96-af873953b6c6_object" - }, - { - "id": "reactflow__edge-9658364f-9788-4bbd-91f4-2fb8fdde5d1bsource_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_dataframe-07cfed06-756e-4cb8-b65b-1d763fb4a98ftarget_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe", - "source": "9658364f-9788-4bbd-91f4-2fb8fdde5d1b", - "target": "07cfed06-756e-4cb8-b65b-1d763fb4a98f", - "sourceHandle": "source_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_dataframe", - "targetHandle": "target_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -890, + "y": 1920 + } }, { - "id": "reactflow__edge-f758c084-1da4-4a3c-8f96-af873953b6c6source_f758c084-1da4-4a3c-8f96-af873953b6c6_dataframe-0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3target_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe", - "source": "f758c084-1da4-4a3c-8f96-af873953b6c6", - "target": "0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3", - "sourceHandle": "source_f758c084-1da4-4a3c-8f96-af873953b6c6_dataframe", - "targetHandle": "target_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe" + "id": "cf76f9a9-321b-469f-8779-fc8945fd50f6", + "data": { + "name": "Insert_into_omop_procedure_occurrence", + "database": "dest_db", + "truncate": false, + "dataframe": "py2table_to_procedure_occurrence", + "schemaname": "dest_schema", + "dbtablename": "procedure_occurrence", + "description": "Insert into omop cdm database" + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 3380, + "y": 2170 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 3380, + "y": 2170 + } }, { - "id": "reactflow__edge-dbb730a1-1499-462e-9d67-4585bb9a9662source_dbb730a1-1499-462e-9d67-4585bb9a9662_dataframe-2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0target_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe", - "source": "dbb730a1-1499-462e-9d67-4585bb9a9662", - "target": "2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0", - "sourceHandle": "source_dbb730a1-1499-462e-9d67-4585bb9a9662_dataframe", - "targetHandle": "target_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe" + "id": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "data": { + "name": "python_node", + "error": false, + "description": "Describe the task of node python_node_0", + "python_code": "def exec(myinput):\n transformed = {}\n for key, result_obj in myinput.items():\n transformed[key] = result_obj.result\n return transformed\ndef test_exec(myinput):\n return \"This is test_exec function\"", + "errorMessage": null + }, + "type": "python_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -420, + "y": 930 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -420, + "y": 930 + } }, { - "id": "reactflow__edge-f67d926f-24be-4a64-848b-8f9e69a5e55esource_f67d926f-24be-4a64-848b-8f9e69a5e55e_dataframe-ab80716e-87b1-479c-bd4e-c95d43b35fe6target_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe", - "source": "f67d926f-24be-4a64-848b-8f9e69a5e55e", - "target": "ab80716e-87b1-479c-bd4e-c95d43b35fe6", - "sourceHandle": "source_f67d926f-24be-4a64-848b-8f9e69a5e55e_dataframe", - "targetHandle": "target_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe" - }, - { - "id": "reactflow__edge-5d62e682-992f-4788-8855-5216eebad563source_5d62e682-992f-4788-8855-5216eebad563_dataframe-b7f82a01-dd6e-4b76-bd72-53d069da2e72target_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe", - "source": "5d62e682-992f-4788-8855-5216eebad563", - "target": "b7f82a01-dd6e-4b76-bd72-53d069da2e72", + "id": "9658364f-9788-4bbd-91f4-2fb8fdde5d1b", + "data": { + "map": {}, + "name": "AllergyIntolerance_df", + "error": false, + "uiMap": { + "path": "$.AllergyIntolerance", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_0", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 20, + "y": -120 + }, "selected": false, - "sourceHandle": "source_5d62e682-992f-4788-8855-5216eebad563_dataframe", - "targetHandle": "target_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 20, + "y": -120 + } }, { - "id": "reactflow__edge-3c69d63f-131c-4ce0-a9cb-a735c1bfd8absource_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_dataframe-369f82ce-d9bb-40dd-aa10-e6acf3849bc5target_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe", - "source": "3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab", - "target": "369f82ce-d9bb-40dd-aa10-e6acf3849bc5", + "id": "3c3f5888-5462-4fa6-8e9b-132d06e3e3d5", + "data": { + "map": {}, + "name": "Patient_df", + "error": false, + "uiMap": { + "path": "$.Patient", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_1", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 130, + "y": 170 + }, "selected": false, - "sourceHandle": "source_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_dataframe", - "targetHandle": "target_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe" - }, - { - "id": "reactflow__edge-227a0e41-40fc-4219-90e5-2c46ea7b1879source_227a0e41-40fc-4219-90e5-2c46ea7b1879_dataframe-53923929-57cc-4bac-b644-78348d982bb3target_53923929-57cc-4bac-b644-78348d982bb3_dataframe", - "source": "227a0e41-40fc-4219-90e5-2c46ea7b1879", - "target": "53923929-57cc-4bac-b644-78348d982bb3", - "sourceHandle": "source_227a0e41-40fc-4219-90e5-2c46ea7b1879_dataframe", - "targetHandle": "target_53923929-57cc-4bac-b644-78348d982bb3_dataframe" - }, - { - "id": "reactflow__edge-3c3f5888-5462-4fa6-8e9b-132d06e3e3d5source_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_dataframe-14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8target_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe", - "source": "3c3f5888-5462-4fa6-8e9b-132d06e3e3d5", - "target": "14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8", - "sourceHandle": "source_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_dataframe", - "targetHandle": "target_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 130, + "y": 170 + } }, { - "id": "reactflow__edge-e332b9d8-a600-4d2a-94cb-fff53ab01a5dsource_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_dataframe-9591d4d0-2887-496e-87f9-a4d7ef5c60eftarget_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe", - "source": "e332b9d8-a600-4d2a-94cb-fff53ab01a5d", - "target": "9591d4d0-2887-496e-87f9-a4d7ef5c60ef", + "id": "227a0e41-40fc-4219-90e5-2c46ea7b1879", + "data": { + "map": {}, + "name": "Condition_df", + "error": false, + "uiMap": { + "path": "$.Condition", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_2", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 150, + "y": 450 + }, "selected": false, - "sourceHandle": "source_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_dataframe", - "targetHandle": "target_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe" - }, - { - "id": "reactflow__edge-9591d4d0-2887-496e-87f9-a4d7ef5c60efsource_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe-c4ae2475-ebb4-4bb7-bd92-5e711d93f20dtarget_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_any", - "source": "9591d4d0-2887-496e-87f9-a4d7ef5c60ef", - "target": "c4ae2475-ebb4-4bb7-bd92-5e711d93f20d", - "sourceHandle": "source_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe", - "targetHandle": "target_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 150, + "y": 450 + } }, { - "id": "reactflow__edge-c9ff11c9-d269-4035-b70a-523b4b92ebb6source_c9ff11c9-d269-4035-b70a-523b4b92ebb6_dataframe-b3e0cbd2-1680-4d5a-8a58-a74d636f1696target_b3e0cbd2-1680-4d5a-8a58-a74d636f1696_dataframe", - "source": "c9ff11c9-d269-4035-b70a-523b4b92ebb6", - "target": "b3e0cbd2-1680-4d5a-8a58-a74d636f1696", - "sourceHandle": "source_c9ff11c9-d269-4035-b70a-523b4b92ebb6_dataframe", - "targetHandle": "target_b3e0cbd2-1680-4d5a-8a58-a74d636f1696_dataframe" + "id": "3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab", + "data": { + "map": {}, + "name": "Encounter_df", + "error": false, + "uiMap": { + "path": "$.Encounter", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_3", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 140, + "y": 740 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 140, + "y": 740 + } }, { - "id": "reactflow__edge-b7f82a01-dd6e-4b76-bd72-53d069da2e72source_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe-fc3206ff-ae52-43ed-8ef7-6d8cb525e698target_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_any", - "source": "b7f82a01-dd6e-4b76-bd72-53d069da2e72", - "target": "fc3206ff-ae52-43ed-8ef7-6d8cb525e698", + "id": "e332b9d8-a600-4d2a-94cb-fff53ab01a5d", + "data": { + "map": {}, + "name": "Immunization_df", + "error": false, + "uiMap": { + "path": "$.Immunization", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_4", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 140, + "y": 1010 + }, "selected": false, - "sourceHandle": "source_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe", - "targetHandle": "target_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_any" + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 140, + "y": 1010 + } }, { - "id": "reactflow__edge-97e789e0-8b0b-49be-ad53-588599053812source_97e789e0-8b0b-49be-ad53-588599053812_dataframe-9fff2d40-4802-46a6-9e9a-7615c47b7754target_9fff2d40-4802-46a6-9e9a-7615c47b7754_dataframe", - "source": "97e789e0-8b0b-49be-ad53-588599053812", - "target": "9fff2d40-4802-46a6-9e9a-7615c47b7754", - "sourceHandle": "source_97e789e0-8b0b-49be-ad53-588599053812_dataframe", - "targetHandle": "target_9fff2d40-4802-46a6-9e9a-7615c47b7754_dataframe" + "id": "5d62e682-992f-4788-8855-5216eebad563", + "data": { + "map": {}, + "name": "Observation_df", + "error": false, + "uiMap": { + "path": "$.Observation", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_5", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 140, + "y": 1310 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 140, + "y": 1310 + } }, { - "id": "reactflow__edge-ab80716e-87b1-479c-bd4e-c95d43b35fe6source_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe-7d661465-6ce0-44af-80d7-fd533a1acae9target_7d661465-6ce0-44af-80d7-fd533a1acae9_any", - "source": "ab80716e-87b1-479c-bd4e-c95d43b35fe6", - "target": "7d661465-6ce0-44af-80d7-fd533a1acae9", - "sourceHandle": "source_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe", - "targetHandle": "target_7d661465-6ce0-44af-80d7-fd533a1acae9_any" + "id": "f67d926f-24be-4a64-848b-8f9e69a5e55e", + "data": { + "map": {}, + "name": "MedicationStatement_df", + "error": false, + "uiMap": { + "path": "$.MedicationStatement", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_6", + "errorMessage": null + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 140, + "y": 1600 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 140, + "y": 1600 + } }, { - "id": "reactflow__edge-09e016fe-ee22-4853-ad40-83917ba84537source_09e016fe-ee22-4853-ad40-83917ba84537_dataframe-345c3710-002f-4c6d-843b-94e873927548target_345c3710-002f-4c6d-843b-94e873927548_dataframe", - "source": "09e016fe-ee22-4853-ad40-83917ba84537", - "target": "345c3710-002f-4c6d-843b-94e873927548", - "sourceHandle": "source_09e016fe-ee22-4853-ad40-83917ba84537_dataframe", - "targetHandle": "target_345c3710-002f-4c6d-843b-94e873927548_dataframe" - }, - { - "id": "reactflow__edge-2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0source_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe-ca83c219-1ab9-44bf-9af6-c158e51f7214target_ca83c219-1ab9-44bf-9af6-c158e51f7214_any", - "source": "2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0", - "target": "ca83c219-1ab9-44bf-9af6-c158e51f7214", - "sourceHandle": "source_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe", - "targetHandle": "target_ca83c219-1ab9-44bf-9af6-c158e51f7214_any" - }, - { - "id": "reactflow__edge-cc4c773e-a0bd-4894-9908-00ad541c310dsource_cc4c773e-a0bd-4894-9908-00ad541c310d_dataframe-a51a4106-095e-49a8-a868-db5874ed60f5target_a51a4106-095e-49a8-a868-db5874ed60f5_dataframe", - "source": "cc4c773e-a0bd-4894-9908-00ad541c310d", - "target": "a51a4106-095e-49a8-a868-db5874ed60f5", - "sourceHandle": "source_cc4c773e-a0bd-4894-9908-00ad541c310d_dataframe", - "targetHandle": "target_a51a4106-095e-49a8-a868-db5874ed60f5_dataframe" - }, - { - "id": "reactflow__edge-0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3source_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe-43ad560c-fdba-43b6-9236-4baadb718c42target_43ad560c-fdba-43b6-9236-4baadb718c42_any", - "source": "0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3", - "target": "43ad560c-fdba-43b6-9236-4baadb718c42", - "sourceHandle": "source_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe", - "targetHandle": "target_43ad560c-fdba-43b6-9236-4baadb718c42_any" - }, - { - "id": "reactflow__edge-e8e268b6-3e03-4468-b386-5e00c6051ca1source_e8e268b6-3e03-4468-b386-5e00c6051ca1_dataframe-cf76f9a9-321b-469f-8779-fc8945fd50f6target_cf76f9a9-321b-469f-8779-fc8945fd50f6_dataframe", - "source": "e8e268b6-3e03-4468-b386-5e00c6051ca1", - "target": "cf76f9a9-321b-469f-8779-fc8945fd50f6", - "sourceHandle": "source_e8e268b6-3e03-4468-b386-5e00c6051ca1_dataframe", - "targetHandle": "target_cf76f9a9-321b-469f-8779-fc8945fd50f6_dataframe" - }, - { - "id": "reactflow__edge-861da43e-01e9-4eac-9136-2547228077f4source_861da43e-01e9-4eac-9136-2547228077f4_dataframe-c59e95aa-1642-4f04-a07d-c19a496aca91target_c59e95aa-1642-4f04-a07d-c19a496aca91_dataframe", - "source": "861da43e-01e9-4eac-9136-2547228077f4", - "target": "c59e95aa-1642-4f04-a07d-c19a496aca91", - "sourceHandle": "source_861da43e-01e9-4eac-9136-2547228077f4_dataframe", - "targetHandle": "target_c59e95aa-1642-4f04-a07d-c19a496aca91_dataframe" - }, - { - "id": "reactflow__edge-07cfed06-756e-4cb8-b65b-1d763fb4a98fsource_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe-a06d966c-271c-4fe7-8fb2-e2c8443dd22etarget_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_any", - "source": "07cfed06-756e-4cb8-b65b-1d763fb4a98f", - "target": "a06d966c-271c-4fe7-8fb2-e2c8443dd22e", - "sourceHandle": "source_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe", - "targetHandle": "target_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_any" - }, - { - "id": "reactflow__edge-6b6a799b-4e67-47fc-8e1b-6050515bfcfesource_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_dataframe-5f6d6ed6-01e1-4186-89cc-6574cd046d40target_5f6d6ed6-01e1-4186-89cc-6574cd046d40_dataframe", - "source": "6b6a799b-4e67-47fc-8e1b-6050515bfcfe", - "target": "5f6d6ed6-01e1-4186-89cc-6574cd046d40", - "sourceHandle": "source_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_dataframe", - "targetHandle": "target_5f6d6ed6-01e1-4186-89cc-6574cd046d40_dataframe" - }, - { - "id": "reactflow__edge-14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8source_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe-0457459b-833a-4563-b702-807031462160target_0457459b-833a-4563-b702-807031462160_any", - "source": "14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8", - "target": "0457459b-833a-4563-b702-807031462160", - "sourceHandle": "source_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe", - "targetHandle": "target_0457459b-833a-4563-b702-807031462160_any" - }, - { - "id": "reactflow__edge-bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5source_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_dataframe-4b92d9e9-6a59-459f-8fc5-5a8ff5824bcatarget_4b92d9e9-6a59-459f-8fc5-5a8ff5824bca_dataframe", - "source": "bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5", - "target": "4b92d9e9-6a59-459f-8fc5-5a8ff5824bca", - "sourceHandle": "source_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_dataframe", - "targetHandle": "target_4b92d9e9-6a59-459f-8fc5-5a8ff5824bca_dataframe" - }, - { - "id": "reactflow__edge-53923929-57cc-4bac-b644-78348d982bb3source_53923929-57cc-4bac-b644-78348d982bb3_dataframe-2d29943f-969e-4b33-b8a1-48b4172a7bdftarget_2d29943f-969e-4b33-b8a1-48b4172a7bdf_any", - "source": "53923929-57cc-4bac-b644-78348d982bb3", - "target": "2d29943f-969e-4b33-b8a1-48b4172a7bdf", - "sourceHandle": "source_53923929-57cc-4bac-b644-78348d982bb3_dataframe", - "targetHandle": "target_2d29943f-969e-4b33-b8a1-48b4172a7bdf_any" - }, - { - "id": "reactflow__edge-4fbeac17-add6-494f-a75a-4eed55d17c85source_4fbeac17-add6-494f-a75a-4eed55d17c85_dataframe-5b177aca-870c-4745-95e1-6305ee390261target_5b177aca-870c-4745-95e1-6305ee390261_dataframe", - "source": "4fbeac17-add6-494f-a75a-4eed55d17c85", - "target": "5b177aca-870c-4745-95e1-6305ee390261", - "sourceHandle": "source_4fbeac17-add6-494f-a75a-4eed55d17c85_dataframe", - "targetHandle": "target_5b177aca-870c-4745-95e1-6305ee390261_dataframe" - }, - { - "id": "reactflow__edge-369f82ce-d9bb-40dd-aa10-e6acf3849bc5source_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe-1c1853ac-6c80-41c3-8c02-c013f42c4917target_1c1853ac-6c80-41c3-8c02-c013f42c4917_any", - "source": "369f82ce-d9bb-40dd-aa10-e6acf3849bc5", - "target": "1c1853ac-6c80-41c3-8c02-c013f42c4917", - "sourceHandle": "source_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe", - "targetHandle": "target_1c1853ac-6c80-41c3-8c02-c013f42c4917_any" - }, - { - "id": "reactflow__edge-a06d966c-271c-4fe7-8fb2-e2c8443dd22esource_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_object-f217a843-35d9-4fbb-8f08-ee9be931dc68target_f217a843-35d9-4fbb-8f08-ee9be931dc68_any", - "source": "a06d966c-271c-4fe7-8fb2-e2c8443dd22e", - "target": "f217a843-35d9-4fbb-8f08-ee9be931dc68", - "sourceHandle": "source_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_object", - "targetHandle": "target_f217a843-35d9-4fbb-8f08-ee9be931dc68_any" - }, - { - "id": "reactflow__edge-f217a843-35d9-4fbb-8f08-ee9be931dc68source_f217a843-35d9-4fbb-8f08-ee9be931dc68_object-6b6a799b-4e67-47fc-8e1b-6050515bfcfetarget_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_object", - "source": "f217a843-35d9-4fbb-8f08-ee9be931dc68", - "target": "6b6a799b-4e67-47fc-8e1b-6050515bfcfe", - "sourceHandle": "source_f217a843-35d9-4fbb-8f08-ee9be931dc68_object", - "targetHandle": "target_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_object" - }, - { - "id": "reactflow__edge-0457459b-833a-4563-b702-807031462160source_0457459b-833a-4563-b702-807031462160_object-417bf8c6-9c9b-4ea5-a684-222fb68f786ftarget_417bf8c6-9c9b-4ea5-a684-222fb68f786f_any", - "source": "0457459b-833a-4563-b702-807031462160", - "target": "417bf8c6-9c9b-4ea5-a684-222fb68f786f", - "sourceHandle": "source_0457459b-833a-4563-b702-807031462160_object", - "targetHandle": "target_417bf8c6-9c9b-4ea5-a684-222fb68f786f_any" - }, - { - "id": "reactflow__edge-417bf8c6-9c9b-4ea5-a684-222fb68f786fsource_417bf8c6-9c9b-4ea5-a684-222fb68f786f_object-bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5target_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_object", - "source": "417bf8c6-9c9b-4ea5-a684-222fb68f786f", - "target": "bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5", - "sourceHandle": "source_417bf8c6-9c9b-4ea5-a684-222fb68f786f_object", - "targetHandle": "target_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_object" - }, - { - "id": "reactflow__edge-2d29943f-969e-4b33-b8a1-48b4172a7bdfsource_2d29943f-969e-4b33-b8a1-48b4172a7bdf_object-f291bb65-0804-40cb-989c-d65387218938target_f291bb65-0804-40cb-989c-d65387218938_any", - "source": "2d29943f-969e-4b33-b8a1-48b4172a7bdf", - "target": "f291bb65-0804-40cb-989c-d65387218938", - "sourceHandle": "source_2d29943f-969e-4b33-b8a1-48b4172a7bdf_object", - "targetHandle": "target_f291bb65-0804-40cb-989c-d65387218938_any" - }, - { - "id": "reactflow__edge-f291bb65-0804-40cb-989c-d65387218938source_f291bb65-0804-40cb-989c-d65387218938_object-4fbeac17-add6-494f-a75a-4eed55d17c85target_4fbeac17-add6-494f-a75a-4eed55d17c85_object", - "source": "f291bb65-0804-40cb-989c-d65387218938", - "target": "4fbeac17-add6-494f-a75a-4eed55d17c85", - "sourceHandle": "source_f291bb65-0804-40cb-989c-d65387218938_object", - "targetHandle": "target_4fbeac17-add6-494f-a75a-4eed55d17c85_object" - }, - { - "id": "reactflow__edge-1c1853ac-6c80-41c3-8c02-c013f42c4917source_1c1853ac-6c80-41c3-8c02-c013f42c4917_object-e68963a3-0fe1-42bc-9983-2ac3657a2d6btarget_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_any", - "source": "1c1853ac-6c80-41c3-8c02-c013f42c4917", - "target": "e68963a3-0fe1-42bc-9983-2ac3657a2d6b", - "sourceHandle": "source_1c1853ac-6c80-41c3-8c02-c013f42c4917_object", - "targetHandle": "target_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_any" - }, - { - "id": "reactflow__edge-e68963a3-0fe1-42bc-9983-2ac3657a2d6bsource_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_object-861da43e-01e9-4eac-9136-2547228077f4target_861da43e-01e9-4eac-9136-2547228077f4_object", - "source": "e68963a3-0fe1-42bc-9983-2ac3657a2d6b", - "target": "861da43e-01e9-4eac-9136-2547228077f4", - "sourceHandle": "source_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_object", - "targetHandle": "target_861da43e-01e9-4eac-9136-2547228077f4_object" - }, - { - "id": "reactflow__edge-c4ae2475-ebb4-4bb7-bd92-5e711d93f20dsource_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_object-ebe521a0-6769-47c0-8d4b-c6e74965ee21target_ebe521a0-6769-47c0-8d4b-c6e74965ee21_any", - "source": "c4ae2475-ebb4-4bb7-bd92-5e711d93f20d", - "target": "ebe521a0-6769-47c0-8d4b-c6e74965ee21", - "sourceHandle": "source_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_object", - "targetHandle": "target_ebe521a0-6769-47c0-8d4b-c6e74965ee21_any" - }, - { - "id": "reactflow__edge-ebe521a0-6769-47c0-8d4b-c6e74965ee21source_ebe521a0-6769-47c0-8d4b-c6e74965ee21_object-c9ff11c9-d269-4035-b70a-523b4b92ebb6target_c9ff11c9-d269-4035-b70a-523b4b92ebb6_object", - "source": "ebe521a0-6769-47c0-8d4b-c6e74965ee21", - "target": "c9ff11c9-d269-4035-b70a-523b4b92ebb6", - "sourceHandle": "source_ebe521a0-6769-47c0-8d4b-c6e74965ee21_object", - "targetHandle": "target_c9ff11c9-d269-4035-b70a-523b4b92ebb6_object" - }, - { - "id": "reactflow__edge-fc3206ff-ae52-43ed-8ef7-6d8cb525e698source_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_object-fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95target_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_any", - "source": "fc3206ff-ae52-43ed-8ef7-6d8cb525e698", - "target": "fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95", - "sourceHandle": "source_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_object", - "targetHandle": "target_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_any" - }, - { - "id": "reactflow__edge-fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95source_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_object-97e789e0-8b0b-49be-ad53-588599053812target_97e789e0-8b0b-49be-ad53-588599053812_object", - "source": "fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95", - "target": "97e789e0-8b0b-49be-ad53-588599053812", - "sourceHandle": "source_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_object", - "targetHandle": "target_97e789e0-8b0b-49be-ad53-588599053812_object" - }, - { - "id": "reactflow__edge-7d661465-6ce0-44af-80d7-fd533a1acae9source_7d661465-6ce0-44af-80d7-fd533a1acae9_object-4b85a7d5-6a32-465c-942c-9b843ba63e02target_4b85a7d5-6a32-465c-942c-9b843ba63e02_any", - "source": "7d661465-6ce0-44af-80d7-fd533a1acae9", - "target": "4b85a7d5-6a32-465c-942c-9b843ba63e02", - "sourceHandle": "source_7d661465-6ce0-44af-80d7-fd533a1acae9_object", - "targetHandle": "target_4b85a7d5-6a32-465c-942c-9b843ba63e02_any" - }, - { - "id": "reactflow__edge-4b85a7d5-6a32-465c-942c-9b843ba63e02source_4b85a7d5-6a32-465c-942c-9b843ba63e02_object-09e016fe-ee22-4853-ad40-83917ba84537target_09e016fe-ee22-4853-ad40-83917ba84537_object", - "source": "4b85a7d5-6a32-465c-942c-9b843ba63e02", - "target": "09e016fe-ee22-4853-ad40-83917ba84537", - "sourceHandle": "source_4b85a7d5-6a32-465c-942c-9b843ba63e02_object", - "targetHandle": "target_09e016fe-ee22-4853-ad40-83917ba84537_object" - }, - { - "id": "reactflow__edge-ca83c219-1ab9-44bf-9af6-c158e51f7214source_ca83c219-1ab9-44bf-9af6-c158e51f7214_object-fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1target_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_any", - "source": "ca83c219-1ab9-44bf-9af6-c158e51f7214", - "target": "fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1", - "sourceHandle": "source_ca83c219-1ab9-44bf-9af6-c158e51f7214_object", - "targetHandle": "target_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_any" - }, - { - "id": "reactflow__edge-fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1source_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_object-cc4c773e-a0bd-4894-9908-00ad541c310dtarget_cc4c773e-a0bd-4894-9908-00ad541c310d_object", - "source": "fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1", - "target": "cc4c773e-a0bd-4894-9908-00ad541c310d", - "sourceHandle": "source_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_object", - "targetHandle": "target_cc4c773e-a0bd-4894-9908-00ad541c310d_object" - }, - { - "id": "reactflow__edge-43ad560c-fdba-43b6-9236-4baadb718c42source_43ad560c-fdba-43b6-9236-4baadb718c42_object-312d8dce-4c22-481a-b37e-07f7ce04a0bctarget_312d8dce-4c22-481a-b37e-07f7ce04a0bc_any", - "source": "43ad560c-fdba-43b6-9236-4baadb718c42", - "target": "312d8dce-4c22-481a-b37e-07f7ce04a0bc", - "sourceHandle": "source_43ad560c-fdba-43b6-9236-4baadb718c42_object", - "targetHandle": "target_312d8dce-4c22-481a-b37e-07f7ce04a0bc_any" - }, - { - "id": "reactflow__edge-312d8dce-4c22-481a-b37e-07f7ce04a0bcsource_312d8dce-4c22-481a-b37e-07f7ce04a0bc_object-e8e268b6-3e03-4468-b386-5e00c6051ca1target_e8e268b6-3e03-4468-b386-5e00c6051ca1_object", - "source": "312d8dce-4c22-481a-b37e-07f7ce04a0bc", - "target": "e8e268b6-3e03-4468-b386-5e00c6051ca1", - "sourceHandle": "source_312d8dce-4c22-481a-b37e-07f7ce04a0bc_object", - "targetHandle": "target_e8e268b6-3e03-4468-b386-5e00c6051ca1_object" - } - ], - "nodes": [ - { - "id": "bc7f2e99-5533-4719-b86a-1a9a83da684f", + "id": "dbb730a1-1499-462e-9d67-4585bb9a9662", "data": { - "name": "AllergyIntolerance", - "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"AllergyIntolerance\"", - "testdata": [ - [] - ], - "description": "Get fhir data for AllergyIntolerance resource", - "errorMessage": null + "map": {}, + "name": "Observation_df", + "uiMap": { + "path": "$.Observation", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_7" }, - "type": "db_reader_node", + "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -930, - "y": -110 + "x": 140, + "y": 1870 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -930, - "y": -110 + "x": 140, + "y": 1870 } }, { - "id": "5f6d6ed6-01e1-4186-89cc-6574cd046d40", + "id": "f758c084-1da4-4a3c-8f96-af873953b6c6", "data": { - "name": "insert_into_omop_observation", + "map": {}, + "name": "Procedure_df", "error": false, - "database": "demo_database", - "dataframe": "py2table_to_observation", - "schemaname": "demo_cdm", - "dbtablename": "observation", - "description": "Insert into omop cdm database table", + "uiMap": { + "path": "$.Procedure", + "source": "python_node" + }, + "description": "Describe the task of node py2table_node_8", "errorMessage": null }, - "type": "db_writer_node", + "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3080, - "y": -210 + "x": 90, + "y": 2180 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3080, - "y": -210 + "x": 90, + "y": 2180 } }, { - "id": "b52d463b-e05c-44ad-90a9-7ac912b35314", + "id": "07cfed06-756e-4cb8-b65b-1d763fb4a98f", "data": { - "name": "Patient", + "id": "AllergeMap", + "name": "transform_to_Observation", "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Patient\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Patient resource", - "errorMessage": null + "dataframe": "AllergyIntolerance_df", + "description": "Describe the task of node transform_fhir_data_node_0", + "errorMessage": null, + "structure_map": "{ \"resourceType\": \"StructureMap\", \"id\": \"AllergyMap\", \"text\": { \"status\": \"generated\", \"div\": \"

Generated Narrative: StructureMap AllergyMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/AllergyMap'\\r\\n/// name = 'AllergyMap'\\r\\n/// title = 'Mapping Allergy resource to Observation OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/AllergyIntolerance" alias Allergy as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Observation" alias ObservationTable as target\\r\\n\\r\\ngroup Observation(source src : Allergy, target tgt : ObservationTable) {\\r\\n  src.code as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code ->  tgt.observation_concept_id,  tgt.observation_source_value,  tgt.observation_source_concept_id;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.observation_id = cast(id, "integer");\\r\\n  src.onset : dateTime as osd ->  tgt.observation_date = cast(osd, 'date'),  tgt.observation_datetime = osd; // src.patient as s -> tgt then {\\r\\n  src.reaction as s -> tgt then {\\r\\n    s.manifestation as sman -> tgt then {\\r\\n      sman.concept as smanc -> tgt then {\\r\\n        smanc.coding as sc -> tgt then {\\r\\n          sc.code ->  tgt.value_as_concept_id,  tgt.value_source_value;\\r\\n        };\\r\\n      };\\r\\n    };\\r\\n  };\\r\\n}\\r\\n\\r\\n
\" }, \"extension\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\", \"valueCode\": \"brr\" }, { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\", \"valueInteger\": 1, \"_valueInteger\": { \"extension\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\", \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\" } ] } }, { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\", \"valueCode\": \"informative\", \"_valueCode\": { \"extension\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\", \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\" } ] } } ], \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/AllergyMap\", \"version\": \"1.0.0-ballot\", \"name\": \"AllergyMap\", \"title\": \"Mapping Allergy resource to Observation OMOP Domain\", \"status\": \"draft\", \"date\": \"2025-07-29T17:40:15+00:00\", \"publisher\": \"HL7 International / Biomedical Research and Regulation\", \"contact\": [ { \"name\": \"HL7 International / Biomedical Research and Regulation\", \"telecom\": [ { \"system\": \"url\", \"value\": \"http://www.hl7.org/Special/committees/rcrim\" } ] } ], \"description\": \"This mapping maps FHIR AllergyIntolerance instances to OMOP Observation Table objects.\", \"jurisdiction\": [ { \"coding\": [ { \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\", \"code\": \"001\", \"display\": \"World\" } ] } ], \"structure\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/AllergyIntolerance\", \"mode\": \"source\", \"alias\": \"Allergy\" }, { \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Observation\", \"mode\": \"target\", \"alias\": \"ObservationTable\" } ], \"group\": [ { \"name\": \"Observation\", \"input\": [ { \"name\": \"src\", \"type\": \"Allergy\", \"mode\": \"source\" }, { \"name\": \"tgt\", \"type\": \"ObservationTable\", \"mode\": \"target\" } ], \"rule\": [ { \"name\": \"mapObservationId\", \"documentation\": \"Generate a unique OMOP observation_id.\", \"source\": [ { \"context\": \"src\", \"element\": \"id\", \"variable\": \"fhirId\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"fhirId\" } ] } ] }, { \"name\": \"mapPatientId\", \"source\": [ { \"context\": \"src\", \"element\": \"patient.reference\", \"variable\": \"patRef\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"person_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"patRef\" } ] } ] }, { \"name\": \"code\", \"source\": [ { \"context\": \"src\", \"element\": \"code\", \"variable\": \"s\" } ], \"target\": [ { \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"tgt\" } ] } ], \"rule\": [ { \"name\": \"coding\", \"source\": [ { \"context\": \"s\", \"element\": \"coding\", \"variable\": \"sc\" } ], \"target\": [ { \"transform\": \"copy\", \"context\": \"tgt\", \"parameter\": [ { \"valueId\": \"sc\" } ] } ], \"rule\": [ { \"name\": \"code\", \"source\": [ { \"context\": \"sc\", \"element\": \"code\", \"variable\": \"sc_code\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_concept_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"sc_code\" } ] }, { \"context\": \"tgt\", \"element\": \"observation_source_value\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"sc_code\" } ] }, { \"context\": \"tgt\", \"element\": \"observation_source_concept_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"sc_code\" } ] } ] } ] } ], \"documentation\": \"src.id as id -> tgt.observation_id = cast(id, \\\"integer\\\");\" }, { \"name\": \"onsetDateTime\", \"source\": [ { \"context\": \"src\", \"type\": \"dateTime\", \"element\": \"onset\", \"variable\": \"osd\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_date\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"osd\" }, { \"valueString\": \"date\" } ] }, { \"context\": \"tgt\", \"element\": \"observation_datetime\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"osd\" } ] } ], \"documentation\": \"src.patient as s -> tgt then {\" }, { \"name\": \"mapObservationTypeConceptId\", \"documentation\": \"Derive OMOP observation_type_concept_id based on FHIR AllergyIntolerance provenance.\", \"source\": [ { \"context\": \"src\", \"element\": \"id\", \"variable\": \"conceptId\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_type_concept_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"conceptId\" } ] } ] } ] } ] }", + "output_omop_data": "" }, - "type": "db_reader_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -1140, - "y": 170 + "x": 730, + "y": -190 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -1140, - "y": 170 + "x": 730, + "y": -190 } }, { - "id": "4b92d9e9-6a59-459f-8fc5-5a8ff5824bca", + "id": "0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3", "data": { - "name": "Insert_into_omop_person", + "id": "ProcedureMap", + "name": "transform_to_procedure_occurrence", "error": false, - "database": "demo_database", - "dataframe": "py2table_to_person", - "schemaname": "demo_cdm", - "dbtablename": "person", - "description": "Insert into cdm omop database", - "errorMessage": null + "dataframe": "Procedure_df", + "description": "Describe the task of node transform_fhir_data_node_1", + "errorMessage": null, + "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"ProcedureMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap ProcedureMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ProcedureMap'\\r\\n/// name = 'ProcedureMap'\\r\\n/// title = 'Mapping Procedure resource to Procedure Occurrence OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Procedure" alias Procedure as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/ProcedureOccurrence" alias ProcedureTable as target\\r\\n\\r\\ngroup ProcedureOccurrence(source src : Procedure, target tgt : ProcedureTable) {\\r\\n  src.code as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a ->  tgt.procedure_concept_id,  tgt.procedure_source_value,  tgt.procedure_source_concept_id = a;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.procedure_occurrence_id = cast(id, "integer");\\r\\n  src.occurrence : dateTime as edt ->  tgt.procedure_datetime = cast(edt, 'dateTime'),  tgt.procedure_date = edt;\\r\\n  src.occurrence : Period as s -> tgt then {\\r\\n    s.start as start ->  tgt.procedure_datetime = cast(start, 'dateTime'),  tgt.procedure_date = start;\\r\\n    s.end as end ->  tgt.procedure_end_datetime,  tgt.procedure_end_date = end;\\r\\n  };\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/ProcedureMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"ProcedureMap\",\n \"title\": \"Mapping Procedure resource to Procedure Occurrence OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Procedure instances to OMOP Procedure Occurrence Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Procedure\",\n \"mode\": \"source\",\n \"alias\": \"Procedure\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/ProcedureOccurrence\",\n \"mode\": \"target\",\n \"alias\": \"ProcedureTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"ProcedureOccurrence\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Procedure\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"ProcedureTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"pid\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_occurrence_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"pid\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"procedure_type_concept_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"procedure_type_concept_id\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 45905771\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.procedure_occurrence_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"occurrenceDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"performedDateTime\",\n \"variable\": \"edt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"occurrencePeriod\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"Period\",\n \"element\": \"performedPeriod\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"start\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"start\",\n \"variable\": \"start\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"start\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"start\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"end\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"end\",\n \"variable\": \"end\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_end_datetime\"\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"end\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "output_omop_data": "" }, - "type": "db_writer_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3130, - "y": 110 + "x": 810, + "y": 2150 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3130, - "y": 110 + "x": 810, + "y": 2150 } }, { - "id": "4a4209c6-84f1-4afe-85a6-2c3aecfee44b", + "id": "2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0", "data": { - "name": "Condition", + "id": "ObservationMap", + "name": "transform_to_observation", "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Condition\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Condition resource", - "errorMessage": null + "dataframe": "Observation_df", + "description": "Describe the task of node transform_fhir_data_node_2", + "errorMessage": null, + "structure_map": "{\"resourceType\":\"StructureMap\",\"id\":\"ObservationMap\",\"text\":{\"status\":\"generated\",\"div\":\"

Generated Narrative: StructureMap ObservationMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ObservationMap'\\r\\n/// name = 'ObservationMap'\\r\\n/// title = 'Mapping Observation resource to  Observation OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Observation" alias ObsTable as target\\r\\n\\r\\ngroup Observe(source src : Observation, target tgt : ObsTable) {\\r\\n  src where ('social-history' | 'imaging' | 'survey' | 'exam' | 'therapy' | 'activity' | 'procedure').supersetOf(Observation.category.coding.code) then {\\r\\n    src.code as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.observation_concept_id = a;\\r\\n      };\\r\\n    }; // src.id as id -> tgt.observation_id = cast(id, "integer");\\r\\n    src.effective : dateTime as a ->  tgt.observation_datetime = a,  tgt.observation_date = cast(a, 'date'); // src.subject as s -> tgt then {\\r\\n    src.effective : instant as einst ->  tgt.observation_datetime = cast(einst, 'dateTime'),  tgt.observation_date = cast(einst, 'date');\\r\\n    src.effective : Period as s -> tgt then {\\r\\n      s.start as ss ->  tgt.observation_datetime = cast(ss, 'dateTime'),  tgt.observation_date = cast(ss, 'date');\\r\\n    };\\r\\n    src.issued as s where (s.toDate != src.effectiveDate) -> tgt.observation_source_value = cast(s, 'string');\\r\\n    src.value : Quantity as s -> tgt then {\\r\\n      s.value as a -> tgt.value_as_number = a;\\r\\n      s.unit as b -> tgt.unit_concept_id = b;\\r\\n    }; // src.performer as s -> tgt then {\\r\\n    src.value : CodeableConcept as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.value_as_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n    src.value : string as b -> tgt.value_as_string = b;\\r\\n    src.note as d -> tgt.observation_source_value = d;\\r\\n  } "OnlyObs";\\r\\n}\\r\\n\\r\\n
\"},\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\"valueCode\":\"brr\"},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\"valueInteger\":1,\"_valueInteger\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\"valueCode\":\"informative\",\"_valueCode\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}}],\"url\":\"http://hl7.org/fhir/uv/omop/StructureMap/ObservationMap\",\"version\":\"1.0.0-ballot\",\"name\":\"ObservationMap\",\"title\":\"Mapping Observation resource to Observation OMOP Domain\",\"status\":\"draft\",\"date\":\"2025-07-29T17:40:15+00:00\",\"publisher\":\"HL7 International / Biomedical Research and Regulation\",\"contact\":[{\"name\":\"HL7 International / Biomedical Research and Regulation\",\"telecom\":[{\"system\":\"url\",\"value\":\"http://www.hl7.org/Special/committees/rcrim\"}]}],\"description\":\"This mapping maps FHIR Observation instances that are NOT considered measurements to OMOP Observation Table objects. Currently, this is done by considering the category code and mapping 'social-history', 'imaging', 'survey', 'exam', 'therapy', 'activity', and 'procedure' Observations.\",\"jurisdiction\":[{\"coding\":[{\"system\":\"http://unstats.un.org/unsd/methods/m49/m49.htm\",\"code\":\"001\",\"display\":\"World\"}]}],\"structure\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/Observation\",\"mode\":\"source\",\"alias\":\"Observation\"},{\"url\":\"http://hl7.org/fhir/uv/omop/StructureDefinition/Observation\",\"mode\":\"target\",\"alias\":\"ObsTable\"}],\"group\":[{\"name\":\"Observe\",\"input\":[{\"name\":\"src\",\"type\":\"Observation\",\"mode\":\"source\"},{\"name\":\"tgt\",\"type\":\"ObsTable\",\"mode\":\"target\"}],\"rule\":[{\"name\":\"mapObservationId\",\"documentation\":\"Generate a unique OMOP observation_id.\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"fhirId\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"fhirId\"}]}]},{\"name\":\"mapPatientId\",\"source\":[{\"context\":\"src\",\"element\":\"subject.reference\",\"variable\":\"patRef\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"person_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"patRef\"}]}]},{\"name\":\"mapObservationTypeConceptId\",\"documentation\":\"Derive OMOP observation_type_concept_id based on FHIR AllergyIntolerance provenance.\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"id\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_type_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"id\"}]}]},{\"name\":\"OnlyObs\",\"source\":[{\"context\":\"src\",\"condition\":\"('social-history' | 'imaging' | 'survey' | 'exam' | 'therapy' | 'activity' | 'procedure').supersetOf(Observation.category.coding.code)\"}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"src\",\"element\":\"code\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}],\"documentation\":\"src.id as id -> tgt.observation_id = cast(id, \\\"integer\\\");\"},{\"name\":\"effectiveDateTime\",\"source\":[{\"context\":\"src\",\"type\":\"dateTime\",\"element\":\"effective\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]},{\"context\":\"tgt\",\"element\":\"observation_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"},{\"valueString\":\"date\"}]}],\"documentation\":\"src.subject as s -> tgt then {\"},{\"name\":\"effectiveInstant\",\"source\":[{\"context\":\"src\",\"type\":\"instant\",\"element\":\"effective\",\"variable\":\"einst\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"einst\"},{\"valueString\":\"dateTime\"}]},{\"context\":\"tgt\",\"element\":\"observation_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"einst\"},{\"valueString\":\"date\"}]}]},{\"name\":\"effectivePeriod\",\"source\":[{\"context\":\"src\",\"type\":\"Period\",\"element\":\"effective\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"start\",\"source\":[{\"context\":\"s\",\"element\":\"start\",\"variable\":\"ss\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"ss\"},{\"valueString\":\"dateTime\"}]},{\"context\":\"tgt\",\"element\":\"observation_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"ss\"},{\"valueString\":\"date\"}]}]}]},{\"name\":\"issued\",\"source\":[{\"context\":\"src\",\"element\":\"issued\",\"variable\":\"s\",\"condition\":\"(s.toDate != src.effectiveDate)\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_source_value\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"s\"},{\"valueString\":\"string\"}]}]},{\"name\":\"valueQuantity\",\"source\":[{\"context\":\"src\",\"type\":\"Quantity\",\"element\":\"value\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"value\",\"source\":[{\"context\":\"s\",\"element\":\"value\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"value_as_number\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]},{\"name\":\"unit\",\"source\":[{\"context\":\"s\",\"element\":\"unit\",\"variable\":\"b\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"unit_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"b\"}]}]}],\"documentation\":\"src.performer as s -> tgt then {\"},{\"name\":\"valueCodeableConcept\",\"source\":[{\"context\":\"src\",\"type\":\"CodeableConcept\",\"element\":\"value\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"value_as_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}]},{\"name\":\"valueString\",\"source\":[{\"context\":\"src\",\"type\":\"string\",\"element\":\"value\",\"variable\":\"b\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"value_as_string\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"b\"}]}]},{\"name\":\"note\",\"source\":[{\"context\":\"src\",\"element\":\"note\",\"variable\":\"d\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_source_value\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"d\"}]}]},{\"name\":\"note\",\"source\":[{\"context\":\"src\",\"element\":\"note\",\"variable\":\"d\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_source_value\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"d\"}]}]}]}]}]}", + "output_omop_data": "" }, - "type": "db_reader_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -1180, - "y": 450 + "x": 790, + "y": 1860 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -1180, - "y": 450 + "x": 790, + "y": 1860 } }, { - "id": "5b177aca-870c-4745-95e1-6305ee390261", + "id": "ab80716e-87b1-479c-bd4e-c95d43b35fe6", "data": { - "name": "Insert_into_omop_condition_occurrence", + "id": "MedicationMap", + "name": "transform_to_drug_exposure", "error": false, - "database": "demo_database", - "dataframe": "py2table_to_condition_occurrence", - "schemaname": "demo_cdm", - "dbtablename": "condition_occurrence", - "description": "Insert into omop cdm database", - "errorMessage": null + "dataframe": "MedicationStatement_df", + "description": "Describe the task of node transform_fhir_data_node_3", + "errorMessage": null, + "structure_map": "{\"resourceType\":\"StructureMap\",\"id\":\"MedicationMap\",\"text\":{\"status\":\"generated\",\"div\":\"

Generated Narrative: StructureMap MedicationMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/MedicationMap'\\r\\n/// name = 'MedicationMap'\\r\\n/// title = 'Mapping MedicationStatement resource to DrugExposure OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/MedicationStatement" alias MedState as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure" alias DrugExpTable as target\\r\\n\\r\\ngroup MedExposure(source src : MedState, target tgt : DrugExpTable) {\\r\\n  src.medication : CodeableReference as s -> tgt then {\\r\\n    s.concept as scs -> tgt then {\\r\\n      scs.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.drug_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n  }; // src.id as id -> tgt.drug_exposure_id = cast(id, "integer");\\r\\n  src.effective : dateTime as edt ->  tgt.drug_exposure_start_datetime = edt,  tgt.drug_exposure_start_date = cast(edt, 'date');\\r\\n  src.effective : Period as s -> tgt then {\\r\\n    s.start as fps ->  tgt.drug_exposure_start_datetime = fps,  tgt.drug_exposure_start_date = cast(fps, 'date');\\r\\n  };\\r\\n  src.effective : Period as s -> tgt then {\\r\\n    s.end as fpe ->  tgt.drug_exposure_end_datetime = fpe,  tgt.drug_exposure_end_date = cast(fps, 'date');\\r\\n  };\\r\\n  src.effective : Period as s -> tgt then {\\r\\n    s.end as fpe -> tgt.verbatim_end_date = cast(fps, 'date');\\r\\n  };\\r\\n  src.category : CodeableConcept as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.drug_type_concept_id = a;\\r\\n    };\\r\\n  };\\r\\n  src.reason : CodeableReference as s -> tgt then {\\r\\n    s.concept as scs -> tgt then {\\r\\n      scs.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.stop_reason = a;\\r\\n      };\\r\\n    };\\r\\n  };\\r\\n}\\r\\n\\r\\n
\"},\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\"valueCode\":\"brr\"},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\"valueInteger\":1,\"_valueInteger\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\"valueCode\":\"informative\",\"_valueCode\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}}],\"url\":\"http://hl7.org/fhir/uv/omop/StructureMap/MedicationMap\",\"version\":\"1.0.0-ballot\",\"name\":\"MedicationMap\",\"title\":\"Mapping MedicationStatement resource to DrugExposure OMOP Domain\",\"status\":\"draft\",\"date\":\"2025-07-29T17:40:15+00:00\",\"publisher\":\"HL7 International / Biomedical Research and Regulation\",\"contact\":[{\"name\":\"HL7 International / Biomedical Research and Regulation\",\"telecom\":[{\"system\":\"url\",\"value\":\"http://www.hl7.org/Special/committees/rcrim\"}]}],\"description\":\"This mapping maps FHIR MedicationStatement instances to OMOP Drug Exposure Table objects. NOTE: It does not map FHIR MedicationRequest instances although there is a discussion of those instances in the notes.\",\"jurisdiction\":[{\"coding\":[{\"system\":\"http://unstats.un.org/unsd/methods/m49/m49.htm\",\"code\":\"001\",\"display\":\"World\"}]}],\"structure\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/MedicationStatement\",\"mode\":\"source\",\"alias\":\"MedState\"},{\"url\":\"http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure\",\"mode\":\"target\",\"alias\":\"DrugExpTable\"}],\"group\":[{\"name\":\"MedExposure\",\"input\":[{\"name\":\"src\",\"type\":\"MedState\",\"mode\":\"source\"},{\"name\":\"tgt\",\"type\":\"DrugExpTable\",\"mode\":\"target\"}],\"rule\":[{\"name\":\"id\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"did\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_exposure_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"did\"}]}]},{\"name\":\"mapPatientId\",\"source\":[{\"context\":\"src\",\"element\":\"subject.reference\",\"variable\":\"patientRefId\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"person_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"patientRefId\"}]}]},{\"name\":\"drugTypeConceptId\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"dtci\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_type_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueInteger\":581452}]}]},{\"name\":\"effectiveDateTime\",\"source\":[{\"context\":\"src\",\"type\":\"dateTime\",\"element\":\"effective\",\"variable\":\"edt\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_exposure_start_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"edt\"}]},{\"context\":\"tgt\",\"element\":\"drug_exposure_start_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"edt\"},{\"valueString\":\"date\"}]}]},{\"name\":\"effectivePeriod\",\"source\":[{\"context\":\"src\",\"type\":\"Period\",\"element\":\"effectivePeriod\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"end\",\"source\":[{\"context\":\"s\",\"element\":\"end\",\"variable\":\"fpe\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_exposure_end_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"fpe\"}]},{\"context\":\"tgt\",\"element\":\"drug_exposure_end_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"fpe\"},{\"valueString\":\"date\"}]}]}]},{\"name\":\"effectivePeriod\",\"source\":[{\"context\":\"src\",\"type\":\"Period\",\"element\":\"effective\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"end\",\"source\":[{\"context\":\"s\",\"element\":\"end\",\"variable\":\"fpe\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"verbatim_end_date\",\"transform\":\"cast\",\"parameter\":[{\"valueId\":\"fps\"},{\"valueString\":\"date\"}]}]}]},{\"name\":\"categoryCodeableConcept\",\"source\":[{\"context\":\"src\",\"type\":\"CodeableConcept\",\"element\":\"category\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_type_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}]},{\"name\":\"reasonCodeableReference\",\"source\":[{\"context\":\"src\",\"element\":\"reasonCode\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"scs\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"stop_reason\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}]},{\"name\":\"medicationCodeableReference\",\"source\":[{\"context\":\"src\",\"element\":\"medicationCodeableConcept\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}],\"documentation\":\"src.id as id -> tgt.drug_exposure_id = cast(id, \\\"integer\\\");\"}]}]}", + "output_omop_data": "" }, - "type": "db_writer_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3130, - "y": 440 + "x": 770, + "y": 1590 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3130, - "y": 440 + "x": 770, + "y": 1590 } }, { - "id": "fcab0880-2901-49fb-8e3c-e73735a07030", + "id": "b7f82a01-dd6e-4b76-bd72-53d069da2e72", "data": { - "name": "Encounter", + "id": "MeasurementMap", + "name": "transform_to_measurement", "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Encounter\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Encounter resource", - "errorMessage": null + "dataframe": "Observation_df", + "description": "Describe the task of node transform_fhir_data_node_4", + "errorMessage": null, + "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"MeasurementMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap MeasurementMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/MeasurementMap'\\r\\n/// name = 'MeasurementMap'\\r\\n/// title = 'Mapping Observation resource to Measurement  OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Measurement" alias MeasureTable as target\\r\\n\\r\\ngroup Measures(source src : Observation, target tgt : MeasureTable) {\\r\\n  src where ('vital-signs' | 'laboratory').supersetOf(Observation.category.coding.code) then {\\r\\n    src.code as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.measurement_concept_id = a;\\r\\n      };\\r\\n    }; // src.id as id -> tgt.measurement_id = cast(id, "integer");\\r\\n    src.effective : dateTime as edt ->  tgt.measurement_datetime = edt,  tgt.measurement_date = cast(edt, 'date'); // src.subject as s -> tgt then {\\r\\n    src.effective : instant as einst ->  tgt.measurement_datetime = cast(einst, 'dateTime'),  tgt.measurement_date = cast(einst, 'date');\\r\\n    src.effective : Period as s -> tgt then {\\r\\n      s.start as eps ->  tgt.measurement_datetime = cast(eps, 'dateTime'),  tgt.measurement_date = cast(eps, 'date');\\r\\n    };\\r\\n    src.issued as s where (src.issued.toDate != src.effectiveDateTime) -> tgt.measurement_source_value = cast(s, 'string');\\r\\n    src.value : Quantity as s -> tgt then {\\r\\n      s.value as a -> tgt.value_as_number = a;\\r\\n      s.unit as b -> tgt.unit_concept_id = b;\\r\\n    }; // src.performer as s -> tgt then {\\r\\n    src.value : CodeableConcept as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.value_as_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n    src.value : string as b -> tgt.value_source_value = b;\\r\\n    src.interpretation as c -> tgt.value_as_concept_id = c;\\r\\n    src.note as d -> tgt.measurement_source_value = d;\\r\\n  } "OnlyMeasures";\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/MeasurementMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"MeasurementMap\",\n \"title\": \"Mapping Observation resource to Measurement OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Observation instances that are considered measurements to OMOP Measurement Table objects. Currently, this is done by considering the category code and mapping 'vital-signs' and 'laboratory' Observations.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Observation\",\n \"mode\": \"source\",\n \"alias\": \"Observation\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Measurement\",\n \"mode\": \"target\",\n \"alias\": \"MeasureTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"Measures\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Observation\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"MeasureTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"mid\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"mid\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"OnlyMeasures\",\n \"source\": [\n {\n \"context\": \"src\",\n \"condition\": \"('vital-signs' | 'laboratory').supersetOf(Observation.category.coding.code)\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueString\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.measurement_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"effectiveDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"effective\",\n \"variable\": \"edt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ],\n \"documentation\": \"src.subject as s -> tgt then {\"\n },\n {\n \"name\": \"effectiveInstant\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"instant\",\n \"element\": \"effective\",\n \"variable\": \"einst\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"einst\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"einst\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"effectivePeriod\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"Period\",\n \"element\": \"effective\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"start\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"start\",\n \"variable\": \"eps\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"eps\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"eps\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"issued\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"issued\",\n \"variable\": \"s\",\n \"condition\": \"(src.issued.toDate != src.effectiveDateTime)\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"valueQuantity\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"Quantity\",\n \"element\": \"value\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"value\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"value\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"unit\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"unit\",\n \"variable\": \"b\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"unit_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"b\"\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.performer as s -> tgt then {\"\n },\n {\n \"name\": \"valueCodeableConcept\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"CodeableConcept\",\n \"element\": \"value\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"measurement_type_concept_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"measurement_type_concept_id\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 581458\n }\n ]\n }\n ]\n },\n {\n \"name\": \"valueString\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"string\",\n \"element\": \"value\",\n \"variable\": \"b\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"b\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"interpretation\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"interpretation\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"note\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"note\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "output_omop_data": "" }, - "type": "db_reader_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -1170, - "y": 700 + "x": 780, + "y": 1300 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -1170, - "y": 700 + "x": 780, + "y": 1300 } }, { - "id": "c59e95aa-1642-4f04-a07d-c19a496aca91", + "id": "369f82ce-d9bb-40dd-aa10-e6acf3849bc5", "data": { - "name": "Insert_into_omop_visit_occurrence", + "id": "EncounterVisitMap", + "name": "transform_to_visit_occurrence", "error": false, - "database": "demo_database", - "dataframe": "py2table_to_visit_occurrence", - "schemaname": "demo_cdm", - "dbtablename": "visit_occurrence", - "description": "Insert into omop cdm database", - "errorMessage": null + "dataframe": "Encounter_df", + "description": "Describe the task of node transform_fhir_data_node_6", + "errorMessage": null, + "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"EncounterVisitMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap EncounterVisitMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/EncounterVisitMap'\\r\\n/// name = 'EncounterVisitMap'\\r\\n/// title = 'Mapping Encounter resource to VisitOccurrence OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Encounter" alias Encounter as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/VisitOccurrence" alias VisitTable as target\\r\\n\\r\\ngroup VisitOccurrence(source src : Encounter, target tgt : VisitTable) {\\r\\n  src.class as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a ->  tgt.visit_concept_id = a,  tgt.visit_source_value = a,  tgt.visit_source_concept_id = a;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.visit_occurrence_id = cast(id, "integer");\\r\\n  src.actualPeriod as s -> tgt then {\\r\\n    s.start as std ->  tgt.visit_start_date = cast(std, 'date'),  tgt.visit_start_datetime = std;\\r\\n    s.end as ed ->  tgt.visit_end_date = cast(ed, 'date'),  tgt.visit_end_datetime = ed;\\r\\n  };\\r\\n  src.admission as s -> tgt then {\\r\\n    s.admitSource as sa -> tgt then {\\r\\n      sa.coding as sc -> tgt then {\\r\\n        sc.code as code ->  tgt.admitted_from_concept_id = code,  tgt.admitted_from_source_value = code;\\r\\n      };\\r\\n    };\\r\\n    s.dischargeDisposition as sd -> tgt then {\\r\\n      sd.coding as sc -> tgt then {\\r\\n        sc.code as code ->  tgt.discharged_to_concept_id = code,  tgt.discharged_to_source_value = code;\\r\\n      };\\r\\n    };\\r\\n  };\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/EncounterVisitMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"EncounterVisitMap\",\n \"title\": \"Mapping Encounter resource to VisitOccurrence OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Encounter instances to OMOP Visit Occurence Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Encounter\",\n \"mode\": \"source\",\n \"alias\": \"Encounter\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/VisitOccurrence\",\n \"mode\": \"target\",\n \"alias\": \"VisitTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"VisitOccurrence\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Encounter\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"VisitTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"vid\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_occurrence_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"vid\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"visitTypeConceptId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"visitTypeConceptId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32817\n }\n ]\n }\n ]\n },\n {\n \"name\": \"subject\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"patientRef.substring(8)\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"class\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"class\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.visit_occurrence_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"actualPeriod\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"period\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"start\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"start\",\n \"variable\": \"std\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"std\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"std\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"end\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"end\",\n \"variable\": \"ed\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ed\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_end_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ed\"\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"admission\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"admission\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"admitSource\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"admitSource\",\n \"variable\": \"sa\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"sa\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"code\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"admitted_from_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"admitted_from_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"dischargeDisposition\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"dischargeDisposition\",\n \"variable\": \"sd\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"sd\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"code\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"discharged_to_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"discharged_to_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "output_omop_data": "" }, - "type": "db_writer_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3110, - "y": 760 + "x": 770, + "y": 730 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3110, - "y": 760 + "x": 770, + "y": 730 } }, { - "id": "97d2d719-131e-4e91-9965-5dacc4f77bba", + "id": "53923929-57cc-4bac-b644-78348d982bb3", "data": { - "name": "Immunization", + "id": "ConditionMap", + "name": "transform_to_condition_occurrence", "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Immunization\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Immunization resource", - "errorMessage": null + "dataframe": "Condition_df", + "description": "Describe the task of node transform_fhir_data_node_7", + "errorMessage": null, + "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"ConditionMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap ConditionMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ConditionMap'\\r\\n/// name = 'ConditionMap'\\r\\n/// title = 'Mapping Condition resource to Condition Occurrence OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Condition" alias Condition as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/ConditionOccurrence" alias ConOccTable as target\\r\\n\\r\\ngroup ConditionOccurrence(source src : Condition, target tgt : ConOccTable) {\\r\\n  src.code as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.condition_concept_id = a;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.condition_occurrence_id = cast(id, "integer");\\r\\n  src.recordedDate as rd ->  tgt.condition_start_datetime = cast(rd, 'dateTime'),  tgt.condition_start_date = rd;\\r\\n  src.onset : dateTime as osd ->  tgt.condition_start_datetime = osd,  tgt.condition_start_date = cast(osd, 'date');\\r\\n  src.abatement : dateTime as abdt ->  tgt.condition_end_datetime = adt,  tgt.condition_end_date = cast(abdt, 'date');\\r\\n  src.category as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.condition_type_concept_id = a;\\r\\n    };\\r\\n  };\\r\\n  src.clinicalStatus as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.condition_status_concept_id = a;\\r\\n    };\\r\\n  };\\r\\n  src.evidence as s -> tgt then {\\r\\n    s.concept as sc -> tgt then {\\r\\n      sc.coding as sci -> tgt then {\\r\\n        sci.code as a -> tgt.condition_source_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n  }; // src.encounter as s -> tgt then {\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/ConditionMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"ConditionMap\",\n \"title\": \"Mapping Condition resource to Condition Occurrence OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Condition instances to OMOP Condition Occurence Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Condition\",\n \"mode\": \"source\",\n \"alias\": \"Condition\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/ConditionOccurrence\",\n \"mode\": \"target\",\n \"alias\": \"ConOccTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"ConditionOccurrence\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Condition\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"ConOccTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"condition_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"conditionId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_occurrence_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"conditionId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.condition_occurrence_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"recordedDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"recordedDate\",\n \"variable\": \"rd\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"rd\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"rd\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"onsetDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"onset\",\n \"variable\": \"osd\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"osd\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"osd\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"abatementDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"abatement\",\n \"variable\": \"abdt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_end_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"adt\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"condition_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"abdt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"category\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"category\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"clinicalStatus\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"clinicalStatus\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_status_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"evidence\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"evidence\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"concept\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"concept\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"coding\",\n \"variable\": \"sci\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sci\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.encounter as s -> tgt then {\"\n }\n ]\n }\n ]\n}", + "output_omop_data": "" }, - "type": "db_reader_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -1150, - "y": 960 + "x": 790, + "y": 450 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -1150, - "y": 960 + "x": 790, + "y": 450 } }, { - "id": "b3e0cbd2-1680-4d5a-8a58-a74d636f1696", + "id": "14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8", "data": { - "name": "Insert_into_omop_drug_exposure", + "id": "PersonMap", + "name": "transform_to_person", "error": false, - "database": "demo_database", - "dataframe": "py2table_drug_exposure", - "schemaname": "demo_cdm", - "dbtablename": "drug_exposure", - "description": "Insert into omop cdm database", - "errorMessage": null + "dataframe": "Patient_df", + "description": "Describe the task of node transform_fhir_data_node_8", + "errorMessage": null, + "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"PersonMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap PersonMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/PersonMap'\\r\\n/// name = 'PersonMap'\\r\\n/// title = 'Mapping Patient resource to Person OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Patient" alias Patient as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Person" alias PersonTable as target\\r\\n\\r\\ngroup Person(source src : Patient, target tgt : PersonTable) {\\r\\n  src.gender as gender ->  tgt.gender_concept_id = gender,  tgt.gender_source_value = cast(gender, 'string'); // src.id as id -> tgt.person_id = cast(id, "integer");\\r\\n  src.birthDate as bdSrc ->  tgt.birth_datetime = bdSrc,  tgt.year_of_birth = (src.birthDate.toString().substring(0, 4)),  tgt.month_of_birth = (src.birthDate.toString().substring(5, 2)),  tgt.day_of_birth = (src.birthDate.toString().substring(8, 2));\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/PersonMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"PersonMap\",\n \"title\": \"Mapping Patient resource to Person OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Patient instances to OMOP Person Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Patient\",\n \"mode\": \"source\",\n \"alias\": \"Patient\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Person\",\n \"mode\": \"target\",\n \"alias\": \"PersonTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"Person\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Patient\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"PersonTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"person_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"patientId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"gender\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"gender\",\n \"variable\": \"gender\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"gender_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"gender\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"gender_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"gender\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.person_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"birthDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"birthDate\",\n \"variable\": \"bdSrc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"birth_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"bdSrc\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"year_of_birth\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"birthDate.substring(0,4)\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"month_of_birth\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"birthDate.substring(5,2)\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"day_of_birth\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"birthDate.substring(8,2)\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"raceConcept\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"extension.where(url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race').extension.valueCoding.display\",\n \"variable\": \"race\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"race_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"race\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"ethnicity_concept_id\",\n \"documentation\": \"Map FHIR US Core ethnicity extension to OMOP person.ethnicity_concept_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"extension.where(url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity').extension.where(url = 'ombCategory').valueCoding.code\",\n \"variable\": \"ethnicityCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"ethnicity_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ethnicityCode\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "output_omop_data": "" }, - "type": "db_writer_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3210, - "y": 1030 + "x": 760, + "y": 150 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3210, - "y": 1030 + "x": 760, + "y": 150 } }, { - "id": "644c6dc1-72bf-4f5b-8a64-620407a36e3a", + "id": "9591d4d0-2887-496e-87f9-a4d7ef5c60ef", "data": { - "name": "Observation", + "id": "ImmunizationMap", + "name": "transform_to_drug_exposure", "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Observation\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Observation resource", - "errorMessage": null + "dataframe": "Immunization_df", + "description": "Describe the task of node transform_fhir_data_node_8", + "errorMessage": null, + "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"ImmunizationMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap ImmunizationMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ImmunizationMap'\\r\\n/// name = 'ImmunizationMap'\\r\\n/// title = 'Mapping Immunization resource to Drug Exposure OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Immunization" alias Immunization as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure" alias DrugExposureTable as target\\r\\n\\r\\ngroup DrugExposure(source src : Immunization, target tgt : DrugExposureTable) {\\r\\n  src.vaccineCode as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code ->  tgt.drug_concept_id,  tgt.drug_source_value,  tgt.drug_source_concept_id;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.drug_exposure_id = cast(id, "integer");\\r\\n  src.doseQuantity as s -> tgt then {\\r\\n    s.value as s -> tgt.quantity = cast(s, 'decimal');\\r\\n    s.code as s -> tgt.dose_unit_source_value = cast(s, 'string');\\r\\n  }; // src.patient as s -> tgt then {\\r\\n  src.route as s -> tgt then {\\r\\n    s.text as s -> tgt.route_source_value = cast(s, 'string');\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code ->  tgt.route_concept_id,  tgt.route_source_value;\\r\\n    };\\r\\n  };\\r\\n  src.occurrence : dateTime as odt ->  tgt.drug_exposure_start_date = cast(odt, 'date'),  tgt.drug_exposure_start_datetime = odt,  tgt.drug_exposure_end_date = cast(odt, 'date'),  tgt.drug_exposure_end_datetime = odt;\\r\\n  src.lotNumber as s -> tgt.lot_number = cast(s, 'string'); // src.encounter as s -> tgt then {\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/ImmunizationMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"ImmunizationMap\",\n \"title\": \"Mapping Immunization resource to Drug Exposure OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Immunization instances to OMOP Drug Exposure Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Immunization\",\n \"mode\": \"source\",\n \"alias\": \"Immunization\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure\",\n \"mode\": \"target\",\n \"alias\": \"DrugExposureTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"DrugExposure\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Immunization\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"DrugExposureTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"did\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"did\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"patient.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"vaccineCode\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"vaccineCode\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"drug_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.drug_exposure_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"doseQuantity\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"doseQuantity\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"value\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"value\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"quantity\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"decimal\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"dose_unit_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.patient as s -> tgt then {\"\n },\n {\n \"name\": \"route\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"route\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"text\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"text\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"route_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"route_concept_id\"\n },\n {\n \"context\": \"tgt\",\n \"element\": \"route_source_value\"\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"occurrenceDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"occurrence\",\n \"variable\": \"odt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_end_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"lotNumber\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"lotNumber\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"lot_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ],\n \"documentation\": \"src.encounter as s -> tgt then {\"\n }\n ]\n }\n ]\n}", + "output_omop_data": "" }, - "type": "db_reader_node", + "type": "transform_fhir_data_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -1120, - "y": 1220 + "x": 770, + "y": 1010 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -1120, - "y": 1220 + "x": 770, + "y": 1010 } }, { - "id": "9fff2d40-4802-46a6-9e9a-7615c47b7754", + "id": "c4ae2475-ebb4-4bb7-bd92-5e711d93f20d", "data": { - "name": "Insert_into_omop_measurement", + "name": "validate_cdm_data_drug_exp", "error": false, - "database": "demo_database", - "dataframe": "py2table_to_measurement", - "schemaname": "demo_cdm", - "dbtablename": "measurement", - "description": "Insert into omop cdm database", + "description": "Describe the task of node python_node_1", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"drug_exposure_id\",\n \"person_id\",\n \"drug_concept_id\",\n \"drug_exposure_start_date\",\n \"drug_exposure_end_date\",\n \"drug_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_drug_exposure\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", "errorMessage": null }, - "type": "db_writer_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3200, - "y": 1320 + "x": 1450, + "y": 1030 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3200, - "y": 1320 + "x": 1450, + "y": 1030 } }, { - "id": "140dffdd-9b98-46a7-ae23-b2b8a6a79a4e", + "id": "c9ff11c9-d269-4035-b70a-523b4b92ebb6", "data": { - "name": "MedicationStatement", - "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"MedicationStatement\"", - "testdata": [ - [] - ], - "description": "Get fhir data for MedicationStatement resource", - "errorMessage": null - }, - "type": "db_reader_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": -1030, - "y": 1520 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": -1030, - "y": 1520 - } - }, - { - "id": "345c3710-002f-4c6d-843b-94e873927548", - "data": { - "name": "Insert_into_omop_drug_exposure", - "database": "demo_database", - "dataframe": "py2table_to_drug_exposure", - "schemaname": "demo_cdm", - "dbtablename": "drug_exposure", - "description": "Insert into omop cdm database" + "map": {}, + "name": "py2table_drug_exposure", + "uiMap": { + "path": "$", + "source": "Truncate_OMOP_cdm_table_drug_expo" + }, + "description": "Describe the task of node py2table_node_9" }, - "type": "db_writer_node", + "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3230, - "y": 1590 + "x": 2550, + "y": 1030 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3230, - "y": 1590 + "x": 2550, + "y": 1030 } }, { - "id": "c1e62222-8885-4467-811f-52e80cf4e3b6", + "id": "fc3206ff-ae52-43ed-8ef7-6d8cb525e698", "data": { - "name": "Observation", - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Observation\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Observation resource" + "name": "validate_cdm_data_meas", + "error": false, + "description": "Describe the task of node python_node_2", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"measurement_id\",\n \"person_id\",\n \"measurement_concept_id\",\n \"measurement_date\",\n \"measurement_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_measurement\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", + "errorMessage": null }, - "type": "db_reader_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -860, - "y": 1840 + "x": 1420, + "y": 1310 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -860, - "y": 1840 + "x": 1420, + "y": 1310 } }, { - "id": "a51a4106-095e-49a8-a868-db5874ed60f5", + "id": "97e789e0-8b0b-49be-ad53-588599053812", "data": { - "name": "Insert_into_omop_observation", - "error": false, - "database": "demo_database", - "dataframe": "py2table_to_observation", - "schemaname": "demo_cdm", - "dbtablename": "observation", - "description": "Insert into omop cdm database", - "errorMessage": null + "map": {}, + "name": "py2table_to_measurement", + "uiMap": { + "path": "$", + "source": "Truncate_OMOP_cdm_table_meas" + }, + "description": "Describe the task of node py2table_node_10" }, - "type": "db_writer_node", + "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3370, - "y": 1860 + "x": 2580, + "y": 1310 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3370, - "y": 1860 + "x": 2580, + "y": 1310 } }, { - "id": "230782cf-935e-4354-9c89-db8a2f37bf99", + "id": "7d661465-6ce0-44af-80d7-fd533a1acae9", "data": { - "name": "Procedure", - "error": false, - "database": "d2e_fhir", - "sqlquery": "select content from \"fhir\".\"Procedure\"", - "testdata": [ - [] - ], - "description": "Get fhir data for Procedure resource", - "errorMessage": null + "name": "validate_cdm_data_drug_exp", + "description": "Describe the task of node python_node_3", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"drug_exposure_id\",\n \"person_id\",\n \"drug_concept_id\",\n \"drug_exposure_start_date\",\n \"drug_exposure_end_date\",\n \"drug_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_drug_exposure\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n" }, - "type": "db_reader_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": -780, - "y": 2170 + "x": 1410, + "y": 1590 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -780, - "y": 2170 + "x": 1410, + "y": 1590 } }, { - "id": "cf76f9a9-321b-469f-8779-fc8945fd50f6", + "id": "09e016fe-ee22-4853-ad40-83917ba84537", "data": { - "name": "Insert_into_omop_procedure_occurrence", - "error": false, - "database": "demo_database", - "dataframe": "py2table_to_procedure_occurrence", - "schemaname": "demo_cdm", - "dbtablename": "procedure_occurrence", - "description": "Insert into omop cdm database", - "errorMessage": null + "map": {}, + "name": "py2table_to_drug_exposure", + "uiMap": { + "path": "$", + "source": "Truncate_OMOP_cdm_table_drug_exp" + }, + "description": "Describe the task of node py2table_node_11" }, - "type": "db_writer_node", + "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 3380, - "y": 2170 + "x": 2620, + "y": 1590 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 3380, - "y": 2170 + "x": 2620, + "y": 1590 } }, { - "id": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "id": "ca83c219-1ab9-44bf-9af6-c158e51f7214", "data": { - "name": "python_node", + "name": "validate_cdm_data_Obs", "error": false, - "description": "Describe the task of node python_node_0", - "python_code": "def exec(myinput):\n transformed = {}\n for key, result_obj in myinput.items():\n transformed[key] = result_obj.result\n return transformed\ndef test_exec(myinput):\n return \"This is test_exec function\"", + "description": "Describe the task of node python_node_4", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"observation_date\",\n \"observation_id\",\n \"person_id\",\n \"observation_type_concept_id\",\n \"observation_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_observation\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", "errorMessage": null }, "type": "python_node", @@ -1008,127 +1207,115 @@ "height": 210, "dragging": false, "position": { - "x": -420, - "y": 930 + "x": 1410, + "y": 1890 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": -420, - "y": 930 + "x": 1410, + "y": 1890 } }, { - "id": "9658364f-9788-4bbd-91f4-2fb8fdde5d1b", + "id": "cc4c773e-a0bd-4894-9908-00ad541c310d", "data": { "map": {}, - "name": "AllergyIntolerance_df", - "error": false, + "name": "py2table_to_observation", "uiMap": { - "path": "$.AllergyIntolerance", - "source": "python_node" + "path": "$", + "source": "Truncate_OMOP_cdm_table_obs" }, - "description": "Describe the task of node py2table_node_0", - "errorMessage": null + "description": "Describe the task of node py2table_node_12" }, "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 20, - "y": -120 + "x": 2700, + "y": 1900 }, - "selected": false, + "selected": true, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 20, - "y": -120 + "x": 2700, + "y": 1900 } }, { - "id": "3c3f5888-5462-4fa6-8e9b-132d06e3e3d5", + "id": "43ad560c-fdba-43b6-9236-4baadb718c42", "data": { - "map": {}, - "name": "Patient_df", - "error": false, - "uiMap": { - "path": "$.Patient", - "source": "python_node" - }, - "description": "Describe the task of node py2table_node_1", - "errorMessage": null + "name": "validate_cdm_data_proc_occ", + "description": "Describe the task of node python_node_5", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"procedure_occurrence_id\",\n \"person_id\",\n \"procedure_concept_id\",\n \"procedure_date\",\n \"procedure_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_procedure_occurrence\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n" }, - "type": "py2table_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 130, - "y": 170 + "x": 1400, + "y": 2200 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 130, - "y": 170 + "x": 1400, + "y": 2200 } }, { - "id": "227a0e41-40fc-4219-90e5-2c46ea7b1879", + "id": "e8e268b6-3e03-4468-b386-5e00c6051ca1", "data": { "map": {}, - "name": "Condition_df", - "error": false, + "name": "py2table_to_procedure_occurrence", "uiMap": { - "path": "$.Condition", - "source": "python_node" + "path": "$", + "source": "Truncate_OMOP_cdm_table_procedure_occ" }, - "description": "Describe the task of node py2table_node_2", - "errorMessage": null + "description": "Describe the task of node py2table_node_13" }, "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 150, - "y": 450 + "x": 2680, + "y": 2190 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 150, - "y": 450 + "x": 2680, + "y": 2190 } }, { - "id": "3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab", + "id": "861da43e-01e9-4eac-9136-2547228077f4", "data": { "map": {}, - "name": "Encounter_df", - "error": false, + "name": "py2table_to_visit_occurrence", "uiMap": { - "path": "$.Encounter", - "source": "python_node" + "path": "$", + "source": "Truncate_OMOP_cdm_table_visit_occ" }, - "description": "Describe the task of node py2table_node_3", - "errorMessage": null + "description": "Describe the task of node py2table_node_14" }, "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 140, + "x": 2560, "y": 740 }, "selected": false, @@ -1136,1153 +1323,914 @@ "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 140, + "x": 2560, "y": 740 } }, { - "id": "e332b9d8-a600-4d2a-94cb-fff53ab01a5d", + "id": "2d29943f-969e-4b33-b8a1-48b4172a7bdf", "data": { - "map": {}, - "name": "Immunization_df", + "name": "validate_cdm_data_co", "error": false, - "uiMap": { - "path": "$.Immunization", - "source": "python_node" - }, - "description": "Describe the task of node py2table_node_4", + "description": "Describe the task of node python_node_7", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"condition_occurrence_id\",\n \"person_id\",\n \"condition_concept_id\",\n \"condition_start_date\",\n \"condition_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_condition_occurrence\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", "errorMessage": null }, - "type": "py2table_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 140, - "y": 1010 + "x": 1390, + "y": 430 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 140, - "y": 1010 + "x": 1390, + "y": 430 } }, { - "id": "5d62e682-992f-4788-8855-5216eebad563", + "id": "4fbeac17-add6-494f-a75a-4eed55d17c85", "data": { "map": {}, - "name": "Observation_df", - "error": false, + "name": "py2table_to_condition_occurrence", "uiMap": { - "path": "$.Observation", - "source": "python_node" + "path": "$", + "source": "Truncate_OMOP_cdm_table_co" }, - "description": "Describe the task of node py2table_node_5", - "errorMessage": null + "description": "Describe the task of node py2table_node_15" }, "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 140, - "y": 1310 + "x": 2590, + "y": 440 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 140, - "y": 1310 + "x": 2590, + "y": 440 } }, { - "id": "f67d926f-24be-4a64-848b-8f9e69a5e55e", + "id": "0457459b-833a-4563-b702-807031462160", "data": { - "map": {}, - "name": "MedicationStatement_df", + "name": "validate_cdm_data_person", "error": false, - "uiMap": { - "path": "$.MedicationStatement", - "source": "python_node" - }, - "description": "Describe the task of node py2table_node_6", + "description": "Describe the task of node python_node_8", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"person_id\",\n \"gender_concept_id\",\n \"year_of_birth\",\n \"race_concept_id\",\n \"ethnicity_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_person\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", "errorMessage": null }, - "type": "py2table_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 140, - "y": 1600 + "x": 1360, + "y": 140 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 140, - "y": 1600 + "x": 1360, + "y": 140 } }, { - "id": "dbb730a1-1499-462e-9d67-4585bb9a9662", + "id": "bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5", "data": { "map": {}, - "name": "Observation_df", + "name": "py2table_to_person", "uiMap": { - "path": "$.Observation", - "source": "python_node" + "path": "$", + "source": "Truncate_OMOP_cdm_table_person" }, - "description": "Describe the task of node py2table_node_7" + "description": "Describe the task of node py2table_node_16" }, "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 140, - "y": 1870 + "x": 2570, + "y": 130 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 140, - "y": 1870 + "x": 2570, + "y": 130 } }, { - "id": "f758c084-1da4-4a3c-8f96-af873953b6c6", + "id": "a06d966c-271c-4fe7-8fb2-e2c8443dd22e", "data": { - "map": {}, - "name": "Procedure_df", - "error": false, - "uiMap": { - "path": "$.Procedure", - "source": "python_node" - }, - "description": "Describe the task of node py2table_node_8", - "errorMessage": null + "name": "validate_cdm_data", + "description": "Describe the task of node python_node_9", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"observation_date\",\n \"observation_id\",\n \"person_id\",\n \"observation_type_concept_id\",\n \"observation_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_Observation\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n" }, - "type": "py2table_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 90, - "y": 2180 + "x": 1370, + "y": -190 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 90, - "y": 2180 + "x": 1370, + "y": -190 } }, { - "id": "07cfed06-756e-4cb8-b65b-1d763fb4a98f", + "id": "6b6a799b-4e67-47fc-8e1b-6050515bfcfe", "data": { - "id": "AllergeMap", - "name": "transform_to_Observation", - "error": false, - "dataframe": "AllergyIntolerance_df", - "description": "Describe the task of node transform_fhir_data_node_0", - "errorMessage": null, - "structure_map": "{ \"resourceType\": \"StructureMap\", \"id\": \"AllergyMap\", \"text\": { \"status\": \"generated\", \"div\": \"

Generated Narrative: StructureMap AllergyMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/AllergyMap'\\r\\n/// name = 'AllergyMap'\\r\\n/// title = 'Mapping Allergy resource to Observation OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/AllergyIntolerance" alias Allergy as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Observation" alias ObservationTable as target\\r\\n\\r\\ngroup Observation(source src : Allergy, target tgt : ObservationTable) {\\r\\n  src.code as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code ->  tgt.observation_concept_id,  tgt.observation_source_value,  tgt.observation_source_concept_id;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.observation_id = cast(id, "integer");\\r\\n  src.onset : dateTime as osd ->  tgt.observation_date = cast(osd, 'date'),  tgt.observation_datetime = osd; // src.patient as s -> tgt then {\\r\\n  src.reaction as s -> tgt then {\\r\\n    s.manifestation as sman -> tgt then {\\r\\n      sman.concept as smanc -> tgt then {\\r\\n        smanc.coding as sc -> tgt then {\\r\\n          sc.code ->  tgt.value_as_concept_id,  tgt.value_source_value;\\r\\n        };\\r\\n      };\\r\\n    };\\r\\n  };\\r\\n}\\r\\n\\r\\n
\" }, \"extension\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\", \"valueCode\": \"brr\" }, { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\", \"valueInteger\": 1, \"_valueInteger\": { \"extension\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\", \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\" } ] } }, { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\", \"valueCode\": \"informative\", \"_valueCode\": { \"extension\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\", \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\" } ] } } ], \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/AllergyMap\", \"version\": \"1.0.0-ballot\", \"name\": \"AllergyMap\", \"title\": \"Mapping Allergy resource to Observation OMOP Domain\", \"status\": \"draft\", \"date\": \"2025-07-29T17:40:15+00:00\", \"publisher\": \"HL7 International / Biomedical Research and Regulation\", \"contact\": [ { \"name\": \"HL7 International / Biomedical Research and Regulation\", \"telecom\": [ { \"system\": \"url\", \"value\": \"http://www.hl7.org/Special/committees/rcrim\" } ] } ], \"description\": \"This mapping maps FHIR AllergyIntolerance instances to OMOP Observation Table objects.\", \"jurisdiction\": [ { \"coding\": [ { \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\", \"code\": \"001\", \"display\": \"World\" } ] } ], \"structure\": [ { \"url\": \"http://hl7.org/fhir/StructureDefinition/AllergyIntolerance\", \"mode\": \"source\", \"alias\": \"Allergy\" }, { \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Observation\", \"mode\": \"target\", \"alias\": \"ObservationTable\" } ], \"group\": [ { \"name\": \"Observation\", \"input\": [ { \"name\": \"src\", \"type\": \"Allergy\", \"mode\": \"source\" }, { \"name\": \"tgt\", \"type\": \"ObservationTable\", \"mode\": \"target\" } ], \"rule\": [ { \"name\": \"mapObservationId\", \"documentation\": \"Generate a unique OMOP observation_id.\", \"source\": [ { \"context\": \"src\", \"element\": \"id\", \"variable\": \"fhirId\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"fhirId\" } ] } ] }, { \"name\": \"mapPatientId\", \"source\": [ { \"context\": \"src\", \"element\": \"patient.reference\", \"variable\": \"patRef\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"person_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"patRef\" } ] } ] }, { \"name\": \"code\", \"source\": [ { \"context\": \"src\", \"element\": \"code\", \"variable\": \"s\" } ], \"target\": [ { \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"tgt\" } ] } ], \"rule\": [ { \"name\": \"coding\", \"source\": [ { \"context\": \"s\", \"element\": \"coding\", \"variable\": \"sc\" } ], \"target\": [ { \"transform\": \"copy\", \"context\": \"tgt\", \"parameter\": [ { \"valueId\": \"sc\" } ] } ], \"rule\": [ { \"name\": \"code\", \"source\": [ { \"context\": \"sc\", \"element\": \"code\", \"variable\": \"sc_code\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_concept_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"sc_code\" } ] }, { \"context\": \"tgt\", \"element\": \"observation_source_value\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"sc_code\" } ] }, { \"context\": \"tgt\", \"element\": \"observation_source_concept_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"sc_code\" } ] } ] } ] } ], \"documentation\": \"src.id as id -> tgt.observation_id = cast(id, \\\"integer\\\");\" }, { \"name\": \"onsetDateTime\", \"source\": [ { \"context\": \"src\", \"type\": \"dateTime\", \"element\": \"onset\", \"variable\": \"osd\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_date\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"osd\" }, { \"valueString\": \"date\" } ] }, { \"context\": \"tgt\", \"element\": \"observation_datetime\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"osd\" } ] } ], \"documentation\": \"src.patient as s -> tgt then {\" }, { \"name\": \"mapObservationTypeConceptId\", \"documentation\": \"Derive OMOP observation_type_concept_id based on FHIR AllergyIntolerance provenance.\", \"source\": [ { \"context\": \"src\", \"element\": \"id\", \"variable\": \"conceptId\" } ], \"target\": [ { \"context\": \"tgt\", \"element\": \"observation_type_concept_id\", \"transform\": \"copy\", \"parameter\": [ { \"valueId\": \"conceptId\" } ] } ] } ] } ] }", - "output_omop_data": "" + "map": {}, + "name": "py2table_to_observation_1", + "uiMap": { + "path": "$", + "source": "Truncate_OMOP__table_observation" + }, + "description": "Describe the task of node py2table_node_17" }, - "type": "transform_fhir_data_node", + "type": "py2table_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 730, - "y": -190 + "x": 2540, + "y": -200 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 730, - "y": -190 + "x": 2540, + "y": -200 } }, { - "id": "0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3", + "id": "1c1853ac-6c80-41c3-8c02-c013f42c4917", "data": { - "id": "ProcedureMap", - "name": "transform_to_procedure_occurrence", + "name": "validate_cdm_data_vo", "error": false, - "dataframe": "Procedure_df", - "description": "Describe the task of node transform_fhir_data_node_1", - "errorMessage": null, - "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"ProcedureMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap ProcedureMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ProcedureMap'\\r\\n/// name = 'ProcedureMap'\\r\\n/// title = 'Mapping Procedure resource to Procedure Occurrence OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Procedure" alias Procedure as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/ProcedureOccurrence" alias ProcedureTable as target\\r\\n\\r\\ngroup ProcedureOccurrence(source src : Procedure, target tgt : ProcedureTable) {\\r\\n  src.code as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a ->  tgt.procedure_concept_id,  tgt.procedure_source_value,  tgt.procedure_source_concept_id = a;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.procedure_occurrence_id = cast(id, "integer");\\r\\n  src.occurrence : dateTime as edt ->  tgt.procedure_datetime = cast(edt, 'dateTime'),  tgt.procedure_date = edt;\\r\\n  src.occurrence : Period as s -> tgt then {\\r\\n    s.start as start ->  tgt.procedure_datetime = cast(start, 'dateTime'),  tgt.procedure_date = start;\\r\\n    s.end as end ->  tgt.procedure_end_datetime,  tgt.procedure_end_date = end;\\r\\n  };\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/ProcedureMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"ProcedureMap\",\n \"title\": \"Mapping Procedure resource to Procedure Occurrence OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Procedure instances to OMOP Procedure Occurrence Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Procedure\",\n \"mode\": \"source\",\n \"alias\": \"Procedure\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/ProcedureOccurrence\",\n \"mode\": \"target\",\n \"alias\": \"ProcedureTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"ProcedureOccurrence\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Procedure\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"ProcedureTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"pid\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_occurrence_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"pid\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"procedure_type_concept_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"procedure_type_concept_id\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 45905771\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.procedure_occurrence_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"occurrenceDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"performedDateTime\",\n \"variable\": \"edt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"occurrencePeriod\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"Period\",\n \"element\": \"performedPeriod\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"start\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"start\",\n \"variable\": \"start\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"start\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"start\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"end\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"end\",\n \"variable\": \"end\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_end_datetime\"\n },\n {\n \"context\": \"tgt\",\n \"element\": \"procedure_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"end\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", - "output_omop_data": "" + "description": "Describe the task of node python_node_9", + "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"visit_occurrence_id\",\n \"person_id\",\n \"visit_concept_id\",\n \"visit_end_date\",\n \"visit_start_date\",\n \"visit_type_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_visit_occurrence\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", + "errorMessage": null }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 810, - "y": 2150 + "x": 1380, + "y": 710 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 810, - "y": 2150 + "x": 1380, + "y": 710 } }, { - "id": "2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0", + "id": "f217a843-35d9-4fbb-8f08-ee9be931dc68", "data": { - "id": "ObservationMap", - "name": "transform_to_observation", - "error": false, - "dataframe": "Observation_df", - "description": "Describe the task of node transform_fhir_data_node_2", - "errorMessage": null, - "structure_map": "{\"resourceType\":\"StructureMap\",\"id\":\"ObservationMap\",\"text\":{\"status\":\"generated\",\"div\":\"

Generated Narrative: StructureMap ObservationMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ObservationMap'\\r\\n/// name = 'ObservationMap'\\r\\n/// title = 'Mapping Observation resource to  Observation OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Observation" alias ObsTable as target\\r\\n\\r\\ngroup Observe(source src : Observation, target tgt : ObsTable) {\\r\\n  src where ('social-history' | 'imaging' | 'survey' | 'exam' | 'therapy' | 'activity' | 'procedure').supersetOf(Observation.category.coding.code) then {\\r\\n    src.code as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.observation_concept_id = a;\\r\\n      };\\r\\n    }; // src.id as id -> tgt.observation_id = cast(id, "integer");\\r\\n    src.effective : dateTime as a ->  tgt.observation_datetime = a,  tgt.observation_date = cast(a, 'date'); // src.subject as s -> tgt then {\\r\\n    src.effective : instant as einst ->  tgt.observation_datetime = cast(einst, 'dateTime'),  tgt.observation_date = cast(einst, 'date');\\r\\n    src.effective : Period as s -> tgt then {\\r\\n      s.start as ss ->  tgt.observation_datetime = cast(ss, 'dateTime'),  tgt.observation_date = cast(ss, 'date');\\r\\n    };\\r\\n    src.issued as s where (s.toDate != src.effectiveDate) -> tgt.observation_source_value = cast(s, 'string');\\r\\n    src.value : Quantity as s -> tgt then {\\r\\n      s.value as a -> tgt.value_as_number = a;\\r\\n      s.unit as b -> tgt.unit_concept_id = b;\\r\\n    }; // src.performer as s -> tgt then {\\r\\n    src.value : CodeableConcept as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.value_as_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n    src.value : string as b -> tgt.value_as_string = b;\\r\\n    src.note as d -> tgt.observation_source_value = d;\\r\\n  } "OnlyObs";\\r\\n}\\r\\n\\r\\n
\"},\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\"valueCode\":\"brr\"},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\"valueInteger\":1,\"_valueInteger\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\"valueCode\":\"informative\",\"_valueCode\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}}],\"url\":\"http://hl7.org/fhir/uv/omop/StructureMap/ObservationMap\",\"version\":\"1.0.0-ballot\",\"name\":\"ObservationMap\",\"title\":\"Mapping Observation resource to Observation OMOP Domain\",\"status\":\"draft\",\"date\":\"2025-07-29T17:40:15+00:00\",\"publisher\":\"HL7 International / Biomedical Research and Regulation\",\"contact\":[{\"name\":\"HL7 International / Biomedical Research and Regulation\",\"telecom\":[{\"system\":\"url\",\"value\":\"http://www.hl7.org/Special/committees/rcrim\"}]}],\"description\":\"This mapping maps FHIR Observation instances that are NOT considered measurements to OMOP Observation Table objects. Currently, this is done by considering the category code and mapping 'social-history', 'imaging', 'survey', 'exam', 'therapy', 'activity', and 'procedure' Observations.\",\"jurisdiction\":[{\"coding\":[{\"system\":\"http://unstats.un.org/unsd/methods/m49/m49.htm\",\"code\":\"001\",\"display\":\"World\"}]}],\"structure\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/Observation\",\"mode\":\"source\",\"alias\":\"Observation\"},{\"url\":\"http://hl7.org/fhir/uv/omop/StructureDefinition/Observation\",\"mode\":\"target\",\"alias\":\"ObsTable\"}],\"group\":[{\"name\":\"Observe\",\"input\":[{\"name\":\"src\",\"type\":\"Observation\",\"mode\":\"source\"},{\"name\":\"tgt\",\"type\":\"ObsTable\",\"mode\":\"target\"}],\"rule\":[{\"name\":\"mapObservationId\",\"documentation\":\"Generate a unique OMOP observation_id.\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"fhirId\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"fhirId\"}]}]},{\"name\":\"mapPatientId\",\"source\":[{\"context\":\"src\",\"element\":\"subject.reference\",\"variable\":\"patRef\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"person_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"patRef\"}]}]},{\"name\":\"mapObservationTypeConceptId\",\"documentation\":\"Derive OMOP observation_type_concept_id based on FHIR AllergyIntolerance provenance.\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"id\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_type_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"id\"}]}]},{\"name\":\"OnlyObs\",\"source\":[{\"context\":\"src\",\"condition\":\"('social-history' | 'imaging' | 'survey' | 'exam' | 'therapy' | 'activity' | 'procedure').supersetOf(Observation.category.coding.code)\"}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"src\",\"element\":\"code\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}],\"documentation\":\"src.id as id -> tgt.observation_id = cast(id, \\\"integer\\\");\"},{\"name\":\"effectiveDateTime\",\"source\":[{\"context\":\"src\",\"type\":\"dateTime\",\"element\":\"effective\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]},{\"context\":\"tgt\",\"element\":\"observation_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"},{\"valueString\":\"date\"}]}],\"documentation\":\"src.subject as s -> tgt then {\"},{\"name\":\"effectiveInstant\",\"source\":[{\"context\":\"src\",\"type\":\"instant\",\"element\":\"effective\",\"variable\":\"einst\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"einst\"},{\"valueString\":\"dateTime\"}]},{\"context\":\"tgt\",\"element\":\"observation_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"einst\"},{\"valueString\":\"date\"}]}]},{\"name\":\"effectivePeriod\",\"source\":[{\"context\":\"src\",\"type\":\"Period\",\"element\":\"effective\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"start\",\"source\":[{\"context\":\"s\",\"element\":\"start\",\"variable\":\"ss\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"ss\"},{\"valueString\":\"dateTime\"}]},{\"context\":\"tgt\",\"element\":\"observation_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"ss\"},{\"valueString\":\"date\"}]}]}]},{\"name\":\"issued\",\"source\":[{\"context\":\"src\",\"element\":\"issued\",\"variable\":\"s\",\"condition\":\"(s.toDate != src.effectiveDate)\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_source_value\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"s\"},{\"valueString\":\"string\"}]}]},{\"name\":\"valueQuantity\",\"source\":[{\"context\":\"src\",\"type\":\"Quantity\",\"element\":\"value\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"value\",\"source\":[{\"context\":\"s\",\"element\":\"value\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"value_as_number\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]},{\"name\":\"unit\",\"source\":[{\"context\":\"s\",\"element\":\"unit\",\"variable\":\"b\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"unit_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"b\"}]}]}],\"documentation\":\"src.performer as s -> tgt then {\"},{\"name\":\"valueCodeableConcept\",\"source\":[{\"context\":\"src\",\"type\":\"CodeableConcept\",\"element\":\"value\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"value_as_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}]},{\"name\":\"valueString\",\"source\":[{\"context\":\"src\",\"type\":\"string\",\"element\":\"value\",\"variable\":\"b\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"value_as_string\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"b\"}]}]},{\"name\":\"note\",\"source\":[{\"context\":\"src\",\"element\":\"note\",\"variable\":\"d\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_source_value\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"d\"}]}]},{\"name\":\"note\",\"source\":[{\"context\":\"src\",\"element\":\"note\",\"variable\":\"d\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"observation_source_value\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"d\"}]}]}]}]}]}", - "output_omop_data": "" + "name": "Truncate_OMOP__table_observation", + "description": "Describe the task of node python_node_10", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"observation\"\n source_col = \"observation_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 790, - "y": 1860 + "x": 1930, + "y": -200 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 790, - "y": 1860 + "x": 1930, + "y": -200 } }, { - "id": "ab80716e-87b1-479c-bd4e-c95d43b35fe6", + "id": "417bf8c6-9c9b-4ea5-a684-222fb68f786f", "data": { - "id": "MedicationMap", - "name": "transform_to_drug_exposure", - "error": false, - "dataframe": "MedicationStatement_df", - "description": "Describe the task of node transform_fhir_data_node_3", - "errorMessage": null, - "structure_map": "{\"resourceType\":\"StructureMap\",\"id\":\"MedicationMap\",\"text\":{\"status\":\"generated\",\"div\":\"

Generated Narrative: StructureMap MedicationMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/MedicationMap'\\r\\n/// name = 'MedicationMap'\\r\\n/// title = 'Mapping MedicationStatement resource to DrugExposure OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/MedicationStatement" alias MedState as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure" alias DrugExpTable as target\\r\\n\\r\\ngroup MedExposure(source src : MedState, target tgt : DrugExpTable) {\\r\\n  src.medication : CodeableReference as s -> tgt then {\\r\\n    s.concept as scs -> tgt then {\\r\\n      scs.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.drug_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n  }; // src.id as id -> tgt.drug_exposure_id = cast(id, "integer");\\r\\n  src.effective : dateTime as edt ->  tgt.drug_exposure_start_datetime = edt,  tgt.drug_exposure_start_date = cast(edt, 'date');\\r\\n  src.effective : Period as s -> tgt then {\\r\\n    s.start as fps ->  tgt.drug_exposure_start_datetime = fps,  tgt.drug_exposure_start_date = cast(fps, 'date');\\r\\n  };\\r\\n  src.effective : Period as s -> tgt then {\\r\\n    s.end as fpe ->  tgt.drug_exposure_end_datetime = fpe,  tgt.drug_exposure_end_date = cast(fps, 'date');\\r\\n  };\\r\\n  src.effective : Period as s -> tgt then {\\r\\n    s.end as fpe -> tgt.verbatim_end_date = cast(fps, 'date');\\r\\n  };\\r\\n  src.category : CodeableConcept as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.drug_type_concept_id = a;\\r\\n    };\\r\\n  };\\r\\n  src.reason : CodeableReference as s -> tgt then {\\r\\n    s.concept as scs -> tgt then {\\r\\n      scs.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.stop_reason = a;\\r\\n      };\\r\\n    };\\r\\n  };\\r\\n}\\r\\n\\r\\n
\"},\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\"valueCode\":\"brr\"},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\"valueInteger\":1,\"_valueInteger\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}},{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\"valueCode\":\"informative\",\"_valueCode\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\"valueCanonical\":\"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"}]}}],\"url\":\"http://hl7.org/fhir/uv/omop/StructureMap/MedicationMap\",\"version\":\"1.0.0-ballot\",\"name\":\"MedicationMap\",\"title\":\"Mapping MedicationStatement resource to DrugExposure OMOP Domain\",\"status\":\"draft\",\"date\":\"2025-07-29T17:40:15+00:00\",\"publisher\":\"HL7 International / Biomedical Research and Regulation\",\"contact\":[{\"name\":\"HL7 International / Biomedical Research and Regulation\",\"telecom\":[{\"system\":\"url\",\"value\":\"http://www.hl7.org/Special/committees/rcrim\"}]}],\"description\":\"This mapping maps FHIR MedicationStatement instances to OMOP Drug Exposure Table objects. NOTE: It does not map FHIR MedicationRequest instances although there is a discussion of those instances in the notes.\",\"jurisdiction\":[{\"coding\":[{\"system\":\"http://unstats.un.org/unsd/methods/m49/m49.htm\",\"code\":\"001\",\"display\":\"World\"}]}],\"structure\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/MedicationStatement\",\"mode\":\"source\",\"alias\":\"MedState\"},{\"url\":\"http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure\",\"mode\":\"target\",\"alias\":\"DrugExpTable\"}],\"group\":[{\"name\":\"MedExposure\",\"input\":[{\"name\":\"src\",\"type\":\"MedState\",\"mode\":\"source\"},{\"name\":\"tgt\",\"type\":\"DrugExpTable\",\"mode\":\"target\"}],\"rule\":[{\"name\":\"id\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"did\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_exposure_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"did\"}]}]},{\"name\":\"mapPatientId\",\"source\":[{\"context\":\"src\",\"element\":\"subject.reference\",\"variable\":\"patientRefId\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"person_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"patientRefId\"}]}]},{\"name\":\"drugTypeConceptId\",\"source\":[{\"context\":\"src\",\"element\":\"id\",\"variable\":\"dtci\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_type_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueInteger\":581452}]}]},{\"name\":\"effectiveDateTime\",\"source\":[{\"context\":\"src\",\"type\":\"dateTime\",\"element\":\"effective\",\"variable\":\"edt\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_exposure_start_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"edt\"}]},{\"context\":\"tgt\",\"element\":\"drug_exposure_start_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"edt\"},{\"valueString\":\"date\"}]}]},{\"name\":\"effectivePeriod\",\"source\":[{\"context\":\"src\",\"type\":\"Period\",\"element\":\"effectivePeriod\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"end\",\"source\":[{\"context\":\"s\",\"element\":\"end\",\"variable\":\"fpe\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_exposure_end_datetime\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"fpe\"}]},{\"context\":\"tgt\",\"element\":\"drug_exposure_end_date\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"fpe\"},{\"valueString\":\"date\"}]}]}]},{\"name\":\"effectivePeriod\",\"source\":[{\"context\":\"src\",\"type\":\"Period\",\"element\":\"effective\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"end\",\"source\":[{\"context\":\"s\",\"element\":\"end\",\"variable\":\"fpe\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"verbatim_end_date\",\"transform\":\"cast\",\"parameter\":[{\"valueId\":\"fps\"},{\"valueString\":\"date\"}]}]}]},{\"name\":\"categoryCodeableConcept\",\"source\":[{\"context\":\"src\",\"type\":\"CodeableConcept\",\"element\":\"category\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_type_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}]},{\"name\":\"reasonCodeableReference\",\"source\":[{\"context\":\"src\",\"element\":\"reasonCode\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"scs\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"stop_reason\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}]},{\"name\":\"medicationCodeableReference\",\"source\":[{\"context\":\"src\",\"element\":\"medicationCodeableConcept\",\"variable\":\"s\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"coding\",\"source\":[{\"context\":\"s\",\"element\":\"coding\",\"variable\":\"sc\"}],\"target\":[{\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"tgt\"}]}],\"rule\":[{\"name\":\"code\",\"source\":[{\"context\":\"sc\",\"element\":\"code\",\"variable\":\"a\"}],\"target\":[{\"context\":\"tgt\",\"element\":\"drug_concept_id\",\"transform\":\"copy\",\"parameter\":[{\"valueId\":\"a\"}]}]}]}],\"documentation\":\"src.id as id -> tgt.drug_exposure_id = cast(id, \\\"integer\\\");\"}]}]}", - "output_omop_data": "" + "name": "Truncate_OMOP_cdm_table_person", + "description": "Describe the task of node python_node_11", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"person\"\n source_col = \"person_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 770, - "y": 1590 + "x": 1920, + "y": 140 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 770, - "y": 1590 + "x": 1920, + "y": 140 } }, { - "id": "b7f82a01-dd6e-4b76-bd72-53d069da2e72", + "id": "f291bb65-0804-40cb-989c-d65387218938", "data": { - "id": "MeasurementMap", - "name": "transform_to_measurement", - "error": false, - "dataframe": "Observation_df", - "description": "Describe the task of node transform_fhir_data_node_4", - "errorMessage": null, - "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"MeasurementMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap MeasurementMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/MeasurementMap'\\r\\n/// name = 'MeasurementMap'\\r\\n/// title = 'Mapping Observation resource to Measurement  OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Measurement" alias MeasureTable as target\\r\\n\\r\\ngroup Measures(source src : Observation, target tgt : MeasureTable) {\\r\\n  src where ('vital-signs' | 'laboratory').supersetOf(Observation.category.coding.code) then {\\r\\n    src.code as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.measurement_concept_id = a;\\r\\n      };\\r\\n    }; // src.id as id -> tgt.measurement_id = cast(id, "integer");\\r\\n    src.effective : dateTime as edt ->  tgt.measurement_datetime = edt,  tgt.measurement_date = cast(edt, 'date'); // src.subject as s -> tgt then {\\r\\n    src.effective : instant as einst ->  tgt.measurement_datetime = cast(einst, 'dateTime'),  tgt.measurement_date = cast(einst, 'date');\\r\\n    src.effective : Period as s -> tgt then {\\r\\n      s.start as eps ->  tgt.measurement_datetime = cast(eps, 'dateTime'),  tgt.measurement_date = cast(eps, 'date');\\r\\n    };\\r\\n    src.issued as s where (src.issued.toDate != src.effectiveDateTime) -> tgt.measurement_source_value = cast(s, 'string');\\r\\n    src.value : Quantity as s -> tgt then {\\r\\n      s.value as a -> tgt.value_as_number = a;\\r\\n      s.unit as b -> tgt.unit_concept_id = b;\\r\\n    }; // src.performer as s -> tgt then {\\r\\n    src.value : CodeableConcept as s -> tgt then {\\r\\n      s.coding as sc -> tgt then {\\r\\n        sc.code as a -> tgt.value_as_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n    src.value : string as b -> tgt.value_source_value = b;\\r\\n    src.interpretation as c -> tgt.value_as_concept_id = c;\\r\\n    src.note as d -> tgt.measurement_source_value = d;\\r\\n  } "OnlyMeasures";\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/MeasurementMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"MeasurementMap\",\n \"title\": \"Mapping Observation resource to Measurement OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Observation instances that are considered measurements to OMOP Measurement Table objects. Currently, this is done by considering the category code and mapping 'vital-signs' and 'laboratory' Observations.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Observation\",\n \"mode\": \"source\",\n \"alias\": \"Observation\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Measurement\",\n \"mode\": \"target\",\n \"alias\": \"MeasureTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"Measures\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Observation\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"MeasureTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"mid\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"mid\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"OnlyMeasures\",\n \"source\": [\n {\n \"context\": \"src\",\n \"condition\": \"('vital-signs' | 'laboratory').supersetOf(Observation.category.coding.code)\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueString\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.measurement_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"effectiveDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"effective\",\n \"variable\": \"edt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"edt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ],\n \"documentation\": \"src.subject as s -> tgt then {\"\n },\n {\n \"name\": \"effectiveInstant\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"instant\",\n \"element\": \"effective\",\n \"variable\": \"einst\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"einst\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"einst\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"effectivePeriod\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"Period\",\n \"element\": \"effective\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"start\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"start\",\n \"variable\": \"eps\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"eps\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"eps\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"issued\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"issued\",\n \"variable\": \"s\",\n \"condition\": \"(src.issued.toDate != src.effectiveDateTime)\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"valueQuantity\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"Quantity\",\n \"element\": \"value\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"value\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"value\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"unit\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"unit\",\n \"variable\": \"b\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"unit_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"b\"\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.performer as s -> tgt then {\"\n },\n {\n \"name\": \"valueCodeableConcept\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"CodeableConcept\",\n \"element\": \"value\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"measurement_type_concept_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"measurement_type_concept_id\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 581458\n }\n ]\n }\n ]\n },\n {\n \"name\": \"valueString\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"string\",\n \"element\": \"value\",\n \"variable\": \"b\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"b\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"interpretation\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"interpretation\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"value_as_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"note\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"note\",\n \"variable\": \"d\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"measurement_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"d\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", - "output_omop_data": "" + "name": "Truncate_OMOP_cdm_table_co", + "description": "Describe the task of node python_node_12", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"condition_occurrence\"\n source_col = \"condition_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 780, - "y": 1300 + "x": 1930, + "y": 420 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 780, - "y": 1300 + "x": 1930, + "y": 420 } }, { - "id": "369f82ce-d9bb-40dd-aa10-e6acf3849bc5", + "id": "e68963a3-0fe1-42bc-9983-2ac3657a2d6b", "data": { - "id": "EncounterVisitMap", - "name": "transform_to_visit_occurrence", - "error": false, - "dataframe": "Encounter_df", - "description": "Describe the task of node transform_fhir_data_node_6", - "errorMessage": null, - "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"EncounterVisitMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap EncounterVisitMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/EncounterVisitMap'\\r\\n/// name = 'EncounterVisitMap'\\r\\n/// title = 'Mapping Encounter resource to VisitOccurrence OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Encounter" alias Encounter as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/VisitOccurrence" alias VisitTable as target\\r\\n\\r\\ngroup VisitOccurrence(source src : Encounter, target tgt : VisitTable) {\\r\\n  src.class as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a ->  tgt.visit_concept_id = a,  tgt.visit_source_value = a,  tgt.visit_source_concept_id = a;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.visit_occurrence_id = cast(id, "integer");\\r\\n  src.actualPeriod as s -> tgt then {\\r\\n    s.start as std ->  tgt.visit_start_date = cast(std, 'date'),  tgt.visit_start_datetime = std;\\r\\n    s.end as ed ->  tgt.visit_end_date = cast(ed, 'date'),  tgt.visit_end_datetime = ed;\\r\\n  };\\r\\n  src.admission as s -> tgt then {\\r\\n    s.admitSource as sa -> tgt then {\\r\\n      sa.coding as sc -> tgt then {\\r\\n        sc.code as code ->  tgt.admitted_from_concept_id = code,  tgt.admitted_from_source_value = code;\\r\\n      };\\r\\n    };\\r\\n    s.dischargeDisposition as sd -> tgt then {\\r\\n      sd.coding as sc -> tgt then {\\r\\n        sc.code as code ->  tgt.discharged_to_concept_id = code,  tgt.discharged_to_source_value = code;\\r\\n      };\\r\\n    };\\r\\n  };\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/EncounterVisitMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"EncounterVisitMap\",\n \"title\": \"Mapping Encounter resource to VisitOccurrence OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Encounter instances to OMOP Visit Occurence Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Encounter\",\n \"mode\": \"source\",\n \"alias\": \"Encounter\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/VisitOccurrence\",\n \"mode\": \"target\",\n \"alias\": \"VisitTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"VisitOccurrence\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Encounter\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"VisitTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"vid\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_occurrence_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"vid\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"visitTypeConceptId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"visitTypeConceptId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueInteger\": 32817\n }\n ]\n }\n ]\n },\n {\n \"name\": \"subject\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"patientRef.substring(8)\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"class\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"class\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.visit_occurrence_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"actualPeriod\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"period\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"start\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"start\",\n \"variable\": \"std\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"std\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"std\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"end\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"end\",\n \"variable\": \"ed\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"visit_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ed\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"visit_end_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ed\"\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"admission\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"admission\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"admitSource\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"admitSource\",\n \"variable\": \"sa\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"sa\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"code\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"admitted_from_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"admitted_from_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"dischargeDisposition\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"dischargeDisposition\",\n \"variable\": \"sd\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"sd\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"code\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"discharged_to_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"discharged_to_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"code\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", - "output_omop_data": "" + "name": "Truncate_OMOP_cdm_table_visit_occ", + "description": "Describe the task of node python_node_13", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"visit_occurrence\"\n source_col = \"visit_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 770, - "y": 730 + "x": 1960, + "y": 710 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 770, - "y": 730 + "x": 1960, + "y": 710 } }, { - "id": "53923929-57cc-4bac-b644-78348d982bb3", + "id": "ebe521a0-6769-47c0-8d4b-c6e74965ee21", "data": { - "id": "ConditionMap", - "name": "transform_to_condition_occurrence", - "error": false, - "dataframe": "Condition_df", - "description": "Describe the task of node transform_fhir_data_node_7", - "errorMessage": null, - "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"ConditionMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap ConditionMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ConditionMap'\\r\\n/// name = 'ConditionMap'\\r\\n/// title = 'Mapping Condition resource to Condition Occurrence OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Condition" alias Condition as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/ConditionOccurrence" alias ConOccTable as target\\r\\n\\r\\ngroup ConditionOccurrence(source src : Condition, target tgt : ConOccTable) {\\r\\n  src.code as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.condition_concept_id = a;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.condition_occurrence_id = cast(id, "integer");\\r\\n  src.recordedDate as rd ->  tgt.condition_start_datetime = cast(rd, 'dateTime'),  tgt.condition_start_date = rd;\\r\\n  src.onset : dateTime as osd ->  tgt.condition_start_datetime = osd,  tgt.condition_start_date = cast(osd, 'date');\\r\\n  src.abatement : dateTime as abdt ->  tgt.condition_end_datetime = adt,  tgt.condition_end_date = cast(abdt, 'date');\\r\\n  src.category as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.condition_type_concept_id = a;\\r\\n    };\\r\\n  };\\r\\n  src.clinicalStatus as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code as a -> tgt.condition_status_concept_id = a;\\r\\n    };\\r\\n  };\\r\\n  src.evidence as s -> tgt then {\\r\\n    s.concept as sc -> tgt then {\\r\\n      sc.coding as sci -> tgt then {\\r\\n        sci.code as a -> tgt.condition_source_concept_id = a;\\r\\n      };\\r\\n    };\\r\\n  }; // src.encounter as s -> tgt then {\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/ConditionMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"ConditionMap\",\n \"title\": \"Mapping Condition resource to Condition Occurrence OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Condition instances to OMOP Condition Occurence Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Condition\",\n \"mode\": \"source\",\n \"alias\": \"Condition\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/ConditionOccurrence\",\n \"mode\": \"target\",\n \"alias\": \"ConOccTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"ConditionOccurrence\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Condition\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"ConOccTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"condition_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"conditionId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_occurrence_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"conditionId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"subject.reference\",\n \"variable\": \"patRef\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patRef\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.condition_occurrence_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"recordedDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"recordedDate\",\n \"variable\": \"rd\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"rd\"\n },\n {\n \"valueString\": \"dateTime\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"rd\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"onsetDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"onset\",\n \"variable\": \"osd\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"osd\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"condition_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"osd\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"abatementDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"abatement\",\n \"variable\": \"abdt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_end_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"adt\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"condition_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"abdt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"category\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"category\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"clinicalStatus\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"clinicalStatus\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_status_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"evidence\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"evidence\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"concept\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"concept\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"coding\",\n \"variable\": \"sci\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sci\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"condition_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.encounter as s -> tgt then {\"\n }\n ]\n }\n ]\n}", - "output_omop_data": "" + "name": "Truncate_OMOP_cdm_table_drug_expo", + "description": "Describe the task of node python_node_14", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"drug_exposure\"\n source_col = \"drug_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 790, - "y": 450 + "x": 1960, + "y": 1020 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 790, - "y": 450 + "x": 1960, + "y": 1020 } }, { - "id": "14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8", + "id": "fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95", "data": { - "id": "PersonMap", - "name": "transform_to_person", - "error": false, - "dataframe": "Patient_df", - "description": "Describe the task of node transform_fhir_data_node_8", - "errorMessage": null, - "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"PersonMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap PersonMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/PersonMap'\\r\\n/// name = 'PersonMap'\\r\\n/// title = 'Mapping Patient resource to Person OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Patient" alias Patient as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/Person" alias PersonTable as target\\r\\n\\r\\ngroup Person(source src : Patient, target tgt : PersonTable) {\\r\\n  src.gender as gender ->  tgt.gender_concept_id = gender,  tgt.gender_source_value = cast(gender, 'string'); // src.id as id -> tgt.person_id = cast(id, "integer");\\r\\n  src.birthDate as bdSrc ->  tgt.birth_datetime = bdSrc,  tgt.year_of_birth = (src.birthDate.toString().substring(0, 4)),  tgt.month_of_birth = (src.birthDate.toString().substring(5, 2)),  tgt.day_of_birth = (src.birthDate.toString().substring(8, 2));\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/PersonMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"PersonMap\",\n \"title\": \"Mapping Patient resource to Person OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Patient instances to OMOP Person Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Patient\",\n \"mode\": \"source\",\n \"alias\": \"Patient\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/Person\",\n \"mode\": \"target\",\n \"alias\": \"PersonTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"Person\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Patient\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"PersonTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"person_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"patientId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"gender\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"gender\",\n \"variable\": \"gender\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"gender_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"gender\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"gender_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"gender\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.person_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"birthDate\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"birthDate\",\n \"variable\": \"bdSrc\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"birth_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"bdSrc\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"year_of_birth\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"birthDate.substring(0,4)\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"month_of_birth\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"birthDate.substring(5,2)\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"day_of_birth\",\n \"transform\": \"evaluate\",\n \"parameter\": [\n {\n \"valueId\": \"src\"\n },\n {\n \"valueString\": \"birthDate.substring(8,2)\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"raceConcept\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"extension.where(url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race').extension.valueCoding.display\",\n \"variable\": \"race\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"race_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"race\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"ethnicity_concept_id\",\n \"documentation\": \"Map FHIR US Core ethnicity extension to OMOP person.ethnicity_concept_id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"extension.where(url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity').extension.where(url = 'ombCategory').valueCoding.code\",\n \"variable\": \"ethnicityCode\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"ethnicity_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"ethnicityCode\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}", - "output_omop_data": "" + "name": "Truncate_OMOP_cdm_table_meas", + "description": "Describe the task of node python_node_15", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"measurement\"\n source_col = \"measurement_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 760, - "y": 150 + "x": 1980, + "y": 1320 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 760, - "y": 150 + "x": 1980, + "y": 1320 } }, { - "id": "9591d4d0-2887-496e-87f9-a4d7ef5c60ef", + "id": "4b85a7d5-6a32-465c-942c-9b843ba63e02", "data": { - "id": "ImmunizationMap", - "name": "transform_to_drug_exposure", - "error": false, - "dataframe": "Immunization_df", - "description": "Describe the task of node transform_fhir_data_node_8", - "errorMessage": null, - "structure_map": "{\n \"resourceType\": \"StructureMap\",\n \"id\": \"ImmunizationMap\",\n \"text\": {\n \"status\": \"generated\",\n \"div\": \"

Generated Narrative: StructureMap ImmunizationMap

\\r\\n/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/ImmunizationMap'\\r\\n/// name = 'ImmunizationMap'\\r\\n/// title = 'Mapping Immunization resource to Drug Exposure OMOP Domain'\\r\\n/// status = 'draft'\\r\\n\\r\\nuses "http://hl7.org/fhir/StructureDefinition/Immunization" alias Immunization as source\\r\\nuses "http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure" alias DrugExposureTable as target\\r\\n\\r\\ngroup DrugExposure(source src : Immunization, target tgt : DrugExposureTable) {\\r\\n  src.vaccineCode as s -> tgt then {\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code ->  tgt.drug_concept_id,  tgt.drug_source_value,  tgt.drug_source_concept_id;\\r\\n    };\\r\\n  }; // src.id as id -> tgt.drug_exposure_id = cast(id, "integer");\\r\\n  src.doseQuantity as s -> tgt then {\\r\\n    s.value as s -> tgt.quantity = cast(s, 'decimal');\\r\\n    s.code as s -> tgt.dose_unit_source_value = cast(s, 'string');\\r\\n  }; // src.patient as s -> tgt then {\\r\\n  src.route as s -> tgt then {\\r\\n    s.text as s -> tgt.route_source_value = cast(s, 'string');\\r\\n    s.coding as sc -> tgt then {\\r\\n      sc.code ->  tgt.route_concept_id,  tgt.route_source_value;\\r\\n    };\\r\\n  };\\r\\n  src.occurrence : dateTime as odt ->  tgt.drug_exposure_start_date = cast(odt, 'date'),  tgt.drug_exposure_start_datetime = odt,  tgt.drug_exposure_end_date = cast(odt, 'date'),  tgt.drug_exposure_end_datetime = odt;\\r\\n  src.lotNumber as s -> tgt.lot_number = cast(s, 'string'); // src.encounter as s -> tgt then {\\r\\n}\\r\\n\\r\\n
\"\n },\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-wg\",\n \"valueCode\": \"brr\"\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm\",\n \"valueInteger\": 1,\n \"_valueInteger\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n },\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status\",\n \"valueCode\": \"informative\",\n \"_valueCode\": {\n \"extension\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/structuredefinition-conformance-derivedFrom\",\n \"valueCanonical\": \"http://hl7.org/fhir/uv/omop/ImplementationGuide/hl7.fhir.uv.omop\"\n }\n ]\n }\n }\n ],\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureMap/ImmunizationMap\",\n \"version\": \"1.0.0-ballot\",\n \"name\": \"ImmunizationMap\",\n \"title\": \"Mapping Immunization resource to Drug Exposure OMOP Domain\",\n \"status\": \"draft\",\n \"date\": \"2025-07-29T17:40:15+00:00\",\n \"publisher\": \"HL7 International / Biomedical Research and Regulation\",\n \"contact\": [\n {\n \"name\": \"HL7 International / Biomedical Research and Regulation\",\n \"telecom\": [\n {\n \"system\": \"url\",\n \"value\": \"http://www.hl7.org/Special/committees/rcrim\"\n }\n ]\n }\n ],\n \"description\": \"This mapping maps FHIR Immunization instances to OMOP Drug Exposure Table objects.\",\n \"jurisdiction\": [\n {\n \"coding\": [\n {\n \"system\": \"http://unstats.un.org/unsd/methods/m49/m49.htm\",\n \"code\": \"001\",\n \"display\": \"World\"\n }\n ]\n }\n ],\n \"structure\": [\n {\n \"url\": \"http://hl7.org/fhir/StructureDefinition/Immunization\",\n \"mode\": \"source\",\n \"alias\": \"Immunization\"\n },\n {\n \"url\": \"http://hl7.org/fhir/uv/omop/StructureDefinition/DrugExposure\",\n \"mode\": \"target\",\n \"alias\": \"DrugExposureTable\"\n }\n ],\n \"group\": [\n {\n \"name\": \"DrugExposure\",\n \"input\": [\n {\n \"name\": \"src\",\n \"type\": \"Immunization\",\n \"mode\": \"source\"\n },\n {\n \"name\": \"tgt\",\n \"type\": \"DrugExposureTable\",\n \"mode\": \"target\"\n }\n ],\n \"rule\": [\n {\n \"name\": \"id\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"id\",\n \"variable\": \"did\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"did\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"mapPatientId\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"patient.reference\",\n \"variable\": \"patientRefId\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"person_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"patientRefId\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"vaccineCode\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"vaccineCode\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\",\n \"variable\": \"a\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"drug_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_source_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_type_concept_id\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"a\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.id as id -> tgt.drug_exposure_id = cast(id, \\\"integer\\\");\"\n },\n {\n \"name\": \"doseQuantity\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"doseQuantity\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"value\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"value\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"quantity\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"decimal\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"code\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"dose_unit_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ]\n }\n ],\n \"documentation\": \"src.patient as s -> tgt then {\"\n },\n {\n \"name\": \"route\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"route\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"text\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"text\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"route_source_value\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"coding\",\n \"source\": [\n {\n \"context\": \"s\",\n \"element\": \"coding\",\n \"variable\": \"sc\"\n }\n ],\n \"target\": [\n {\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"tgt\"\n }\n ]\n }\n ],\n \"rule\": [\n {\n \"name\": \"code\",\n \"source\": [\n {\n \"context\": \"sc\",\n \"element\": \"code\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"route_concept_id\"\n },\n {\n \"context\": \"tgt\",\n \"element\": \"route_source_value\"\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"occurrenceDateTime\",\n \"source\": [\n {\n \"context\": \"src\",\n \"type\": \"dateTime\",\n \"element\": \"occurrence\",\n \"variable\": \"odt\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_start_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_start_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_end_date\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n },\n {\n \"valueString\": \"date\"\n }\n ]\n },\n {\n \"context\": \"tgt\",\n \"element\": \"drug_exposure_end_datetime\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"odt\"\n }\n ]\n }\n ]\n },\n {\n \"name\": \"lotNumber\",\n \"source\": [\n {\n \"context\": \"src\",\n \"element\": \"lotNumber\",\n \"variable\": \"s\"\n }\n ],\n \"target\": [\n {\n \"context\": \"tgt\",\n \"element\": \"lot_number\",\n \"transform\": \"copy\",\n \"parameter\": [\n {\n \"valueId\": \"s\"\n },\n {\n \"valueString\": \"string\"\n }\n ]\n }\n ],\n \"documentation\": \"src.encounter as s -> tgt then {\"\n }\n ]\n }\n ]\n}", - "output_omop_data": "" + "name": "Truncate_OMOP_cdm_table_drug_exp", + "description": "Describe the task of node python_node_16", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"drug_exposure\"\n source_col = \"drug_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "transform_fhir_data_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 770, - "y": 1010 - }, + "x": 2020, + "y": 1600 + }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 770, - "y": 1010 + "x": 2020, + "y": 1600 } }, { - "id": "c4ae2475-ebb4-4bb7-bd92-5e711d93f20d", + "id": "fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1", "data": { - "name": "validate_cdm_data_drug_exp", - "error": false, - "description": "Describe the task of node python_node_1", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"drug_exposure_id\",\n \"person_id\",\n \"drug_concept_id\",\n \"drug_exposure_start_date\",\n \"drug_exposure_end_date\",\n \"drug_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_drug_exposure\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", - "errorMessage": null + "name": "Truncate_OMOP_cdm_table_obs", + "description": "Describe the task of node python_node_17", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"observation\"\n source_col = \"observation_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 1450, - "y": 1030 + "x": 2020, + "y": 1900 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 1450, - "y": 1030 + "x": 2020, + "y": 1900 } }, { - "id": "c9ff11c9-d269-4035-b70a-523b4b92ebb6", + "id": "312d8dce-4c22-481a-b37e-07f7ce04a0bc", "data": { - "map": {}, - "name": "py2table_drug_exposure", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_9" + "name": "Truncate_OMOP_cdm_table_procedure_occ", + "description": "Describe the task of node python_node_18", + "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n database_code = dest_db\n cdm_schema = dest_schema\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"procedure_occurrence\"\n source_col = \"procedure_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" }, - "type": "py2table_node", + "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 2550, - "y": 1030 + "x": 2020, + "y": 2200 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 2550, - "y": 1030 + "x": 2020, + "y": 2200 } }, { - "id": "fc3206ff-ae52-43ed-8ef7-6d8cb525e698", + "id": "05615b95-3ccc-4a81-99bf-8c5a1f9c2a8d", "data": { - "name": "validate_cdm_data_meas", - "error": false, - "description": "Describe the task of node python_node_2", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"measurement_id\",\n \"person_id\",\n \"measurement_concept_id\",\n \"measurement_date\",\n \"measurement_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_measurement\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", - "errorMessage": null + "name": "Truncate_omop_tables", + "description": "Describe the task of node python_node_19", + "python_code": "def exec(myinput):\n dbdao = DBDao(database_code=database_code)\n # Truncate tables\n dbdao.truncate_table(cdm_schema, \"observation\")\n dbdao.truncate_table(cdm_schema, \"measurement\")\n dbdao.truncate_table(cdm_schema, \"person\")\n dbdao.truncate_table(cdm_schema, \"visit_occurrence\")\n dbdao.truncate_table(cdm_schema, \"procedure_occurrence\")\n dbdao.truncate_table(cdm_schema, \"drug_exposure\")\n dbdao.truncate_table(cdm_schema, \"condition_occurrence\")\n return \"true\" " }, "type": "python_node", "width": 350, "height": 210, "dragging": false, "position": { - "x": 1420, - "y": 1310 + "x": -650, + "y": -530 }, "selected": false, "dragHandle": "", "sourcePosition": "right", "targetPosition": "left", "positionAbsolute": { - "x": 1420, - "y": 1310 + "x": -650, + "y": -530 } - }, + } + ], + "edges": [ { - "id": "97e789e0-8b0b-49be-ad53-588599053812", - "data": { - "map": {}, - "name": "py2table_to_measurement", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_10" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2580, - "y": 1310 - }, + "id": "reactflow__edge-bc7f2e99-5533-4719-b86a-1a9a83da684fsource_bc7f2e99-5533-4719-b86a-1a9a83da684f_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "bc7f2e99-5533-4719-b86a-1a9a83da684f", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2580, - "y": 1310 - } + "sourceHandle": "source_bc7f2e99-5533-4719-b86a-1a9a83da684f_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "7d661465-6ce0-44af-80d7-fd533a1acae9", - "data": { - "name": "validate_cdm_data_drug_exp", - "description": "Describe the task of node python_node_3", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"drug_exposure_id\",\n \"person_id\",\n \"drug_concept_id\",\n \"drug_exposure_start_date\",\n \"drug_exposure_end_date\",\n \"drug_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_drug_exposure\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1410, - "y": 1590 - }, + "id": "reactflow__edge-b52d463b-e05c-44ad-90a9-7ac912b35314source_b52d463b-e05c-44ad-90a9-7ac912b35314_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "b52d463b-e05c-44ad-90a9-7ac912b35314", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1410, - "y": 1590 - } + "sourceHandle": "source_b52d463b-e05c-44ad-90a9-7ac912b35314_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "09e016fe-ee22-4853-ad40-83917ba84537", - "data": { - "map": {}, - "name": "py2table_to_drug_exposure", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_11" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2620, - "y": 1590 - }, + "id": "reactflow__edge-4a4209c6-84f1-4afe-85a6-2c3aecfee44bsource_4a4209c6-84f1-4afe-85a6-2c3aecfee44b_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "4a4209c6-84f1-4afe-85a6-2c3aecfee44b", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2620, - "y": 1590 - } + "sourceHandle": "source_4a4209c6-84f1-4afe-85a6-2c3aecfee44b_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "ca83c219-1ab9-44bf-9af6-c158e51f7214", - "data": { - "name": "validate_cdm_data_Obs", - "error": false, - "description": "Describe the task of node python_node_4", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"observation_date\",\n \"observation_id\",\n \"person_id\",\n \"observation_type_concept_id\",\n \"observation_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_observation\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", - "errorMessage": null - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1410, - "y": 1890 - }, + "id": "reactflow__edge-fcab0880-2901-49fb-8e3c-e73735a07030source_fcab0880-2901-49fb-8e3c-e73735a07030_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "fcab0880-2901-49fb-8e3c-e73735a07030", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1410, - "y": 1890 - } + "sourceHandle": "source_fcab0880-2901-49fb-8e3c-e73735a07030_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "cc4c773e-a0bd-4894-9908-00ad541c310d", - "data": { - "map": {}, - "name": "py2table_to_observation", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_12" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2700, - "y": 1900 - }, + "id": "reactflow__edge-97d2d719-131e-4e91-9965-5dacc4f77bbasource_97d2d719-131e-4e91-9965-5dacc4f77bba_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "97d2d719-131e-4e91-9965-5dacc4f77bba", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2700, - "y": 1900 - } + "sourceHandle": "source_97d2d719-131e-4e91-9965-5dacc4f77bba_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "43ad560c-fdba-43b6-9236-4baadb718c42", - "data": { - "name": "validate_cdm_data_proc_occ", - "description": "Describe the task of node python_node_5", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"procedure_occurrence_id\",\n \"person_id\",\n \"procedure_concept_id\",\n \"procedure_date\",\n \"procedure_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_procedure_occurrence\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1400, - "y": 2200 - }, + "id": "reactflow__edge-644c6dc1-72bf-4f5b-8a64-620407a36e3asource_644c6dc1-72bf-4f5b-8a64-620407a36e3a_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "644c6dc1-72bf-4f5b-8a64-620407a36e3a", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1400, - "y": 2200 - } + "sourceHandle": "source_644c6dc1-72bf-4f5b-8a64-620407a36e3a_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "e8e268b6-3e03-4468-b386-5e00c6051ca1", - "data": { - "map": {}, - "name": "py2table_to_procedure_occurrence", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_13" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2680, - "y": 2190 - }, + "id": "reactflow__edge-140dffdd-9b98-46a7-ae23-b2b8a6a79a4esource_140dffdd-9b98-46a7-ae23-b2b8a6a79a4e_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "140dffdd-9b98-46a7-ae23-b2b8a6a79a4e", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2680, - "y": 2190 - } + "sourceHandle": "source_140dffdd-9b98-46a7-ae23-b2b8a6a79a4e_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "861da43e-01e9-4eac-9136-2547228077f4", - "data": { - "map": {}, - "name": "py2table_to_visit_occurrence", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_14" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2560, - "y": 740 - }, + "id": "reactflow__edge-230782cf-935e-4354-9c89-db8a2f37bf99source_230782cf-935e-4354-9c89-db8a2f37bf99_dataframe-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any", + "source": "230782cf-935e-4354-9c89-db8a2f37bf99", + "target": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2560, - "y": 740 - } + "sourceHandle": "source_230782cf-935e-4354-9c89-db8a2f37bf99_dataframe", + "targetHandle": "target_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_any" }, { - "id": "2d29943f-969e-4b33-b8a1-48b4172a7bdf", - "data": { - "name": "validate_cdm_data_co", - "error": false, - "description": "Describe the task of node python_node_7", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"condition_occurrence_id\",\n \"person_id\",\n \"condition_concept_id\",\n \"condition_start_date\",\n \"condition_type_concept_id\"\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_condition_occurrence\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", - "errorMessage": null - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1390, - "y": 430 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-9658364f-9788-4bbd-91f4-2fb8fdde5d1btarget_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "9658364f-9788-4bbd-91f4-2fb8fdde5d1b", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1390, - "y": 430 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_object" }, { - "id": "4fbeac17-add6-494f-a75a-4eed55d17c85", - "data": { - "map": {}, - "name": "py2table_to_condition_occurrence", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_15" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2590, - "y": 440 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-3c3f5888-5462-4fa6-8e9b-132d06e3e3d5target_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "3c3f5888-5462-4fa6-8e9b-132d06e3e3d5", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2590, - "y": 440 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_object" }, { - "id": "0457459b-833a-4563-b702-807031462160", - "data": { - "name": "validate_cdm_data_person", - "error": false, - "description": "Describe the task of node python_node_8", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"person_id\",\n \"gender_concept_id\",\n \"year_of_birth\",\n \"race_concept_id\",\n \"ethnicity_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_person\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", - "errorMessage": null - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1360, - "y": 140 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-227a0e41-40fc-4219-90e5-2c46ea7b1879target_227a0e41-40fc-4219-90e5-2c46ea7b1879_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "227a0e41-40fc-4219-90e5-2c46ea7b1879", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1360, - "y": 140 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_227a0e41-40fc-4219-90e5-2c46ea7b1879_object" }, { - "id": "bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5", - "data": { - "map": {}, - "name": "py2table_to_person", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_16" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2570, - "y": 130 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-3c69d63f-131c-4ce0-a9cb-a735c1bfd8abtarget_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2570, - "y": 130 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_object" }, { - "id": "a06d966c-271c-4fe7-8fb2-e2c8443dd22e", - "data": { - "name": "validate_cdm_data", - "description": "Describe the task of node python_node_9", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"observation_date\",\n \"observation_id\",\n \"person_id\",\n \"observation_type_concept_id\",\n \"observation_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_Observation\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1370, - "y": -190 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-e332b9d8-a600-4d2a-94cb-fff53ab01a5dtarget_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "e332b9d8-a600-4d2a-94cb-fff53ab01a5d", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1370, - "y": -190 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_object" }, { - "id": "6b6a799b-4e67-47fc-8e1b-6050515bfcfe", - "data": { - "map": {}, - "name": "py2table_to_observation", - "uiMap": { - "path": "$", - "source": "Truncate_OMOP_cdm_tables" - }, - "description": "Describe the task of node py2table_node_17" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2540, - "y": -200 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-5d62e682-992f-4788-8855-5216eebad563target_5d62e682-992f-4788-8855-5216eebad563_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "5d62e682-992f-4788-8855-5216eebad563", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2540, - "y": -200 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_5d62e682-992f-4788-8855-5216eebad563_object" }, { - "id": "1c1853ac-6c80-41c3-8c02-c013f42c4917", - "data": { - "name": "validate_cdm_data_vo", - "error": false, - "description": "Describe the task of node python_node_9", - "python_code": "import pandas as pd\n\nREQUIRED_COLS = [\n \"visit_occurrence_id\",\n \"person_id\",\n \"visit_concept_id\",\n \"visit_end_date\",\n \"visit_start_date\",\n \"visit_type_concept_id\",\n]\n\ndef exec(myinput):\n df = myinput.get(\"transform_to_visit_occurrence\").result\n valid_df = df.dropna(subset=REQUIRED_COLS)\n return valid_df\n", - "errorMessage": null - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1380, - "y": 710 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-f67d926f-24be-4a64-848b-8f9e69a5e55etarget_f67d926f-24be-4a64-848b-8f9e69a5e55e_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "f67d926f-24be-4a64-848b-8f9e69a5e55e", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1380, - "y": 710 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_f67d926f-24be-4a64-848b-8f9e69a5e55e_object" }, { - "id": "f217a843-35d9-4fbb-8f08-ee9be931dc68", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_10", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"observation\"\n source_col = \"observation_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1930, - "y": -200 - }, + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-dbb730a1-1499-462e-9d67-4585bb9a9662target_dbb730a1-1499-462e-9d67-4585bb9a9662_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "dbb730a1-1499-462e-9d67-4585bb9a9662", "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1930, - "y": -200 - } + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_dbb730a1-1499-462e-9d67-4585bb9a9662_object" + }, + { + "id": "reactflow__edge-1c9c746c-1ef1-4bca-b294-59e8d81f0fe3source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object-f758c084-1da4-4a3c-8f96-af873953b6c6target_f758c084-1da4-4a3c-8f96-af873953b6c6_object", + "source": "1c9c746c-1ef1-4bca-b294-59e8d81f0fe3", + "target": "f758c084-1da4-4a3c-8f96-af873953b6c6", + "selected": false, + "sourceHandle": "source_1c9c746c-1ef1-4bca-b294-59e8d81f0fe3_object", + "targetHandle": "target_f758c084-1da4-4a3c-8f96-af873953b6c6_object" + }, + { + "id": "reactflow__edge-9658364f-9788-4bbd-91f4-2fb8fdde5d1bsource_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_dataframe-07cfed06-756e-4cb8-b65b-1d763fb4a98ftarget_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe", + "source": "9658364f-9788-4bbd-91f4-2fb8fdde5d1b", + "target": "07cfed06-756e-4cb8-b65b-1d763fb4a98f", + "sourceHandle": "source_9658364f-9788-4bbd-91f4-2fb8fdde5d1b_dataframe", + "targetHandle": "target_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe" + }, + { + "id": "reactflow__edge-f758c084-1da4-4a3c-8f96-af873953b6c6source_f758c084-1da4-4a3c-8f96-af873953b6c6_dataframe-0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3target_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe", + "source": "f758c084-1da4-4a3c-8f96-af873953b6c6", + "target": "0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3", + "sourceHandle": "source_f758c084-1da4-4a3c-8f96-af873953b6c6_dataframe", + "targetHandle": "target_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe" + }, + { + "id": "reactflow__edge-dbb730a1-1499-462e-9d67-4585bb9a9662source_dbb730a1-1499-462e-9d67-4585bb9a9662_dataframe-2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0target_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe", + "source": "dbb730a1-1499-462e-9d67-4585bb9a9662", + "target": "2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0", + "sourceHandle": "source_dbb730a1-1499-462e-9d67-4585bb9a9662_dataframe", + "targetHandle": "target_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe" + }, + { + "id": "reactflow__edge-f67d926f-24be-4a64-848b-8f9e69a5e55esource_f67d926f-24be-4a64-848b-8f9e69a5e55e_dataframe-ab80716e-87b1-479c-bd4e-c95d43b35fe6target_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe", + "source": "f67d926f-24be-4a64-848b-8f9e69a5e55e", + "target": "ab80716e-87b1-479c-bd4e-c95d43b35fe6", + "sourceHandle": "source_f67d926f-24be-4a64-848b-8f9e69a5e55e_dataframe", + "targetHandle": "target_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe" + }, + { + "id": "reactflow__edge-5d62e682-992f-4788-8855-5216eebad563source_5d62e682-992f-4788-8855-5216eebad563_dataframe-b7f82a01-dd6e-4b76-bd72-53d069da2e72target_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe", + "source": "5d62e682-992f-4788-8855-5216eebad563", + "target": "b7f82a01-dd6e-4b76-bd72-53d069da2e72", + "selected": false, + "sourceHandle": "source_5d62e682-992f-4788-8855-5216eebad563_dataframe", + "targetHandle": "target_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe" + }, + { + "id": "reactflow__edge-3c69d63f-131c-4ce0-a9cb-a735c1bfd8absource_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_dataframe-369f82ce-d9bb-40dd-aa10-e6acf3849bc5target_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe", + "source": "3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab", + "target": "369f82ce-d9bb-40dd-aa10-e6acf3849bc5", + "selected": false, + "sourceHandle": "source_3c69d63f-131c-4ce0-a9cb-a735c1bfd8ab_dataframe", + "targetHandle": "target_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe" + }, + { + "id": "reactflow__edge-227a0e41-40fc-4219-90e5-2c46ea7b1879source_227a0e41-40fc-4219-90e5-2c46ea7b1879_dataframe-53923929-57cc-4bac-b644-78348d982bb3target_53923929-57cc-4bac-b644-78348d982bb3_dataframe", + "source": "227a0e41-40fc-4219-90e5-2c46ea7b1879", + "target": "53923929-57cc-4bac-b644-78348d982bb3", + "sourceHandle": "source_227a0e41-40fc-4219-90e5-2c46ea7b1879_dataframe", + "targetHandle": "target_53923929-57cc-4bac-b644-78348d982bb3_dataframe" + }, + { + "id": "reactflow__edge-3c3f5888-5462-4fa6-8e9b-132d06e3e3d5source_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_dataframe-14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8target_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe", + "source": "3c3f5888-5462-4fa6-8e9b-132d06e3e3d5", + "target": "14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8", + "sourceHandle": "source_3c3f5888-5462-4fa6-8e9b-132d06e3e3d5_dataframe", + "targetHandle": "target_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe" + }, + { + "id": "reactflow__edge-e332b9d8-a600-4d2a-94cb-fff53ab01a5dsource_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_dataframe-9591d4d0-2887-496e-87f9-a4d7ef5c60eftarget_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe", + "source": "e332b9d8-a600-4d2a-94cb-fff53ab01a5d", + "target": "9591d4d0-2887-496e-87f9-a4d7ef5c60ef", + "selected": false, + "sourceHandle": "source_e332b9d8-a600-4d2a-94cb-fff53ab01a5d_dataframe", + "targetHandle": "target_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe" + }, + { + "id": "reactflow__edge-9591d4d0-2887-496e-87f9-a4d7ef5c60efsource_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe-c4ae2475-ebb4-4bb7-bd92-5e711d93f20dtarget_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_any", + "source": "9591d4d0-2887-496e-87f9-a4d7ef5c60ef", + "target": "c4ae2475-ebb4-4bb7-bd92-5e711d93f20d", + "sourceHandle": "source_9591d4d0-2887-496e-87f9-a4d7ef5c60ef_dataframe", + "targetHandle": "target_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_any" + }, + { + "id": "reactflow__edge-c9ff11c9-d269-4035-b70a-523b4b92ebb6source_c9ff11c9-d269-4035-b70a-523b4b92ebb6_dataframe-b3e0cbd2-1680-4d5a-8a58-a74d636f1696target_b3e0cbd2-1680-4d5a-8a58-a74d636f1696_dataframe", + "source": "c9ff11c9-d269-4035-b70a-523b4b92ebb6", + "target": "b3e0cbd2-1680-4d5a-8a58-a74d636f1696", + "sourceHandle": "source_c9ff11c9-d269-4035-b70a-523b4b92ebb6_dataframe", + "targetHandle": "target_b3e0cbd2-1680-4d5a-8a58-a74d636f1696_dataframe" + }, + { + "id": "reactflow__edge-b7f82a01-dd6e-4b76-bd72-53d069da2e72source_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe-fc3206ff-ae52-43ed-8ef7-6d8cb525e698target_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_any", + "source": "b7f82a01-dd6e-4b76-bd72-53d069da2e72", + "target": "fc3206ff-ae52-43ed-8ef7-6d8cb525e698", + "selected": false, + "sourceHandle": "source_b7f82a01-dd6e-4b76-bd72-53d069da2e72_dataframe", + "targetHandle": "target_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_any" + }, + { + "id": "reactflow__edge-97e789e0-8b0b-49be-ad53-588599053812source_97e789e0-8b0b-49be-ad53-588599053812_dataframe-9fff2d40-4802-46a6-9e9a-7615c47b7754target_9fff2d40-4802-46a6-9e9a-7615c47b7754_dataframe", + "source": "97e789e0-8b0b-49be-ad53-588599053812", + "target": "9fff2d40-4802-46a6-9e9a-7615c47b7754", + "sourceHandle": "source_97e789e0-8b0b-49be-ad53-588599053812_dataframe", + "targetHandle": "target_9fff2d40-4802-46a6-9e9a-7615c47b7754_dataframe" + }, + { + "id": "reactflow__edge-ab80716e-87b1-479c-bd4e-c95d43b35fe6source_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe-7d661465-6ce0-44af-80d7-fd533a1acae9target_7d661465-6ce0-44af-80d7-fd533a1acae9_any", + "source": "ab80716e-87b1-479c-bd4e-c95d43b35fe6", + "target": "7d661465-6ce0-44af-80d7-fd533a1acae9", + "sourceHandle": "source_ab80716e-87b1-479c-bd4e-c95d43b35fe6_dataframe", + "targetHandle": "target_7d661465-6ce0-44af-80d7-fd533a1acae9_any" + }, + { + "id": "reactflow__edge-09e016fe-ee22-4853-ad40-83917ba84537source_09e016fe-ee22-4853-ad40-83917ba84537_dataframe-345c3710-002f-4c6d-843b-94e873927548target_345c3710-002f-4c6d-843b-94e873927548_dataframe", + "source": "09e016fe-ee22-4853-ad40-83917ba84537", + "target": "345c3710-002f-4c6d-843b-94e873927548", + "sourceHandle": "source_09e016fe-ee22-4853-ad40-83917ba84537_dataframe", + "targetHandle": "target_345c3710-002f-4c6d-843b-94e873927548_dataframe" + }, + { + "id": "reactflow__edge-2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0source_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe-ca83c219-1ab9-44bf-9af6-c158e51f7214target_ca83c219-1ab9-44bf-9af6-c158e51f7214_any", + "source": "2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0", + "target": "ca83c219-1ab9-44bf-9af6-c158e51f7214", + "sourceHandle": "source_2db7ffaa-b9cc-4bd2-8f62-5a0059c5cea0_dataframe", + "targetHandle": "target_ca83c219-1ab9-44bf-9af6-c158e51f7214_any" + }, + { + "id": "reactflow__edge-cc4c773e-a0bd-4894-9908-00ad541c310dsource_cc4c773e-a0bd-4894-9908-00ad541c310d_dataframe-a51a4106-095e-49a8-a868-db5874ed60f5target_a51a4106-095e-49a8-a868-db5874ed60f5_dataframe", + "source": "cc4c773e-a0bd-4894-9908-00ad541c310d", + "target": "a51a4106-095e-49a8-a868-db5874ed60f5", + "sourceHandle": "source_cc4c773e-a0bd-4894-9908-00ad541c310d_dataframe", + "targetHandle": "target_a51a4106-095e-49a8-a868-db5874ed60f5_dataframe" + }, + { + "id": "reactflow__edge-0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3source_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe-43ad560c-fdba-43b6-9236-4baadb718c42target_43ad560c-fdba-43b6-9236-4baadb718c42_any", + "source": "0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3", + "target": "43ad560c-fdba-43b6-9236-4baadb718c42", + "sourceHandle": "source_0a9450ec-38f8-4c3f-b735-1f2abbdd3fc3_dataframe", + "targetHandle": "target_43ad560c-fdba-43b6-9236-4baadb718c42_any" + }, + { + "id": "reactflow__edge-e8e268b6-3e03-4468-b386-5e00c6051ca1source_e8e268b6-3e03-4468-b386-5e00c6051ca1_dataframe-cf76f9a9-321b-469f-8779-fc8945fd50f6target_cf76f9a9-321b-469f-8779-fc8945fd50f6_dataframe", + "source": "e8e268b6-3e03-4468-b386-5e00c6051ca1", + "target": "cf76f9a9-321b-469f-8779-fc8945fd50f6", + "sourceHandle": "source_e8e268b6-3e03-4468-b386-5e00c6051ca1_dataframe", + "targetHandle": "target_cf76f9a9-321b-469f-8779-fc8945fd50f6_dataframe" + }, + { + "id": "reactflow__edge-861da43e-01e9-4eac-9136-2547228077f4source_861da43e-01e9-4eac-9136-2547228077f4_dataframe-c59e95aa-1642-4f04-a07d-c19a496aca91target_c59e95aa-1642-4f04-a07d-c19a496aca91_dataframe", + "source": "861da43e-01e9-4eac-9136-2547228077f4", + "target": "c59e95aa-1642-4f04-a07d-c19a496aca91", + "sourceHandle": "source_861da43e-01e9-4eac-9136-2547228077f4_dataframe", + "targetHandle": "target_c59e95aa-1642-4f04-a07d-c19a496aca91_dataframe" + }, + { + "id": "reactflow__edge-07cfed06-756e-4cb8-b65b-1d763fb4a98fsource_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe-a06d966c-271c-4fe7-8fb2-e2c8443dd22etarget_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_any", + "source": "07cfed06-756e-4cb8-b65b-1d763fb4a98f", + "target": "a06d966c-271c-4fe7-8fb2-e2c8443dd22e", + "sourceHandle": "source_07cfed06-756e-4cb8-b65b-1d763fb4a98f_dataframe", + "targetHandle": "target_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_any" + }, + { + "id": "reactflow__edge-6b6a799b-4e67-47fc-8e1b-6050515bfcfesource_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_dataframe-5f6d6ed6-01e1-4186-89cc-6574cd046d40target_5f6d6ed6-01e1-4186-89cc-6574cd046d40_dataframe", + "source": "6b6a799b-4e67-47fc-8e1b-6050515bfcfe", + "target": "5f6d6ed6-01e1-4186-89cc-6574cd046d40", + "sourceHandle": "source_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_dataframe", + "targetHandle": "target_5f6d6ed6-01e1-4186-89cc-6574cd046d40_dataframe" + }, + { + "id": "reactflow__edge-14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8source_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe-0457459b-833a-4563-b702-807031462160target_0457459b-833a-4563-b702-807031462160_any", + "source": "14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8", + "target": "0457459b-833a-4563-b702-807031462160", + "sourceHandle": "source_14f6c52b-5c9e-4cb7-8ed9-8636c4e6bed8_dataframe", + "targetHandle": "target_0457459b-833a-4563-b702-807031462160_any" + }, + { + "id": "reactflow__edge-bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5source_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_dataframe-4b92d9e9-6a59-459f-8fc5-5a8ff5824bcatarget_4b92d9e9-6a59-459f-8fc5-5a8ff5824bca_dataframe", + "source": "bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5", + "target": "4b92d9e9-6a59-459f-8fc5-5a8ff5824bca", + "sourceHandle": "source_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_dataframe", + "targetHandle": "target_4b92d9e9-6a59-459f-8fc5-5a8ff5824bca_dataframe" + }, + { + "id": "reactflow__edge-53923929-57cc-4bac-b644-78348d982bb3source_53923929-57cc-4bac-b644-78348d982bb3_dataframe-2d29943f-969e-4b33-b8a1-48b4172a7bdftarget_2d29943f-969e-4b33-b8a1-48b4172a7bdf_any", + "source": "53923929-57cc-4bac-b644-78348d982bb3", + "target": "2d29943f-969e-4b33-b8a1-48b4172a7bdf", + "sourceHandle": "source_53923929-57cc-4bac-b644-78348d982bb3_dataframe", + "targetHandle": "target_2d29943f-969e-4b33-b8a1-48b4172a7bdf_any" + }, + { + "id": "reactflow__edge-4fbeac17-add6-494f-a75a-4eed55d17c85source_4fbeac17-add6-494f-a75a-4eed55d17c85_dataframe-5b177aca-870c-4745-95e1-6305ee390261target_5b177aca-870c-4745-95e1-6305ee390261_dataframe", + "source": "4fbeac17-add6-494f-a75a-4eed55d17c85", + "target": "5b177aca-870c-4745-95e1-6305ee390261", + "sourceHandle": "source_4fbeac17-add6-494f-a75a-4eed55d17c85_dataframe", + "targetHandle": "target_5b177aca-870c-4745-95e1-6305ee390261_dataframe" + }, + { + "id": "reactflow__edge-369f82ce-d9bb-40dd-aa10-e6acf3849bc5source_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe-1c1853ac-6c80-41c3-8c02-c013f42c4917target_1c1853ac-6c80-41c3-8c02-c013f42c4917_any", + "source": "369f82ce-d9bb-40dd-aa10-e6acf3849bc5", + "target": "1c1853ac-6c80-41c3-8c02-c013f42c4917", + "sourceHandle": "source_369f82ce-d9bb-40dd-aa10-e6acf3849bc5_dataframe", + "targetHandle": "target_1c1853ac-6c80-41c3-8c02-c013f42c4917_any" + }, + { + "id": "reactflow__edge-a06d966c-271c-4fe7-8fb2-e2c8443dd22esource_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_object-f217a843-35d9-4fbb-8f08-ee9be931dc68target_f217a843-35d9-4fbb-8f08-ee9be931dc68_any", + "source": "a06d966c-271c-4fe7-8fb2-e2c8443dd22e", + "target": "f217a843-35d9-4fbb-8f08-ee9be931dc68", + "sourceHandle": "source_a06d966c-271c-4fe7-8fb2-e2c8443dd22e_object", + "targetHandle": "target_f217a843-35d9-4fbb-8f08-ee9be931dc68_any" + }, + { + "id": "reactflow__edge-f217a843-35d9-4fbb-8f08-ee9be931dc68source_f217a843-35d9-4fbb-8f08-ee9be931dc68_object-6b6a799b-4e67-47fc-8e1b-6050515bfcfetarget_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_object", + "source": "f217a843-35d9-4fbb-8f08-ee9be931dc68", + "target": "6b6a799b-4e67-47fc-8e1b-6050515bfcfe", + "sourceHandle": "source_f217a843-35d9-4fbb-8f08-ee9be931dc68_object", + "targetHandle": "target_6b6a799b-4e67-47fc-8e1b-6050515bfcfe_object" + }, + { + "id": "reactflow__edge-0457459b-833a-4563-b702-807031462160source_0457459b-833a-4563-b702-807031462160_object-417bf8c6-9c9b-4ea5-a684-222fb68f786ftarget_417bf8c6-9c9b-4ea5-a684-222fb68f786f_any", + "source": "0457459b-833a-4563-b702-807031462160", + "target": "417bf8c6-9c9b-4ea5-a684-222fb68f786f", + "sourceHandle": "source_0457459b-833a-4563-b702-807031462160_object", + "targetHandle": "target_417bf8c6-9c9b-4ea5-a684-222fb68f786f_any" + }, + { + "id": "reactflow__edge-417bf8c6-9c9b-4ea5-a684-222fb68f786fsource_417bf8c6-9c9b-4ea5-a684-222fb68f786f_object-bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5target_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_object", + "source": "417bf8c6-9c9b-4ea5-a684-222fb68f786f", + "target": "bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5", + "sourceHandle": "source_417bf8c6-9c9b-4ea5-a684-222fb68f786f_object", + "targetHandle": "target_bdb6b7b0-f502-4406-9f66-cd0ac2e86ee5_object" + }, + { + "id": "reactflow__edge-2d29943f-969e-4b33-b8a1-48b4172a7bdfsource_2d29943f-969e-4b33-b8a1-48b4172a7bdf_object-f291bb65-0804-40cb-989c-d65387218938target_f291bb65-0804-40cb-989c-d65387218938_any", + "source": "2d29943f-969e-4b33-b8a1-48b4172a7bdf", + "target": "f291bb65-0804-40cb-989c-d65387218938", + "sourceHandle": "source_2d29943f-969e-4b33-b8a1-48b4172a7bdf_object", + "targetHandle": "target_f291bb65-0804-40cb-989c-d65387218938_any" + }, + { + "id": "reactflow__edge-f291bb65-0804-40cb-989c-d65387218938source_f291bb65-0804-40cb-989c-d65387218938_object-4fbeac17-add6-494f-a75a-4eed55d17c85target_4fbeac17-add6-494f-a75a-4eed55d17c85_object", + "source": "f291bb65-0804-40cb-989c-d65387218938", + "target": "4fbeac17-add6-494f-a75a-4eed55d17c85", + "sourceHandle": "source_f291bb65-0804-40cb-989c-d65387218938_object", + "targetHandle": "target_4fbeac17-add6-494f-a75a-4eed55d17c85_object" }, { - "id": "417bf8c6-9c9b-4ea5-a684-222fb68f786f", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_11", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"person\"\n source_col = \"person_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1920, - "y": 140 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1920, - "y": 140 - } + "id": "reactflow__edge-1c1853ac-6c80-41c3-8c02-c013f42c4917source_1c1853ac-6c80-41c3-8c02-c013f42c4917_object-e68963a3-0fe1-42bc-9983-2ac3657a2d6btarget_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_any", + "source": "1c1853ac-6c80-41c3-8c02-c013f42c4917", + "target": "e68963a3-0fe1-42bc-9983-2ac3657a2d6b", + "sourceHandle": "source_1c1853ac-6c80-41c3-8c02-c013f42c4917_object", + "targetHandle": "target_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_any" }, { - "id": "f291bb65-0804-40cb-989c-d65387218938", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_12", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"condition_occurrence\"\n source_col = \"condition_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1930, - "y": 420 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1930, - "y": 420 - } + "id": "reactflow__edge-e68963a3-0fe1-42bc-9983-2ac3657a2d6bsource_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_object-861da43e-01e9-4eac-9136-2547228077f4target_861da43e-01e9-4eac-9136-2547228077f4_object", + "source": "e68963a3-0fe1-42bc-9983-2ac3657a2d6b", + "target": "861da43e-01e9-4eac-9136-2547228077f4", + "sourceHandle": "source_e68963a3-0fe1-42bc-9983-2ac3657a2d6b_object", + "targetHandle": "target_861da43e-01e9-4eac-9136-2547228077f4_object" }, { - "id": "e68963a3-0fe1-42bc-9983-2ac3657a2d6b", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_13", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"visit_occurrence\"\n source_col = \"visit_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1960, - "y": 710 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1960, - "y": 710 - } + "id": "reactflow__edge-c4ae2475-ebb4-4bb7-bd92-5e711d93f20dsource_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_object-ebe521a0-6769-47c0-8d4b-c6e74965ee21target_ebe521a0-6769-47c0-8d4b-c6e74965ee21_any", + "source": "c4ae2475-ebb4-4bb7-bd92-5e711d93f20d", + "target": "ebe521a0-6769-47c0-8d4b-c6e74965ee21", + "sourceHandle": "source_c4ae2475-ebb4-4bb7-bd92-5e711d93f20d_object", + "targetHandle": "target_ebe521a0-6769-47c0-8d4b-c6e74965ee21_any" }, { - "id": "ebe521a0-6769-47c0-8d4b-c6e74965ee21", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_14", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"drug_exposure\"\n source_col = \"drug_source_value\"\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1960, - "y": 1020 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1960, - "y": 1020 - } + "id": "reactflow__edge-ebe521a0-6769-47c0-8d4b-c6e74965ee21source_ebe521a0-6769-47c0-8d4b-c6e74965ee21_object-c9ff11c9-d269-4035-b70a-523b4b92ebb6target_c9ff11c9-d269-4035-b70a-523b4b92ebb6_object", + "source": "ebe521a0-6769-47c0-8d4b-c6e74965ee21", + "target": "c9ff11c9-d269-4035-b70a-523b4b92ebb6", + "sourceHandle": "source_ebe521a0-6769-47c0-8d4b-c6e74965ee21_object", + "targetHandle": "target_c9ff11c9-d269-4035-b70a-523b4b92ebb6_object" }, { - "id": "fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_15", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"measurement\"\n source_col = \"measurement_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1980, - "y": 1320 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1980, - "y": 1320 - } + "id": "reactflow__edge-fc3206ff-ae52-43ed-8ef7-6d8cb525e698source_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_object-fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95target_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_any", + "source": "fc3206ff-ae52-43ed-8ef7-6d8cb525e698", + "target": "fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95", + "sourceHandle": "source_fc3206ff-ae52-43ed-8ef7-6d8cb525e698_object", + "targetHandle": "target_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_any" }, { - "id": "4b85a7d5-6a32-465c-942c-9b843ba63e02", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_16", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"drug_exposure\"\n source_col = \"drug_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2020, - "y": 1600 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2020, - "y": 1600 - } + "id": "reactflow__edge-fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95source_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_object-97e789e0-8b0b-49be-ad53-588599053812target_97e789e0-8b0b-49be-ad53-588599053812_object", + "source": "fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95", + "target": "97e789e0-8b0b-49be-ad53-588599053812", + "sourceHandle": "source_fa08ff6e-f9c6-4aea-b1e4-fa03aaa83a95_object", + "targetHandle": "target_97e789e0-8b0b-49be-ad53-588599053812_object" }, { - "id": "fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_17", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"observation\"\n source_col = \"observation_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2020, - "y": 1900 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2020, - "y": 1900 - } + "id": "reactflow__edge-7d661465-6ce0-44af-80d7-fd533a1acae9source_7d661465-6ce0-44af-80d7-fd533a1acae9_object-4b85a7d5-6a32-465c-942c-9b843ba63e02target_4b85a7d5-6a32-465c-942c-9b843ba63e02_any", + "source": "7d661465-6ce0-44af-80d7-fd533a1acae9", + "target": "4b85a7d5-6a32-465c-942c-9b843ba63e02", + "sourceHandle": "source_7d661465-6ce0-44af-80d7-fd533a1acae9_object", + "targetHandle": "target_4b85a7d5-6a32-465c-942c-9b843ba63e02_any" }, { - "id": "312d8dce-4c22-481a-b37e-07f7ce04a0bc", - "data": { - "name": "Truncate_OMOP_cdm_tables", - "description": "Describe the task of node python_node_18", - "python_code": "def exec(myinput):\n data = myinput.get(\"validate_cdm_data\").result\n dao = SqlAlchemyDao(database_code=database_code)\n table_name = \"procedure_occurrence\"\n source_col = \"procedure_source_value\"\n\n source_ids = data[source_col].dropna().unique().tolist()\n metadata_obj = sql.MetaData(schema=cdm_schema)\n table_obj = sql.Table(table_name, metadata_obj, autoload_with=dao.engine)\n delete_stmt = table_obj.delete().where(table_obj.c[source_col].in_(source_ids))\n dao.execute_sqlalchemy_statement(delete_stmt, lambda r: r.rowcount)\n\n return data" - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 2020, - "y": 2200 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 2020, - "y": 2200 - } + "id": "reactflow__edge-4b85a7d5-6a32-465c-942c-9b843ba63e02source_4b85a7d5-6a32-465c-942c-9b843ba63e02_object-09e016fe-ee22-4853-ad40-83917ba84537target_09e016fe-ee22-4853-ad40-83917ba84537_object", + "source": "4b85a7d5-6a32-465c-942c-9b843ba63e02", + "target": "09e016fe-ee22-4853-ad40-83917ba84537", + "sourceHandle": "source_4b85a7d5-6a32-465c-942c-9b843ba63e02_object", + "targetHandle": "target_09e016fe-ee22-4853-ad40-83917ba84537_object" }, { - "id": "05615b95-3ccc-4a81-99bf-8c5a1f9c2a8d", - "data": { - "name": "Truncate_omop_tables", - "description": "Describe the task of node python_node_19", - "python_code": "def exec(myinput):\n dbdao = DBDao(database_code=database_code)\n # Truncate tables\n dbdao.truncate_table(cdm_schema, \"observation\")\n dbdao.truncate_table(cdm_schema, \"measurement\")\n dbdao.truncate_table(cdm_schema, \"person\")\n dbdao.truncate_table(cdm_schema, \"visit_occurrence\")\n dbdao.truncate_table(cdm_schema, \"procedure_occurrence\")\n dbdao.truncate_table(cdm_schema, \"drug_exposure\")\n dbdao.truncate_table(cdm_schema, \"condition_occurrence\")\n return \"true\" " - }, - "type": "python_node", - "width": 354, - "height": 214, - "dragging": false, - "position": { - "x": -650, - "y": -530 - }, - "selected": true, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": -650, - "y": -530 - } - } - ], - "variables": [ + "id": "reactflow__edge-ca83c219-1ab9-44bf-9af6-c158e51f7214source_ca83c219-1ab9-44bf-9af6-c158e51f7214_object-fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1target_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_any", + "source": "ca83c219-1ab9-44bf-9af6-c158e51f7214", + "target": "fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1", + "sourceHandle": "source_ca83c219-1ab9-44bf-9af6-c158e51f7214_object", + "targetHandle": "target_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_any" + }, + { + "id": "reactflow__edge-fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1source_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_object-cc4c773e-a0bd-4894-9908-00ad541c310dtarget_cc4c773e-a0bd-4894-9908-00ad541c310d_object", + "source": "fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1", + "target": "cc4c773e-a0bd-4894-9908-00ad541c310d", + "sourceHandle": "source_fb5fe712-a2aa-4b29-a860-0ffe9d66e1a1_object", + "targetHandle": "target_cc4c773e-a0bd-4894-9908-00ad541c310d_object" + }, { - "key": "database_code", - "value": "demo_database" + "id": "reactflow__edge-43ad560c-fdba-43b6-9236-4baadb718c42source_43ad560c-fdba-43b6-9236-4baadb718c42_object-312d8dce-4c22-481a-b37e-07f7ce04a0bctarget_312d8dce-4c22-481a-b37e-07f7ce04a0bc_any", + "source": "43ad560c-fdba-43b6-9236-4baadb718c42", + "target": "312d8dce-4c22-481a-b37e-07f7ce04a0bc", + "sourceHandle": "source_43ad560c-fdba-43b6-9236-4baadb718c42_object", + "targetHandle": "target_312d8dce-4c22-481a-b37e-07f7ce04a0bc_any" }, { - "key": "cdm_schema", - "value": "demo_cdm" + "id": "reactflow__edge-312d8dce-4c22-481a-b37e-07f7ce04a0bcsource_312d8dce-4c22-481a-b37e-07f7ce04a0bc_object-e8e268b6-3e03-4468-b386-5e00c6051ca1target_e8e268b6-3e03-4468-b386-5e00c6051ca1_object", + "source": "312d8dce-4c22-481a-b37e-07f7ce04a0bc", + "target": "e8e268b6-3e03-4468-b386-5e00c6051ca1", + "sourceHandle": "source_312d8dce-4c22-481a-b37e-07f7ce04a0bc_object", + "targetHandle": "target_e8e268b6-3e03-4468-b386-5e00c6051ca1_object" } ], + "variables": [], "importLibs": [ "from _shared_flow_utils.dao.DBDao import DBDao", "from _shared_flow_utils.dao.sqlalchemydao import SqlAlchemyDao", "import sqlalchemy as sql" + ], + "databases": [ + { + "code": "d2e_fhir", + "name": "fhir_db" + }, + { + "code": "demo_database", + "name": "dest_db" + } + ], + "schemas": [ + { + "name": "dest_schema", + "schema": "demo_cdm" + } ] -} +} \ No newline at end of file diff --git a/flows/nodestest.json b/flows/nodestest.json index 8ddb435..455bb61 100644 --- a/flows/nodestest.json +++ b/flows/nodestest.json @@ -1,261 +1,275 @@ { + "id": "c3453d9e-eda8-4954-b771-6465c487a9f5", "name": "Nodes Test", "description": "Test r, python, py2table, sql, db reader/writer, generic file, csv nodes", - "edges": [ - { - "id": "reactflow__edge-f39e43f1-5297-4def-a239-90420112b31bsource_f39e43f1-5297-4def-a239-90420112b31b_object-bfe6629e-7a9e-4cfc-80f2-36df8cf783a8target_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_object", - "source": "f39e43f1-5297-4def-a239-90420112b31b", - "target": "bfe6629e-7a9e-4cfc-80f2-36df8cf783a8", - "selected": false, - "sourceHandle": "source_f39e43f1-5297-4def-a239-90420112b31b_object", - "targetHandle": "target_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_object" - }, - { - "id": "reactflow__edge-bfe6629e-7a9e-4cfc-80f2-36df8cf783a8source_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_dataframe-6ba6d31d-80af-49c3-b52d-92ed5fb6e800target_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe", - "source": "bfe6629e-7a9e-4cfc-80f2-36df8cf783a8", - "target": "6ba6d31d-80af-49c3-b52d-92ed5fb6e800", - "selected": false, - "sourceHandle": "source_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_dataframe", - "targetHandle": "target_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe" - }, - { - "id": "reactflow__edge-6ba6d31d-80af-49c3-b52d-92ed5fb6e800source_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe-0b1cc19f-9fb3-49e5-b614-532d6f07a5a8target_0b1cc19f-9fb3-49e5-b614-532d6f07a5a8_dataframe", - "source": "6ba6d31d-80af-49c3-b52d-92ed5fb6e800", - "target": "0b1cc19f-9fb3-49e5-b614-532d6f07a5a8", - "selected": false, - "sourceHandle": "source_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe", - "targetHandle": "target_0b1cc19f-9fb3-49e5-b614-532d6f07a5a8_dataframe" - }, - { - "id": "reactflow__edge-afa5fe8a-f201-4e71-9511-dd8ee1a91396source_afa5fe8a-f201-4e71-9511-dd8ee1a91396_any-f39e43f1-5297-4def-a239-90420112b31btarget_f39e43f1-5297-4def-a239-90420112b31b_any", - "source": "afa5fe8a-f201-4e71-9511-dd8ee1a91396", - "target": "f39e43f1-5297-4def-a239-90420112b31b", - "selected": false, - "sourceHandle": "source_afa5fe8a-f201-4e71-9511-dd8ee1a91396_any", - "targetHandle": "target_f39e43f1-5297-4def-a239-90420112b31b_any" - } - ], - "nodes": [ - { - "id": "f39e43f1-5297-4def-a239-90420112b31b", - "data": { - "name": "python_node_0", - "description": "Update dataframe to only include cohort members with cohort_id 36 and 49", - "python_code": "import pandas as pd \nfrom typing import Any \n \ndef exec(myinput: dict[str, Any]) -> dict[str, list[dict[str, Any]]]:\n df = myinput[\"r_node_0\"].result \n filtered = df[df[\"cohort_id\"].isin([36, 49])]\n return { \n \"cohort_members\": filtered.to_dict(orient=\"records\")\n } " - }, - "type": "python_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 210, - "y": 100 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 210, - "y": 100 - } - }, - { - "id": "bfe6629e-7a9e-4cfc-80f2-36df8cf783a8", - "data": { - "map": {}, - "name": "py2table_node_0", - "uiMap": { - "path": "$.cohort_members", - "source": "python_node_0" + "nodes": [ + { + "id": "f39e43f1-5297-4def-a239-90420112b31b", + "data": { + "name": "python_node_0", + "description": "Update dataframe to only include cohort members with cohort_id 36 and 49", + "python_code": "import pandas as pd \nfrom typing import Any \n \ndef exec(myinput: dict[str, Any]) -> dict[str, list[dict[str, Any]]]:\n df = myinput[\"r_node_0\"].result \n filtered = df[df[\"cohort_id\"].isin([36, 49])]\n return { \n \"cohort_members\": filtered.to_dict(orient=\"records\")\n } " + }, + "type": "python_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 210, + "y": 100 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 210, + "y": 100 + } }, - "description": "Convert python node output to dataframe for cohort members" - }, - "type": "py2table_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 650, - "y": 100 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 650, - "y": 100 - } - }, - { - "id": "6ba6d31d-80af-49c3-b52d-92ed5fb6e800", - "data": { - "sql": "DROP TABLE IF EXISTS demo_cdm_results.nodetest;\nSELECT * FROM py2table_node_0\nORDER BY cohort_id ", - "name": "sql_node_0", - "description": "Execute SQL to create a new table nodetest in demo_cdm_results schema and select cohort members from py2table_node_0 and order them by cohort_id" - }, - "type": "sql_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1090, - "y": 100 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1090, - "y": 100 - } - }, - { - "id": "0b1cc19f-9fb3-49e5-b614-532d6f07a5a8", - "data": { - "name": "db_writer_node_0", - "database": "demo_database", - "dataframe": "sql_node_0", - "schemaname": "demo_cdm_results", - "dbtablename": "nodetest", - "description": "Write the dataframe from sql_node_0 to database demo_database, schema demo_cdm_results, table nodetest." - }, - "type": "db_writer_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1560, - "y": 100 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1560, - "y": 100 - } - }, - { - "id": "afa5fe8a-f201-4e71-9511-dd8ee1a91396", - "data": { - "name": "r_node_0", - "r_code": "exec <- function(myinput) { \n data.frame( \n person_id = c(1, 2, 3, 4), \n cohort_id = c(25, 49, 49, 36) \n ) \n}", - "description": "Create a dataframe with person_id and cohort_id." - }, - "type": "r_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": -220, - "y": 100 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": -220, - "y": 100 - } - }, - { - "id": "baa1e7e5-59ff-4c7a-8af0-3dff4ec4cee2", - "data": { - "name": "db_reader_node_0", - "database": "demo_database", - "sqlquery": "SELECT * FROM demo_cdm_results.nodetest", - "testdata": [ - [ - 2, - 49 - ], - [ - 3, - 49 - ], - [ - 4, - 36 - ] - ], - "description": "Read from database demo_database, table demo_cdm_results.nodetest to get the cohort members with person_id and cohort_id." - }, - "type": "db_reader_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": 1990, - "y": 100 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 1990, - "y": 100 - } - }, - { - "id": "d797bf8e-7843-4471-9d53-466f5bffb896", - "data": { - "file": "broadsea_person_200.csv", - "name": "file_node_0", - "encoding": "utf-8", - "description": "Upload a local file broadsea_person_200.csv and read it as a generic file node." - }, - "type": "file_node", - "width": 350, - "height": 210, - "dragging": false, - "position": { - "x": -220, - "y": 410 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": -220, - "y": 410 - } - }, - { - "id": "9a326ef7-aafc-4065-8385-9cf4febc0a5d", - "data": { - "file": "broadsea_person_200.csv", - "name": "csv_node_0", - "columns": [], - "encoding": "utf-8", - "delimiter": ",", - "hasheader": true, - "description": "Upload a local file broadsea_person_200.csv and read it as a csv node, with the ability to specify columns, delimiter, encoding, and whether it has header or not." - }, - "type": "csv_node", - "width": 354, - "height": 214, - "dragging": false, - "position": { - "x": 210, - "y": 410 - }, - "selected": false, - "dragHandle": "", - "sourcePosition": "right", - "targetPosition": "left", - "positionAbsolute": { - "x": 210, - "y": 410 - } - } - ], - "variables": [], - "importLibs": [] + { + "id": "bfe6629e-7a9e-4cfc-80f2-36df8cf783a8", + "data": { + "map": {}, + "name": "py2table_node_0", + "uiMap": { + "path": "$.cohort_members", + "source": "python_node_0" + }, + "description": "Convert python node output to dataframe for cohort members" + }, + "type": "py2table_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 650, + "y": 100 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 650, + "y": 100 + } + }, + { + "id": "6ba6d31d-80af-49c3-b52d-92ed5fb6e800", + "data": { + "sql": "DROP TABLE IF EXISTS demo_cdm_results.nodetest;\nSELECT * FROM py2table_node_0\nORDER BY cohort_id ", + "name": "sql_node_0", + "description": "Execute SQL to create a new table nodetest in demo_cdm_results schema and select cohort members from py2table_node_0 and order them by cohort_id" + }, + "type": "sql_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 1090, + "y": 100 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 1090, + "y": 100 + } + }, + { + "id": "0b1cc19f-9fb3-49e5-b614-532d6f07a5a8", + "data": { + "name": "db_writer_node_0", + "database": "dest_db", + "truncate": false, + "dataframe": "sql_node_0", + "schemaname": "dest_schema", + "dbtablename": "nodetest", + "description": "Write the dataframe from sql_node_0 to database demo_database, schema demo_cdm_results, table nodetest." + }, + "type": "db_writer_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 1560, + "y": 100 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 1560, + "y": 100 + } + }, + { + "id": "afa5fe8a-f201-4e71-9511-dd8ee1a91396", + "data": { + "name": "r_node_0", + "r_code": "exec <- function(myinput) { \n data.frame( \n person_id = c(1, 2, 3, 4), \n cohort_id = c(25, 49, 49, 36) \n ) \n}", + "description": "Create a dataframe with person_id and cohort_id." + }, + "type": "r_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -220, + "y": 100 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -220, + "y": 100 + } + }, + { + "id": "baa1e7e5-59ff-4c7a-8af0-3dff4ec4cee2", + "data": { + "name": "db_reader_node_0", + "database": "dest_db", + "sqlquery": "SELECT * FROM demo_cdm_results.nodetest", + "testdata": [ + [ + 2, + 49 + ], + [ + 3, + 49 + ], + [ + 4, + 36 + ] + ], + "description": "Read from database demo_database, table demo_cdm_results.nodetest to get the cohort members with person_id and cohort_id." + }, + "type": "db_reader_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 1990, + "y": 100 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 1990, + "y": 100 + } + }, + { + "id": "d797bf8e-7843-4471-9d53-466f5bffb896", + "data": { + "file": "broadsea_person_200.csv", + "name": "file_node_0", + "encoding": "utf-8", + "description": "Upload a local file broadsea_person_200.csv and read it as a generic file node." + }, + "type": "file_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": -220, + "y": 410 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": -220, + "y": 410 + } + }, + { + "id": "9a326ef7-aafc-4065-8385-9cf4febc0a5d", + "data": { + "file": "broadsea_person_200.csv", + "name": "csv_node_0", + "columns": [], + "encoding": "utf-8", + "delimiter": ",", + "hasheader": true, + "description": "Upload a local file broadsea_person_200.csv and read it as a csv node, with the ability to specify columns, delimiter, encoding, and whether it has header or not." + }, + "type": "csv_node", + "width": 350, + "height": 210, + "dragging": false, + "position": { + "x": 210, + "y": 410 + }, + "selected": false, + "dragHandle": "", + "sourcePosition": "right", + "targetPosition": "left", + "positionAbsolute": { + "x": 210, + "y": 410 + } + } + ], + "edges": [ + { + "id": "reactflow__edge-f39e43f1-5297-4def-a239-90420112b31bsource_f39e43f1-5297-4def-a239-90420112b31b_object-bfe6629e-7a9e-4cfc-80f2-36df8cf783a8target_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_object", + "source": "f39e43f1-5297-4def-a239-90420112b31b", + "target": "bfe6629e-7a9e-4cfc-80f2-36df8cf783a8", + "selected": false, + "sourceHandle": "source_f39e43f1-5297-4def-a239-90420112b31b_object", + "targetHandle": "target_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_object" + }, + { + "id": "reactflow__edge-bfe6629e-7a9e-4cfc-80f2-36df8cf783a8source_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_dataframe-6ba6d31d-80af-49c3-b52d-92ed5fb6e800target_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe", + "source": "bfe6629e-7a9e-4cfc-80f2-36df8cf783a8", + "target": "6ba6d31d-80af-49c3-b52d-92ed5fb6e800", + "selected": false, + "sourceHandle": "source_bfe6629e-7a9e-4cfc-80f2-36df8cf783a8_dataframe", + "targetHandle": "target_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe" + }, + { + "id": "reactflow__edge-6ba6d31d-80af-49c3-b52d-92ed5fb6e800source_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe-0b1cc19f-9fb3-49e5-b614-532d6f07a5a8target_0b1cc19f-9fb3-49e5-b614-532d6f07a5a8_dataframe", + "source": "6ba6d31d-80af-49c3-b52d-92ed5fb6e800", + "target": "0b1cc19f-9fb3-49e5-b614-532d6f07a5a8", + "selected": false, + "sourceHandle": "source_6ba6d31d-80af-49c3-b52d-92ed5fb6e800_dataframe", + "targetHandle": "target_0b1cc19f-9fb3-49e5-b614-532d6f07a5a8_dataframe" + }, + { + "id": "reactflow__edge-afa5fe8a-f201-4e71-9511-dd8ee1a91396source_afa5fe8a-f201-4e71-9511-dd8ee1a91396_any-f39e43f1-5297-4def-a239-90420112b31btarget_f39e43f1-5297-4def-a239-90420112b31b_any", + "source": "afa5fe8a-f201-4e71-9511-dd8ee1a91396", + "target": "f39e43f1-5297-4def-a239-90420112b31b", + "selected": false, + "sourceHandle": "source_afa5fe8a-f201-4e71-9511-dd8ee1a91396_any", + "targetHandle": "target_f39e43f1-5297-4def-a239-90420112b31b_any" + } + ], + "variables": [], + "importLibs": [], + "databases": [ + { + "code": "demo_database", + "name": "dest_db" + } + ], + "schemas": [ + { + "name": "dest_schema", + "schema": "demo_cdm_results" + } + ] } \ No newline at end of file