clean_energy_value   C
last analyzed

Complexity

Total Complexity 54

Size/Duplication

Total Lines 552
Duplicated Lines 5.43 %

Importance

Changes 0
Metric Value
eloc 172
dl 30
loc 552
rs 6.4799
c 0
b 0
f 0
wmc 54

1 Function

Rating   Name   Duplication   Size   Complexity  
F process() 30 536 54

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like clean_energy_value often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
import mysql.connector
2
import config
3
import time
4
from datetime import datetime
5
6
7
########################################################################################################################
8
# This procedure will find and tag the bad energy values.
9
#
10
# Step 1: get the time slot to clean.
11
# Step 2: check bad case class 1 with high limits and low limits.
12
# Step 3: check bad case class 2 which is in concave shape model.
13
# Step 4: tag the is_bad property of energy values.
14
########################################################################################################################
15
16
def process(logger):
17
18
    while True:
19
        # the outermost loop to reconnect server if there is a connection error
20
        cnx = None
21
        cursor = None
22
        try:
23
            cnx = mysql.connector.connect(**config.myems_historical_db)
24
            cursor = cnx.cursor()
25
        except Exception as e:
26
            logger.error("Error at the begin of clean_energy_value.process " + str(e))
27
            if cursor:
28
                cursor.close()
29
            if cnx:
30
                cnx.close()
31
            time.sleep(60)
32
            continue
33
34
        # Note:
35
        # the default value of unchecked values' is_bad property is NULL
36
        # if a value is checked and the result is bad then is_bad would be set to TRUE
37
        # else if a value is checked and the result is good then is_bad would be set to FALSE
38
39
        ################################################################################################################
40
        # Step 1: get the time slot to clean.
41
        ################################################################################################################
42
43
        min_datetime = None
44
        max_datetime = None
45
        try:
46
            query = (" SELECT MIN(utc_date_time), MAX(utc_date_time) "
47
                     " FROM tbl_energy_value "
48
                     " WHERE is_bad IS NULL ")
49
            cursor.execute(query, ())
50
            row_datetime = cursor.fetchone()
51
            if row_datetime is not None and len(row_datetime) == 2 and \
52
                    isinstance(row_datetime[0], datetime) and isinstance(row_datetime[1], datetime):
53
                min_datetime = row_datetime[0]
54
                max_datetime = row_datetime[1]
55
56
        except Exception as e:
57
            logger.error("Error in Step 1 of clean_energy_value.process " + str(e))
58
            if cursor:
59
                cursor.close()
60
            if cnx:
61
                cnx.close()
62
            time.sleep(60)
63
            continue
64
        print("min_datetime: " + min_datetime.isoformat()[0:19])
65
        print("max_datetime: " + max_datetime.isoformat()[0:19])
66
67
        ################################################################################################################
68
        # Step 2: check bad case class 1 with high limits and low limits.
69
        ################################################################################################################
70
71
        ################################################################################################################
72
        # bad case 1.1
73
        # id          point_id utc_date_time        actual_value          is_bad (expected)
74
        # 104814811	  3333     2018-01-31 16:45:04	115603.0078125        good
75
        # 104814588	  3333     2018-01-31 16:44:00	115603.0078125        good
76
        # 104815007	  3333     2018-01-31 16:46:09	1.832278249396618e21  bad
77
        # 104815226	  3333     2018-01-31 16:47:13	1.832278249396618e21  bad
78
        # 104815423	  3333     2018-01-31 16:48:17	1.832278249396618e21  bad
79
        # 104815643	  3333     2018-01-31 16:49:22	1.832278249396618e21  bad
80
        # 104815820	  3333     2018-01-31 16:50:26	1.832278249396618e21  bad
81
        # 104816012	  3333     2018-01-31 16:51:30	1.832278249396618e21  bad
82
        # 104816252	  3333     2018-01-31 16:52:34	1.832278249396618e21  bad
