Issue #1735 ForecastPointDataRetrieve now uses DbQueryRequest to obtain forecast times in asscending order and option to limit times returned.

Change reviewer comments.

Change-Id: Ida69b63198ffa5c229eedd3abb42c4f5f9e1d00d

Former-commit-id: 54cbf656e9 [formerly b836dcb6d55dfbdf8e825fb194903d45a83382c8]
Former-commit-id: d2aae617b2
This commit is contained in:
Roger Ferrel 2013-04-03 07:41:39 -05:00
parent 374eed35b3
commit 7b829a2fec
4 changed files with 53 additions and 36 deletions

View file

@ -96,6 +96,10 @@ def writeLLWS(ident, data):
_Logger.error('Cannot write LLWS file for %s', ident) _Logger.error('Cannot write LLWS file for %s', ident)
def retrieve(siteID, info): def retrieve(siteID, info):
from datetime import timedelta
day = timedelta(days=1)
secondsPerDay = day.total_seconds()
msPerSecond = 1000.0
th = LLWSThread.Server(info) th = LLWSThread.Server(info)
t = 0 t = 0
d = {} d = {}
@ -115,7 +119,7 @@ def retrieve(siteID, info):
# This may be ok if database is purged frequently. # This may be ok if database is purged frequently.
# How far back should it go 1, 6, 12, 24 hours? # How far back should it go 1, 6, 12, 24 hours?
# acarsRec = LlwsManager.getAcarsRecord(siteID, 0) # acarsRec = LlwsManager.getAcarsRecord(siteID, 0)
refTime = long((time.time() - (24.0*3600.0)) * 1000.0) refTime = long((time.time() - secondsPerDay) * msPerSecond)
acarsRec = LlwsManager.getAcarsRecord(siteID, refTime) acarsRec = LlwsManager.getAcarsRecord(siteID, refTime)
if acarsRec: if acarsRec:
acarsId = siteID[1:] acarsId = siteID[1:]

View file

@ -32,6 +32,7 @@ import ForecastPointDataRetrieve, NoDataException
# ------------ ---------- ----------- -------------------------- # ------------ ---------- ----------- --------------------------
# 09/15/09 njensen Initial Creation. # 09/15/09 njensen Initial Creation.
# 26APR2012 14688 rferrel Use ForecastPointDataRetrieve. # 26APR2012 14688 rferrel Use ForecastPointDataRetrieve.
# 03APR2013 1735 rferrel Limit retrieval for forecast times to the number used.
# #
# #
# #
@ -39,23 +40,24 @@ import ForecastPointDataRetrieve, NoDataException
PARAMETERS = ['tstorm2hr', 'stationId', 'refTime', 'fcstHr'] PARAMETERS = ['tstorm2hr', 'stationId', 'refTime', 'fcstHr']
LOOK_AHEAD = 3 # hours LOOK_AHEAD = 3 # hours
SEC_PER_HOUR = 60*60
_Logger = logging.getLogger(Avn.CATEGORY) _Logger = logging.getLogger(Avn.CATEGORY)
def retrieve(siteID): def retrieve(siteID):
try: try:
pdc = ForecastPointDataRetrieve.retrieve('bufrmosLAMP', siteID, PARAMETERS) pdc = ForecastPointDataRetrieve.retrieve('bufrmosLAMP', siteID, PARAMETERS, forecastTimesLimit=3)
except NoDataException.NoDataException: except NoDataException.NoDataException:
return None return None
pots = [] pots = []
try: try:
# assume pdc[0] is 0 hour and not used in the forecast. # assume pdc[0] is 0 hour and not used in the forecast.
vtime = pdc[1]['refTime'] / 1000.0 + LOOK_AHEAD*3600 vtime = pdc[1]['refTime'] / 1000.0 + LOOK_AHEAD*SEC_PER_HOUR
for n in range(1, LOOK_AHEAD): for n in range(1, LOOK_AHEAD):
pdv = pdc[n] pdv = pdc[n]
pots.append(pdv['tstorm2hr']) pots.append(pdv['tstorm2hr'])
data = max([x for x in pots if 0<= x <= 100] + [0]) data = max([x for x in pots if 0 <= x <= 100] + [0])
return {'from': vtime-LOOK_AHEAD*3600, 'to': vtime, 'prob': min(data, 100)} return {'from': vtime-LOOK_AHEAD*SEC_PER_HOUR, 'to': vtime, 'prob': min(data, 100)}
except KeyError: except KeyError:
return None return None

View file

