Changeset 6865 for TI01-discovery-Ingest


Ignore:
Timestamp:
14/05/10 14:22:21 (9 years ago)
Author:
sdonegan
Message:

Upgrade a set of bug fixes to deal with authors, upgrade stats, reporting and deletion of records. Also includes update to Utilities.py for methods to provide string representation of the ISO data object doubledictionary

Location:
TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/DeleteDatacentreRecords.py

    r6616 r6865  
    110110         
    111111                #delete original record 
    112                 try:             
     112                try: 
     113                     
    113114                    dao.deleteOriginalRecord() 
    114                     dao._deleteSpatioTemporalData() 
    115                  
     115                                         
    116116                    #check item deleted (note need to reinitialise the record object!) 
    117117                    dao = PostgresDAO(record,None,None, self.pgc) 
    118118                    record = RecordToDelete(recordFilename,None) 
    119119                    self.createRecordObject(record,dao,recordFilename) 
    120                  
     120                     
    121121                    if record.db_id is None: 
    122122                        deleteCounter = deleteCounter + 1 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/ExtractISO.py

    r6709 r6865  
    22from xml.etree import ElementTree as ET 
    33import logging,urllib,os,sys,inspect 
     4from Utilities import IsoIngestListUtilities # so can use those useful getSingleVal and getMultipleVal methods for discerning lists etc (esp useful when using the isoVal to dbColumn methods..) 
     5 
    46 
    57class ExtractISO: 
     
    139141                 
    140142                self.authors = self.getElementVal(self.isoModel.authors()) 
    141                 self.authors_text = self.authors 
    142                 self.authors_ts_vector = self.authors 
     143                 
     144                #need to provide a list for updating relevant db column - keep distinct from other authors based vars just in case of problems..                 
     145                self.authorOb = IsoIngestListUtilities(self.authors,True)                
     146                self.authors_text = self.authorOb.getDelimitedStringFromList(self.authorOb.listVals)             
     147                self.authors_ts_vector = self.authors_text 
    143148                 
    144149                self.datacentreName = self.getElementVal(self.isoModel.dataCentreName()) 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/PostgresDAO.py

    r6851 r6865  
    5555        if dbId: 
    5656            self._record.db_id = dbId[0][0] 
     57             
    5758             
    5859    def getRecordID_using_OriginalDocumentFilename(self): 
     
    159160        dbColumns = self.isoDataModel.mapIsoFieldsToDBcolumns() 
    160161         
     162         
    161163        for isoData in dbColumns.keys(): 
    162164                 
     
    187189        logging.info("Updating " + columnName + " for record: " + original_document_filename) 
    188190         
     191         
    189192        #get the matching dictionary of postgres datatypes defined in the iso model 
    190193        postgresDataType = self.isoDataModel.mapDBcolumnsToIsoDataTypes()[columnName] 
     
    196199                logging.info("Data type is text or tsvector!") 
    197200                 
    198                 if len(columnValue[0]) == 0: 
    199                         logging.info("No data to extract - no point continuing!") 
    200                         return False 
    201                  
    202                 elif len(columnValue[0]) > 1: 
    203                         newColVal = "" 
    204                         cnt = 0 
    205                         for val in columnValue[0]: 
    206                                 if cnt == 0: 
    207                                         newColVal = newColVal + val 
     201                #need to work out whether value passed here to be updated is a string or list 
     202                if type(columnValue) is list: 
     203                         
     204                        if len(columnValue[0]) == 0: 
     205                                logging.info("No data to extract - no point continuing!") 
     206                                return False 
     207                          
     208                        elif len(columnValue[0]) > 1: 
     209                                newColVal = "" 
     210                                cnt = 0 
     211                                 
     212                                for val in columnValue[0]: 
     213                                        if cnt == 0: 
     214                                                newColVal = newColVal + val 
    208215                                else: 
    209                                         newColVal = newColVal + "; " + val 
     216                                                newColVal = newColVal + "; " + val 
    210217                                 
    211218                                cnt = 1 
     219                          
     220                        else: 
     221                                newColVal = columnValue[0][0] 
    212222                                 
    213223                else: 
    214                         newColVal = columnValue[0][0] 
     224                        logging.info("Value type for %s has already been converted to a simple string" %columnName ) 
     225                        #remaining type to deal with is the value has already been converted to a simple string (i.e. authors, data centre name) 
     226                        newColVal = columnValue 
     227                 
     228                 
    215229                         
    216230        else: 
     
    280294            logging.info("Clearing out existing data for record - to allow clean update") 
    281295             
    282             self._deleteSpatioTemporalData() 
    283296            self._insertSpatioTemporalData() 
    284297            result = True 
     
    441454            self._record.dataset_lastEdit + "', '" + self._record.datasetStartNom + "', '" + self._record.datasetEndNom + "');" 
    442455         
    443          
     456        
    444457        #sort out any nulls.. 
    445458        sqlCmd = sqlCmd.replace("'NULL'","NULL") 
     
    472485        Update the original doc in the postgres DB 
    473486        ''' 
     487         
    474488        logging.info("Updating original document in Postgres DB") 
    475489        sqlCmd = "SELECT update_document('" + str(self._record.db_id) + "', '" + \ 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/PostgresRecord.py

    r6846 r6865  
    66from xml.etree import cElementTree 
    77import os, sys, logging, re, pkg_resources 
    8 #import csml.csml2Moles.molesReadWrite as MRW 
    98from ndg.common.src.models.ndgObject import ndgObject 
    109from ndg.common.src.lib.ndgresources import ndgResources 
    1110import ndg.common.src.lib.fileutilities as FileUtilities 
    12 from Utilities import xqueryTransformation 
    13 #from SpatioTemporalData import SpatioTemporalData 
     11from Utilities import xqueryTransformation,IsoIngestListUtilities 
    1412import keywordAdder 
    1513 
     
    6967         
    7068        self.dataset_name = self.escapeSpecialCharacters(self.isoDataModel.datasetName[0][0]) 
    71                  
    72         self.datacentre_name = self.getSingleVal(self.isoDataModel.datacentreName) 
     69         
     70        self.dcOb = IsoIngestListUtilities(self.isoDataModel.datacentreName,True) 
     71        self.datacentre_name = self.dcOb.singleVal 
    7372         
    7473        #self.dataset_lastEdit = datasetLastEditUpdateDate 
     
    133132                self.stubISO = self.escapeSpecialCharacters(stubIso) 
    134133                 
    135                  
    136     def getSingleVal(self, inputList): 
    137          
    138                 ''' 
    139                 Simple method to sort through a value list from the ISOdata model and check if any values are present, if not return an empty string 
    140                 This gets around any list based errors when fishing for mandatory values 
    141                  
    142                 @param inputList: list of values corresponding to xpath expressions used to fill the inputList from the original xml  
    143                 @return: string: empty if no list values present, otherwise the first value if many 
    144                 ''' 
    145                  
    146                 valList = [] 
    147                 #if type(item) is list: 
    148                 #loop through all vals present and add to a temp list 
    149                 for value in inputList: 
    150                         if len(value) > 0:                               
    151                                         valList = valList + value 
    152                  
    153                 #take the first val.. if there is one (gotta put some cardinality in somewhere!) 
    154                 if len(valList) > 0: 
    155                         return valList[0] 
    156                 else: 
    157                         #if not, return an empty string 
    158                         return '' 
    159          
     134      
    160135     
    161136    def escapeSpecialCharacters(self, inputString): 
     
    279254         
    280255     
    281     def getSpatioTemporalData(self): 
    282         ''' 
    283         Extract spatio temporal data from the original document 
    284         ''' 
    285         logging.info('Retrieving spatiotemporal info from ISO file') 
    286         # initialise the various spatiotemporal arrays used to extract data to 
    287          
    288          
    289         ''' 
    290         self.stData = SpatioTemporalData() 
    291          
    292         if self.dgMeta is None: 
    293             self.createMolesFile() 
    294              
    295             
    296         # do quick checks to see if the relevant data exists 
    297         if not self.dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary: 
    298             logging.info("No data summary elements found - assuming no spatiotemporal data available") 
    299             return 
    300          
    301         if not self.dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage: 
    302             logging.info("No data coverage elements found - assuming no spatiotemporal data available") 
    303             return 
    304          
    305         if not self.dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgSpatialCoverage: 
    306             logging.info("No spatial coverage elements found - assuming no spatial data available") 
    307         else: 
    308             self.getCoordData(self.dgMeta) 
    309  
    310         #SJD error with line below- this is where 23/09/08 edit in PostgresDAO fudge sorts... 
    311         if not self.dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgTemporalCoverage: 
    312             logging.info("No temporal coverage elements found - assuming no temporal data available") 
    313         else: 
    314             self.getTimeRangeData(self.dgMeta) 
    315                 ''' 
    316256     
    317257    def getAuthorsInfo(self): 
     
    323263         
    324264        #simple method to generate a space delimited list of authors from isoObject         
    325         self.authors = '' 
    326          
    327         #remember the double list return style.. 
    328         if len(self.isoDataModel.authors[0])==0: 
    329                 logging.info("No author information present (none not caught but extractISO.py - sort it!") 
    330                 self.authors = "null" 
    331                 return self.authors 
    332                  
    333         if self.isoDataModel.authors[0][0] == 'None':            
    334                 logging.info("No author information present") 
    335                 self.authors = "null" 
    336         else: 
    337                 for author in self.isoDataModel.authors[0]: 
    338                         self.authors = self.authors + ' ' +author 
    339          
     265        #13/05/10 - note this now moved to ExtractISO - and the list handling methods in Utilities.py         
     266        self.authors = self.isoDataModel.authors_text # Note this is using a unique list of authors so NO duplication 
     267                
    340268        return self.authors 
    341269        
     
    346274        Extract parameters info from the moles file 
    347275        ''' 
    348         logging.info('\nRetrieving parameters info from moles file\n') 
     276        logging.info('Retrieving parameters info...') 
    349277         
    350278        self.params = "" 
     
    358286         
    359287        return self.params 
     288        
    360289         
    361290     
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/Utilities.py

    r6618 r6865  
    296296                xquery=xquery.replace('xmldb:exist:///db/xqueryLib/Vocabs/', '') 
    297297                xquery=xquery.replace('xmldb:exist:///db/xqueryLib/Utilities/', '') 
    298  
     298                 
    299299        # write the query to file, to make it easier to input 
    300300        # NB, running directly at the command line leads to problems with the interpretation of $ characters 
     
    528528             
    529529 
     530class IsoIngestListUtilities: 
     531         
     532        ''' 
     533        Class to hold different utilities methods for access lists etc that need to be be visible across the MEDIN ingest software suite 
     534        ''' 
     535         
     536        def __init__(self,inputList, unique): 
     537                 
     538                logging.info("ISO ingest utilities activated!") 
     539                                 
     540                self.singleVal = self.getSingleVal(inputList) 
     541                self.listVals = self.getMultipleVal(inputList, unique) 
     542                 
     543                logging.info("ISO list utilities object set up") 
     544                 
     545        def getSingleVal(self, inputList): 
     546         
     547                ''' 
     548                Simple method to sort through a value list from the ISOdata model and check if any values are present, if not return an empty string 
     549                This gets around any list based errors when fishing for mandatory values 
     550                 
     551                USE THIS WHERE WE JUST NEED A SINGLE VALUE (I.E. THE FIRST AS CARDINAL) FROM A POSSIBLE LIST (i.e. datacentre name - just need one!) 
     552                 
     553                @param inputList: list of values corresponding to xpath expressions used to fill the inputList from the original xml  
     554                @return: string: empty if no list values present, otherwise the first value if many 
     555                ''' 
     556                 
     557                valList = [] 
     558                #if type(item) is list: 
     559                #loop through all vals present and add to a temp list 
     560                for value in inputList: 
     561                        if len(value) > 0:                               
     562                                        valList = valList + value 
     563                 
     564                #take the first val.. if there is one (gotta put some cardinality in somewhere!) 
     565                if len(valList) > 0: 
     566                        return valList[0] 
     567                else: 
     568                        #if not, return an empty string 
     569                        return '' 
     570                 
     571         
     572        def getMultipleVal(self,inputList, unique): 
     573         
     574                ''' 
     575                Simple method to sort through a value list from the ISOdata model and check if any values are present, if not return an empty string 
     576                This gets around any list based errors when fishing for mandatory values 
     577                 
     578                USE THIS WHERE WE JUST NEED ALL VALUES FROM A POSSIBLE LIST I.E. authors (will need all of them) 
     579                 
     580                @param inputList: list of values corresponding to xpath expressions used to fill the inputList from the original xml 
     581                @param unique:  if unique is set to True return only unique values in list, if false return all values 
     582                @return: list: empty if no list values present, otherwise the first value if many 
     583                ''' 
     584                 
     585                valList = [] 
     586                #if type(item) is list: 
     587                #loop through all vals present and add to a temp list 
     588                for value in inputList: 
     589                        if len(value) > 0:                               
     590                                        valList = valList + value 
     591                                         
     592                #if required keep only unique values 
     593                if unique: 
     594                        set = {} 
     595                        map(set.__setitem__,valList, []) 
     596                        return set.keys() 
     597                 
     598                return valList 
     599         
     600         
     601        def getDelimitedStringFromList(self,inputList,concatStr=None): 
     602                ''' 
     603                Simple method to concatanate a list separating with a ';' by default but if concatStr is defined, with that 
     604                @param inputList: list of values to concatenate 
     605                @param concatStr: character to join list elements (with a bounding space char either side) 
     606                @return listStr: string representing the joined list 
     607                ''' 
     608                 
     609                listStr = '' 
     610                 
     611                if concatStr is None: 
     612                        concatStr = ';' 
     613                         
     614                logging.info("Concatenating list using this character: %s" %concatStr) 
     615                 
     616                for str in inputList:                    
     617                        listStr = listStr + " " + concatStr + " " + str 
     618                         
     619                #get rid of any preceding  concatStrs and space paddings 
     620                if listStr[1] == concatStr: 
     621                        listStr = listStr[3:]                    
     622                                         
     623                return listStr 
     624             
     625 
    530626class DatasetBasicParameters_MEDIN_v01: 
    531627     
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/abstractdocumentingester.py

    r6836 r6865  
    184184                 
    185185                try: 
    186                                  
     186                         
    187187                        #record whats bout to be ingestd                         
    188188                        self.recordAttemptToIngestDiscoveryID = self.isoDataModel.datasetID[0][0] 
     
    777777                message = message + "Original metadata directory: " + self._harvest_home + "\n\n" 
    778778                message = message + "TOTAL_PROCESSED " + str(numfilesproc) + "\n" 
    779                 message = message + "INGESTED_Created " + str(self._no_files_changed)  + "\n" 
    780                 message = message + "INGESTED_Updated " + str(self._no_files_ingested)  + "\n" 
     779                message = message + "INGESTED_Created " + str(self._no_files_ingested)  + "\n" 
     780                message = message + "INGESTED_Updated " + str(self._no_files_changed)  + "\n" 
    781781                message = message + "DELETED " + str(self._no_files_deleted)  + "\n" 
    782782                message = message + "PROBLEM_FILES " + str(self._no_problem_files)  + "\n" 
     
    784784                 
    785785                for badFile in self.updateFailList: 
    786                         #recOpFile.write("PROBLEM_FILE " + badFile + "\n") 
     786                        #recOpFile.write("PROBLEM_FILE " + badFile + "\n")       
    787787                        message = message +"PROBLEM_FILE " + badFile + "\n" 
    788788                          
Note: See TracChangeset for help on using the changeset viewer.