83
        # 104816446	  3333     2018-01-31 16:53:38	1.832278249396618e21  bad
84
        # 104816667	  3333     2018-01-31 16:54:43	1.832278249396618e21  bad
85
        # 104816860	  3333     2018-01-31 16:55:47	1.832278249396618e21  bad
86
        # 104817065	  3333     2018-01-31 16:56:51	1.832278249396618e21  bad
87
        # 104817284	  3333     2018-01-31 16:57:55	1.832278249396618e21  bad
88
        # 104817482	  3333     2018-01-31 16:58:59	1.832278249396618e21  bad
89
        # 104817723	  3333     2018-01-31 17:00:04	1.832278249396618e21  bad
90
        # 104817940	  3333     2018-01-31 17:01:08	115749.0078125        good
91
        # 104818142	  3333     2018-01-31 17:02:11	115749.0078125        good
92
        # 104818380	  3333     2018-01-31 17:03:16	115749.0078125        good
93
        # 104818596	  3333     2018-01-31 17:04:20	115749.0078125        good
94
        ################################################################################################################
95
96
        ################################################################################################################
97
        # bad case 1.2:
98
        # id    point_id  utc_date_time          actual_value           is_bad (expected)
99
        #       3333      2018-01-31 17:27:53    115823.0078125         good
100
        #       3333      2018-01-31 17:28:57    115823.0078125         good
101
        #       3333      2018-01-31 17:30:02    115823.0078125         good
102
        #       3333      2018-01-31 17:31:06    115823.0078125         good
103
        #       3333      2018-01-31 17:32:11    0                      bad
104
        #       3333      2018-01-31 17:33:15    0                      bad
105
        #       3333      2018-01-31 17:34:19    0                      bad
106
        #       3333      2018-01-31 17:35:24    0                      bad
107
        #       3333      2018-01-31 17:36:28    0                      bad
108
        #       3333      2018-01-31 17:37:32    0                      bad
109
        #       3333      2018-01-31 17:38:36    0                      bad
110
        #       3333      2018-01-31 17:39:41    0                      bad
111
        #       3333      2018-01-31 17:40:44    0                      bad
112
        #       3333      2018-01-31 17:41:49    0                      bad
113
        #       3333      2018-01-31 17:43:57    0                      bad
114
        #       3333      2018-01-31 17:42:53    0                      bad
115
        #       3333      2018-01-31 17:45:01    0                      bad
116
        #       3333      2018-01-31 17:46:06    0                      bad
117
        #       3333      2018-01-31 17:47:10    0                      bad
118
        #       3333      2018-01-31 17:48:14    115969.0078125         good
119
        #       3333      2018-01-31 17:49:18    115969.0078125         good
120
        #       3333      2018-01-31 17:50:22    115969.0078125         good
121
        ################################################################################################################
122
123
        ################################################################################################################
124
        # bad case 1.3:
125
        # id    point_id  utc_date_time          actual_value           is_bad (expected)
126
        #       3333      2018-02-04 07:00:38    139968                  good
127
        #       3333      2018-02-04 07:01:42    139968                  good
128
        #       3333      2018-02-04 07:03:54    -7.068193740872921e-3   bad
129
        #       3333      2018-02-04 07:04:58    -7.068193740872921e-3   bad
130
        #       3333      2018-02-04 07:06:03    -7.068193740872921e-3   bad
131
        #       3333      2018-02-04 07:07:06    -7.068193740872921e-3   bad
132
        #       3333      2018-02-04 07:08:10    -7.068193740872921e-3   bad
133
        #       3333      2018-02-04 07:09:13    -7.068193740872921e-3   bad
134
        #       3333      2018-02-04 07:10:17    -7.068193740872921e-3   bad
135
        #       3333      2018-02-04 07:11:21    -7.068193740872921e-3   bad
136
        #       3333      2018-02-04 07:12:25    -7.068193740872921e-3   bad
137
        #       3333      2018-02-04 07:13:29    -7.068193740872921e-3   bad
138
        #       3333      2018-02-04 07:14:33    -7.068193740872921e-3   bad
139
        #       3333      2018-02-04 07:15:37    -7.068193740872921e-3   bad
140
        #       3333      2018-02-04 07:16:41    -7.068193740872921e-3   bad
141
        #       3333      2018-02-04 07:17:45    140114                  good
142
        #       3333      2018-02-04 07:18:49    140114                  good
143
        #       3333      2018-02-04 07:19:53    140114                  good
144
        ################################################################################################################
145
146
        ################################################################################################################
147
        # bad case 1.4:
148
        # id    point_id  utc_date_time          actual_value           is_bad (expected)
149
        #       3333      2018-02-08 01:16:38    165746.015625          good
150
        #       3333      2018-02-08 01:15:34    165746.015625          good
151
        #       3333      2018-02-08 01:14:30    165746.015625          good
152
        #       3333      2018-02-08 01:13:27    0.00303281145170331    bad
153
        #       3333      2018-02-08 01:12:22    0.00303281145170331    bad
154
        #       3333      2018-02-08 01:11:19    0.00303281145170331    bad
155
        #       3333      2018-02-08 01:10:15    0.00303281145170331    bad
156
        #       3333      2018-02-08 01:09:11    0.00303281145170331    bad
157
        #       3333      2018-02-08 01:08:06    0.00303281145170331    bad
158
        #       3333      2018-02-08 01:07:02    0.00303281145170331    bad
159
        #       3333      2018-02-08 01:05:58    0.00303281145170331    bad
160
        #       3333      2018-02-08 01:04:54    0.00303281145170331    bad
161
        #       3333      2018-02-08 01:03:50    0.00303281145170331    bad
162
        #       3333      2018-02-08 01:02:46    0.00303281145170331    bad
163
        #       3333      2018-02-08 01:01:42    0.00303281145170331    bad
164
        #       3333      2018-02-08 01:00:39    0.00303281145170331    bad
165
        #       3333      2018-02-08 00:59:34    0.00303281145170331    bad
166
        #       3333      2018-02-08 00:58:31    0.00303281145170331    bad
167
        #       3333      2018-02-08 00:57:27    165599.015625          good
168
        #       3333      2018-02-08 00:56:23    165599.015625          good
169
        #       3333      2018-02-08 00:55:20    165599.015625          good
170
        #       3333      2018-02-08 00:54:16    165599.015625          good
171
        ################################################################################################################
172
        print("Step 2: Processing bad case 1.x")
173
        try:
174
            cnx_system = mysql.connector.connect(**config.myems_system_db)
175
            cursor_system = cnx_system.cursor(dictionary=True)
176
177
            query = (" SELECT id, high_limit, low_limit "
178
                     " FROM tbl_points "
179
                     " WHERE object_type='ENERGY_VALUE'")
180
            cursor_system.execute(query)
181
            rows_points = cursor_system.fetchall()
182
183
            point_dict = dict()
184
            if rows_points is not None and len(rows_points) > 0:
185
                for row in rows_points:
186
                    point_dict[row['id']] = {"high_limit": row['high_limit'],
187
                                             "low_limit": row['low_limit']}
188
        except Exception as e:
189
            logger.error("Error in step 2.1 of clean_energy_value.process " + str(e))
190
            time.sleep(60)
191
            continue
192
        finally:
193
            if cursor_system:
0 ignored issues
show
introduced by
The variable cursor_system does not seem to be defined for all execution paths.
Loading history...
194
                cursor_system.close()
195
            if cnx_system:
196
                cnx_system.close()
197
198
        try:
199
            query = (" SELECT id, point_id, actual_value "
200
                     " FROM tbl_energy_value "
201
                     " WHERE utc_date_time >= %s AND utc_date_time <= %s AND is_bad IS NOT TRUE ")