@ -31,34 +31,47 @@ import PointDataView, PointDataContainer, NoDataException, PointDataRetrieve
# Date Ticket# Engineer Description # Date Ticket# Engineer Description
# ------------ ---------- ----------- -------------------------- # ------------ ---------- ----------- --------------------------
# 25Apr2012 14688 rferrel Initial Creation. # 25Apr2012 14688 rferrel Initial Creation.
# # 03Apr2013 1735 rferrel Use DbQueryRequest to get forecast times
# and added option to limit number returned.
# #
# #
class ForecastPointDataRetrieve(PointDataRetrieve.PointDataRetrieve): class ForecastPointDataRetrieve(PointDataRetrieve.PointDataRetrieve):
def __init__(self, pluginName, site, parameters, keyId='forecastHr', refTime=None, constraint={}, maxSize=99): def __init__(self, pluginName, site, parameters, keyId='forecastHr', refTime=None, constraint={}, maxSize=99, forecastTimesLimit=-999):
self.forecastTimesLimit = forecastTimesLimit
super(ForecastPointDataRetrieve, self).__init__(pluginName, site, parameters, keyId, refTime, constraint, maxSize) super(ForecastPointDataRetrieve, self).__init__(pluginName, site, parameters, keyId, refTime, constraint, maxSize)
def _query(self, parameters, maxSize): def _query(self, parameters, maxSize):
times = self.__queryForecastTimes() fctTimes = self.__queryForecastTimes()
self.__javaPdc = self.__requestForecastData(times, parameters) self.__javaPdc = self.__requestForecastData(fctTimes, parameters)
pdvDict = self._organizeData(self.__javaPdc) pdvDict = self._organizeData(self.__javaPdc)
self.pdc = PointDataContainer.PointDataContainer(pdvDict, self.__javaPdc, self.refTime) self.pdc = PointDataContainer.PointDataContainer(pdvDict, self.__javaPdc, self.refTime)
def __queryForecastTimes(self): def __queryForecastTimes(self):
from com.raytheon.uf.viz.core.catalog import CatalogQuery from com.raytheon.uf.common.dataquery.requests import DbQueryRequest
return CatalogQuery.performQuery('dataTime.fcstTime', self._buildConstraints(self.refTime)) from com.raytheon.uf.viz.core.requests import ThriftClient
from java.lang import Integer
request = DbQueryRequest()
request.setConstraints(self._buildConstraints(self.refTime))
request.addRequestField('dataTime.fcstTime')
request.setOrderByField('dataTime.fcstTime')
request.setDistinct(True)
iForecastTimesLimit = Integer(self.forecastTimesLimit)
if (self.forecastTimesLimit > 0) :
request.setLimit(iForecastTimesLimit)
return ThriftClient.sendRequest(request).getFieldObjects('dataTime.fcstTime', iForecastTimesLimit.getClass())
def __requestForecastData(self, availableHours, parameters): def __requestForecastData(self, availableHours, parameters):
from com.raytheon.viz.pointdata import PointDataRequest from com.raytheon.viz.pointdata import PointDataRequest
from com.raytheon.uf.common.time import DataTime from com.raytheon.uf.common.time import DataTime
from java.lang import String from java.lang import String
import jep import jep
dts = jep.jarray(len(availableHours), DataTime) dtsLen = len(availableHours)
for i in range(len(availableHours)): dts = jep.jarray(dtsLen, DataTime)
dts[i] = DataTime(self.refTime, int(availableHours[i])) for i in range(dtsLen):
constraints = self._buildConstraints(None) #times are explicitly set so we don't need to constrain those dts[i] = DataTime(self.refTime, availableHours[i].intValue())
constraints = self._buildConstraints(None) #fctTimes are explicitly set so we don't need to constrain those
params = jep.jarray(len(parameters), String) params = jep.jarray(len(parameters), String)
for i in range(len(parameters)): for i in range(len(parameters)):
params[i] = String(parameters[i]) params[i] = String(parameters[i])
@ -71,9 +84,6 @@ class ForecastPointDataRetrieve(PointDataRetrieve.PointDataRetrieve):
self.pluginName, params, stations, self.pluginName, params, stations,
constraints) constraints)
def retrieve(pluginName, site, parameters, keyId='forecastHr', refTime=None, constraint={}, maxSize=99): def retrieve(pluginName, site, parameters, keyId='forecastHr', refTime=None, constraint={}, maxSize=99, forecastTimesLimit=-999):
ret = ForecastPointDataRetrieve(pluginName, site, parameters, keyId, refTime, constraint, maxSize) ret = ForecastPointDataRetrieve(pluginName, site, parameters, keyId, refTime, constraint, maxSize, forecastTimesLimit)
return ret.pdc return ret.pdc

View file

@ -302,7 +302,8 @@ public class DbQueryRequest implements IServerRequest {
+ ", orderBy=" + ", orderBy="
+ (orderBy == null ? "null" : String.format( + (orderBy == null ? "null" : String.format(
"[field=%s, mode=%s]", orderBy.field, "[field=%s, mode=%s]", orderBy.field,
orderBy.mode.toString())) + "]"; orderBy.mode.toString()))
+ (limit == null ? "" : ", limit=" + limit) + "]";
} }
} }