Changeset 6660


Ignore:
Timestamp:
02/03/10 11:27:24 (9 years ago)
Author:
sdonegan
Message:

Update includes latest changes to allow full MEDIN xml and DIF xml ingest - now updates stubISO as proper MEDIN format in transformed docs table

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/ExtractISO.py

    r6639 r6660  
    4646        'originalFormatVersion':'original_format_version',\ 
    4747        'datasetAbstract':'dataset_abstract', \ 
    48         'resourceType':'resource_type_ts_vector', \ 
    49         'topicCategory':'topic_category_ts_vector', \ 
    50         'lineage':'lineage_ts_vector', \ 
    51         'publicAccessLimitations':'limitations_public_access_ts_vector', \ 
    52         'dataOriginator':'data_originator',\ 
     48        'resourceType_text':'resource_type', \ 
     49        'resourceType_tsvector':'resource_type_ts_vector', \ 
     50        'topicCategory_text':'topic_category', \ 
     51        'topicCategory_tsvector':'topic_category_ts_vector', \ 
     52        'lineage_text':'lineage', \ 
     53        'lineage_tsvector':'lineage_ts_vector', \ 
     54        'publicAccessLimitations_text':'limitations_public_access', \ 
     55        'publicAccessLimitations_tsvector':'limitations_public_access_ts_vector', \ 
     56        'dataOriginator_text':'data_originator',\ 
     57        'dataOriginator_tsvector':'data_originator_tsvector',\ 
    5358        'metadataUpdateDate':'dataset_metadata_update_date', \ 
    5459        'dataFormat':'original_format_name', 
    5560        'createDate':'dataset_metadata_creation_date', 
    56         'publicationDate':'dataset_metadata_publication_date'} 
     61        'publicationDate':'dataset_metadata_publication_date', 
     62        'authors_text':'authors','parameters_text':'parameters'} 
    5763                 
    5864                 
     
    6571        'original_format_version':'text',\ 
    6672        'dataset_abstract':'text', \ 
     73        'resource_type':'text', \ 
    6774        'resource_type_ts_vector':'tsvector', \ 
     75        'topic_category':'text', \ 
    6876        'topic_category_ts_vector':'tsvector', \ 
     77        'lineage':'text', \ 
     78        'limitations_public_access':'text', \ 
    6979        'lineage_ts_vector':'tsvector', \ 
    7080        'limitations_public_access_ts_vector':'tsvector', \ 
    71         'data_originator':'tsvector',\ 
     81        'data_originator':'text',\ 
     82        'data_originator_tsvector':'tsvector',\ 
    7283        'dataset_metadata_update_date':'timestamp', \ 
    7384        'original_format_name':'text', 
    7485        'dataset_metadata_creation_date':'timestamp', 
    75         'dataset_metadata_publication_date':'timestamp'} 
     86        'dataset_metadata_publication_date':'timestamp', 
     87        'authors':'text','parameters':'text'} 
    7688         
    7789                 
     
    123135                 
    124136                self.authors = self.getElementVal(self.isoModel.authors()) 
     137                self.authors_text = self.authors 
     138                self.authors_ts_vector = self.authors 
    125139                                 
    126140                self.datacentreName = self.getElementVal(self.isoModel.dataCentreName()) 
    127141                 
    128                 self.parameters = self.getElementVal(self.isoModel.parameters())  
     142                self.parameters = self.getElementVal(self.isoModel.parameters()) 
     143                self.parameters_text = self.parameters 
     144                self.parameters_tsvector = self.parameters 
    129145                 
    130146                self.keywords = self.getElementVal(self.isoModel.keywords()) 
     
    147163                try: 
    148164                        self.resourceType = self.getElementVal(self.isoModel.resourceType()) 
     165                        self.resourceType_text = self.resourceType 
     166                        self.resourceType_tsvector = self.resourceType 
    149167                except: 
    150168                        self.resourceType = None 
     169                        self.resourceType_text = None 
     170                        self.resourceType_tsvector = None 
    151171                 
    152172                try: 
    153173                        self.topicCategory = self.getElementVal(self.isoModel.topicCategory()) 
     174                        self.topicCategory_text = self.topicCategory 
     175                        self.topicCategory_tsvector = self.topicCategory 
    154176                except: 
    155177                        self.topicCategory = None 
     178                        self.topicCategory_text = None 
     179                        self.topicCategory_tsvector = None 
    156180                 
    157181                try: 
    158182                        self.lineage = self.getElementVal(self.isoModel.lineage()) 
     183                        self.lineage_text = self.lineage 
     184                        self.lineage_tsvector = self.lineage 
    159185                except: 
    160186                        self.lineage = None 
     187                        self.lineage_text = None 
     188                        self.lineage_tsvector = None 
    161189                 
    162190                try: 
    163191                        self.publicAccessLimitations = self.getElementVal(self.isoModel.publicAccessLimitations()) 
     192                        self.publicAccessLimitations_text = self.publicAccessLimitations 
     193                        self.publicAccessLimitations_tsvector = self.publicAccessLimitations 
    164194                except: 
    165195                        self.publicAccessLimitations = None 
     196                        self.publicAccessLimitations_text = None 
     197                        self.publicAccessLimitations_tsvector = None 
    166198                         
    167199                try: 
    168200                        self.dataOriginator= self.getElementVal(self.isoModel.dataOriginator()) 
    169201                         
     202                        #add some extra specifications to deal with MEDIn requirement to have both searchable field (vector) and return as a text field 
     203                        self.dataOriginator_text = self.dataOriginator 
     204                        self.dataOriginator_tsvector = self.dataOriginator 
     205                         
    170206                except: 
    171207                        self.dataOriginator = None 
     208                        self.dataOriginator_text = None 
     209                        self.dataOriginator_tsvector = None 
    172210                 
    173211                try: 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/PostgresDAO.py

    r6639 r6660  
    205205                                        newColVal = newColVal + val 
    206206                                else: 
    207                                         newColVal = newColVal + ";" + val 
     207                                        newColVal = newColVal + "; " + val 
    208208                                 
    209209                                cnt = 1 
     
    222222                 
    223223                #TODO: at some stage add some checking of timestamps etc 
     224                 
     225        #get rid of any special characters 
     226        newColVal = self._record.escapeSpecialCharacters(newColVal) 
    224227         
    225228        #build the sql query 
     
    233236        #submit the sqlQuery 
    234237        try: 
     238                 
     239                #deal with nones 
    235240                sqlCmd = sqlCmd.replace("'null'", "null") 
    236241                sqlCmd = sqlCmd.replace("'None'", "null") 
     
    240245                 
    241246                report = True 
     247                 
    242248        except: 
    243249                logging.error("Could not submit query for: " + sqlCmd) 
     
    413419        ''' 
    414420        
    415          
    416421        sqlCmd = "SELECT create_document('" + self._record.shortFilename + "', '" + \ 
    417422            self._record.discovery_id + "', '" + self._record.docType + "', '" + \ 
     
    492497         
    493498        for docType, doc in self._record.getAllDocs(self.discovery_dir): 
    494              
     499                 
    495500            #if docType is original input xml then put that in rather than some lossy transformed guff. 
    496501            if docType == self._record.docType: 
    497502                doc = self._record.originalXMLdoc 
    498503             
    499                                    
     504                                 
    500505            sqlCmd = "INSERT INTO TRANSFORMED_DOCUMENT (transformed_document_id, " \ 
    501506                "original_document_id, transformed_format, " \ 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/PostgresRecord.py

    r6618 r6660  
    3535    #def __init__(self, filename, ndg_dataprovider, datacentre_groups, datacentre_namespace, discovery_id, xq, docType): 
    3636    def __init__(self, filename, ndg_dataprovider, datacentre_groups, datacentre_namespace, isoDataModel, xq, docType 
    37                                 , xqExceptions , xqueryConversions, saxonJarFile, xqueryDocTypes, originalXML, stubIso = None): 
     37                                , xqExceptions , xqueryConversions, saxonJarFile, xqueryDocTypes, originalXML, currentMedinStandard, stubIso = None): 
    3838                  
    3939                  
     
    9999        # escape any apostrophes  
    100100        self.originalFormat = self.escapeSpecialCharacters(self.originalFormat) 
     101         
     102        self.currentMedinStandard = currentMedinStandard 
    101103                 
    102104        # initialise the various record fields 
     
    124126         
    125127        self.originalXMLdoc = self.escapeSpecialCharacters(originalXML) 
    126          
     128        
    127129        #need t define stubISO only if ingesting a dif. 
    128130        if self.originalXMLdoc == "null": 
     
    176178        logging.info("Running XQuery transform, " + xQueryType + " to create TRANSFORMED document!!") 
    177179 
    178              
    179180        #takes metadataFileLoc,repositoryName,metadataID,metadataFilename, saxonJar 
    180181        #self.xqueryTransformation = xqueryTransformation(self.discovery_dir,self._repository,self.discovery_id,self._local_id,self._saxonJarFile) 
     
    216217        self.discovery_dir = transformationDir 
    217218         
    218                  
     219                
    219220        for docType in self._xqueryConversions: 
    220221                 
     
    224225        #(if original format was ISO, this is covered by the self.originalXMLdoc overrider in the insertMetadata method in PostgresDAO.) 
    225226         
    226         if self.stubISO is not None: 
     227        if self.docType == 'DIF_9.4': 
    227228                logging.info("Transient ISO intermediate format detected; adding to transformed docs!") 
    228229                 
    229                 self._allDocs.append(['stubISO',self.stubISO]) 
     230                #we must cast this stubISO as the MEDIN format ISO so can be selected ("provide MEDIN format output from non-MEDIN input") 
     231                self._allDocs.append([self.currentMedinStandard,self.stubISO]) 
    230232                 
    231233        else: 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/abstractdocumentingester.py

    r6618 r6660  
    180180                        #In new ingest system all vals parsed from iso xml are returned as either lists of dictionaries 
    181181                         
    182                         #record whats attempting to be ingested          
     182                        #record whats attempting to be ingested  
    183183                        record = PostgresRecord(filename, self._NDG_dataProvider,self._datacentre_groups, self._datacentre_namespace, 
    184184                                                                self.isoDataModel,self._xq, self._datacentre_format, self._xqueryConversionsExceptions,  
    185                                                                 self._xqueryConversions,self._saxonJarFile, self._xqueryDocTypes, self.originalXMLdoc, stubIso = self.isoXML)                    
     185                                                                self._xqueryConversions,self._saxonJarFile, self._xqueryDocTypes, self.originalXMLdoc, self._currentMedinStandard, stubIso = self.isoXML)                        
    186186                         
    187187                        # Now create the data access object to interface to the DB                       
     
    320320                                #build a list of acceptable formats to convert into from ISO (except where format matches input format 
    321321                                processingConfig['xqueryConversions'] = words[1].split(",") 
     322                                 
     323                        elif words[0] == 'currentMEDIN': 
     324                                 
     325                                #define the current MEDIN standard so can cast conversions as this (at some stage we will ingest a few different versions) 
     326                                processingConfig['currentMEDIN'] = words[1] 
    322327                                 
    323328                        elif words[0] == 'exceptXqConv': 
     
    477482                                self.isoFormat= "stubISO" 
    478483                                                                 
    479                                                                  
     484                                 
    480485                                #self.isoXML = self.convertDIFtoISO(metadataFileLoc,repositoryName,metadataID,metadataFilename) 
    481486                                self.xqueryTransformation = xqueryTransformation(metadataFileLoc,repositoryName,metadataID,metadataFilename,self._saxonJarFile) 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/feeddocumentingester.py

    r6544 r6660  
    4747                ''' 
    4848                logging.info("Setting up connection to eXist DB") 
     49                 
    4950                self.dbClient = SearchClient(dbHostName = dBHostname, 
    5051                                                                         configFileName = configFileName) 
     
    125126                self._setupDataCentreDirs() 
    126127                 
     128                # override default settings with input keyword values, if set            
     129                #if dataFormat: 
     130                #       self._datacentre_format = dataFormat 
     131                 
     132                 
    127133                 
    128134                difFilename = self.originals_dir + no.localID + '.xml'           
     
    136142                        FileUtilities.createFile(difFilename, doc) 
    137143                        print "*****************************************************************************   1"                        
    138                         numfilesproc, processingReport = self._convertAndIngestFiles(self.originals_dir, self.discovery_dir, self.dataCentre, False)                             
     144                         
     145                        #updated for MEDIN... 
     146                         
     147                        numfilesproc, processingReport = self._convertAndIngestFiles(self.originals_dir, self.discovery_dir, self.dataCentre, False, self._datacentre_format)                            
    139148                        print "*****************************************************************************   2" 
    140149                        if numfilesproc != 0: 
     
    363372                self._existPassWordFile = self.processingDict['passwords_file'] 
    364373                 
     374                #extra medin update required config fields 
     375                self._saxonJarFile = self.processingDict['saxonJarFile']                 
     376                self._isoClass = self.processingDict['xpathIsoClass'] 
     377                self._xqueryConversions = self.processingDict['xqueryConversions'] 
     378                self._xqueryConversionsExceptions = self.processingDict['exceptXqConv']  
     379                self._xqueryDocTypes = self.processingDict['xqDocTypes'] 
     380                 
     381                # override default settings with input keyword values, if set 
     382                #if harvestDir: 
     383                #       self._harvest_home = harvestDir 
     384                 
     385                #if dataFormat: 
     386                        #self._datacentre_format = dataFormat 
     387                #currently (Feb 2010) ingests via CEDA feed are DIF_9.4 only.. 
     388                self._datacentre_format = 'DIF_9.4' 
     389                 
     390                 
     391                #if a dif format we need to convert to the stub iso profile so can extract all the info for ingest from that 
     392                if self._datacentre_format in self.processingDict['xqueryStubIsoGen'].keys():                    
     393                        self._dif2isoXquery = self.processingDict['xqueryStubIsoGen'][self._datacentre_format] 
     394                 
     395                 
    365396                self._getPostgresDBConnection() 
    366397                #self.__getDBConnection(self.eXistDBHostname, self.configFileName) 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/oai_document_ingester.py

    r6367 r6660  
    2525        indFileToIngest="" 
    2626 
    27         def processDataCentre(self, dataCentre, harvestDir = None, dataFormat = None): 
     27        def processDataCentre(self, dataCentre, harvestDir = None, dataFormat = None, configFileName = None): 
    2828                ''' 
    2929                indFileToIngest=None 
     
    3737                outMessage = summary of ingest process 
    3838                ''' 
     39                 
    3940                self._no_files_ingested = 0 
    4041                self._no_files_changed = 0 
     
    4445                self._error_messages = '' 
    4546                self.dataCentre = dataCentre 
    46                 self._base_dir = os.getcwd() + "/" # this is the base dir that the script is ran from 
     47                #self._base_dir = os.getcwd() + "/" # this is the base dir that the script is ran from 
     48 
     49                #extract relevant directories etc from processing config gile 
     50                 
     51                 
     52                #self.processingDict = self.getProcessingConfig('oai_document_ingester.config') 
     53                if configFileName is None: 
     54                        self.processingDict = self.getProcessingConfig(self.oaiEditorConfig) 
     55                else: 
     56                        self.processingDict = self.getProcessingConfig(configFileName) 
     57                         
     58                 
     59                self._code_dir = self.processingDict['code_directory'] 
     60                self._base_dir = self.processingDict['base_directory']           
     61                self._databaseConfigurationFile = self.processingDict['ingestConfig'] 
     62                self._ndgRedirectURL = self.processingDict['NDG_redirect_URL'] 
     63                self._saxonJarFile = self.processingDict['saxonJarFile']                 
     64                self._isoClass = self.processingDict['xpathIsoClass'] 
     65                self._xqueryConversions = self.processingDict['xqueryConversions'] 
     66                self._xqueryConversionsExceptions = self.processingDict['exceptXqConv']  
     67                self._xqueryDocTypes = self.processingDict['xqDocTypes']  
     68                self._currentMedinStandard = self.processingDict['currentMEDIN'] 
     69                                 
     70                self.processThread = 'OAI' 
     71                 
    4772                self._setupDataCentreDirs() 
    4873                 
    4974                #Change os directory to that with the harvested documents in it. 
    5075                os.chdir(self._base_dir) 
    51                  
    52                                  
     76                                                 
    5377                # - to run on Windows under cygwin, use the following 
    5478                #os.putenv('PATH', 'C:\\opt\\cygwin\\bin') 
    5579                 
    56  
    5780                self.getConfigDetails(dataCentre) 
    58                                          
     81                 
    5982                # override default settings with input keyword values, if set 
    6083                if harvestDir: 
     
    6386                        self._datacentre_format = dataFormat 
    6487 
    65                  
    66                 # check harvest dir exists and that there are any records to harvest? 
     88                #if a dif format we need to convert to the stub iso profile so can extract all the info for ingest from that 
     89                if self._datacentre_format in self.processingDict['xqueryStubIsoGen'].keys():                    
     90                        self._dif2isoXquery = self.processingDict['xqueryStubIsoGen'][self._datacentre_format] 
     91                 
     92                 
     93                # check harvest dir exists and that there are any records to harvest?            
    6794                if self.indFileToIngest == "": 
    6895                        if not os.path.exists(self._harvest_home): 
     
    81108                        #must be looking for an individual file to upload 
    82109                        if not os.path.exists(self.indFileToIngest): 
     110                                 
    83111                                logging .warn("Specified file does not exist") 
    84112                                return 
     
    95123                 
    96124                self._setupXQueries() 
    97  
     125                 
    98126                # Process the resulting files and put the data into the postgres DB 
    99127                # - firstly set up a db connection to use 
    100                 self._getPostgresDBConnection() 
    101                  
    102                  
    103                 #start of MEDIN upgrades! 19/11/09 SJD 
    104                  
    105                 #define accepted data formats so can do "smart" ingest (i.e. many different i/p formats) 
    106                 acceptedFormats = ['MDIP','DIF','MEDIN_v0.1'] # TODO have this in a config file: MEDIN_v0.1 is the NDG development version 
    107                  
     128                self._getPostgresDBConnection()          
     129                 
     130                #accepted formats defined in oai_processing config file - should also match formats published on API getFormat list 
     131                acceptedFormats = self.processingDict['acceptedFormats'].split(',') 
     132                                 
    108133                if self._datacentre_format in acceptedFormats: 
    109134                         
     
    115140                 
    116141                 
    117  
     142                #numfilesproc, processingReport = self._convertAndIngestFiles(self.originals_dir, self.discovery_dir, dataCentre, True) 
     143                 
    118144                outMessage = "OAI Document ingest processing complete:\n" 
    119145                logging.info("oai_document_ingest processing complete:") 
     
    125151                else: 
    126152                        logging.error("Problems experienced with %s files" %self._no_problem_files) 
    127                         logging.error("- harvest ingest directory will not be cleared until these have been fixed and the script has been reran") 
     153                        logging.error("- harvnegest directory will not be cleared until these have been fixed and the script has been reran") 
    128154                 
    129155                logging.info(self.lineSeparator) 
     
    153179                ''' 
    154180                self.indFileToIngest = indFileToIngest 
     181                 
     182                 
     183        def setOaiConfigFile(self, configFilePath): 
     184                ''' 
     185                Set the path to the OAI configuration file - directories etc used for data & reporting etc etc 
     186                ''' 
     187                print "**********************************************************************" 
     188                if configFilePath: 
     189                        self.oaiEditorConfig = configFilePath 
     190                        logging.info("Using configuration file at: " + configFilePath) 
     191                 
    155192 
    156193         
     
    171208 
    172209        print "=================================" 
    173         print "RUNNING: oai_document_ingester.py" 
     210        print "RUNNING: configurable MEDIN ingester: oai_document_ingester.py" 
    174211         
    175212         
    176213        ingester = oai_document_ingester()       
    177         args = ingester._setupCmdLineOptions() 
     214        args = ingester._setupCmdLineOptions()   
    178215        ingester.processDataCentre(args[0]) 
Note: See TracChangeset for help on using the changeset viewer.