Skip to content

Commit 60a99ac

Browse files
BFD-4678: Fix deadlocks when updating last_updated (#3107)
1 parent 8e0d7f5 commit 60a99ac

27 files changed

Lines changed: 356 additions & 211 deletions

apps/bfd-pipeline-idr/constants.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,45 @@
1313
CLAIM_INSTITUTIONAL_NCH_TABLE = "idr.claim_institutional_nch"
1414
CLAIM_INSTITUTIONAL_SS_TABLE = "idr.claim_institutional_ss"
1515

16+
IDR_PREFIX = "cms_vdm_view_mdcr_prd"
17+
IDR_BENE_HISTORY_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_hstry"
18+
IDR_BENE_MBI_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_mbi_id"
19+
IDR_BENE_XREF_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_xref"
20+
IDR_BENE_ENTITLEMENT_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_mdcr_entlmt"
21+
IDR_BENE_ENTITLEMENT_REASON_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_mdcr_entlmt_rsn"
22+
IDR_BENE_STATUS_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_mdcr_stus"
23+
IDR_BENE_THIRD_PARTY_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_tp"
24+
IDR_BENE_COMBINED_DUAL_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_cmbnd_dual_mdcr"
25+
IDR_BENE_LOW_INCOME_SUBSIDY_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_lis"
26+
IDR_BENE_MA_PART_D_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_mapd_enrlmt"
27+
IDR_BENE_MA_PART_D_RX_TABLE = f"{IDR_PREFIX}.v2_mdcr_bene_mapd_enrlmt_rx"
28+
29+
IDR_CLAIM_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm"
30+
IDR_CLAIM_ANSI_SIGNATURE_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_ansi_sgntr"
31+
IDR_CLAIM_DATE_SIGNATURE_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_dt_sgntr"
32+
IDR_CLAIM_INSTITUTIONAL_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_instnl"
33+
IDR_CLAIM_PROFESSIONAL_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_prfnl"
34+
IDR_CLAIM_DOCUMENTATION_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_dcmtn"
35+
IDR_CLAIM_LINE_DOCUMENTATION_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_dcmtn"
36+
IDR_CLAIM_VAL_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_val"
37+
IDR_CLAIM_LINE_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line"
38+
IDR_CLAIM_LINE_INSTITUTIONAL_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_instnl"
39+
IDR_CLAIM_LINE_PROFESSIONAL_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_prfnl"
40+
IDR_CLAIM_PROD_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_prod"
41+
IDR_CLAIM_FISS_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_fiss"
42+
IDR_CLAIM_LINE_RX_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_rx"
43+
IDR_CLAIM_LINE_FISS_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_fiss"
44+
IDR_CLAIM_LINE_MCS_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_mcs"
45+
IDR_CLAIM_LINE_FISS_BENEFIT_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_line_fiss_bnft_svg"
46+
IDR_CLAIM_LOCATION_HISTORY_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_lctn_hstry"
47+
IDR_CLAIM_RELATED_CONDITION_SIGNATURE_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_rlt_cond_sgntr_mbr"
48+
IDR_CLAIM_OCCURRENCE_SIGNATURE_TABLE = f"{IDR_PREFIX}.v2_mdcr_clm_ocrnc_sgntr_mbr"
49+
IDR_CLAIM_RELATED_OCCURRENCE_SIGNATURE_TABLE = f"{IDR_PREFIX}.v2_clm_rlt_ocrnc_sgntr_mbr"
50+
IDR_PROVIDER_HISTORY_TABLE = f"{IDR_PREFIX}.v2_mdcr_prvdr_hstry"
51+
IDR_CONTRACT_PBP_NUM_TABLE = f"{IDR_PREFIX}.v2_mdcr_cntrct_pbp_num"
52+
IDR_CONTRACT_PBP_CONTACT_TABLE = f"{IDR_PREFIX}.v2_mdcr_cntrct_pbp_cntct"
53+
IDR_CONTRACT_PBP_SEGMENT_TABLE = f"{IDR_PREFIX}.v2_mdcr_cntrct_pbp_sgmt"
54+
1655
DEATH_DATE_CUTOFF_YEARS = 4
1756

1857
match PARTITION_TYPE:

apps/bfd-pipeline-idr/load_synthetic.py

Lines changed: 70 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,81 @@
66

77
import psycopg
88

9+
from constants import (
10+
IDR_BENE_COMBINED_DUAL_TABLE,
11+
IDR_BENE_ENTITLEMENT_REASON_TABLE,
12+
IDR_BENE_ENTITLEMENT_TABLE,
13+
IDR_BENE_HISTORY_TABLE,
14+
IDR_BENE_LOW_INCOME_SUBSIDY_TABLE,
15+
IDR_BENE_MA_PART_D_RX_TABLE,
16+
IDR_BENE_MA_PART_D_TABLE,
17+
IDR_BENE_MBI_TABLE,
18+
IDR_BENE_STATUS_TABLE,
19+
IDR_BENE_THIRD_PARTY_TABLE,
20+
IDR_BENE_XREF_TABLE,
21+
IDR_CLAIM_ANSI_SIGNATURE_TABLE,
22+
IDR_CLAIM_DATE_SIGNATURE_TABLE,
23+
IDR_CLAIM_DOCUMENTATION_TABLE,
24+
IDR_CLAIM_FISS_TABLE,
25+
IDR_CLAIM_INSTITUTIONAL_TABLE,
26+
IDR_CLAIM_LINE_DOCUMENTATION_TABLE,
27+
IDR_CLAIM_LINE_INSTITUTIONAL_TABLE,
28+
IDR_CLAIM_LINE_PROFESSIONAL_TABLE,
29+
IDR_CLAIM_LINE_RX_TABLE,
30+
IDR_CLAIM_LINE_TABLE,
31+
IDR_CLAIM_LOCATION_HISTORY_TABLE,
32+
IDR_CLAIM_PROD_TABLE,
33+
IDR_CLAIM_PROFESSIONAL_TABLE,
34+
IDR_CLAIM_RELATED_CONDITION_SIGNATURE_TABLE,
35+
IDR_CLAIM_TABLE,
36+
IDR_CLAIM_VAL_TABLE,
37+
IDR_CONTRACT_PBP_CONTACT_TABLE,
38+
IDR_CONTRACT_PBP_NUM_TABLE,
39+
IDR_PROVIDER_HISTORY_TABLE,
40+
)
941
from loader import get_connection_string
1042
from logger_config import configure_logger
1143
from model.base_model import LoadMode
1244

1345
logger = logging.getLogger(__name__)
1446

1547
tables = [
16-
{"csv_name": "SYNTHETIC_BENE_HSTRY.csv", "table": "v2_mdcr_bene_hstry"},
17-
{"csv_name": "SYNTHETIC_BENE_MBI_ID.csv", "table": "v2_mdcr_bene_mbi_id"},
18-
{"csv_name": "SYNTHETIC_BENE_XREF.csv", "table": "v2_mdcr_bene_xref"},
19-
{"csv_name": "SYNTHETIC_BENE_MDCR_ENTLMT.csv", "table": "v2_mdcr_bene_mdcr_entlmt"},
48+
{"csv_name": "SYNTHETIC_BENE_HSTRY.csv", "table": IDR_BENE_HISTORY_TABLE},
49+
{"csv_name": "SYNTHETIC_BENE_MBI_ID.csv", "table": IDR_BENE_MBI_TABLE},
50+
{"csv_name": "SYNTHETIC_BENE_XREF.csv", "table": IDR_BENE_XREF_TABLE},
51+
{"csv_name": "SYNTHETIC_BENE_MDCR_ENTLMT.csv", "table": IDR_BENE_ENTITLEMENT_TABLE},
2052
{
2153
"csv_name": "SYNTHETIC_BENE_MDCR_ENTLMT_RSN.csv",
22-
"table": "v2_mdcr_bene_mdcr_entlmt_rsn",
54+
"table": IDR_BENE_ENTITLEMENT_REASON_TABLE,
2355
},
24-
{"csv_name": "SYNTHETIC_BENE_MDCR_STUS.csv", "table": "v2_mdcr_bene_mdcr_stus"},
25-
{"csv_name": "SYNTHETIC_BENE_TP.csv", "table": "v2_mdcr_bene_tp"},
26-
{"csv_name": "SYNTHETIC_BENE_CMBND_DUAL_MDCR.csv", "table": "v2_mdcr_bene_cmbnd_dual_mdcr"},
27-
{"csv_name": "SYNTHETIC_BENE_LIS.csv", "table": "v2_mdcr_bene_lis"},
28-
{"csv_name": "SYNTHETIC_BENE_MAPD_ENRLMT.csv", "table": "v2_mdcr_bene_mapd_enrlmt"},
29-
{"csv_name": "SYNTHETIC_BENE_MAPD_ENRLMT_RX.csv", "table": "v2_mdcr_bene_mapd_enrlmt_rx"},
30-
{"csv_name": "SYNTHETIC_CLM.csv", "table": "v2_mdcr_clm"},
31-
{"csv_name": "SYNTHETIC_CLM_INSTNL.csv", "table": "v2_mdcr_clm_instnl"},
32-
{"csv_name": "SYNTHETIC_CLM_PRFNL.csv", "table": "v2_mdcr_clm_prfnl"},
33-
{"csv_name": "SYNTHETIC_CLM_DCMTN.csv", "table": "v2_mdcr_clm_dcmtn"},
34-
{"csv_name": "SYNTHETIC_CLM_LINE_DCMTN.csv", "table": "v2_mdcr_clm_line_dcmtn"},
35-
{"csv_name": "SYNTHETIC_CLM_DT_SGNTR.csv", "table": "v2_mdcr_clm_dt_sgntr"},
36-
{"csv_name": "SYNTHETIC_CLM_VAL.csv", "table": "v2_mdcr_clm_val"},
37-
{"csv_name": "SYNTHETIC_CLM_LINE.csv", "table": "v2_mdcr_clm_line"},
38-
{"csv_name": "SYNTHETIC_CLM_LINE_INSTNL.csv", "table": "v2_mdcr_clm_line_instnl"},
39-
{"csv_name": "SYNTHETIC_CLM_LINE_PRFNL.csv", "table": "v2_mdcr_clm_line_prfnl"},
40-
{"csv_name": "SYNTHETIC_CLM_ANSI_SGNTR.csv", "table": "v2_mdcr_clm_ansi_sgntr"},
41-
{"csv_name": "SYNTHETIC_CLM_PROD.csv", "table": "v2_mdcr_clm_prod"},
42-
{"csv_name": "SYNTHETIC_CLM_FISS.csv", "table": "v2_mdcr_clm_fiss"},
43-
{"csv_name": "SYNTHETIC_CLM_LINE_RX.csv", "table": "v2_mdcr_clm_line_rx"},
44-
{"csv_name": "SYNTHETIC_CLM_LCTN_HSTRY.csv", "table": "v2_mdcr_clm_lctn_hstry"},
45-
{"csv_name": "SYNTHETIC_CLM_RLT_COND_SGNTR_MBR.csv", "table": "v2_mdcr_clm_rlt_cond_sgntr_mbr"},
46-
{"csv_name": "SYNTHETIC_PRVDR_HSTRY.csv", "table": "v2_mdcr_prvdr_hstry"},
47-
{"csv_name": "SYNTHETIC_CNTRCT_PBP_NUM.csv", "table": "v2_mdcr_cntrct_pbp_num"},
48-
{"csv_name": "SYNTHETIC_CNTRCT_PBP_CNTCT.csv", "table": "v2_mdcr_cntrct_pbp_cntct"},
56+
{"csv_name": "SYNTHETIC_BENE_MDCR_STUS.csv", "table": IDR_BENE_STATUS_TABLE},
57+
{"csv_name": "SYNTHETIC_BENE_TP.csv", "table": IDR_BENE_THIRD_PARTY_TABLE},
58+
{"csv_name": "SYNTHETIC_BENE_CMBND_DUAL_MDCR.csv", "table": IDR_BENE_COMBINED_DUAL_TABLE},
59+
{"csv_name": "SYNTHETIC_BENE_LIS.csv", "table": IDR_BENE_LOW_INCOME_SUBSIDY_TABLE},
60+
{"csv_name": "SYNTHETIC_BENE_MAPD_ENRLMT.csv", "table": IDR_BENE_MA_PART_D_TABLE},
61+
{"csv_name": "SYNTHETIC_BENE_MAPD_ENRLMT_RX.csv", "table": IDR_BENE_MA_PART_D_RX_TABLE},
62+
{"csv_name": "SYNTHETIC_CLM.csv", "table": IDR_CLAIM_TABLE},
63+
{"csv_name": "SYNTHETIC_CLM_INSTNL.csv", "table": IDR_CLAIM_INSTITUTIONAL_TABLE},
64+
{"csv_name": "SYNTHETIC_CLM_PRFNL.csv", "table": IDR_CLAIM_PROFESSIONAL_TABLE},
65+
{"csv_name": "SYNTHETIC_CLM_DCMTN.csv", "table": IDR_CLAIM_DOCUMENTATION_TABLE},
66+
{"csv_name": "SYNTHETIC_CLM_LINE_DCMTN.csv", "table": IDR_CLAIM_LINE_DOCUMENTATION_TABLE},
67+
{"csv_name": "SYNTHETIC_CLM_DT_SGNTR.csv", "table": IDR_CLAIM_DATE_SIGNATURE_TABLE},
68+
{"csv_name": "SYNTHETIC_CLM_VAL.csv", "table": IDR_CLAIM_VAL_TABLE},
69+
{"csv_name": "SYNTHETIC_CLM_LINE.csv", "table": IDR_CLAIM_LINE_TABLE},
70+
{"csv_name": "SYNTHETIC_CLM_LINE_INSTNL.csv", "table": IDR_CLAIM_LINE_INSTITUTIONAL_TABLE},
71+
{"csv_name": "SYNTHETIC_CLM_LINE_PRFNL.csv", "table": IDR_CLAIM_LINE_PROFESSIONAL_TABLE},
72+
{"csv_name": "SYNTHETIC_CLM_ANSI_SGNTR.csv", "table": IDR_CLAIM_ANSI_SIGNATURE_TABLE},
73+
{"csv_name": "SYNTHETIC_CLM_PROD.csv", "table": IDR_CLAIM_PROD_TABLE},
74+
{"csv_name": "SYNTHETIC_CLM_FISS.csv", "table": IDR_CLAIM_FISS_TABLE},
75+
{"csv_name": "SYNTHETIC_CLM_LINE_RX.csv", "table": IDR_CLAIM_LINE_RX_TABLE},
76+
{"csv_name": "SYNTHETIC_CLM_LCTN_HSTRY.csv", "table": IDR_CLAIM_LOCATION_HISTORY_TABLE},
77+
{
78+
"csv_name": "SYNTHETIC_CLM_RLT_COND_SGNTR_MBR.csv",
79+
"table": IDR_CLAIM_RELATED_CONDITION_SIGNATURE_TABLE,
80+
},
81+
{"csv_name": "SYNTHETIC_PRVDR_HSTRY.csv", "table": IDR_PROVIDER_HISTORY_TABLE},
82+
{"csv_name": "SYNTHETIC_CNTRCT_PBP_NUM.csv", "table": IDR_CONTRACT_PBP_NUM_TABLE},
83+
{"csv_name": "SYNTHETIC_CNTRCT_PBP_CNTCT.csv", "table": IDR_CONTRACT_PBP_CONTACT_TABLE},
4984
]
5085

5186

@@ -54,16 +89,14 @@ def load_from_csv(conn: psycopg.Connection, src_folder: str) -> None:
5489
for table in tables:
5590
# Clear out any previous data
5691
sql_table = table["table"]
57-
full_table = f"cms_vdm_view_mdcr_prd.{sql_table}"
58-
cur.execute(f"TRUNCATE TABLE {full_table}") # type: ignore
92+
93+
cur.execute(f"TRUNCATE TABLE {sql_table}") # type: ignore
5994
file = table["csv_name"]
60-
_load_file(cur, src_folder, file, sql_table, full_table)
95+
_load_file(cur, src_folder, file, sql_table)
6196
conn.commit()
6297

6398

64-
def _load_file(
65-
cur: psycopg.Cursor, src_folder: str, file: str, sql_table: str, full_table: str
66-
) -> None:
99+
def _load_file(cur: psycopg.Cursor, src_folder: str, file: str, full_table: str) -> None:
67100
path = Path(src_folder)
68101
# `glob` will return nothing for an invalid path so we'll explicitly make sure you supplied a
69102
# valid path
@@ -81,6 +114,7 @@ def _load_file(
81114

82115
# fetch the list of columns from the database and filter them out
83116
# so we don't get errors trying to insert extra columns
117+
sql_table = full_table.split(".")[1]
84118
db_columns = cur.execute(
85119
t"""
86120
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS

apps/bfd-pipeline-idr/loader.py

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import psycopg
66
from psycopg.abc import Params, Query
7-
from psycopg.errors import DeadlockDetected
87

98
from constants import DEFAULT_MIN_DATE
109
from load_partition import LoadPartition, LoadType
@@ -293,33 +292,30 @@ def _merge(self, cur: psycopg.Cursor, timestamp: datetime) -> None:
293292
last_updated_cols = self.model.last_updated_date_column()
294293
set_clause = ", ".join(f"{col} = %(timestamp)s" for col in last_updated_cols)
295294

296-
try:
297-
cur.execute(
298-
f"""
299-
WITH locked AS (
300-
SELECT {key}
301-
FROM {self.model.last_updated_date_table()}
302-
WHERE {key} IN (
303-
SELECT {key} FROM {self.temp_table}
304-
)
305-
ORDER BY {key}
306-
FOR UPDATE
295+
# We require multi-step transactions since we're dealing with temp tables, so there
296+
# is a chance of a deadlock here.
297+
# However, it's safe to ignore these because if the timestamp for this row is being
298+
# updated concurrently then it's going to have the same end result anyway.
299+
# If a deadlock occurs, the CTE returns no rows and this is a no-op.
300+
301+
cur.execute(
302+
f"""
303+
WITH current_ts AS (
304+
SELECT {key}
305+
FROM {self.model.last_updated_date_table()}
306+
WHERE {key} IN (
307+
SELECT {key} FROM {self.temp_table}
307308
)
308-
UPDATE {self.model.last_updated_date_table()} u
309-
SET {set_clause}
310-
FROM locked l
311-
WHERE u.{key} = l.{key};
312-
""", # type: ignore
313-
{"timestamp": timestamp},
309+
ORDER BY {key}
310+
FOR UPDATE SKIP LOCKED
314311
)
315-
except DeadlockDetected as ex:
316-
# We require multi-step transactions since we're dealing with temp tables, so there
317-
# is a chance of a deadlock here.
318-
# Locking rows helps reduce the chance of this when multiple nodes update this
319-
# table, but it doesn't eliminate the possibility.
320-
# However, it's safe to ignore this because if the timestamp for this row is being
321-
# updated concurrently then it's going to have the same end result anyway
322-
logger.warning("deadlock updating update timestamp, ignoring: %s", ex)
312+
UPDATE {self.model.last_updated_date_table()} u
313+
SET {set_clause}
314+
FROM current_ts t
315+
WHERE u.{key} = t.{key};
316+
""", # type: ignore
317+
{"timestamp": timestamp},
318+
)
323319

324320
def _copy_data(self, cur: psycopg.Cursor, results: Sequence[T]) -> None:
325321
# Use COPY to load the batch into Postgres.

apps/bfd-pipeline-idr/model/base_model.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@
1919
DEFAULT_MAX_DATE,
2020
DEFAULT_MIN_DATE,
2121
EMPTY_PARTITION,
22+
IDR_BENE_HISTORY_TABLE,
23+
IDR_CLAIM_ANSI_SIGNATURE_TABLE,
24+
IDR_CLAIM_DATE_SIGNATURE_TABLE,
25+
IDR_CLAIM_OCCURRENCE_SIGNATURE_TABLE,
26+
IDR_CLAIM_RELATED_CONDITION_SIGNATURE_TABLE,
27+
IDR_CLAIM_RELATED_OCCURRENCE_SIGNATURE_TABLE,
28+
IDR_CLAIM_TABLE,
2229
INSTITUTIONAL_NCH_PARTITIONS,
2330
INSTITUTIONAL_SS_PARTITIONS,
2431
NON_CLAIM_PARTITION,
@@ -166,7 +173,7 @@ def clm_base_query(start_time: datetime, partition: LoadPartition, model_type: M
166173
clm_idr_ld_dt,
167174
idr_insrt_ts,
168175
idr_updt_ts
169-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm {clm}
176+
FROM {IDR_CLAIM_TABLE} {clm}
170177
WHERE
171178
{claim_filter(start_time, partition)} AND
172179
{clm}.clm_idr_ld_dt >= '{model_type.min_transaction_date}'
@@ -202,7 +209,7 @@ def clm_child_query(table: str) -> str:
202209
{clm}.clm_num_sk,
203210
{clm}.clm_dt_sgntr_sk,
204211
{clm}.clm_idr_ld_dt
205-
FROM cms_vdm_view_mdcr_prd.{table} temp
212+
FROM {table} temp
206213
JOIN claim_base clm ON
207214
{clm}.geo_bene_sk = temp.geo_bene_sk AND
208215
{clm}.clm_dt_sgntr_sk = temp.clm_dt_sgntr_sk AND
@@ -223,7 +230,7 @@ def clm_ansi_sgntr_query() -> str:
223230
{clm}.clm_num_sk,
224231
{clm}.clm_dt_sgntr_sk,
225232
{clm}.clm_idr_ld_dt
226-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm_ansi_sgntr sgntr
233+
FROM {IDR_CLAIM_ANSI_SIGNATURE_TABLE} sgntr
227234
JOIN claim_base clm ON
228235
{clm}.clm_dt_sgntr_sk = sgntr.clm_ansi_sgntr_sk
229236
WHERE (sgntr.idr_insrt_ts {{FILTER_OP}} {{LAST_TS}}
@@ -241,7 +248,7 @@ def clm_dt_sgntr_query() -> str:
241248
{clm}.clm_num_sk,
242249
{clm}.clm_dt_sgntr_sk,
243250
{clm}.clm_idr_ld_dt
244-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm_dt_sgntr sgntr
251+
FROM {IDR_CLAIM_DATE_SIGNATURE_TABLE} sgntr
245252
JOIN claim_base clm ON
246253
{clm}.clm_dt_sgntr_sk = sgntr.clm_dt_sgntr_sk
247254
WHERE (sgntr.idr_insrt_ts {{FILTER_OP}} {{LAST_TS}}
@@ -259,7 +266,7 @@ def clm_ocrnc_sgntr_query() -> str:
259266
{clm}.clm_num_sk,
260267
{clm}.clm_dt_sgntr_sk,
261268
{clm}.clm_idr_ld_dt
262-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm_ocrnc_sgntr_mbr sgntr
269+
FROM {IDR_CLAIM_OCCURRENCE_SIGNATURE_TABLE} sgntr
263270
JOIN claim_base clm ON
264271
{clm}.clm_ocrnc_sgntr_sk = sgntr.clm_ocrnc_sgntr_sk
265272
WHERE sgntr.clm_ocrnc_span_cd IN ('{QUALIFYING_STAY_CD}', '{NON_COVERED_STAY_CD}')
@@ -280,7 +287,7 @@ def clm_rlt_ocrnc_clause() -> str:
280287
{clm}.clm_num_sk,
281288
{clm}.clm_dt_sgntr_sk,
282289
{clm}.clm_idr_ld_dt
283-
FROM cms_vdm_view_mdcr_prd.v2_clm_rlt_ocrnc_sgntr_mbr sgntr
290+
FROM {IDR_CLAIM_RELATED_OCCURRENCE_SIGNATURE_TABLE} sgntr
284291
JOIN claim_base clm ON
285292
{clm}.clm_rlt_ocrnc_sgntr_sk = sgntr.clm_rlt_ocrnc_sgntr_sk
286293
WHERE sgntr.clm_rlt_ocrnc_cd IN ('{MEDICARE_EXHAUSTED_CD}', '{ACTIVE_CARE_CD}') AND (
@@ -300,7 +307,7 @@ def clm_rlt_cond_sgntr_query() -> str:
300307
{clm}.clm_num_sk,
301308
{clm}.clm_dt_sgntr_sk,
302309
{clm}.clm_idr_ld_dt
303-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm_rlt_cond_sgntr_mbr sgntr
310+
FROM {IDR_CLAIM_RELATED_CONDITION_SIGNATURE_TABLE} sgntr
304311
JOIN claim_base {clm} ON
305312
{clm}.clm_rlt_cond_sgntr_sk = sgntr.clm_rlt_cond_sgntr_sk
306313
WHERE sgntr.clm_rlt_cond_sgntr_sk NOT IN (0, 1, -1)
@@ -588,7 +595,7 @@ def insert_keys(cls) -> list[str]:
588595
def deceased_bene_filter(alias: str) -> str:
589596
return f"""
590597
SELECT bene_sk
591-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_bene_hstry {alias}
598+
FROM {IDR_BENE_HISTORY_TABLE} {alias}
592599
WHERE {alias}.bene_vrfy_death_day_sw = 'Y'
593600
AND {alias}.bene_death_dt < CURRENT_DATE - INTERVAL '{DEATH_DATE_CUTOFF_YEARS} years'
594601
"""
@@ -743,7 +750,7 @@ def claim_occurrence_cte() -> str:
743750
MAX(CASE WHEN clm_ocrnc_span_cd = '{QUALIFYING_STAY_CD}'
744751
THEN clm_ocrnc_span_thru_dt END) AS bfd_clm_qlfy_stay_thru_dt,
745752
MAX(idr_insrt_ts) AS idr_insrt_ts
746-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm_ocrnc_sgntr_mbr {ocrnc_sgntr}
753+
FROM {IDR_CLAIM_OCCURRENCE_SIGNATURE_TABLE} {ocrnc_sgntr}
747754
WHERE clm_ocrnc_span_cd IN ('{QUALIFYING_STAY_CD}', '{NON_COVERED_STAY_CD}')
748755
GROUP BY clm_ocrnc_sgntr_sk"""
749756

@@ -760,7 +767,7 @@ def claim_related_occurrences_cte() -> str:
760767
MAX(CASE WHEN clm_rlt_ocrnc_cd = '{ACTIVE_CARE_CD}'
761768
THEN clm_rlt_ocrnc_dt END) AS bfd_clm_actv_care_thru_dt,
762769
MAX(idr_insrt_ts) AS idr_insrt_ts
763-
FROM cms_vdm_view_mdcr_prd.v2_clm_rlt_ocrnc_sgntr_mbr {rlt_ocrnc_sgntr}
770+
FROM {IDR_CLAIM_RELATED_OCCURRENCE_SIGNATURE_TABLE} {rlt_ocrnc_sgntr}
764771
WHERE clm_rlt_ocrnc_cd in ('{MEDICARE_EXHAUSTED_CD}', '{ACTIVE_CARE_CD}')
765772
GROUP BY clm_rlt_ocrnc_sgntr_sk
766773
"""
@@ -794,7 +801,7 @@ def claim_related_conditions_cte(load_mode: LoadMode) -> str:
794801
clm_rlt_cond_sgntr_sk,
795802
ARRAY_TO_STRING({clm_rlt_cond_cd_agg}, '') AS clm_rlt_cond_cd,
796803
MAX(idr_insrt_ts) AS idr_insrt_ts
797-
FROM cms_vdm_view_mdcr_prd.v2_mdcr_clm_rlt_cond_sgntr_mbr {rlt_cond}
804+
FROM {IDR_CLAIM_RELATED_CONDITION_SIGNATURE_TABLE} {rlt_cond}
798805
WHERE clm_rlt_cond_sgntr_sk NOT IN (0, 1, -1)
799806
AND clm_rlt_cond_cd != '~'
800807
GROUP BY clm_rlt_cond_sgntr_sk

0 commit comments

Comments
 (0)