202
            cursor.execute(query, (min_datetime, max_datetime,))
203
            rows_energy_values = cursor.fetchall()
204
        except Exception as e:
205
            logger.error("Error in step 2.2 of clean_energy_value.process " + str(e))
206
            if cursor:
207
                cursor.close()
208
            if cnx:
209
                cnx.close()
210
            time.sleep(60)
211
            continue
212
213
        bad_list = list()
214
215
        if rows_energy_values is not None and len(rows_energy_values) > 0:
216
            for row_energy_value in rows_energy_values:
217
                point_id = row_energy_value[1]
218
                actual_value = row_energy_value[2]
219
                point = point_dict.get(point_id, None)
0 ignored issues
show
introduced by
The variable point_dict does not seem to be defined for all execution paths.
Loading history...
220
                if point is None or actual_value > point['high_limit'] or actual_value < point['low_limit']:
221
                    bad_list.append(row_energy_value[0])
222
223
        print('bad list: ' + str(bad_list))
224 View Code Duplication
        if len(bad_list) > 0:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
225
            try:
226
                update = (" UPDATE tbl_energy_value "
227
                          " SET is_bad = TRUE "
228
                          " WHERE id IN (" + ', '.join(map(str, bad_list)) + ")")
229
                cursor.execute(update, )
230
                cnx.commit()
231
            except Exception as e:
232
                logger.error("Error in step 2.3 of clean_energy_value.process " + str(e))
233
                if cursor:
234
                    cursor.close()
235
                if cnx:
236
                    cnx.close()
237
                time.sleep(60)
238
                continue
239
240
        ################################################################################################################
241
        # Step 3: check bad case class 2 which is in concave shape model.
242
        ################################################################################################################
243
        print("Step 3: Processing bad case 2.x")
244
        ################################################################################################################
245
        # bad case 2.1
246
        # id    point_id  utc_date_time          actual_value       is_bad (expected)
247
        #       3333      2018-02-05 04:55:45    146129.015         good
248
        #       3333      2018-02-05 04:56:49    146129.015         good
249
        #       3333      2018-02-05 04:57:54    146129.015         good
250
        #       3333      2018-02-05 05:22:52    145693.015         bad
251
        #       3333      2018-02-05 05:25:01    146274             good
252
        #       3333      2018-02-05 05:26:03    146274             good
253
        #       3333      2018-02-05 05:27:05    146274             good
254
        #       3333      2018-02-05 05:29:30    146274             good
255
        ################################################################################################################
256
257
        ################################################################################################################
258
        # bad case 2.2
259
        # id    point_id	utc_date_time	    actual_value	is_bad (expected)
260
        #       3321	    2018-05-15 15:09:54	33934040         good
261
        #       3321	    2018-05-15 15:08:51	33934040         good
262
        #       3321	    2018-05-15 15:07:47	33934040         good
263
        #       3321	    2018-05-15 15:06:44	33934040         good
264
        #       3321	    2018-05-15 15:05:40	33934040         good
265
        #       3321	    2018-05-15 15:04:36	33934040         good
266
        #       3321	    2018-05-15 09:09:00	33928880	     bad
267
        #       3321	    2018-05-15 09:05:23	33933568         good
268
        #       3321	    2018-05-15 09:04:20	33933568         good
269
        #       3321	    2018-05-15 09:03:16	33933568         good
270
        #       3321	    2018-05-15 09:02:13	33933560         good
271
        #       3321	    2018-05-15 09:01:09	33933560         good
272
        #       3321	    2018-05-15 09:00:04	33933560         good
273
        ################################################################################################################
274
275
        ################################################################################################################
276
        # bad case 2.3
277
        # id    point_id	utc_date_time	    actual_value	is_bad (expected)
278
        #       554	        2018-05-19 15:32:52	24001            good
279
        #       554	        2018-05-19 15:30:45	24001            good
280
        #       554	        2018-05-19 15:28:39	24001            good
