From e577cb2759dc6d20e68b857cc6622f8c7deef987 Mon Sep 17 00:00:00 2001 From: XANTRONIX Industrial Date: Fri, 14 Feb 2025 13:34:31 -0500 Subject: [PATCH] Prepare for a big db.py refactor --- lib/nexrad/db.py | 18 +++++++++++++++++- lib/nexrad/storm.py | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/lib/nexrad/db.py b/lib/nexrad/db.py index 3df8ba8..ec32a2c 100644 --- a/lib/nexrad/db.py +++ b/lib/nexrad/db.py @@ -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__ diff --git a/lib/nexrad/storm.py b/lib/nexrad/storm.py index adde44a..6b820a0 100644 --- a/lib/nexrad/storm.py +++ b/lib/nexrad/storm.py @@ -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