# HG changeset patch # User dwinter # Date 1350023817 -7200 # Node ID 283badd6259375998ef34838ce89ee659b19695f # Parent 26c06d568e1d440ff1c471217c8fe244f04cfd0d new version for embedded e4D diff -r 26c06d568e1d -r 283badd62593 .project --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.project Fri Oct 12 08:36:57 2012 +0200 @@ -0,0 +1,17 @@ + + + events2kml + + + + + + org.python.pydev.PyDevBuilder + + + + + + org.python.pydev.pythonNature + + diff -r 26c06d568e1d -r 283badd62593 .pydevproject --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.pydevproject Fri Oct 12 08:36:57 2012 +0200 @@ -0,0 +1,10 @@ + + + + + +/events2kml + +python 2.7 +Default + diff -r 26c06d568e1d -r 283badd62593 eventsDB2kml.py --- a/eventsDB2kml.py Thu Sep 13 16:56:49 2012 +0200 +++ b/eventsDB2kml.py Fri Oct 12 08:36:57 2012 +0200 @@ -3,19 +3,17 @@ import psycopg2 import harvestDataFromEvents +CONNECTION_STRING="dbname='mmpermits' user='www' host='localhost' password='XX'" + class DBQuery: def __init__(self): - self.conn=psycopg2.connect("dbname='mmpermits' user='postgres' host='localhost' password='XX'") + self.conn=psycopg2.connect(CONNECTION_STRING) self.cur=self.conn.cursor() - def searchXPath(self,xpath,searchTerm): - query="""select data from locations - where - '%s' = ANY (cast (xpath('%s', data) as text[])) ; - """%(searchTerm,xpath) - + def sql(self,query): + self.cur.execute(query) @@ -24,7 +22,56 @@ ret="" for result in results: - ret+=result[0]+"\n" + ret+="%s\n"%result[0] + + + + return ret + + def searchXPaths(self,queries,query="data",asList=False): + + qs=[] + for q in queries: + qs.append(""" '%s' = ANY (cast (xpath('%s', data) as text[]))"""%(q[1],q[0])) + + query="""select %s from locations where"""%query + + query+=" AND ".join(qs) + + self.cur.execute(query) + + print query + + results= self.cur.fetchall() + if asList: + return results + + ret="" + for result in results: + ret+="%s\n"%result[0] + + + + return ret + + + def searchXPath(self,xpath,searchTerm,query="data",asList=False): + query="""select %s from locations + where + '%s' = ANY (cast (xpath('%s', data) as text[])) ; + """%(query,searchTerm,xpath) + + + self.cur.execute(query) + + + results= self.cur.fetchall() + if asList: + return results + + ret="" + for result in results: + ret+="%s\n"%result[0] diff -r 26c06d568e1d -r 283badd62593 eventsRestService.py --- a/eventsRestService.py Thu Sep 13 16:56:49 2012 +0200 +++ b/eventsRestService.py Fri Oct 12 08:36:57 2012 +0200 @@ -2,49 +2,208 @@ import eventsDB2kml import harvestDataFromEvents import urllib +import urlparse + urls = ( '/xpath/(.*)', 'xpath', + '/xpathSearch', 'xpathSearch', + '/sqlSearch', 'sqlSearch', + '/sql', 'sql', '/species', 'species', '/applicants', 'applicants', - '/locations','locations' + '/locations','locations', + '/restricted', 'restricted' ) app = web.application(urls, globals()) -E4D_URL="http://localhost:8180/e4D/" -BASE_URL="http://localhost:8080/" +E4D_URL="http://localhost/mmpa/" +BASE_URL="http://localhost/m/" + +APPLICANT_FILE_NAME="http://localhost/outApplicants.xml" +RESEARCH_FILE_NAME="http://localhost/outResearch.xml" class locations: def GET(self): ret="" - url1=urllib.quote_plus("http://localhost/outApplicants.xml") + url1=urllib.quote_plus(APPLICANT_FILE_NAME) ret+=""" applicants
+ >applicants
"""%(E4D_URL,url1) - url2=urllib.quote_plus("http://localhost/outResearch.xml") + url2=urllib.quote_plus(RESEARCH_FILE_NAME) ret+=""" research
+ >research
"""%(E4D_URL,url2) ret+= """ both
+ >both
"""%(E4D_URL,url1,url2) return ret +class restricted: + def GET(self): + x=web.input() + pathes=x.get("path") + print pathes + select=x.get("select") + newRestriction=x.get("newRestriction") + + if select is None: + select="data" + + + + #path kann meherer abfragen enthalten durch | getrennt + + splittedPath = pathes.split("|") + print splittedPath + queriesArray=[] + for xlinkPath in splittedPath: + url = urllib.unquote_plus(xlinkPath); + qs=urlparse.urlparse(url).query + + queries=urlparse.parse_qsl(qs) + q="" + for query in queries: + if query[0]=='q': + q=query[1] + + + + + + url= urlparse.urlparse(url).path + + pathSplitted=url.split("xpath/") + if len(pathSplitted)>1: + path=pathSplitted[1] + queriesArray.append((path,q)) + print queriesArray + + + + db = eventsDB2kml.DBQuery() + + if newRestriction is None: # keine weiteren Einschaenkungen dann erzeugen das kml file + res= ""+ db.searchXPaths(queriesArray)+"" + + + + hv=harvestDataFromEvents.EventKMLTransformer() + + + #x,cnt=hv.readString(res, ".//research_location/place_information", 0) + x,cnt=hv.readString(res, ".//place_information", 0) + + + + s = hv.toKML(x) + + return s + + + #sonst suche nach restriction suche muss eine liste von werten ergeben die sich mit der REstriction versteht, dh. restriction =wert wird dann in die Links eingebaut + # e.g. man such nach name d.h + # select=%20distinct%20cast%28xpath%28%27//applicant/name/text%28%29%27,%20data%29%20as%20text[]%29%20AS%20name + # dann muss die Restriction darauf passen i.a. wird die Restriction dem xpath im Suchstring entsprechen, + # newRestriction=http%3A%2F%2Flocalhost%2Fm%2Fxpath%2F%2F%2Fapplicant%2Fnam%2Ftext%28%29% + + newRestriction=urllib.unquote_plus(newRestriction) + + vals = db.searchXPaths(queriesArray,select,True) + + + ret="" + + + #berechen den neuer link = alter path ergaenzt um neue restriction + for val in vals: + val=val[0] # result ist immer ein tuple + # mehr als ein Treffer pro eintrag + for v in val: + newQuery="" + splittedPath.append(newRestriction+"?q="+v) + splittedPathQuoted=[urllib.quote_plus(x) for x in splittedPath] + + pathNew="|".join(splittedPathQuoted) + urlNew=urllib.quote_plus("""%srestricted?path=%s"""%(BASE_URL,pathNew)) + ret+="""%s
"""%(E4D_URL,urlNew,v) + return ret + +class sqlSearch: + def GET(self): + x=web.input() + sql=x.get("sql") + p=x.get("xpathPlace") + output=x.get("output") + + + + url="%ssql?q=%s&p=%s"%(BASE_URL,urllib.quote_plus(sql),p) + + if output=="sql": + raise web.seeother(url) + + url=urllib.quote_plus(url) + + + + url="""%s?kml1=%s&source1=1"""%(E4D_URL,url) + raise web.seeother(url) + + +class xpathSearch: + def GET(self): + x=web.input() + path=x.get("path") + value=x.get("value") + + url="%sxpath/%s?q=%s"%(BASE_URL,path,value) + + url=urllib.quote_plus(url) + + + + url="""%s?kml1=%s&source1=1"""%(E4D_URL,url) + raise web.seeother(url) + +class sql: + def GET(self): + x = web.input() + q= x.get("q") + p= x.get("p") + db = eventsDB2kml.DBQuery() + res= ""+db.sql(q)+"" + + + + hv=harvestDataFromEvents.EventKMLTransformer() + + + #x,cnt=hv.readString(res, ".//research_location/place_information", 0) + x,cnt=hv.readString(res, p, 0) + + + + s = hv.toKML(x) + + return s + + class xpath: def GET(self, path): @@ -76,11 +235,31 @@ def GET(self): db = eventsDB2kml.DBQuery() + + + x = web.input() + where= x.get("where") + + whereClause="" + +#Beispiel: +#select distinct +# +#cast (xpath('//name/text()',data) as text[]) AS name +# +#from locations +# where +# 'Astrophytum asterius' = ANY (cast (xpath('//species/text()', data) as text[])) ; + + if where!="" and where is not None: + whereClause="where %s"%where + q=""" select cast(xpath('//applicant/name/text()', data) as text[]) AS name from locations - """ + %s + """%whereClause res=db.query(q) #hole alle species @@ -97,15 +276,15 @@ spList.sort() for x in spList: - print x - ret+="""%s"""%(x,x) + + ret+="""%s"""%(BASE_URL,x,x) url=urllib.quote_plus("%sxpath///applicant/name/text()?q=%s"%(BASE_URL,x)) ret+=""" e4D
+ >e4D
"""%(E4D_URL,url) return ret @@ -113,12 +292,32 @@ def GET(self): db = eventsDB2kml.DBQuery() + + x = web.input() + where= x.get("where") + + whereClause="" + +# Beispiel: +#select +# +#cast (xpath('//species/text()',data) as text[]) AS name +# +#from locations +# where +# 'Anna George' = ANY (cast (xpath('//name/text()', data) as text[])) ; +# + if where!="" and where is not None: + whereClause="where %s"%where + q=""" - select + select distinct cast(xpath('//species/text()', data) as text[]) AS name from locations - """ - + %s + """%whereClause + + res=db.query(q) #hole alle species spec=set() @@ -134,15 +333,15 @@ spList.sort() for x in spList: - print x - ret+="""%s"""%(x,x) + + ret+="""%s"""%(BASE_URL,x,x) url=urllib.quote_plus("%sxpath///species/text()?q=%s"%(BASE_URL,x)) ret+=""" e4D
+ >e4D
"""%(E4D_URL,url) return ret diff -r 26c06d568e1d -r 283badd62593 harvestDataFromEvents.py --- a/harvestDataFromEvents.py Thu Sep 13 16:56:49 2012 +0200 +++ b/harvestDataFromEvents.py Fri Oct 12 08:36:57 2012 +0200 @@ -129,14 +129,14 @@ cnt+=1 return ret,cnt - def readFiles(self,path,locationXPath): + def readFiles(self,path,locationXPath,cnt=0): ret=[] - cnt=0 + for f in os.listdir(path): ret2,cnt=self.readFile(path+f,locationXPath,cnt) ret+=ret2 - return ret + return ret,cnt def toKML(self,events): @@ -161,7 +161,7 @@ tf=EventKMLTransformer("/tmp/out.sql") - x = tf.readFiles("/Users/dwinter/Documents/Projekte/mmpa-permit-etienne/events/",".//research_location/place_information") + x,cnt = tf.readFiles("/Users/dwinter/Documents/Projekte/mmpa-permit-etienne/events/",".//research_location/place_information") #x = readFiles("/Users/dwinter/Documents/Projekte/mmpa-permit-etienne/Results/events/") evs= tf.toKML(x) @@ -170,7 +170,7 @@ out.write(evs) out.close() - x = tf.readFiles("/Users/dwinter/Documents/Projekte/mmpa-permit-etienne/events/",".//applicant_locations/place_information") + x,cnt = tf.readFiles("/Users/dwinter/Documents/Projekte/mmpa-permit-etienne/events/",".//applicant_locations/place_information",cnt) #x = readFiles("/Users/dwinter/Documents/Projekte/mmpa-permit-etienne/Results/events/") evs= tf.toKML(x)