Exemplo n.º 1
0
 def setTime(self, aDattim):
     convert = GempakConvert()
     name = "dataTime"
     operand = "between"
     aw2Time = convert.dattimToDbtime(aDattim)
     timeRange = convert.setTimeRange(aw2Time)
     self.query.addParameter(name, timeRange, operand)
 def setTime(self, aDattim):
     convert = GempakConvert()
     name = "dataTime"
     operand = "between"
     aw2Time = convert.dattimToDbtime(aDattim)
     timeRange = convert.setTimeRange(aw2Time)
     self.query.addParameter(name, timeRange, operand)
Exemplo n.º 3
0
 def __getDbTime(self, aDattim):
     refTime = aDattim.upper().split("F")[0]
     fcstTime = "%s" % (int(aDattim.upper().split("F")[1]) * 3600)
     convert = GempakConvert()
     refTime = convert.dattimToDbtime(refTime)
     print "refTime=", refTime
     print "fcstTime=", fcstTime
     return refTime, fcstTime
Exemplo n.º 4
0
 def __getDbTime (self, aDattim):
     refTime = aDattim.upper().split("F")[0]
     fcstTime = "%s" % (int(aDattim.upper().split("F")[1]) * 3600)
     convert = GempakConvert()
     refTime = convert.dattimToDbtime(refTime)
     print "refTime=", refTime
     print "fcstTime=", fcstTime
     return refTime, fcstTime
Exemplo n.º 5
0
class GempakGridCycleQuery():
    def __init__(self, aPlugin):
        self.plugin = aPlugin
        self.queryResults = ArrayList()
        self.GSQ = GempakSqlQuery.GempakSqlQuery()
        self.GSQ.setReturnText()
        self.convert = GempakConvert()

#
# Set parameters of the metadata catalog query
#

    def setParameters(self, aParms):
        parms = aParms.split("|")
        self.model = parms[0].upper()
        self.cycle = self.convert.dattimToDbtime(parms[1].upper()).replace(
            ' ', '_')
        #print "model=", self.model
        #print "cycle=", self.cycle

#
# Generates a list of responses in XML format
#

    def makeResponse(self):
        retStr = self.convert.dbtimeToDattim((self.queryResult).split("/")[2])
        #print "returning time=", retStr
        return ResponseMessageGeneric(retStr)

#
# Executes the query and calls appropriate response functions
#

    def execute(self):
        #
        # construct the SQL query to execute
        #
        myQuery = "SELECT datauri FROM " + self.plugin + " WHERE datauri LIKE '%" + \
                   self.cycle + "%' AND datauri ~* '/" + self.model + "/' LIMIT 1"
        #print "myQuery:", myQuery

        #
        # set the SQL query
        #
        self.GSQ.setQuery(myQuery)
        self.queryResult = self.GSQ.execute()
        #print "self.queryResult=", self.queryResult
        #
        # process the results of the query
        #
        if self.queryResult is None:
            return self.makeNullResponse("Query returned no results")
        else:
            return self.makeResponse()
    def setGridIdParms(self, aGridName, *parms):
        for ii in range(len(parms)):
            if ii == 0: 
                #print "setting time to", parms[0]
                convert = GempakConvert()
                self.query.addParameter("dataTime", convert.dattimToDbtime(parms[0]))
            elif ii == 1:
                #print "setting eventName to", parms[1]
                self.query.addParameter("modelInfo.eventName", parms[1])

        self.gridName= aGridName
Exemplo n.º 7
0
class GempakGridCycleQuery():
    
    def __init__(self, aPlugin):
        self.plugin = aPlugin
        self.queryResults = ArrayList()
        self.GSQ = GempakSqlQuery.GempakSqlQuery()
        self.GSQ.setReturnText()
        self.convert = GempakConvert()
    
#
# Set parameters of the metadata catalog query
#
    def setParameters (self, aParms):
        parms = aParms.split("|")
        self.model=parms[0].upper()
        self.cycle = self.convert.dattimToDbtime(parms[1].upper()).replace (' ', '_')
        #print "model=", self.model
        #print "cycle=", self.cycle
        
#
# Generates a list of responses in XML format
#
    def makeResponse(self):
        retStr = self.convert.dbtimeToDattim((self.queryResult).split("/")[2])
        #print "returning time=", retStr
        return ResponseMessageGeneric(retStr)
    
#
# Executes the query and calls appropriate response functions
#    
    def execute(self):
        #
        # construct the SQL query to execute
        #
        myQuery = "SELECT datauri FROM " + self.plugin + " WHERE datauri LIKE '%" + \
                   self.cycle + "%' AND datauri ~* '/" + self.model + "/' LIMIT 1"
        #print "myQuery:", myQuery
        
        #
        # set the SQL query
        # 
        self.GSQ.setQuery(myQuery)
        self.queryResult = self.GSQ.execute()
        #print "self.queryResult=", self.queryResult
        #
        # process the results of the query
        #
        if self.queryResult is None:
            return self.makeNullResponse("Query returned no results")
        else:
            return self.makeResponse()
Exemplo n.º 8
0
 def __getDbTime (self, aDattim):
     if self.pluginName == 'grib' or self.pluginName == 'ncgrib':
         convert = GempakConvert()
         return convert.dattimToDbtime(aDattim)           
     else:
         return None
Exemplo n.º 9
0
class AtcfTrackRequest(BaseRequest.BaseRequest):
    def __init__(self):
        BaseRequest.BaseRequest.__init__(self, "atcf")
        self.isTechniqueSet = False
        self.time = None
        self.StartTime = None
        self.EndTime = None
        self.isTimeList = False
        self.AllTimesList = []
        self.TimesList = []
        self.Convert = GempakConvert()

    def setTime(self, aTime=None):
        self.time = aTime

    def setStartTime(self, aTime=None):
        if aTime:
            self.StartTime = aTime
        else:
            # set StartTime to the First Available Time
            self.StartTime = self.__getFirstTime()

    def setEndTime(self, aTime=None):
        if aTime:
            self.EndTime = aTime
        else:
            # set StartTime to the Last Available Time
            self.EndTime = self.__getLastTime()

    def setTechnique(self, aTechnique):
        self.technique = aTechnique
        self.isTechniqueSet = True

    def execute(self):
        if self.time:
            self.query.addParameter("dataTime", self.time)
        else:
            if not self.StartTime:
                self.StartTime = self.__getFirstTime()
            if not self.EndTime:
                self.EndTime = self.__getLastTime()
            if self.StartTime and self.EndTime:
                self.timeRange = self.StartTime + "--" + self.EndTime
                self.query.addParameter("dataTime", self.timeRange, "between")
            else:
                return self.__makeNullResponse("Could not set the time range")
        # get the results from the database
        self.queryResults = self.query.execute()
        if self.queryResults is None or self.queryResults.size() == 0:
            return self.__makeNullResponse()
        else:
            # process the results
            return self.__makeResponse()

    def __getFirstTime(self):
        # check if the list of available times has been calculated
        if self.isTimeList:
            return self.Convert.dattimToDbtime(self.AllTimesList[0])
        else:
            # get the list of times and return the earliest available time
            self.__getTimeList()
            return self.Convert.dattimToDbtime(self.AllTimesList[0])

    def __getLastTime(self):
        # check if the list of available times has been calculated
        if self.isTimeList:
            return self.Convert.dattimToDbtime(
                self.AllTimesList[len(self.AllTimesList) - 1])
        else:
            # get the list of times and return the last available time
            self.__getTimeList()
            return self.Convert.dattimToDbtime(
                self.AllTimesList[len(self.AllTimesList) - 1])

    def __getTimePlus(self, aTime, aPlus="168"):
        return self.Convert.addHours(aTime, aPlus)

#    def __createTimes(self):
#        if self.time:
#            self.TimesList.append(self.time)
#        else:
#            startIndex = self.AllTimesList.index(self.StartTime)
#            endIndex = self.AllTimesList.index(self.EndTime)
#            self.TimesList = self.AllTimesList[startIndex:endIndex]

    def __getTimeList(self):
        import GempakCatalogTimeQuery
        tq = GempakCatalogTimeQuery.GempakCatalogTimeQuery("atcf")
        tq.setReturnText()
        self.AllTimesList = tq.execute().split("|")
        self.isTimeList = True

    def __getDictionaries(self):
        import GempakSqlQuery
        # list of time cyclone ID tuples:
        # eg [('2010-08-28 06:00:00.0', 'EP9'), ('2010-08-28 12:00:00.0', 'EP8')]
        timeIdTupleList = []

        # timeIdTqDict - is the key-value dictionary of time-Id tuple Technique List dictionary
        # each time has a corresponding dictionary of ID-Technique
        # eg: {('2010-08-28 06:00:00.0','AL8'):['AEMI', 'AEMN', 'AP01', 'AP02'], ('2010-08-28 12:00:00.0','AL9'):['AP11', 'AP14', 'AP18']}
        timeIdTqDict = {}

        # idNumberDict - is the key-value dictionary of cycloneID-basin, cycloneNumb tuple pairs
        # each cycloneId has a corresponding basin-cycloneNumb tuple
        # eg: {'AL8': ('AL', '8'), 'AL9': ('AL', '9')}
        idNumberDict = {}

        for ii in range(self.queryResults.size()):

            currentRecord = self.queryResults.get(ii)

            # get the time
            recordTime = str(currentRecord.getDataTime())

            # get basin
            basin = str(currentRecord.getBasin())
            # get cyclone number
            cycloneNumb = str(currentRecord.getCycloneNum())

            # construct cyclone ID
            # eg EP9
            cycloneId = basin + cycloneNumb

            # construct time - cyclone ID tuple
            # eg ('2010-08-21 06:00:00.0', 'EP9')
            timeIdTuple = (recordTime, cycloneId)

            # check time - cyclone ID tuple old or new
            if timeIdTuple in timeIdTupleList:
                # existing time - cyclone ID tuple - do not add to list
                pass
            else:
                timeIdTupleList.append(timeIdTuple)

                # add the basin,cycloneNumb tuple as value to the idNumberDict dictionary
                # for the key cycloneId, if has not been added already
                if (basin, cycloneNumb) in idNumberDict.values():
                    pass
                else:
                    idNumberDict[cycloneId] = (basin, cycloneNumb)

                techniqueList = []
                # check if the request is for a single technique
                if self.isTechniqueSet:
                    techniqueList.append(self.technique)
                else:
                    # perform the db query for the records with that cyclone ID
                    techniqueQuery = GempakSqlQuery.GempakSqlQuery()

                    # set the return type to text(string)
                    # not a ResponseMessageGEneric object
                    techniqueQuery.setReturnText()

                    # set the separator
                    techniqueQuery.setSeparator("|")

                    # set the query text
                    techniqueQueryText = "SELECT DISTINCT technique FROM atcf WHERE " + \
                            "basin ='" + idNumberDict[cycloneId][0] + "' AND " +  \
                            "cyclonenum ='" + idNumberDict[cycloneId][1] +  "' AND " + \
                            "reftime='" + recordTime + "'"
                    techniqueQuery.setQuery(techniqueQueryText)

                    # execute the query
                    techniqueQueryResults = techniqueQuery.execute()

                    # create a list of techniques
                    techniqueList = techniqueQueryResults.split("|")

                    # add technique as value to the to the time,cyclone ID - technique dictionary
                    timeIdTqDict[timeIdTuple] = techniqueList
        return idNumberDict, timeIdTqDict

    def __makeResponse(self):
        from gov.noaa.nws.ncep.edex.uengine.tasks.atcf import AtcfCyclone, AtcfTrack
        response = ArrayList()
        idNumberDict, timeIdTqDict = self.__getDictionaries()

        # traverse the time,cyclone ID - technique dictionary to obtain AtcfRecords and
        # construct AtcfCyclone objects
        for key, value in timeIdTqDict.items():
            currentTime = key[0]
            cycId = key[1]
            techList = value
            aBasin = idNumberDict[cycId][0]
            aCycloneNumb = idNumberDict[cycId][1]

            # create new AtcfCyclone object
            aCyclone = AtcfCyclone(cycId)
            for techniqueName in techList:
                bsResults = None
                # CARQ case
                if techniqueName == "CARQ":
                    # first we need to create track for the past
                    BaseRequest.BaseRequest.__init__(self, "atcf")
                    self.query.addParameter("dataTime", currentTime)
                    self.query.addParameter("basin", aBasin)
                    self.query.addParameter("cycloneNum", aCycloneNumb)
                    self.query.addParameter("technique", techniqueName)
                    self.query.addParameter("radWind", "34")
                    self.query.addParameter("fcstHour", "0", "<")
                    order = True
                    self.query.setSortBy("fcstHour", order)
                    bsResultsPast = self.query.execute()
                    bsResults = bsResultsPast

                    # second we need to create track for the future
                    BaseRequest.BaseRequest.__init__(self, "atcf")
                    timeRange = currentTime + "--" + self.__getTimePlus(
                        currentTime)
                    self.query.addParameter("dataTime", timeRange, "between")
                    self.query.addParameter("basin", aBasin)
                    self.query.addParameter("cycloneNum", aCycloneNumb)
                    self.query.addParameter("technique", techniqueName)
                    self.query.addParameter("radWind", "34")
                    self.query.addParameter("fcstHour", "0")
                    order = True
                    self.query.setSortBy("dataTime", order)
                    bsResultsFuture = self.query.execute()
                    count = 0
                    for ii in range(bsResultsFuture.size()):
                        recordToChange = bsResultsFuture.get(ii)
                        recordToChange.setFcstHour(ii * 6)
                        bsResults.add(recordToChange)
                # non-CARQ case
                else:
                    BaseRequest.BaseRequest.__init__(self, "atcf")
                    self.query.addParameter("dataTime", currentTime)
                    self.query.addParameter("basin", aBasin)
                    self.query.addParameter("cycloneNum", aCycloneNumb)
                    self.query.addParameter("technique", techniqueName)
                    order = True
                    self.query.setSortBy("fcstHour", order)
                    bsResults = self.query.execute()
                if bsResults is None or bsResults.size() == 0:
                    pass
                else:
                    # create new AtcfTrack object
                    aTrack = AtcfTrack(techniqueName, bsResults)

                    # add AtcfTrack object to AtcfCyclone
                    aCyclone.addTrack(aTrack)
                # add AtcfCyclone object to the response ArrayList
                response.add(ResponseMessageGeneric(aCyclone))
        return response

