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

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

various improvements

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