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

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

dealing with missing content

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 id_exists(Mid):
13        sql = "select id from spatiotemp where id = '"+Mid+"';"
14        cursor = connection.cursor()
15        try:
16            cursor.execute(sql)
17        except:
18            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
19        if len(cursor.fetchall()) <1:
20            return False
21        else:
22            return True
23
24
25def do_insert(Mid,west,south,east,north,startdate,enddate):
26        sql = "INSERT INTO spatiotemp (id, coordinates, startdate, enddate) VALUES ( '"+Mid+ "', sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', '"+startdate+"', '"+enddate+"');"
27        print sql
28        cursor = connection.cursor()
29        try:
30            cursor.execute(sql)
31        except:
32            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
33        connection.commit()
34
35def do_update(Mid,west,south,east,north,startdate,enddate):
36        sql = "UPDATE spatiotemp SET coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', startdate='"+startdate+"', enddate= '"+enddate+"', update_time= now() WHERE id='"+Mid+"';"
37        print sql
38        cursor = connection.cursor()
39        try:
40            cursor.execute(sql)
41        except:
42            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
43        connection.commit()
44
45def main(indir):
46    if indir == "":
47        sys.exit("USAGE: argument 1 = full path of directory where MOLES records reside")
48    else:
49        print "INFO: moles records are in %s" %indir
50
51#this is a fix to the  ElementTree namespace problem that namespaces are usually represented as ns0, ns1, ns2 etc.
52    etree._namespace_map.update({'http://ndg.nerc.ac.uk/moles': 'moles', 'http://www.w3.org/1999/xlink':'xlink'})
53    numfilesproc = 0
54
55    filenames = os.listdir(indir)
56    for filename in filenames:
57            if filename.find('.xml') != -1:
58                full_filename = indir + "/" + filename
59                #print full_filename
60                no_bbox = False
61                no_dates = False
62                dgMeta=MRW.dgMetadata()
63                try:
64                    dgMeta.fromXML(cElementTree.ElementTree(file=full_filename).getroot())
65                except:
66                    print "WARNING: Cannot parse the XML moles document %s. Will not process" %full_filename
67                    continue
68                try:
69                    bbox=dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgSpatialCoverage.BoundingBox
70                    print bbox
71                    if type(bbox) == tuple:
72                        bbox==string(bbox[0])
73                except:
74                    print "INFO: XML moles document %s does not contain a bounding box." %full_filename
75                    no_bbox=True
76                try:
77                    dates=dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgTemporalCoverage.DateRange
78                    print dates
79                except:
80                    print "INFO: XML moles document %s does not contain temporal info." %full_filename
81                    no_dates=True
82
83                if no_bbox and no_dates:
84                    print "INFO: XML moles document %s does not contain any spatiotemporal info." %full_filename
85                    continue
86                #coverage= [dates.DateRangeEnd, dates.DateRangeStart, bbox.LimitNorth, bbox.LimitSouth,bbox.LimitEast, bbox.LimitWest]
87                #Mid = dgMeta.dgMetadataRecord.dgMetadataID.repositoryIdentifier+"__"+dgMeta.dgMetadataRecord.dgMetadataID.localIdentifier
88                Mid = filename
89                print Mid
90                #parse the coordinates somewhat
91                #west
92                west = bbox.LimitWest.strip()
93                if west.endswith('E'):
94                    west=bbox.LimitWest.split('E')[0]
95                elif west.endswith('W'):
96                    if west.startswith('-'):
97                        west = bbox.LimitWest.split('W')[0]
98                    else:
99                        west = "-" +bbox.LimitWest.split('W')[0]
100                try:
101                    float(west)
102                except:
103                    print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
104                    continue
105                #print "West = %s" %west
106                #east
107                east = bbox.LimitEast.strip()
108                if east.endswith('E'):
109                    east=bbox.LimitEast.split('E')[0]
110                elif east.endswith('W'):
111                    if east.startswith('-'):
112                        east = bbox.LimitEast.split('W')[0]
113                    else:
114                        east = "-" +bbox.LimitEast.split('W')[0]
115                try:
116                    float(east)
117                except:
118                    print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
119                    continue
120                #print "East = %s" %east
121                #north
122                north = bbox.LimitNorth.strip()
123                if north.endswith('N'):
124                    north=bbox.LimitNorth.split('N')[0]
125                elif north.endswith('S'):
126                    if north.startswith('-'):
127                        north = bbox.LimitNorth.split('S')[0]
128                    else:
129                        north = "-" +bbox.LimitNorth.split('S')[0]
130                try:
131                    float(north)
132                except:
133                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
134                    continue
135                #print "North = %s" %north
136                #south
137                south = bbox.LimitSouth.strip()
138                if south.endswith('N'):
139                    south=bbox.LimitSouth.split('N')[0]
140                elif south.endswith('S'):
141                    if south.startswith('-'):
142                        south = bbox.LimitSouth.split('S')[0]
143                    else:
144                        south = "-" +bbox.LimitSouth.split('S')[0]
145                try:
146                    float(south)
147                except:
148                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
149                    continue
150                #print "North = %s" %south
151
152                if id_exists( Mid ):
153                    print "INFO: doc %s exists, updating\n" %Mid
154                    do_update( Mid, west, south, east, north, dates.DateRangeStart, dates.DateRangeEnd )
155                else:
156                    print "INFO: doc %s does not exist, inserting new record\n" %Mid
157                    do_insert( Mid, west, south, east, north, dates.DateRangeStart, dates.DateRangeEnd )
158
159                numfilesproc += 1
160
161            else:
162                print "WARNING: File %s appears not to be XML. Will not be processed." %filename
163
164    print 'INFO: SpaceTimeIngestFromMOLES.py ran to end. files processed= %s' %(numfilesproc)
165
166if __name__=='__main__':
167    indir=sys.argv[1]
168    main(indir)
Note: See TracBrowser for help on using the repository browser.