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: b836dcb6d55dfbdf8e825fb194903d45a83382c8
This commit is contained in:
Roger Ferrel 2013-04-03 07:41:39 -05:00
parent f57358cff8
commit 54cbf656e9
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)
def retrieve(siteID, info):
from datetime import timedelta
day = timedelta(days=1)
secondsPerDay = day.total_seconds()
msPerSecond = 1000.0
th = LLWSThread.Server(info)
t = 0
d = {}
@ -115,7 +119,7 @@ def retrieve(siteID, info):
# This may be ok if database is purged frequently.
# How far back should it go 1, 6, 12, 24 hours?
# 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)
if acarsRec:
acarsId = siteID[1:]

View file

@ -32,6 +32,7 @@ import ForecastPointDataRetrieve, NoDataException
# ------------ ---------- ----------- --------------------------
# 09/15/09 njensen Initial Creation.
# 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']
LOOK_AHEAD = 3 # hours
SEC_PER_HOUR = 60*60
_Logger = logging.getLogger(Avn.CATEGORY)
def retrieve(siteID):
try:
pdc = ForecastPointDataRetrieve.retrieve('bufrmosLAMP', siteID, PARAMETERS)
pdc = ForecastPointDataRetrieve.retrieve('bufrmosLAMP', siteID, PARAMETERS, forecastTimesLimit=3)
except NoDataException.NoDataException:
return None
pots = []
try:
# 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):
pdv = pdc[n]
pots.append(pdv['tstorm2hr'])
data = max([x for x in pots if 0<= x <= 100] + [0])
return {'from': vtime-LOOK_AHEAD*3600, 'to': vtime, 'prob': min(data, 100)}
data = max([x for x in pots if 0 <= x <= 100] + [0])
return {'from': vtime-LOOK_AHEAD*SEC_PER_HOUR, 'to': vtime, 'prob': min(data, 100)}
except KeyError:
return None

View file

@ -31,34 +31,47 @@ import PointDataView, PointDataContainer, NoDataException, PointDataRetrieve
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 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):
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)
def _query(self, parameters, maxSize):
times = self.__queryForecastTimes()
self.__javaPdc = self.__requestForecastData(times, parameters)
fctTimes = self.__queryForecastTimes()
self.__javaPdc = self.__requestForecastData(fctTimes, parameters)
pdvDict = self._organizeData(self.__javaPdc)
self.pdc = PointDataContainer.PointDataContainer(pdvDict, self.__javaPdc, self.refTime)
def __queryForecastTimes(self):
from com.raytheon.uf.viz.core.catalog import CatalogQuery
return CatalogQuery.performQuery('dataTime.fcstTime', self._buildConstraints(self.refTime))
from com.raytheon.uf.common.dataquery.requests import DbQueryRequest
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):
from com.raytheon.viz.pointdata import PointDataRequest
from com.raytheon.uf.common.time import DataTime
from java.lang import String
import jep
dts = jep.jarray(len(availableHours), DataTime)
for i in range(len(availableHours)):
dts[i] = DataTime(self.refTime, int(availableHours[i]))
constraints = self._buildConstraints(None) #times are explicitly set so we don't need to constrain those
dtsLen = len(availableHours)
dts = jep.jarray(dtsLen, DataTime)
for i in range(dtsLen):
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)
for i in range(len(parameters)):
params[i] = String(parameters[i])
@ -71,9 +84,6 @@ class ForecastPointDataRetrieve(PointDataRetrieve.PointDataRetrieve):
self.pluginName, params, stations,
constraints)
def retrieve(pluginName, site, parameters, keyId='forecastHr', refTime=None, constraint={}, maxSize=99):
ret = ForecastPointDataRetrieve(pluginName, site, parameters, keyId, refTime, constraint, maxSize)
def retrieve(pluginName, site, parameters, keyId='forecastHr', refTime=None, constraint={}, maxSize=99, forecastTimesLimit=-999):
ret = ForecastPointDataRetrieve(pluginName, site, parameters, keyId, refTime, constraint, maxSize, forecastTimesLimit)
return ret.pdc

View file

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