1
1
import requests
2
2
import sys
3
3
import json
4
+ import time
4
5
from pathlib import Path
5
6
from db .models import Drugs , Routes , ProductTypes , PharmClasses
6
7
from db .connect import connection
@@ -24,64 +25,110 @@ def buildProductTypes(session, data):
24
25
for item in responses :
25
26
exists = session .query (ProductTypes ).filter (ProductTypes .product_type == item ).scalar ()
26
27
if not exists :
27
- logger .info (f"New response added: { item } \n " )
28
+ logger .debug (f"New response added: { item } \n " )
28
29
row = ProductTypes (product_type = item )
29
30
session .add (row )
30
31
31
- def addData (session , data ):
32
+ def buildRouteTypes (session , data ):
33
+ routes = set ()
32
34
try :
35
+ for item in data ['results' ]:
36
+ try :
37
+ for route in item ['route' ]:
38
+ routes .add (route )
39
+ except :
40
+ pass
41
+ except :
42
+ logger .error ("Failed to load routes table" )
43
+ return
44
+ logger .debug (f"New data route(s): { str (routes )} \n " )
45
+ for item in routes :
46
+ logger .debug (item )
47
+ exists = session .query (Routes ).filter (Routes .route == item ).scalar ()
48
+ if not exists :
49
+ logger .debug (f"New response added: { item } \n " )
50
+ row = Routes (route = item )
51
+ session .add (row )
52
+
53
+
54
+ def buildDrugs (session , drugs_data ):
55
+ objects = []
56
+ product_ids = []
57
+ for data in drugs_data ['results' ]:
33
58
try :
34
- product_id = data ['product_id' ]
59
+ try :
60
+ product_id = data ['product_id' ]
61
+ except :
62
+ logger .warning (f"A product ID does not exists for { data ['generic_name' ]} " )
63
+ return
64
+ try :
65
+ generic_name = data ['generic_name' ].lower ()[:300 ]
66
+ except :
67
+ generic_name = ""
68
+ try :
69
+ brand_name = data ['brand_name' ].lower ()[:300 ]
70
+ except :
71
+ brand_name = ""
72
+ try :
73
+ classList = []
74
+ for classItem in data ['pharm_class' ]:
75
+ classList .append (classItem )
76
+ except :
77
+ classList = []
78
+ try :
79
+ routesList = []
80
+ for route in data ['route' ]:
81
+ route_id = session .query (Routes .id ).filter (Routes .route == route )
82
+ routesList .append (route_id )
83
+ except :
84
+ routesList = []
85
+ try :
86
+ form = data ['dosage_form' ].lower ()[:100 ]
87
+ except :
88
+ form = ""
89
+ try :
90
+ productTypeId = session .query (ProductTypes .id ).filter (ProductTypes .product_type == data ['product_type' ])
91
+ except :
92
+ productTypeId = None
35
93
except :
36
- logger .warning (f"A product ID does not exists for { data [ 'generic_name' ] } " )
94
+ logger .error (f"JSON failure \n " )
37
95
return
38
- try :
39
- generic_name = data ['generic_name' ].lower ()[:300 ]
40
- except :
41
- generic_name = ""
42
- try :
43
- brand_name = data ['brand_name' ].lower ()[:300 ]
44
- except :
45
- brand_name = ""
46
- try :
47
- classList = []
48
- for classItem in data ['pharm_class' ]:
49
- classList .append (classItem )
50
- except :
51
- classList = []
52
- try :
53
- routesList = []
54
- for route in data ['route' ]:
55
- routesList .append (route .lower ())
56
- except :
57
- routesList = []
58
- try :
59
- form = data ['dosage_form' ].lower ()[:100 ]
60
- except :
61
- form = ""
62
- try :
63
- productTypeId = session .query (ProductTypes .id ).filter (ProductTypes .product_type == data ['product_type' ])
64
- except :
65
- productTypeId = None
66
- except :
67
- logger .error (f"JSON failure\n " )
68
- return
69
- exists = session .query (Drugs ).filter (Drugs .product_id == product_id ).scalar ()
70
- if not exists :
71
- logger .info (f"New data added: { generic_name } |{ brand_name } |{ form } |{ product_id } \n " )
72
- row = Drugs (product_id = product_id , generic_name = generic_name , brand_name = brand_name , dosage_form = form , product_type = productTypeId )
73
- session .add (row )
74
- for route in routesList :
75
- logger .info (f"New data added: { generic_name } |{ route } \n " )
76
- route_row = Routes (route = route , dx_route = row )
77
- session .add (route_row )
78
- for pharmClass in classList :
79
- logger .info (f"New data added: { generic_name } |{ pharmClass } \n " )
80
- class_row = PharmClasses (pharm_class = pharmClass , dx_pharmClass = row )
81
- session .add (class_row )
82
- else :
83
- logger .warning (f"Data already exists: { product_id } |{ generic_name } |{ brand_name } \n " )
96
+ # exists = session.query(Drugs).filter(Drugs.product_id == product_id).scalar()
97
+ if product_id not in product_ids :
98
+ product_ids .append (product_id )
99
+ logger .debug (f"New data added: { generic_name } |{ brand_name } |{ form } |{ product_id } \n " )
100
+ if len (routesList ) == 3 :
101
+ route1 = routesList [0 ]
102
+ route2 = routesList [1 ]
103
+ route3 = routesList [2 ]
104
+ elif len (routesList ) == 2 :
105
+ route1 = routesList [0 ]
106
+ route2 = routesList [1 ]
107
+ route3 = None
108
+ elif len (routesList ) == 1 :
109
+ route1 = routesList [0 ]
110
+ route2 = None
111
+ route3 = None
112
+ else :
113
+ route1 = None
114
+ route2 = None
115
+ route3 = None
116
+ row = Drugs (product_id = product_id , generic_name = generic_name , brand_name = brand_name , dosage_form = form , route1 = route1 , route2 = route2 , route3 = route3 , product_type = productTypeId )
117
+ objects .append (row )
118
+ # for route in routesList:
119
+ # logger.info(f"New data added: {generic_name}|{route}\n")
120
+ # route_row = Routes(route=route, dx_route=row)
121
+ # objects.append(route_row)
122
+ for pharmClass in classList :
123
+ logger .debug (f"New data added: { generic_name } |{ pharmClass } \n " )
124
+ class_row = PharmClasses (pharm_class = pharmClass , dx_pharmClass = row )
125
+ objects .append (class_row )
126
+ else :
127
+ logger .warning (f"Data already exists: { product_id } |{ generic_name } |{ brand_name } \n " )
128
+ start = time .process_time ()
129
+ session .add_all (objects )
84
130
session .commit ()
131
+ logger .info (f"Commit drugs db: { str (time .process_time () - start )} " )
85
132
return
86
133
87
134
@@ -101,10 +148,16 @@ def main(session):
101
148
# Need a flag / config / etc. to drop tables on demand for rebuild.
102
149
103
150
# Need improved process to minimze circling through JSON file twice.
151
+ start = time .process_time ()
104
152
buildProductTypes (session , data )
105
- for line in data ['results' ]:
106
- logger .debug (f"{ line } " )
107
- addData (session , line )
153
+ logger .info (f"Add product types: { str (time .process_time () - start )} " )
154
+ start = time .process_time ()
155
+ buildRouteTypes (session , data )
156
+ logger .info (f"Add routes: { str (time .process_time () - start )} " )
157
+ start = time .process_time ()
158
+ buildDrugs (session , data )
159
+ logger .info (f"Add drugs information: { str (time .process_time () - start )} " )
160
+ f .close ()
108
161
109
162
110
163
if __name__ == "__main__" :
0 commit comments