@@ -24,7 +24,7 @@ def _validate_document(document: str):
2424 raise RuntimeError ("Failed to validate document: " + str (result .issues ))
2525
2626
27- def _find_invalid_pointers (table_name : str ) -> dict [str , float | int ]:
27+ def _find_invalid_pointers (table_name : str ) -> dict [str , Any ]:
2828 """
2929 Find and delete pointers in the given table that are invalid based on the FHIR model and NRLF validators.
3030 Parameters:
@@ -64,32 +64,28 @@ def _find_invalid_pointers(table_name: str) -> dict[str, float | int]:
6464
6565 print (f" Done. Found { len (invalid_pointers )} invalid pointers" )
6666
67- if len (invalid_pointers ) == 0 :
68- return {
69- "invalid_pointers" : 0 ,
70- "scanned_count" : total_scanned_count ,
71- "took-secs" : timedelta .total_seconds (end_time - start_time ),
72- }
67+ if len (invalid_pointers ) > 0 :
68+ print ("Writing invalid pointers IDs to file ./invalid_pointers.txt ..." )
69+ with open ("invalid_pointers.txt" , "w" ) as f :
70+ for _id , err in invalid_pointers :
71+ f .write (f"{ _id } : { err } \n " )
7372
74- print ("Writing invalid pointers IDs to file ./invalid_pointers.txt ..." )
75- with open ("invalid_pointers.txt" , "w" ) as f :
76- for _id , err in invalid_pointers :
77- f .write (f"{ _id } : { err } \n " )
73+ return {
74+ "invalid_pointers" : invalid_pointers ,
75+ "scanned_count" : total_scanned_count ,
76+ "find-took-secs" : timedelta .total_seconds (end_time - start_time ),
77+ }
7878
79- confirmation_input = input (
80- "Would you like to delete all the invalid pointers? (yes/no): "
81- )
82- if confirmation_input != "yes" :
83- print ("Invalid pointers NOT deleted." )
84- return {
85- "invalid_pointers" : len (invalid_pointers ),
86- "scanned_count" : total_scanned_count ,
87- "took-secs" : timedelta .total_seconds (end_time - start_time ),
88- }
79+
80+ def _delete_pointers (table_name : str , pointers_to_delete : list [str ]) -> dict [str , Any ]:
81+ """
82+ Delete the provided pointers from the given table.
83+ """
84+ start_time = datetime .now (tz = timezone .utc )
8985
9086 print ("Deleting invalid pointers..." )
9187 pointers_deleted = 0
92- for _id , _ in invalid_pointers :
88+ for _id , _ in pointers_to_delete :
9389 try :
9490 item_key = {"S" : f"D#{ _id } " }
9591 dynamodb .delete_item (
@@ -109,12 +105,38 @@ def _find_invalid_pointers(table_name: str) -> dict[str, float | int]:
109105
110106 print (" Done" )
111107 return {
112- "invalid_pointers_total" : len (invalid_pointers ),
113- "invalid_pointers_deleted" : pointers_deleted ,
114- "scanned_count" : total_scanned_count ,
115- "took-secs" : timedelta .total_seconds (end_time - start_time ),
108+ "pointers_to_delete" : len (pointers_to_delete ),
109+ "deleted_pointers" : pointers_deleted ,
110+ "deletes-took-secs" : timedelta .total_seconds (end_time - start_time ),
116111 }
117112
118113
114+ def _find_and_delete_invalid_pointers (table_name : str ) -> dict [str , float | int ]:
115+ find_result = _find_invalid_pointers (table_name )
116+
117+ if len (find_result ["invalid_pointers" ]) == 0 :
118+ return {
119+ "invalid_pointers" : 0 ,
120+ "scanned_count" : find_result ["scanned_count" ],
121+ "find-took-secs" : find_result ["find-took-secs" ],
122+ }
123+
124+ confirmation_input = input (
125+ "Would you like to delete all the invalid pointers? (yes/no): "
126+ )
127+ if confirmation_input != "yes" :
128+ print ("Invalid pointers NOT deleted." )
129+ find_result .pop ("invalid_pointers" )
130+ return find_result
131+
132+ pointers_to_delete = [_id for _id , _ in find_result ["invalid_pointers" ]]
133+
134+ delete_result = _delete_pointers (table_name , pointers_to_delete )
135+
136+ find_result .pop ("invalid_pointers" )
137+
138+ return {** find_result , ** delete_result }
139+
140+
119141if __name__ == "__main__" :
120- fire .Fire (_find_invalid_pointers )
142+ fire .Fire (_find_and_delete_invalid_pointers )
0 commit comments