281
        #       554	        2018-05-19 15:26:32	24001            good
282
        #       554	        2018-05-19 15:24:25	24001            good
283
        #       554	        2018-05-19 15:22:18	24001            good
284
        #       554	        2018-05-19 15:20:10	24001            good
285
        #       554	        2018-05-19 15:18:04	24001            good
286
        #       554	        2018-05-19 15:15:58	24001            good
287
        #       554	        2018-05-19 15:13:51	24001            good
288
        #       554	        2018-05-19 15:11:43	24001            good
289
        #       554	        2018-05-19 15:09:37	24001            good
290
        #       554	        2018-05-19 15:07:29	24000            good
291
        #       554	        2018-05-19 15:05:22	23000	         bad
292
        #       554	        2018-05-19 15:03:14	23999            good
293
        #       554	        2018-05-19 15:01:06	23999            good
294
        #       554	        2018-05-19 14:58:59	23999            good
295
        #       554	        2018-05-19 14:56:52	23998            good
296
        #       554	        2018-05-19 14:54:45	23998            good
297
        #       554	        2018-05-19 14:52:39	23998            good
298
        ################################################################################################################
299
300
        ################################################################################################################
301
        # bad case 2.4
302
        # id       point_id utc_date_time          actual_value    is_bad (expected)
303
        # 104373141 3336    2018-01-30 03:04:12    216463.015625   good
304
        # 104373337 3336    2018-01-30 03:05:15    216463.015625   good
305
        # 104373555 3336    2018-01-30 03:06:20    216463.015625   good
306
        # 104373750 3336    2018-01-30 03:07:25    192368.015625   bad
307
        # 104373957 3336    2018-01-30 03:08:29    192368.015625   bad
308
        # 104374175 3336    2018-01-30 03:09:33    192368.015625   bad
309
        # 104374382 3336    2018-01-30 03:10:38    192368.015625   bad
310
        # 104374604 3336    2018-01-30 03:11:42    192368.015625   bad
311
        # 104374792 3336    2018-01-30 03:12:47    192368.015625   bad
312
        # 104375010 3336    2018-01-30 03:13:51    192368.015625   bad
313
        # 104375200 3336    2018-01-30 03:14:55    192368.015625   bad
314
        # 104375418 3336    2018-01-30 03:16:00    192368.015625   bad
315
        # 104375617 3336    2018-01-30 03:17:04    192368.015625   bad
316
        # 104375837 3336    2018-01-30 03:18:08    192368.015625   bad
317
        # 104376023 3336    2018-01-30 03:19:12    192368.015625   bad
318
        # 104376216 3336    2018-01-30 03:20:16    192368.015625   bad
319
        # 104376435 3336    2018-01-30 03:21:21    192368.015625   bad
320
        # 104376634 3336    2018-01-30 03:22:25    192368.015625   bad
321
        # 104376853 3336    2018-01-30 03:23:30    192368.015625   bad
322
        # 104377071 3336    2018-01-30 03:24:34    192368.015625   bad
323
        # 104377274 3336    2018-01-30 03:25:38    192368.015625   bad
324
        # 104377501 3336    2018-01-30 03:26:42    216574.015625   good
325
        # 104377714 3336    2018-01-30 03:27:47    216574.015625   good
326
        ################################################################################################################
327
328
        ################################################################################################################
329
        # bad case 2.5
330
        # id       point_id utc_date_time          actual_value  is_bad (expected)
331
        # 104370839 3334    2018-01-30 02:52:23    844966.0625   good
332
        # 104371064 3334    2018-01-30 02:53:27    844966.0625   good
333
        # 104371261 3334    2018-01-30 02:54:32    844966.0625   good
334
        # 104371479 3334    2018-01-30 02:55:36    826142.0625   bad
335
        # 104371672 3334    2018-01-30 02:56:41    826142.0625   bad
336
        # 104371884 3334    2018-01-30 02:57:45    826142.0625   bad
