Prepare for a big db.py refactor
This commit is contained in:
parent
124bab8b17
commit
e577cb2759
2 changed files with 43 additions and 18 deletions
|
@ -26,6 +26,22 @@ class DatabaseTable():
|
||||||
object.__setattr__(self, '__dirty__', True)
|
object.__setattr__(self, '__dirty__', True)
|
||||||
values[k] += 1
|
values[k] += 1
|
||||||
|
|
||||||
|
def __format_columns_select__(self):
|
||||||
|
csel = getattr(self, '__columns_select__')
|
||||||
|
|
||||||
|
if csel is None:
|
||||||
|
return self.__columns__
|
||||||
|
else:
|
||||||
|
ret = list()
|
||||||
|
|
||||||
|
for c in self.__columns__:
|
||||||
|
if c in csel:
|
||||||
|
ret.append(csel[c])
|
||||||
|
else:
|
||||||
|
ret.append(c)
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
class DatabaseTableCursor():
|
class DatabaseTableCursor():
|
||||||
__slots__ = 'cr', 'table',
|
__slots__ = 'cr', 'table',
|
||||||
|
|
||||||
|
@ -160,7 +176,7 @@ class Database():
|
||||||
return cr
|
return cr
|
||||||
|
|
||||||
def query(self, table, values=dict(), order_by=list()):
|
def query(self, table, values=dict(), order_by=list()):
|
||||||
selectors = getattr(table, '__selectors__')
|
selectors = getattr(table, '__columns_select__')
|
||||||
|
|
||||||
if selectors is None:
|
if selectors is None:
|
||||||
columns = table.__columns__
|
columns = table.__columns__
|
||||||
|
|
|
@ -97,12 +97,12 @@ class StormReport(DatabaseTable):
|
||||||
'tornado_f_rating', 'coord_start', 'coord_end'
|
'tornado_f_rating', 'coord_start', 'coord_end'
|
||||||
)
|
)
|
||||||
|
|
||||||
__selectors__ = {
|
__columns_select__ = {
|
||||||
'coord_start': 'ST_AsText(coord_start) as coord_start',
|
'coord_start': 'ST_AsText(coord_start) as coord_start',
|
||||||
'coord_end': 'ST_AsText(coord_end) as coord_end'
|
'coord_end': 'ST_AsText(coord_end) as coord_end'
|
||||||
}
|
}
|
||||||
|
|
||||||
__constructors__ = {
|
__columns_insert__ = {
|
||||||
'coord_start': lambda v: 'null' if v is None else f'MakePoint({v.lon}, {v.lat}, {COORD_SYSTEM})',
|
'coord_start': lambda v: 'null' if v is None else f'MakePoint({v.lon}, {v.lat}, {COORD_SYSTEM})',
|
||||||
'coord_end': lambda v: 'null' if v is None else f'MakePoint({v.lon}, {v.lat}, {COORD_SYSTEM})'
|
'coord_end': lambda v: 'null' if v is None else f'MakePoint({v.lon}, {v.lat}, {COORD_SYSTEM})'
|
||||||
}
|
}
|
||||||
|
@ -238,29 +238,39 @@ class StormReport(DatabaseTable):
|
||||||
coord: Coord=None,
|
coord: Coord=None,
|
||||||
radius: float=RADAR_RANGE,
|
radius: float=RADAR_RANGE,
|
||||||
timestamp: datetime.datetime=None):
|
timestamp: datetime.datetime=None):
|
||||||
sql = """
|
columns = StormReport.__format_columns_select__(StormReport)
|
||||||
select * from nexrad_storm_report
|
|
||||||
"""
|
|
||||||
|
|
||||||
clauses = list()
|
clauses = list()
|
||||||
values = list()
|
values = dict()
|
||||||
|
|
||||||
if coord is not None:
|
if coord is not None:
|
||||||
clauses.append("""ST_DistanceWithin(MakeLine(coord_start, coord_end),
|
columns.append("""
|
||||||
MakePoint(?, ?, {csr}),
|
ST_Distance(MakeLine(coord_start, coord_end),
|
||||||
{radius}) = 1""".format(
|
MakePoint(:lon, :lat, :crs),
|
||||||
csr = COORD_SYSTEM,
|
true) as distance
|
||||||
radius = radius
|
""")
|
||||||
))
|
|
||||||
|
|
||||||
values.append(coord.lon)
|
clauses.extend([
|
||||||
values.append(coord.lat)
|
'distance <= :radius'
|
||||||
|
])
|
||||||
|
|
||||||
|
values.update({
|
||||||
|
'lon': coord.lon,
|
||||||
|
'lat': coord.lat,
|
||||||
|
'crs': COORD_SYSTEM,
|
||||||
|
'radius': radius
|
||||||
|
})
|
||||||
|
|
||||||
if timestamp is not None:
|
if timestamp is not None:
|
||||||
clauses.append("timestamp_start >= ? and timestamp_end <= ?")
|
clauses.append("timestamp_start >= :timestamp and timestamp_end <= :timestamp")
|
||||||
|
|
||||||
|
values.update({
|
||||||
|
'timestamp': timestamp.isoformat()
|
||||||
|
})
|
||||||
|
|
||||||
values.append(timestamp.isoformat())
|
values.append(timestamp.isoformat())
|
||||||
|
|
||||||
|
sql = "select " + ", ".join(columns) + " from nexrad_storm_report"
|
||||||
|
|
||||||
if len(clauses) > 0:
|
if len(clauses) > 0:
|
||||||
sql += " where " + " and ".join(clauses)
|
sql += " where " + " and ".join(clauses)
|
||||||
|
|
||||||
|
@ -268,7 +278,6 @@ class StormReport(DatabaseTable):
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
obj = st.fetchone()
|
obj = st.fetchone()
|
||||||
|
|
||||||
if obj is None:
|
if obj is None:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue