version 1.70, 2005/10/24 23:50:53
|
version 1.71, 2005/11/08 13:37:32
|
Line 17 import Shared.DC.ZRDB.DA
|
Line 17 import Shared.DC.ZRDB.DA
|
import zLOG |
import zLOG |
import os.path |
import os.path |
import os |
import os |
|
from OFS.SimpleItem import SimpleItem |
|
|
def analyseIntSearch(word): |
def analyseIntSearch(word): |
#analyse integer searches |
#analyse integer searches |
Line 48 def sql_quote(v):
|
Line 48 def sql_quote(v):
|
def showSQLConnectionIDs(self): |
def showSQLConnectionIDs(self): |
return SQLConnectionIDs(self) |
return SQLConnectionIDs(self) |
|
|
|
class ZSQLIndex(SimpleItem): |
|
"""index""" |
|
meta_type="ZSQLIndex" |
|
|
|
def __init__(self,index,id,table=''): |
|
self.index=[x for x in index] |
|
self.id=id |
|
self.table=table |
|
|
|
def setIndex(self,index): |
|
self.index=[x for x in index] |
|
|
|
def getIndex(self): |
|
return self.index |
|
|
class ZSQLExtendFolder(Folder,Persistent, Implicit): |
class ZSQLExtendFolder(Folder,Persistent, Implicit): |
"""Folder""" |
"""Folder""" |
meta_type="ZSQLExtendFolder" |
meta_type="ZSQLExtendFolder" |
|
|
|
def importXMLFile(self,table,containerTagName,file,identify=None,RESPONSE=None): |
|
#TODO: finish importXMLFile |
|
''' |
|
Import XML file into the table |
|
@param table: name of the table the xml shall be imported into |
|
@param containerTagName: XML-Tag which describes a dataset |
|
@param file: xmlfile handle |
|
@param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes. |
|
@param RESPONSE: (optional) |
|
''' |
|
from xml.dom.pulldom import parseString |
|
|
|
doc=parseString(file.read()) |
|
while 1: |
|
node=doc.getEvent() |
|
|
|
if node is None: |
|
break; |
|
else: |
|
if node[1].nodeName==containerTagName: |
|
doc.expandNode(node[1]) |
|
#fn=node[1].getAttribute("xml:id") |
|
#nf=file("xtf/"+fn+".xtf",'w') |
|
#nf.write("""<texts xmlns="http://emegir.info/xtf" xmlns:lem="http://emegir.info/lemma" >"""+node[1].toxml()+"</texts>") |
|
#print "wrote: %s"%fn |
|
|
|
|
|
def generateIndex(self,field,index_name,table,RESPONSE=None): |
|
"""erzeuge index aus feld""" |
|
index={} |
|
founds=self.ZSQLSimpleSearch("""SELECT %s,oid FROM %s LIMIT 2000"""%(field,table)) |
|
print len(founds) |
|
for found in founds: |
|
tmp=getattr(found,field,None) |
|
if tmp: |
|
strings=tmp.split(" ") |
|
for string in strings: |
|
if index.get(string): |
|
index[string].append(found.oid) |
|
else: |
|
index[string]=[found.oid] |
|
RESPONSE.write(string+"\n") |
|
|
|
if not hasattr(self,index_name): |
|
obj=ZSQLIndex(index,index_name,table) |
|
self._setObject(index_name,obj) |
|
|
|
self._getOb(index_name).setIndex(index) |
|
|
|
def getIndex(self,index_name): |
|
"""getIndex""" |
|
founds=self.ZopeFind(self,obj_ids=[index_name]) |
|
|
|
return founds[0][1].getIndex() |
|
|
|
|
def testneu(self): |
def testneu(self): |
"""test""" |
"""test""" |
Line 64 class ZSQLExtendFolder(Folder,Persistent
|
Line 134 class ZSQLExtendFolder(Folder,Persistent
|
def URLquote(self,txt): |
def URLquote(self,txt): |
"""urlquote""" |
"""urlquote""" |
return urllib.quote(txt) |
return urllib.quote(txt) |
|
|
def searchRel(self,relStatement,statement,wherePart,classes): |
def searchRel(self,relStatement,statement,wherePart,classes): |
"""suche relative haufigkeiten""" |
"""suche relative haufigkeiten""" |
ret={} |
ret={} |
Line 518 class ZSQLExtendFolder(Folder,Persistent
|
Line 589 class ZSQLExtendFolder(Folder,Persistent
|
return True |
return True |
|
|
|
|
|
def ZSQLFindIndexed(self,qs="",select="oid,*",storename=None,indexedFields=['data_line'],restrictField='id_text',**argv): |
|
"""find2""" |
|
|
|
for index in self.ZopeFind(self,obj_ids=indexedFields): |
|
txt=argv.get(index[0],None) |
|
if txt: |
|
oids=index[1].getIndex()[txt] |
|
|
|
search1= self.ZSQLFind(qs=qs,select=select,storename=storename,tableExt=tableList[1],restrictField=restrictField,NoQuery='yes',NoLimit='yes',**argv) |
|
|
|
search2 = self.ZSQLFind(tableExt=tableList[0],qs=qs,select=select,storename=storename,restrictConnect=(tableList[0]+"."+restrictField,search1),**argv) |
|
return search2 |
|
|
def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): |
def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): |
"""find2""" |
"""find2""" |
|
|
Line 529 class ZSQLExtendFolder(Folder,Persistent
|
Line 613 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
def ZSQLFind(self,qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv): |
def ZSQLFind(self,qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv): |
"""Find""" |
"""search in database""" |
|
|
def delEmpty(list): |
def delEmpty(list): |
|
""""loesche leere elemente aus der liste""" |
ret=[] |
ret=[] |
for x in list: |
for x in list: |
splitted=x.split("=") |
splitted=x.split("=") |
Line 539 class ZSQLExtendFolder(Folder,Persistent
|
Line 624 class ZSQLExtendFolder(Folder,Persistent
|
ret.append(x) |
ret.append(x) |
return ret |
return ret |
|
|
|
|
|
|
#self.REQUEST.SESSION['come_from_search']="no" # zuruecksetzen |
|
if qs=="": |
if qs=="": |
|
#kein querystring ubergeben |
if self.REQUEST['QUERY_STRING']: |
if self.REQUEST['QUERY_STRING']: |
qs=self.REQUEST['QUERY_STRING'] |
qs=self.REQUEST['QUERY_STRING'] |
|
|
|
|
qs=string.join(qs.split("&"),",") |
qs=string.join(qs.split("&"),",") |
|
|
for field in argv.keys(): |
for field in argv.keys(): |
Line 579 class ZSQLExtendFolder(Folder,Persistent
|
Line 660 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
|
|
qs=re.sub("\\+"," ",qs)# Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular. |
qs=re.sub("\\+"," ",qs)#TODO: Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular. |
|
|
qs=string.join(delEmpty(qs.split(",")),",") |
qs=string.join(delEmpty(qs.split(",")),",") |
|
|
Line 707 class ZSQLExtendFolder(Folder,Persistent
|
Line 788 class ZSQLExtendFolder(Folder,Persistent
|
"""analysieren den QueryString""" |
"""analysieren den QueryString""" |
|
|
|
|
|
#setzte generische werte |
|
|
lop="AND" # standardsuche mit and |
lop="AND" # standardsuche mit and |
max="ALL" #standard alle auswaehlen |
max="ALL" #standard alle auswaehlen |
maxstr="" |
maxstr="" |
Line 722 class ZSQLExtendFolder(Folder,Persistent
|
Line 805 class ZSQLExtendFolder(Folder,Persistent
|
limit=0 |
limit=0 |
searchFields={} |
searchFields={} |
searchFieldsOnly={} |
searchFieldsOnly={} |
|
queryTemplate=[] |
|
|
if not select: |
if not select: |
select="oid,*" |
select="oid,*" |
#print "Q",nostore,qs |
|
#check for op |
|
|
|
|
|
|
|
|
|
|
#check for op |
splitted=qs.split(",") |
splitted=qs.split(",") |
|
print splitted |
if tableExt: |
if tableExt: |
table=tableExt |
table=tableExt |
|
|
if restrictField: |
if restrictField: |
select=restrictField |
select=restrictField |
|
|
|
|
|
#erster durchgang suche operatoren |
for q in splitted: |
for q in splitted: |
|
|
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
Line 768 class ZSQLExtendFolder(Folder,Persistent
|
Line 852 class ZSQLExtendFolder(Folder,Persistent
|
else: |
else: |
sortfields[field]=value |
sortfields[field]=value |
|
|
#print "HI",op,field |
#zweiter durchgang analysiere felder |
#print opfieldsa |
|
#now analyse the querystring |
|
|
|
for q in qs.split(","): |
for q in qs.split(","): |
|
|
|
|
#try: |
|
|
|
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
try: |
try: |
Line 783 class ZSQLExtendFolder(Folder,Persistent
|
Line 863 class ZSQLExtendFolder(Folder,Persistent
|
except: |
except: |
value="" |
value="" |
|
|
#value=sql_quote(value) |
punktsplit=name.split(".") #sonderfall feld mit punkten(tabelle.suchFeld.ausgewaehltesFeld,feldinoriginal), d.h. suche in anderer tabelle: |
|
|
|
|
|
#analysiere alle anderen faelle |
if name==iCT+"lop": |
if name==iCT+"lop": |
lop=value |
lop=value |
elif name==iCT+"table": |
elif name==iCT+"table": |
Line 827 class ZSQLExtendFolder(Folder,Persistent
|
Line 907 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
|
|
|
elif (not name[0]==iCT) and len(punktsplit)==4: |
|
if opfields.has_key(name): |
|
op=opfields[name] |
|
else: |
|
op="ct" |
|
namealt=name |
|
name="LOWER("+punktsplit[1]+")" |
|
print "XX",op |
|
if op=="ct": |
|
tmp=(name+" LIKE "+sql_quote("%"+value+"%")) |
|
elif op=="gt": |
|
tmp=(name+">"+sql_quote(value)) |
|
elif op=="lt": |
|
tmp=(name+"<"+sql_quote(value)) |
|
elif op=="eq": |
|
tmp=(name+"="+sql_quote(value)) |
|
elif op=="bw": |
|
tmp=(name+" LIKE "+sql_quote(value+"%")) |
|
elif op=="ew": |
|
tmp=(name+" LIKE "+sql_quote("%"+value)) |
|
elif op=="all": |
|
tmps=[] |
|
for word in value.split(" "): |
|
tmps.append(name+" LIKE "+sql_quote("%"+word+"%")) |
|
|
|
tmp=string.join(tmps,' AND ') |
|
|
|
elif op=="numerical": |
|
term=analyseIntSearch(value) |
|
tmp=(name+" "+term) |
|
elif op=="grep": |
|
tmp=(name+" ~* "+sql_quote(value)) |
|
elif op=="one": |
|
tmps=[] |
|
for word in value.split(" "): |
|
tmps.append(name+" LIKE "+sql_quote("%"+word+"%")) |
|
|
|
tmp=string.join(tmps,' OR ') |
|
|
|
op="all" |
|
|
|
print punktsplit |
|
searchTmp="""%s in (select %s from %s where %s)"""%(punktsplit[3],punktsplit[2],punktsplit[0],tmp) |
|
print "got",searchTmp |
|
queryTemplate.append(searchTmp) |
|
|
elif (not name[0]==iCT) and (not len(value)==0): |
elif (not name[0]==iCT) and (not len(value)==0): |
|
|
#print "OP",op,name |
#print "OP",op,name |
Line 881 class ZSQLExtendFolder(Folder,Persistent
|
Line 1007 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
whereList=["("+searchFields[x]+")" for x in searchFields.keys()] |
whereList=["("+searchFields[x]+")" for x in searchFields.keys()] |
|
whereList+=queryTemplate |
|
|
if len(whereList)>0: |
if len(whereList)>0: |
if filter: |
if filter: |
Line 904 class ZSQLExtendFolder(Folder,Persistent
|
Line 1031 class ZSQLExtendFolder(Folder,Persistent
|
#print "QE",table |
#print "QE",table |
#print (select,table,where,sort,maxstr,skip) |
#print (select,table,where,sort,maxstr,skip) |
query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip) |
query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip) |
|
print query |
if not nostore=="yes": |
if not nostore=="yes": |
|
|
self.REQUEST.SESSION['qs']=opfields |
self.REQUEST.SESSION['qs']=opfields |
Line 978 class ZSQLExtendFolder(Folder,Persistent
|
Line 1105 class ZSQLExtendFolder(Folder,Persistent
|
|
|
def ZSQLSearch(self): |
def ZSQLSearch(self): |
"""To be done""" |
"""To be done""" |
rq=self.REQUEST['QUERY_STRING'] |
|
|
|
querys=rq.split("&") |
|
|
|
|
|
formatfile=self.REQUEST['URL1'] #generisch redirect zur gleichen url |
formatfile=self.REQUEST['URL1'] #generisch redirect zur gleichen url |
|
|
for querytemp in querys: |
#zerlege querystring in key value paare |
query=querytemp.split("=") |
#TODO: check if this is really necessary, use argv** |
|
|
|
|
|
|
|
rq=self.REQUEST['QUERY_STRING'] |
|
querys=rq.split("&") |
|
for querytemp in querys: #zerg |
|
query=querytemp.split("=") |
|
|
try: |
try: |
if query[0].lower()=="-format": |
if query[0].lower()=="-format": |
formatfile=query[1] |
formatfile=query[1] |
except: |
except: |
"""nothing""" |
pass |
|
|
|
|
#print formatfile |
|
|
|
|
|
|
#sichern |
self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",") |
self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",") |
self.REQUEST.SESSION['come_from_search']="yes" |
self.REQUEST.SESSION['come_from_search']="yes" |
|
|