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:
parent
374eed35b3
commit
7b829a2fec
4 changed files with 53 additions and 36 deletions
|
@ -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:]
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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) + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue