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

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

fixed bug in ingest - not clearing out intermediate directory.

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