IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 30, 2012, 2:49:37 PM (14 years ago)
Author:
eugene
Message:

merge changes from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20111122/ippToPsps/jython/scratchdb.py

    r32590 r33638  
    1919    Constructor
    2020    '''
    21     def __init__(self, logger, doc, useFull=0):
    22         super(ScratchDb, self).__init__(logger, doc, "localdatabase")
     21    def __init__(self, logger, config, dbName=None):
     22        super(ScratchDb, self).__init__(logger, config, "localdatabase", dbName)
     23
     24        self.dvoDoneTable = "dvoDone"
     25        self.dvoSkyTable = "dvoSkyTable"
     26
     27
     28    '''
     29    Destructor
     30    '''
     31    def __del__(self):
     32
     33        self.logger.debug("ScratchDb destructor")
     34
     35
     36    '''
     37    Sets whether we are using normal or pre-ingested DVO tables
     38    '''
     39    def setUseFullTables(self, useFull):
    2340
    2441        if useFull:
    25             self.dvoMetaTable = "dvoMetaFull"
     42            self.dvoImagesTable = "dvoImagesFull"
    2643            self.dvoDetectionTable = "dvoDetectionFull"
    27             self.dvoDoneTable = "dvoDone"
    2844        else:
    29             self.dvoMetaTable = "dvoMeta"
     45            self.dvoImagesTable = "dvoImages"
    3046            self.dvoDetectionTable = "dvoDetection"
    3147
    32         self.logger.debugPair("Using DVO meta table", self.dvoMetaTable)
     48        self.logger.debugPair("Using DVO images table", self.dvoImagesTable)
    3349        self.logger.debugPair("Using DVO detection table", self.dvoDetectionTable)
    34 
    35     '''
    36     Destructor
    37     '''
    38     def __del__(self):
    39 
    40         self.logger.debug("ScratchDb destructor")
    4150
    4251    '''
     
    112121    Gets imageID from extern ID
    113122    '''
    114     def getImageIDFromExternID(self, sourceID, externID):
     123    def getImageIDFromExternID(self, externID):
    115124               
    116125        imageID = -1
    117126               
    118         sql = "SELECT imageID FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID, externID)
     127        sql = "SELECT IMAGE_ID FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID)
    119128        try:
    120129            rs = self.executeQuery(sql)   
     
    129138    Gets DVO image flags
    130139    '''
    131     def getDvoImageFlags(self, sourceID, externID):
     140    def getDvoImageFlags(self, externID):
    132141
    133142        flags = 0
    134143
    135         sql = "SELECT flags FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID, externID)
     144        sql = "SELECT FLAGS FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID)
    136145        try:
    137146            rs = self.executeQuery(sql) 
     
    145154    Gets photcode (aka photoCalID from dvo table)
    146155    '''
    147     def getPhotoCalID(self, sourceID, externID):
     156    def getPhotoCalID(self, externID):
    148157
    149158        photcode = -1
    150159
    151         sql = "SELECT photcode FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID, externID)
     160        sql = "SELECT PHOTCODE FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID)
    152161        try:
    153162            rs = self.executeQuery(sql) 
     
    168177
    169178    '''
    170     Inserts a new sourceID/imageID combo into dvoMeta
     179    Inserts a new sourceID/imageID combo into dvoImages
    171180    '''
    172181    def insertNewDvoExternID(self, sourceID, externID):
    173182
    174         sql = "INSERT INTO dvoMeta ( \
    175                sourceID, \
    176                externID \
     183        sql = "INSERT INTO " + self.dvoImagesTable + " ( \
     184               SOURCE_ID, \
     185               EXTERN_ID \
    177186               ) VALUES (\
    178187               " + str(sourceID) + ", \
     
    182191
    183192    '''
     193    Do we have an out-of-date version of this file?
     194    '''
     195    def haveOutOfDateVersionOfThisDvoTable(self, path):
     196
     197        fileStat = os.stat(path)
     198
     199        sql = "SELECT COUNT(*) FROM " + self.dvoDoneTable + " WHERE path = '" + path + "' AND modifiedDate != " + str(fileStat.st_mtime)
     200
     201        try:
     202            rs = self.executeQuery(sql)
     203            rs.first()
     204            if rs.getInt(1) > 0:
     205                self.logger.debugPair("Have out-to-date version of",  path)
     206                return True
     207            else:
     208                return False
     209        except:
     210            self.logger.exception("Unable to check whether this DVO table is out-of-date")
     211
     212    '''
     213    Have we already imported this DVO table?
     214    Checks path and modified date to be sure
     215    '''
     216    def alreadyImportedThisDvoTable(self, path):
     217
     218        fileStat = os.stat(path)
     219
     220        sql = "SELECT COUNT(*) FROM " + self.dvoDoneTable + " WHERE path = '" + path + "' AND modifiedDate = " + str(fileStat.st_mtime)
     221
     222        try:
     223            rs = self.executeQuery(sql)
     224            rs.first()
     225            if rs.getInt(1) > 0:
     226                self.logger.debugPair("Already imported up-to-date version of",  path)
     227                return True
     228            else:
     229                return False
     230        except:
     231            self.logger.exception("Unable to check whether this DVO table has been imported")
     232
     233
     234    '''
    184235    Updates dvoDone table with this DVO table
    185236    '''
    186     def setImportedThisDvoTable(self, name):
    187 
    188         sql = "INSERT INTO dvoDone (name) VALUES ('" + name + "')"
     237    def setImportedThisDvoTable(self, path, region="null"):
     238
     239        fileStat = os.stat(path)
     240
     241        # first delete any old version we have ingested
     242        sql = "DELETE FROM " + self.dvoDoneTable + " WHERE path = '" + path + "'"
    189243        self.execute(sql)
    190        
     244
     245        # now insert new version with up-to-date size and date
     246        sql = "INSERT INTO " + self.dvoDoneTable + " (region, path, modifiedDate, size) VALUES ('" + region + "', '" + path + "', " + str(str(fileStat.st_mtime)) + ", " + str(str(fileStat.st_size)) + ")"
     247        self.execute(sql)
     248
     249
     250    '''
     251    Gets the id for the cpm file for the provided region
     252    '''
     253    def getDvoCpmFileIdForRegion(self, region):
     254
     255        id = -1
     256        sql = "SELECT id FROM " + self.dvoDoneTable + " WHERE region = '" + region + "' AND path LIKE '%.cpm'";
     257        try:
     258            rs = self.executeQuery(sql)
     259            rs.first()
     260            id = rs.getInt(1)
     261        except:
     262            self.logger.errorPair("Could not get file id from " + self.dvoDoneTable, "for region: " + region)
     263
     264        return id
     265
     266
     267    '''
     268    Gets the id for the provided file
     269    '''
     270    def getDvoFileId(self, path):
     271
     272        id = -1
     273        sql = "SELECT id FROM " + self.dvoDoneTable + " WHERE path = '" + path + "'"
     274        try:
     275            rs = self.executeQuery(sql)
     276            rs.first()
     277            id = rs.getInt(1)
     278        except:
     279            self.logger.errprPair("Could not get file id from " + self.dvoDoneTable + "for", path)
     280
     281        return id
     282                                                                                               
     283    '''
     284    Returns a list of DVO regions currently ingested
     285    '''
     286    def getIngestedDvoRegions(self):
     287
     288        regions = []
     289
     290        sql = "SELECT DISTINCT region FROM dvoDone WHERE region != 'null'"
     291        try:
     292            rs = self.executeQuery(sql)
     293            while (rs.next()):
     294                regions.append(rs.getString(1))
     295            rs.close()
     296        except:
     297            self.logger.errorPai("Can't query for ingested regions", sql)
     298
     299        return regions
     300
     301   
     302    '''
     303    Gets total size of DVO files imported to this database
     304    Counts only cpm and cpt files
     305    '''
     306    def getTotalSizeOfIngestedDvoFiles(self):
     307
     308        size = 0
     309        sql = "SELECT SUM(size) FROM " + self.dvoDoneTable + " WHERE path LIKE '%cpm' OR path LIKE '%cpt'"
     310        try:
     311            rs = self.executeQuery(sql) 
     312            rs.first()
     313            size = rs.getLong(1)
     314        except:
     315            self.logger.errorPair("Unable to get total ingested DVO size", sql)
     316
     317        return size
     318
     319    '''
     320    Checks whether DVO files we have ingested are from the DVO path provided
     321    Does this by checking the original path of the SkyTable.fits file
     322    '''
     323    def isCorrectDvo(self, path):
     324
     325        sql = "SELECT path FROM " + self.dvoDoneTable + " WHERE path LIKE '%SkyTable.fits'"
     326        try:
     327            rs = self.executeQuery(sql) 
     328            rs.first()
     329
     330            head,tail = os.path.split(rs.getString(1))
     331
     332            if head == path:
     333                self.logger.debugPair("Already ingested stuff from DVO at", path)
     334                return True
     335            else:
     336                self.logger.errorPair("DVO does not match. We have", head)
     337                return False
     338
     339        except:
     340            self.logger.errorPair("No DVO files ingested for this path", path)
     341            return False
     342
    191343    '''
    192344    Checks whether the astrometric solution is ok for this chip
     
    210362        return True
    211363
    212     '''
    213     Have we already imported this DVO table?
    214     '''
    215     def alreadyImportedThisDvoTable(self, name):
    216 
    217         sql = "SELECT COUNT(*) FROM dvoDone WHERE name = '" + name + "'"
    218 
    219         try:
    220             rs = self.executeQuery(sql)
    221             rs.first()
    222             if rs.getInt(1) > 0:
    223                 self.logger.errorPair("Already imported DVO tables for",  name)
    224                 return True
    225             else:
    226                 return False
    227         except:
    228             self.logger.exception("Unable to check whether this DVO table has been imported")
    229 
    230364
    231365    '''
     
    233367    '''
    234368    def createDvoTables(self):
    235 
    236         self.logger.debugPair("Creating DVO table", "dvoMeta")
    237 
    238         sql = "DROP TABLE dvoMeta"
     369   
     370        # drop and create Images table
     371        self.logger.debugPair("Creating DVO table", self.dvoImagesTable)
     372        sql = "DROP TABLE " + self.dvoImagesTable
    239373        try: self.execute(sql)
    240374        except: pass
    241375       
    242         sql = "DROP TABLE dvoDetection"
    243         try: self.execute(sql)
    244         except: pass
    245 
    246         sql = "CREATE TABLE dvoMeta ( \
    247                sourceID INT, \
    248                imageID INT, \
    249                externID INT, \
    250                flags INT, \
    251                photcode INT, \
    252                PRIMARY KEY (sourceID, imageID, externID) \
     376        sql = "CREATE TABLE " + self.dvoImagesTable + " ( \
     377               SOURCE_ID SMALLINT, \
     378               IMAGE_ID INT, \
     379               EXTERN_ID INT, \
     380               FLAGS INT, \
     381               PHOTCODE SMALLINT, \
     382               PRIMARY KEY (IMAGE_ID, EXTERN_ID) \
    253383               )"
    254384
     
    257387            self.logger.error("Unable to create DVO meta-data database table")
    258388
     389        # now detection table
     390        self.logger.debugPair("Creating DVO table", self.dvoDetectionTable)
     391        sql = "DROP TABLE " + self.dvoDetectionTable
     392        try: self.execute(sql)
     393        except: pass
     394
    259395        self.logger.debugPair("Creating DVO table", "dvoDetection")
    260396        sql = "CREATE TABLE dvoDetection ( \
    261                sourceID INT, \
    262397               imageID INT, \
    263398               ippDetectID BIGINT, \
     
    266401               objID BIGINT, \
    267402               flags INT, \
    268                PRIMARY KEY (sourceID, imageID, ippDetectID) \
     403               PRIMARY KEY (imageID, ippDetectID) \
    269404               )"
    270405
     
    275410
    276411    '''
     412    Removes the provided DVO FITS files from from dvoDone and dvoDetection tables
     413    Returns a count of the number of detections deleted
     414    '''
     415    def purgeTheseDvoRegions(self, regions):
     416
     417        detectionCount = self.getRowCount(self.dvoDetectionTable)
     418        for region in regions:
     419           
     420           fileId = self.getDvoCpmFileIdForRegion(region)
     421
     422           if fileId < 0:
     423               self.logger.errorPair("Unable to get file ID to delete " + region + " from", self.dvoDoneTable)
     424               continue
     425
     426           sql = "DELETE FROM " + self.dvoDoneTable + " WHERE region = '" + region + "'"
     427           try: self.execute(sql)
     428           except:
     429               self.logger.errorPair("Unable to delete " + region + " from", self.dvoDoneTable)
     430
     431        finalCount = detectionCount - self.getRowCount(self.dvoDetectionTable)
     432
     433        # after a big delete, we should OPTIMIZE the table
     434        self.logger.infoPair("Running OPTIMIZE on ", self.dvoDetectionTable)
     435        if finalCount > 0: self.optimizeTable(self.dvoDetectionTable)
     436
     437        return finalCount
     438           
     439    '''
    277440    Drops and recreates tables necessary for dvoToMySQL program. Be very careful before using this...
    278441    '''
    279     def resetDvoToMysqlTables(self):
    280 
    281        self.logger.infoPair("Dropping table", self.dvoMetaTable)
    282        self.dropTable(self.dvoMetaTable)
     442    def resetAllDvoTables(self):
     443
     444       # drop all dvo tables - NB detections have to be deleted prior to dvoDone due to foreign key constraint
     445       self.logger.infoPair("Dropping table", self.dvoImagesTable)
     446       self.dropTable(self.dvoImagesTable)
     447       self.logger.infoPair("Dropping table", self.dvoSkyTable)
     448       self.dropTable(self.dvoSkyTable)
    283449       self.logger.infoPair("Dropping table", self.dvoDetectionTable)
    284450       self.dropTable(self.dvoDetectionTable)
     
    286452       self.dropTable(self.dvoDoneTable)
    287453
    288        self.logger.infoPair("Creating table", self.dvoMetaTable)
    289        sql = "CREATE TABLE " + self.dvoMetaTable + " LIKE dvoMeta"
     454       # create dvoDone table
     455       self.logger.infoPair("Creating table", self.dvoDoneTable)
     456       sql = "CREATE TABLE " + self.dvoDoneTable + " (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, region VARCHAR(100), path VARCHAR(1000), modifiedDate BIGINT, size BIGINT)"
    290457       try: self.execute(sql)
    291        except: self.logger.errorPair("Unable to create table", self.dvoMetaTable)
    292 
     458       except:
     459           self.logger.errorPair("Unable to create table", self.dvoDoneTable)
     460           return False
     461
     462       self.changeEngineToInnoDB(self.dvoDoneTable)
     463
     464       # create detections table
    293465       self.logger.infoPair("Creating table", self.dvoDetectionTable)
    294466       sql = "CREATE TABLE " + self.dvoDetectionTable + " LIKE dvoDetection"
    295467       try: self.execute(sql)
    296        except: self.logger.errorPair("Unable to create table", self.dvoDetectionTable)
    297 
    298        self.logger.infoPair("Creating table", self.dvoDoneTable )
    299        sql = "CREATE TABLE " + self.dvoDoneTable + " (name VARCHAR(100))"
     468       except:
     469           self.logger.errorPair("Unable to create table", self.dvoDetectionTable)
     470           return False
     471       self.changeEngineToInnoDB(self.dvoDetectionTable)
     472
     473       # add fileID column
     474       sql = "ALTER TABLE " + self.dvoDetectionTable + " ADD fileID INT NOT NULL"
    300475       try: self.execute(sql)
    301        except: self.logger.errorPair("Unable to create table", self.dvoDoneTable)
    302 
    303 
    304 
     476       except:
     477           self.logger.errorPair("Unable to add fileID column to ", self.dvoDetectionTable)
     478           return False
     479
     480       # add an index to the fileID column
     481       self.createIndex(self.dvoDetectionTable, "fileID")
     482
     483       # now add a delete cascading foreign key constraint on fileID
     484       sql = "ALTER TABLE dvoDetectionFull \
     485              ADD CONSTRAINT fk_fileID \
     486              FOREIGN KEY (fileID) \
     487              REFERENCES dvoDone(id) \
     488              ON DELETE CASCADE"
     489       try: self.execute(sql)
     490       except:
     491           self.logger.errorPair("Unable to create foreign key on", self.dvoDoneTable)
     492           return False
     493
     494       return True
     495
     496    '''
     497    Gets a list of DVO regions that overlap with the defined box
     498    '''
     499    def getDvoRegions(self, minRa, maxRa, minDec, maxDec):
     500
     501        self.logger.debug("Querying DVO SkyTable for FITS files in this region")
     502
     503        regions = []
     504        self.getDvoRegionsForThisBox(regions, minRa, maxRa, minDec, maxDec)
     505
     506        # deal with 0/360 boundary
     507        if minRa < 0: self.getDvoRegionsForThisBox(regions, minRa + 360, 361 ,minDec, maxDec)
     508        if maxRa > 360: self.getDvoRegionsForThisBox(regions, 0, maxRa - 360 ,minDec, maxDec)
     509
     510        return regions
     511
     512    '''
     513    Gets a list of DVO regions that overlap with the defined box
     514    '''
     515    def getDvoRegionsForThisBox(self, regions, minRa, maxRa, minDec, maxDec):
     516
     517        sql = "SELECT name FROM " + self.dvoSkyTable + " \
     518               WHERE NOT ((" + str(maxRa) + " <= R_MIN) OR \
     519                       (" + str(minRa) + " >= R_MAX) OR \
     520                       (" + str(maxDec) + " <= D_MIN) OR \
     521                       (" + str(minDec) + " >= D_MAX)) "
     522
     523        try:
     524            rs = self.executeQuery(sql)
     525            while (rs.next()): regions.append(rs.getString(1))
     526            rs.close()
     527        except:
     528            self.logger.exception("Can't query for DVO regions")
     529
     530
Note: See TracChangeset for help on using the changeset viewer.