-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql_connector.py
257 lines (233 loc) · 11 KB
/
sql_connector.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
import sqlite3
from datetime import datetime
import pytz
from config import *
class SqlConnector:
def __init__(self, db_name):
self.conn = sqlite3.connect(db_name)
self.cursor = self.conn.cursor()
def create_table(self, table_name):
if table_name == "markers":
self.cursor.execute('''CREATE TABLE IF NOT EXISTS markers (id INTEGER PRIMARY KEY AUTOINCREMENT, time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)''')
elif table_name == "particles":
self.cursor.execute('''CREATE TABLE IF NOT EXISTS particles (id INTEGER PRIMARY KEY AUTOINCREMENT, time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, two_point_five FLOAT NOT NULL, ten FLOAT NOT NULL)''')
elif table_name == "push_subscriptions":
self.cursor.execute('''CREATE TABLE IF NOT EXISTS push_subscriptions (id INTEGER PRIMARY KEY AUTOINCREMENT, endpoint TEXT NOT NULL, p256dh TEXT NOT NULL, auth TEXT NOT NULL)''')
def insert_marker(self, date=None):
self.create_table('markers')
if date is None:
self.cursor.execute('''INSERT INTO markers DEFAULT VALUES''')
self.conn.commit()
return
# Convert the date to UTC
date = datetime.strptime(date, "%Y-%m-%dT%H:%M")
tz = pytz.timezone(TIMEZONE)
date_utc = tz.localize(date).astimezone(pytz.utc).strftime("%Y-%m-%d %H:%M:%S")
self.cursor.execute('''INSERT INTO markers (time) VALUES (?)''', (date_utc,))
self.conn.commit()
def insert_particles(self, two_point_five, ten):
self.create_table('particles')
self.cursor.execute('''INSERT INTO particles (two_point_five, ten) VALUES (?, ?)''', (two_point_five, ten))
self.conn.commit()
def get_marker_times(self, date=None, offset=0):
self.create_table('markers')
# For windows that have a fixed duration we define the duration (in SQLite modifier format)
if date == "last_10_min":
# Window size is 10 minutes.
if offset == 0:
# Base window: from now-10 minutes to now.
query = (
"SELECT * FROM markers "
"WHERE time >= datetime('now', '-10 minutes') "
" AND time < datetime('now')"
)
else:
# For offset k, we want:
# lower_bound = now - (k+1)*10 minutes
# upper_bound = now - (k*10) minutes
query = (
"SELECT * FROM markers "
"WHERE time >= datetime('now', '-{} minutes') "
" AND time < datetime('now', '-{} minutes')"
.format((offset + 1) * 10, offset * 10)
)
elif date == "last_30_min":
# Window size is 30 minutes.
if offset == 0:
query = (
"SELECT * FROM markers "
"WHERE time >= datetime('now', '-30 minutes') "
" AND time < datetime('now')"
)
else:
query = (
"SELECT * FROM markers "
"WHERE time >= datetime('now', '-{} minutes') "
" AND time < datetime('now', '-{} minutes')"
.format((offset + 1) * 30, offset * 30)
)
elif date == "last_2_hours":
# Window size is 2 hours.
if offset == 0:
query = (
"SELECT * FROM markers "
"WHERE time >= datetime('now', '-2 hours') "
" AND time < datetime('now')"
)
else:
query = (
"SELECT * FROM markers "
"WHERE time >= datetime('now', '-{} hours') "
" AND time < datetime('now', '-{} hours')"
.format((offset + 1) * 2, offset * 2)
)
elif date == "today":
# The base window here is from today’s midnight until now.
# (SQLite’s date('now') returns the current date with time 00:00:00.)
if offset == 0:
query = (
"SELECT * FROM markers "
"WHERE time >= datetime(date('now')) "
" AND time < datetime('now')"
)
else:
# For a nonzero offset we assume you want the complete previous day(s).
# For example, offset==1 returns all markers from yesterday.
# The window is defined as:
# lower_bound = midnight of (now - offset days)
# upper_bound = midnight of (now - (offset-1) days)
query = (
"SELECT * FROM markers "
"WHERE time >= datetime(date('now', '-{} day', 'start of day')) "
" AND time < datetime(date('now', '-{} day', 'start of day'))"
.format(offset, offset - 1)
)
else:
# If no date parameter is given, return all markers.
query = "SELECT * FROM markers"
self.cursor.execute(query)
return self.cursor.fetchall()
def get_particles(self, date=None, offset=0):
self.create_table('particles')
# For windows that have a fixed duration we define the duration (in SQLite modifier format)
if date == "last_10_min":
# Window size is 10 minutes.
if offset == 0:
# Base window: from now-10 minutes to now.
query = (
"SELECT * FROM particles "
"WHERE time >= datetime('now', '-10 minutes') "
" AND time < datetime('now')"
)
else:
# For offset k, we want:
# lower_bound = now - (k+1)*10 minutes
# upper_bound = now - k*10 minutes
query = (
"SELECT * FROM particles "
"WHERE time >= datetime('now', '-{} minutes') "
" AND time < datetime('now', '-{} minutes')"
.format((offset + 1) * 10, offset * 10)
)
elif date == "last_30_min":
# Window size is 30 minutes.
if offset == 0:
query = (
"SELECT * FROM particles "
"WHERE time >= datetime('now', '-30 minutes') "
" AND time < datetime('now')"
)
else:
query = (
"SELECT * FROM particles "
"WHERE time >= datetime('now', '-{} minutes') "
" AND time < datetime('now', '-{} minutes')"
.format((offset + 1) * 30, offset * 30)
)
elif date == "last_2_hours":
# Window size is 2 hours.
if offset == 0:
query = (
"SELECT * FROM particles "
"WHERE time >= datetime('now', '-2 hours') "
" AND time < datetime('now')"
)
else:
query = (
"SELECT * FROM particles "
"WHERE time >= datetime('now', '-{} hours') "
" AND time < datetime('now', '-{} hours')"
.format((offset + 1) * 2, offset * 2)
)
elif date == "today":
# The base window here is from today’s midnight until now.
# (SQLite’s date('now') returns the current date with time 00:00:00.)
if offset == 0:
query = (
"SELECT * FROM particles "
"WHERE time >= datetime(date('now')) "
" AND time < datetime('now')"
)
else:
# For a nonzero offset we assume you want the complete previous day(s).
# For example, offset==1 returns all particles from yesterday.
# The window is defined as:
# lower_bound = midnight of (now - offset days)
# upper_bound = midnight of (now - (offset-1) days)
query = (
"SELECT * FROM particles "
"WHERE time >= datetime(date('now', '-{} day', 'start of day')) "
" AND time < datetime(date('now', '-{} day', 'start of day'))"
.format(offset, offset - 1)
)
else:
# If no date parameter is given, return all particles.
query = "SELECT * FROM particles"
self.cursor.execute(query)
return self.cursor.fetchall()
def get_last_particle(self, minutes=None):
self.create_table('particles')
if minutes is not None:
self.cursor.execute('''SELECT * FROM particles WHERE time >= datetime('now', '-{} minutes') ORDER BY time DESC LIMIT 1'''.format(minutes))
else:
self.cursor.execute('''SELECT * FROM particles ORDER BY time DESC LIMIT 1''')
return self.cursor.fetchone()
def get_last_marker_within(self, minutes):
self.create_table('markers')
self.cursor.execute('''SELECT * FROM markers WHERE time >= datetime('now', '-{} minutes') ORDER BY time DESC LIMIT 1'''.format(minutes))
return self.cursor.fetchone()
def get_avg_last_particles(self, sample_size, offset=0):
""" Get the average of the last n particles with optional offset.
Args:
sample_size (_type_): _description_
offset (int, optional): _description_. Defaults to 0.
Returns:
_type_: _description_
"""
self.create_table('particles')
self.cursor.execute(''' SELECT AVG(two_point_five), AVG(ten) FROM particles WHERE time >= datetime('now', '-{} minutes') AND time < datetime('now', '-{} minutes') ORDER BY time DESC '''.format(sample_size + offset, offset))
return self.cursor.fetchone()
def get_markers_desc(self):
self.create_table('markers')
self.cursor.execute('''SELECT * FROM markers ORDER BY time DESC''')
return self.cursor.fetchall()
def delete_markers(self, date=None):
if date is None:
self.cursor.execute('''DELETE FROM markers''')
elif date == "today":
self.cursor.execute('''DELETE FROM markers WHERE time >= datetime(date('now'))''')
self.conn.commit()
def delete_particles(self, date=None):
if date is None:
self.cursor.execute('''DELETE FROM particles''')
elif date == "today":
self.cursor.execute('''DELETE FROM particles WHERE time >= datetime(date('now'))''')
self.conn.commit()
def delete_marker(self, id_):
self.cursor.execute('''DELETE FROM markers WHERE id = ?''', (id_,))
self.conn.commit()
def __del__(self):
self.conn.close()
if __name__ == "__main__":
db = SqlConnector("database.db")
print(db.get_avg_last_particles(3, 3))