337
        # 104372110 3334    2018-01-30 02:58:49    826142.0625   bad
338
        # 104372278 3334    2018-01-30 02:59:54    845019.0625   good
339
        # 104372512 3334    2018-01-30 03:00:58    845019.0625   good
340
        # 104372704 3334    2018-01-30 03:02:03    845019.0625   good
341
        ################################################################################################################
342
343
        ################################################################################################################
344
        # bad case 2.6
345
        # 394084273	1001444	2019-08-22 03:39:44	   38969028      good
346
        # 394083709	1001444	2019-08-22 03:38:43    38968876	     good
347
        # 394083145	1001444	2019-08-22 03:37:43    28371884      bad
348
        # 394082019	1001444	2019-08-22 03:35:42    28371884      bad
349
        # 394081456	1001444	2019-08-22 03:34:42    28371884      bad
350
        # 394080892	1001444	2019-08-22 03:33:42    28371884      bad
351
        # 394079200	1001444	2019-08-22 03:30:38    28371884      bad
352
        # 394077511	1001444	2019-08-22 03:27:37    38968408	     good
353
        # 394076947	1001444	2019-08-22 03:26:37    38968236	     good
354
        # 394076384	1001444	2019-08-22 03:25:37    38968060	     good
355
        ################################################################################################################
356
357
        ################################################################################################################
358
        # bad case 2.7
359
        # id       point_id utc_date_time          actual_value   is_bad (expected)
360
        # 17303260 11       2020-3-15 05:43:52     33600          good
361
        # 17303399 11       2020-3-15 05:44:58     33600          good
362
        # 17303538 11       2020-3-15 05:46:04     33600          good
363
        # 17303677 11       2020-3-15 05:47:10     33500          bad
364
        # 17303816 11       2020-3-15 05:48:15     33500          bad
365
        # 17303955 11       2020-3-15 05:49:21     33600          good
366
        # 17304094 11       2020-3-15 05:50:27     33600          good
367
        # 17304233 11       2020-3-15 05:51:33     33600          good
368
        ################################################################################################################
369
370
        try:
371
            query = (" SELECT point_id, id, utc_date_time, actual_value "
372
                     " FROM tbl_energy_value "
373
                     " WHERE utc_date_time >= %s AND utc_date_time <= %s AND is_bad IS NOT TRUE "
374
                     " ORDER BY point_id, utc_date_time ")
375
            cursor.execute(query, (min_datetime, max_datetime,))
376
            rows_energy_values = cursor.fetchall()
377
        except Exception as e:
378
            logger.error("Error in step 3.1 of clean_energy_value.process " + str(e))
379
            if cursor:
380
                cursor.close()
381
            if cnx:
382
                cnx.close()
383
            time.sleep(60)
384
            continue
385
386
        point_value_dict = dict()
387
        current_point_value_list = list()
388
        current_point_id = 0
389
390
        if rows_energy_values is not None and len(rows_energy_values) > 0:
391
            for row_energy_value in rows_energy_values:
392
                previous_point_id = current_point_id
393
                current_point_id = row_energy_value[0]
394
                if current_point_id not in point_value_dict.keys():
395
                    # new point id found
396
                    # save previous point values
397
                    if len(current_point_value_list) > 0:
398
                        point_value_dict[previous_point_id] = current_point_value_list
399
                        current_point_value_list = list()
400
401
                    current_point_value_list.append({'id': row_energy_value[1],
402
                                                     'actual_value': row_energy_value[3]})
403
                else:
404
                    current_point_value_list.append({'id': row_energy_value[1],
405
                                                     'actual_value': row_energy_value[3]})
406
            # end of for loop
407
            # save rest point values
408
            if len(current_point_value_list) > 0:
409
                point_value_dict[current_point_id] = current_point_value_list
410
411
        bad_list = list()
412
413
        for point_id, point_value_list in point_value_dict.items():
414
            if len(point_value_list) <= 1:
