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)
|
||||
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():
|
||||
__slots__ = 'cr', 'table',
|
||||
|
||||
|
@ -160,7 +176,7 @@ class Database():
|
|||
return cr
|
||||
|
||||
def query(self, table, values=dict(), order_by=list()):
|
||||
selectors = getattr(table, '__selectors__')
|
||||
selectors = getattr(table, '__columns_select__')
|
||||
|
||||
if selectors is None:
|
||||
columns = table.__columns__
|
||||
|
|
|
@ -97,12 +97,12 @@ class StormReport(DatabaseTable):
|
|||
'tornado_f_rating', 'coord_start', 'coord_end'
|
||||
)
|
||||
|
||||
__selectors__ = {
|
||||
__columns_select__ = {
|
||||
'coord_start': 'ST_AsText(coord_start) as coord_start',
|
||||
'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_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,
|
||||
radius: float=RADAR_RANGE,
|
||||
timestamp: datetime.datetime=None):
|
||||
sql = """
|
||||
select * from nexrad_storm_report
|
||||
"""
|
||||
|
||||
columns = StormReport.__format_columns_select__(StormReport)
|
||||
clauses = list()
|
||||
values = list()
|
||||
values = dict()
|
||||
|
||||
if coord is not None:
|
||||
clauses.append("""ST_DistanceWithin(MakeLine(coord_start, coord_end),
|
||||
MakePoint(?, ?, {csr}),
|
||||
{radius}) = 1""".format(
|
||||
csr = COORD_SYSTEM,
|
||||
radius = radius
|
||||
))
|
||||
columns.append("""
|
||||
ST_Distance(MakeLine(coord_start, coord_end),
|
||||
MakePoint(:lon, :lat, :crs),
|
||||
true) as distance
|
||||
""")
|
||||
|
||||
values.append(coord.lon)
|
||||
values.append(coord.lat)
|
||||
clauses.extend([
|
||||
'distance <= :radius'
|
||||
])
|
||||
|
||||
values.update({
|
||||
'lon': coord.lon,
|
||||
'lat': coord.lat,
|
||||
'crs': COORD_SYSTEM,
|
||||
'radius': radius
|
||||
})
|
||||
|
||||
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())
|
||||
|
||||
sql = "select " + ", ".join(columns) + " from nexrad_storm_report"
|
||||
|
||||
if len(clauses) > 0:
|
||||
sql += " where " + " and ".join(clauses)
|
||||
|
||||
|
@ -268,7 +278,6 @@ class StormReport(DatabaseTable):
|
|||
|
||||
while True:
|
||||
obj = st.fetchone()
|
||||
|
||||
if obj is None:
|
||||
break
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue