source: TI01-discovery/trunk/ingestAutomation/OAIBatch/SpaceTimeIngestFromMOLES.py @ 2424

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI01-discovery/trunk/ingestAutomation/OAIBatch/SpaceTimeIngestFromMOLES.py@2424
Revision 2424, 9.6 KB checked in by selatham, 13 years ago (diff)

fixed bug in spatiotemp ingest where no dates

Line 
1#!/usr/bin/env python
2import cElementTree
3import elementtree.ElementTree as etree
4import molesReadWrite as MRW
5import sys
6import db_funcs
7import os
8
9#connect to db (in separate db functions module)
10connection = db_funcs.db_connect()
11
12def listify(item):
13        ''' listify checks if an item is a list, if it isn't it puts it inside a list and returns it. Always returns a list object.'''
14        if type(item) is list:
15            return item
16        else:
17            return [item]
18
19def id_exists(Mid):
20        sql = "select id from spatiotemp where id = '"+Mid+"';"
21        cursor = connection.cursor()
22        try:
23            cursor.execute(sql)
24        except:
25            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
26        if len(cursor.fetchall()) <1:
27            return False
28        else:
29            return True
30
31
32def do_insert(Mid,west,south,east,north,startdate,enddate):
33        sql = "INSERT INTO spatiotemp (id, coordinates, startdate, enddate) VALUES ( '"+Mid+ "', sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', '"+startdate+"', '"+enddate+"');"
34        if str(startdate)=='nostartdate':
35            sql=sql.replace(", startdate,"," ")
36            sql=sql.replace(",   'no '"," ")
37            sql=sql.replace("'"+startdate+"',"," ")
38        if str(enddate)=='noenddate':
39            sql=sql.replace("enddate"," ")
40            sql=sql.replace(",   'no '"," ")
41            sql=sql.replace("'"+enddate+"',"," ")
42        if str(west)=='null' or str(south)=='null' or str(east)=='null' or str(north)=='null':
43            sql=sql.replace("coordinates,"," ")
44            sql=sql.replace("sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))',"," ")
45        print sql
46        cursor = connection.cursor()
47        try:
48            cursor.execute(sql)
49        except:
50            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
51        connection.commit()
52
53def do_update(Mid,west,south,east,north,startdate,enddate):
54        sql = "UPDATE spatiotemp SET coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', startdate='"+startdate+"', enddate= '"+enddate+"', update_time= now() WHERE id='"+Mid+"';"
55        if str(startdate)=='nostartdate':
56            sql=sql.replace("startdate='"+startdate+"',"," ")
57        if str(enddate)=='noenddate':
58            sql=sql.replace("enddate= '"+enddate+"',"," ")
59        if str(west)=='null' or str(south)=='null' or str(east)=='null' or str(north)=='null':
60            sql=sql.replace("coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))',", " ")
61        print sql
62        cursor = connection.cursor()
63        try:
64            cursor.execute(sql)
65        except:
66            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
67        connection.commit()
68
69def main(indir):
70    if indir == "":
71        sys.exit("USAGE: argument 1 = full path of directory where MOLES records reside")
72    else:
73        print "INFO: moles records are in %s" %indir
74
75#this is a fix to the  ElementTree namespace problem that namespaces are usually represented as ns0, ns1, ns2 etc.
76    etree._namespace_map.update({'http://ndg.nerc.ac.uk/moles': 'moles', 'http://www.w3.org/1999/xlink':'xlink'})
77    numfilesproc = 0
78
79    filenames = os.listdir(indir)
80    for filename in filenames:
81        Mid = filename
82        print Mid
83        if filename.find('.xml') != -1:
84            full_filename = indir + "/" + filename
85            #print full_filename
86            no_bbox = False
87            no_dates = False
88            east = 'null'
89            west = 'null'
90            north = 'null'
91            south = 'null'
92            startdate='nostartdate'
93            enddate='noenddate'
94            dgMeta=MRW.dgMetadata()
95            try:
96                dgMeta.fromXML(cElementTree.ElementTree(file=full_filename).getroot())
97            except:
98                print "WARNING: Cannot parse the XML moles document %s. Will not process" %full_filename
99                continue
100            try:
101                bbox_list=listify(dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgSpatialCoverage.BoundingBox)
102            except:
103                print "INFO: XML moles document %s does not contain a bounding box." %full_filename
104                no_bbox=True
105
106            try:
107                dates=dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgTemporalCoverage.DateRange
108                print "startdate = %s" %dates.DateRangeStart
109                print "enddate = %s" %dates.DateRangeEnd
110            except:
111                print "INFO: XML moles document %s does not contain temporal info." %full_filename
112                no_dates=True
113            #if type(dates) =='NoneType':
114            #    no_dates=True
115
116            if no_bbox and no_dates:
117                print "INFO: XML moles document %s does not contain any spatiotemporal info." %full_filename
118                continue
119            if no_dates:
120                pass
121            else:
122                startdate=dates.DateRangeStart
123                enddate= dates.DateRangeEnd
124                if startdate==None:
125                    startdate="nostartdate"
126                if enddate==None:
127                    enddate="noenddate"
128
129            if no_bbox:
130                pass
131            else:
132                # for bbox in bbox_list:
133                #parse the coordinates somewhat - only use the first bounding box.
134                #print bbox_list
135                bbox=bbox_list[0]
136                #print bbox
137                #west
138                try:
139                    west = bbox.LimitWest.strip()
140                except:
141                    print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
142                    continue
143                if west.endswith('E'):
144                    west=bbox.LimitWest.split('E')[0]
145                elif west.endswith('W'):
146                    if west.startswith('-'):
147                        west = bbox.LimitWest.split('W')[0]
148                    else:
149                        west = "-" +bbox.LimitWest.split('W')[0]
150                try:
151                    float(west)
152                except:
153                    print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
154                    continue
155                #print "West = %s" %west
156                #east
157                try:
158                    east = bbox.LimitEast.strip()
159                except:
160                    print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
161                    continue
162                if east.endswith('E'):
163                    east=bbox.LimitEast.split('E')[0]
164                elif east.endswith('W'):
165                    if east.startswith('-'):
166                        east = bbox.LimitEast.split('W')[0]
167                    else:
168                        east = "-" +bbox.LimitEast.split('W')[0]
169                try:
170                    float(east)
171                except:
172                    print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
173                    continue
174                #print "East = %s" %east
175                #north
176                try:
177                    north = bbox.LimitNorth.strip()
178                except:
179                    print "ERROR:  Will not process File %s. Contains incorrect North bounding box limit." %full_filename
180                    continue
181                if north.endswith('N'):
182                    north=bbox.LimitNorth.split('N')[0]
183                elif north.endswith('S'):
184                    if north.startswith('-'):
185                        north = bbox.LimitNorth.split('S')[0]
186                    else:
187                        north = "-" +bbox.LimitNorth.split('S')[0]
188                try:
189                    float(north)
190                except:
191                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
192                    continue
193                #print "North = %s" %north
194                #south
195                try:
196                    south = bbox.LimitSouth.strip()
197                except:
198                    print "ERROR:  Will not process File %s. Contains incorrect South bounding box limit." %full_filename
199                    continue
200                if south.endswith('N'):
201                    south=bbox.LimitSouth.split('N')[0]
202                elif south.endswith('S'):
203                    if south.startswith('-'):
204                        south = bbox.LimitSouth.split('S')[0]
205                    else:
206                        south = "-" +bbox.LimitSouth.split('S')[0]
207                try:
208                    float(south)
209                except:
210                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
211                    continue
212                #print "North = %s" %south
213
214            print "west= %s,south %s, east %s, north %s, startdate %s, enddate %s" %(west,south,east,north,startdate,enddate)
215            if id_exists( Mid ):
216                print "INFO: doc %s exists, updating\n" %Mid
217                do_update( Mid, west, south, east, north, startdate, enddate )
218            else:
219                print "INFO: doc %s does not exist, inserting new record\n" %Mid
220
221                do_insert( Mid, west, south, east, north, startdate, enddate )
222            numfilesproc += 1
223        else:
224            print "WARNING: File %s appears not to be XML. Will not be processed." %filename
225
226    print 'INFO: SpaceTimeIngestFromMOLES.py ran to end. files processed= %s' %(numfilesproc)
227
228if __name__=='__main__':
229    indir=sys.argv[1]
230    main(indir)
Note: See TracBrowser for help on using the repository browser.