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\": \"
\\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\": \" \\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\":\" \\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\":\" \\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\": \" \\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\": \" \\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\": \" \\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\": \" \\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\": \" \\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\": \" \\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\": \" \\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\":\" \\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\":\" \\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\": \" \\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\": \" \\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\": \" \\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\": \" \\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\": \" \\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