Prepare for a big db.py refactor

This commit is contained in:
XANTRONIX Industrial 2025-02-14 13:34:31 -05:00
parent 124bab8b17
commit e577cb2759
2 changed files with 43 additions and 18 deletions

View file

@ -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__

View file

@ -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