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

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

Changes for getting id for filename from inside Discovery record.

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