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

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

added date stamp

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