415
                continue
416
            elif len(point_value_list) == 2:
417
                if point_value_list[1]['actual_value'] < point_value_list[0]['actual_value']:
418
                    bad_list.append(point_value_list[1]['id'])
419
                continue
420
            else:
421
                base_point_value = point_value_list[0]['actual_value']
422
                concave_point_value_list = list()
423
                for i in range(len(point_value_list)):
424
                    if point_value_list[i]['actual_value'] < base_point_value:
425
                        # candidate concave value found
426
                        concave_point_value_list.append(point_value_list[i]['id'])
427
                    else:
428
                        # normal value found
429
                        if len(concave_point_value_list) > 0:
430
                            # save confirmed concave value(s) to bad value(s)
431
                            bad_list.extend(concave_point_value_list)
432
433
                        # prepare for next candidate concave value list
434
                        base_point_value = point_value_list[i]['actual_value']
435
                        concave_point_value_list.clear()
436
                continue
437
438
        print('bad list: ' + str(bad_list))
439 View Code Duplication
        if len(bad_list) > 0:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
440
            try:
441
                update = (" UPDATE tbl_energy_value "
442
                          " SET is_bad = TRUE "
443
                          " WHERE id IN (" + ', '.join(map(str, bad_list)) + ")")
444
                cursor.execute(update, )
445
                cnx.commit()
446
            except Exception as e:
447
                logger.error("Error in step 3.2 of clean_energy_value.process " + str(e))
448
                if cursor:
449
                    cursor.close()
450
                if cnx:
451
                    cnx.close()
452
                time.sleep(60)
453
                continue
454
455
        ################################################################################################################
456
        # TODO: bad case 2.8
457
        # id          point_id utc_date_time          actual_value is_bad (expected)
458
        # 105752070    3333    2018-02-04 00:27:15    138144       good
459
        # 105752305    3333    2018-02-04 00:28:19    138144       good
460
        # 105752523    3333    2018-02-04 00:29:22    138144       good
461
        # 105752704    3333    2018-02-04 00:30:26    138144       good
462
        # 105752924    3333    2018-02-04 00:31:30    138144       good
463
        # 105753138    3333    2018-02-04 00:32:34    138144       good
464
        # 105753351    3333    2018-02-04 00:33:38    138144       good
465
        # 105753577    3333    2018-02-04 00:34:42    52776558592  bad?
466
        # 105753794    3333    2018-02-04 00:35:46    52776558592  bad?
467
        # 105753999    3333    2018-02-04 00:36:50    52776558592  bad?
468
        # 105754231    3333    2018-02-04 00:37:54    52776558592  bad?
469
        # 105754443    3333    2018-02-04 00:38:58    52776558592  bad?
470
        # 105754655    3333    2018-02-04 00:40:01    52776558592  bad?
471
        # 105754878    3333    2018-02-04 00:41:06    52776558592  bad?
472
        # 105755092    3333    2018-02-04 00:42:09    52776558592  bad?
473
        # 105755273    3333    2018-02-04 00:43:14    52776558592  bad?
474
        # 105755495    3333    2018-02-04 00:44:17    52776558592  bad?
475
        # 105755655    3333    2018-02-04 00:45:21    52776558592  bad?
476
        # 105755854    3333    2018-02-04 00:46:25    52776558592  bad?
477
        # 105756073    3333    2018-02-04 00:47:29    52776558592  bad?
478
        # 105756272    3333    2018-02-04 00:48:34    52776558592  bad?
479
        # 105756489    3333    2018-02-04 00:49:38    52776558592  bad?
480
        ################################################################################################################
481
482
        ################################################################################################################
483
        # TODO: bad case 2.10
484
        # id       point_id utc_date_time          actual_value   is_bad (expected)
485
        # 106363135 3336    2018-02-06 04:45:57    253079.015625  good
486
        # 106363776 3336    2018-02-06 04:49:09    253079.015625  good
