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

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

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