#
# Returns a string with a response message
#

    def __makeNullResponse(self,
                           aMessage="Database Query returned no results"):
        return ResponseMessageGeneric(aMessage)
Exemplo n.º 10
0
class AtcfTrackRequest(BaseRequest.BaseRequest):
    
    def __init__(self):
        BaseRequest.BaseRequest.__init__(self, "atcf")
        self.isTechniqueSet = False
        self.time = None
        self.StartTime = None
        self.EndTime = None
        self.isTimeList= False
        self.AllTimesList = []
        self.TimesList = []
        self.Convert = GempakConvert()
        
    def setTime(self, aTime=None):
        self.time = aTime

    def setStartTime(self, aTime=None):
        if aTime :
            self.StartTime = aTime
        else:
            # set StartTime to the First Available Time
            self.StartTime = self.__getFirstTime()
            
    def setEndTime(self, aTime=None):
        if aTime :
            self.EndTime = aTime
        else:
            # set StartTime to the Last Available Time
            self.EndTime = self.__getLastTime() 
    
    def setTechnique(self, aTechnique):
        self.technique = aTechnique
        self.isTechniqueSet = True
    
    def execute(self):
        if self.time:
            self.query.addParameter("dataTime", self.time)
        else:
            if not self.StartTime:
                self.StartTime = self.__getFirstTime()
            if not self.EndTime:
                self.EndTime = self.__getLastTime()
            if self.StartTime and self.EndTime:
                self.timeRange = self.StartTime + "--" + self.EndTime
                self.query.addParameter("dataTime", self.timeRange, "between")
            else:
                return self.__makeNullResponse("Could not set the time range")
        # get the results from the database              
        self.queryResults = self.query.execute()
        if self.queryResults is None or self.queryResults.size() == 0:
            return self.__makeNullResponse()
        else:
            # process the results
            return self.__makeResponse()
    
    def __getFirstTime(self):
        # check if the list of available times has been calculated            
        if self.isTimeList:
            return self.Convert.dattimToDbtime(self.AllTimesList[0])
        else:
            # get the list of times and return the earliest available time
            self.__getTimeList()
            return self.Convert.dattimToDbtime(self.AllTimesList[0])
        
    def __getLastTime(self):
        # check if the list of available times has been calculated
        if self.isTimeList:
            return self.Convert.dattimToDbtime(self.AllTimesList[len(self.AllTimesList) -1])
        else:
            # get the list of times and return the last available time
            self.__getTimeList()
            return self.Convert.dattimToDbtime(self.AllTimesList[len(self.AllTimesList) -1])
 
              
    
    def __getTimePlus(self, aTime, aPlus="168"):
        return self.Convert.addHours(aTime, aPlus)

#    def __createTimes(self):
#        if self.time:
#            self.TimesList.append(self.time)
#        else:
#            startIndex = self.AllTimesList.index(self.StartTime)
#            endIndex = self.AllTimesList.index(self.EndTime)
#            self.TimesList = self.AllTimesList[startIndex:endIndex]
            
    def __getTimeList(self):
        import GempakCatalogTimeQuery
        tq = GempakCatalogTimeQuery.GempakCatalogTimeQuery("atcf")
        tq.setReturnText()
        self.AllTimesList =  tq.execute().split("|")
        self.isTimeList =True
        
    def __getDictionaries(self):
        import GempakSqlQuery
        # list of time cyclone ID tuples:
        # eg [('2010-08-28 06:00:00.0', 'EP9'), ('2010-08-28 12:00:00.0', 'EP8')]
        timeIdTupleList = []
        
        # timeIdTqDict - is the key-value dictionary of time-Id tuple Technique List dictionary
        # each time has a corresponding dictionary of ID-Technique
        # eg: {('2010-08-28 06:00:00.0','AL8'):['AEMI', 'AEMN', 'AP01', 'AP02'], ('2010-08-28 12:00:00.0','AL9'):['AP11', 'AP14', 'AP18']}
        timeIdTqDict = {}
        
        # idNumberDict - is the key-value dictionary of cycloneID-basin, cycloneNumb tuple pairs
        # each cycloneId has a corresponding basin-cycloneNumb tuple
        # eg: {'AL8': ('AL', '8'), 'AL9': ('AL', '9')}       
        idNumberDict = {}
        
        for ii in range(self.queryResults.size()):
            
            currentRecord = self.queryResults.get(ii)

            # get the time 
            recordTime = str(currentRecord.getDataTime())
            
            # get basin
            basin = str(currentRecord.getBasin())
            # get cyclone number
            cycloneNumb = str(currentRecord.getCycloneNum())
        
            # construct cyclone ID
            # eg EP9
            cycloneId = basin + cycloneNumb
            
            # construct time - cyclone ID tuple
            # eg ('2010-08-21 06:00:00.0', 'EP9')
            timeIdTuple = (recordTime, cycloneId)
             
            # check time - cyclone ID tuple old or new
            if timeIdTuple in timeIdTupleList:
                # existing time - cyclone ID tuple - do not add to list
                pass
            else:
                timeIdTupleList.append(timeIdTuple)
                
                # add the basin,cycloneNumb tuple as value to the idNumberDict dictionary 
                # for the key cycloneId, if has not been added already
                if (basin, cycloneNumb) in idNumberDict.values():
                    pass
                else:
                    idNumberDict[cycloneId] = (basin, cycloneNumb)

                techniqueList = []
                # check if the request is for a single technique
                if self.isTechniqueSet:
                    techniqueList.append(self.technique)
                else:
                    # perform the db query for the records with that cyclone ID
                    techniqueQuery = GempakSqlQuery.GempakSqlQuery()
    
                    # set the return type to text(string)
                    # not a ResponseMessageGEneric object 
                    techniqueQuery.setReturnText()

                    # set the separator
                    techniqueQuery.setSeparator("|")

                    # set the query text
                    techniqueQueryText = "SELECT DISTINCT technique FROM atcf WHERE " + \
                            "basin ='" + idNumberDict[cycloneId][0] + "' AND " +  \
                            "cyclonenum ='" + idNumberDict[cycloneId][1] +  "' AND " + \
                            "reftime='" + recordTime + "'"
                    techniqueQuery.setQuery(techniqueQueryText)
                    
                    # execute the query
                    techniqueQueryResults = techniqueQuery.execute()
                    
                    # create a list of techniques
                    techniqueList = techniqueQueryResults.split("|")
                    
                    # add technique as value to the to the time,cyclone ID - technique dictionary 
                    timeIdTqDict[timeIdTuple] = techniqueList
        return idNumberDict, timeIdTqDict

    def __makeResponse(self):
        from gov.noaa.nws.ncep.edex.uengine.tasks.atcf import AtcfCyclone, AtcfTrack
        response = ArrayList()
        idNumberDict, timeIdTqDict = self.__getDictionaries()
               
        # traverse the time,cyclone ID - technique dictionary to obtain AtcfRecords and
        # construct AtcfCyclone objects
        for key, value in timeIdTqDict.items():                
            currentTime = key[0]
            cycId = key[1]
            techList = value
            aBasin = idNumberDict[cycId][0]
            aCycloneNumb = idNumberDict[cycId][1]

            # create new AtcfCyclone object
            aCyclone = AtcfCyclone(cycId)
            for techniqueName in techList:
                bsResults = None
                # CARQ case
                if techniqueName == "CARQ":
                    # first we need to create track for the past  
                    BaseRequest.BaseRequest.__init__(self, "atcf")
                    self.query.addParameter("dataTime", currentTime)
                    self.query.addParameter("basin",aBasin)
                    self.query.addParameter("cycloneNum",aCycloneNumb)
                    self.query.addParameter("technique",techniqueName)
                    self.query.addParameter("radWind", "34")
                    self.query.addParameter("fcstHour","0", "<")
                    order = True
                    self.query.setSortBy("fcstHour", order)
                    bsResultsPast = self.query.execute()
                    bsResults = bsResultsPast

                    # second we need to create track for the future  
                    BaseRequest.BaseRequest.__init__(self, "atcf")
                    timeRange = currentTime + "--" + self.__getTimePlus(currentTime)
                    self.query.addParameter("dataTime", timeRange, "between")
                    self.query.addParameter("basin",aBasin)
                    self.query.addParameter("cycloneNum",aCycloneNumb)
                    self.query.addParameter("technique",techniqueName)
                    self.query.addParameter("radWind", "34")
                    self.query.addParameter("fcstHour","0")
                    order = True
                    self.query.setSortBy("dataTime", order)                
                    bsResultsFuture = self.query.execute()
                    count = 0
                    for ii in range(bsResultsFuture.size()):
                        recordToChange = bsResultsFuture.get(ii)
                        recordToChange.setFcstHour(ii*6)                       
                        bsResults.add(recordToChange)
                # non-CARQ case
                else:
                    BaseRequest.BaseRequest.__init__(self, "atcf")
                    self.query.addParameter("dataTime", currentTime)
                    self.query.addParameter("basin",aBasin)
                    self.query.addParameter("cycloneNum",aCycloneNumb)
                    self.query.addParameter("technique",techniqueName)
                    order = True
                    self.query.setSortBy("fcstHour", order)
                    bsResults = self.query.execute()
                if bsResults is None or bsResults.size() == 0:
                    pass
                else:                    
                    # create new AtcfTrack object
                    aTrack = AtcfTrack(techniqueName, bsResults)
                    
                    # add AtcfTrack object to AtcfCyclone
                    aCyclone.addTrack(aTrack)
                # add AtcfCyclone object to the response ArrayList
                response.add(ResponseMessageGeneric(aCyclone))
        return response

#
# Returns a string with a response message
#
    def __makeNullResponse(self, aMessage="Database Query returned no results"):
        return ResponseMessageGeneric(aMessage)