487
        # 106364381 3336    2018-02-06 04:52:21    253079.015625  good
488
        # 106364603 3336    2018-02-06 04:53:25    253079.015625  good
489
        # 106365213 3336    2018-02-06 04:56:37    253079.015625  good
490
        # 106365634 3336    2018-02-06 04:58:45    253079.015625  good
491
        # 106366055 3336    2018-02-06 05:00:53    253079.015625  good
492
        # 106367097 3336    2018-02-06 05:06:12    259783.015625  bad?
493
        # 106367507 3336    2018-02-06 05:08:21    259783.015625  bad?
494
        # 106368318 3336    2018-02-06 05:12:37    259783.015625  bad?
495
        # 106368732 3336    2018-02-06 05:14:44    259783.015625  bad?
496
        # 106368952 3336    2018-02-06 05:15:48    259783.015625  bad?
497
        # 106369145 3336    2018-02-06 05:16:52    259783.015625  bad?
498
        # 106369353 3336    2018-02-06 05:17:56    259783.015625  bad?
499
        ################################################################################################################
500
501
        ################################################################################################################
502
        # TODO: bad case 2.11
503
        # id       point_id utc_date_time          actual_value   is_bad (expected)
504
        # 14784589 21	    2020-03-05 07:22:22    17990           good
505
        # 14784450 21	    2020-03-05 07:21:17    17990           good
506
        # 14784311 21	    2020-03-05 07:20:10    17990           good
507
        # 14784172 21	    2020-03-05 07:19:04    17990           good
508
        # 14784033 21	    2020-03-05 07:17:58    18990           bad
509
        # 14783894 21	    2020-03-05 07:16:52    17990           good
510
        # 14783755 21	    2020-03-05 07:15:46    17990           good
511
        # 14783616 21	    2020-03-05 07:14:40    17990           good
512
        # 14783477 21	    2020-03-05 07:13:34    17990           good
513
        # 14783338 21	    2020-03-05 07:12:28    17990           good
514
        # 14783199 21	    2020-03-05 07:11:22    17990           good
515
        ################################################################################################################
516
517
        ################################################################################################################
518
        # TODO: bad case 2.12
519
        # id       point_id utc_date_time          actual_value   is_bad (expected)
520
        # 3337308  21       2020-01-07 09:02:18    7990           good
521
        # 3337174  21       2020-01-07 09:01:13    7990	          good
522
        # 3337040  21       2020-01-07 09:00:08    7990	          good
523
        # 3336906  21       2020-01-07 08:59:04    7990	          good
524
        # 3336772  21       2020-01-07 08:57:59    7990	          good
525
        # 3336638  21       2020-01-07 08:56:54    8990	          bad
526
        # 3336504  21       2020-01-07 08:55:49    7990	          good
527
        # 3336370  21       2020-01-07 08:54:44    7990	          good
528
        # 3336236  21       2020-01-07 08:53:39    7990	          good
529
        # 3336102  21       2020-01-07 08:52:34    7990	          good
530
        # 3335968  21       2020-01-07 08:51:30    7990	          good
531
        ################################################################################################################
532
        # Step 4: tag the is_bad property of energy values.
533
        ################################################################################################################
534
        try:
535
            update = (" UPDATE tbl_energy_value "
536
                      " SET is_bad = FALSE "
537
                      " WHERE utc_date_time >= %s AND utc_date_time < %s AND is_bad IS NULL ")
538
            # NOTE: use '<' instead of '<=' in WHERE statement because there may be some new inserted values
539
            cursor.execute(update, (min_datetime, max_datetime,))
540
            cnx.commit()
541
        except Exception as e:
542
            logger.error("Error in step 4 of clean_energy_value.process " + str(e))
543
            time.sleep(60)
544
            continue
545
        finally:
546
            if cursor:
547
                cursor.close()
548
            if cnx:
549
                cnx.close()
550
551
        time.sleep(900)
552