source: exist/trunk/python/ndgeXist/eXistInterface.py @ 3111

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/exist/trunk/python/ndgeXist/eXistInterface.py@3111
Revision 3111, 4.4 KB checked in by lawrence, 12 years ago (diff)

eggification of xqueries proceeds ...

Line 
1from eXistConnector import *
2class ndg_eXist(eXistConnector):
3    ''' Adds ndg methods to a "standard" exist Connector '''
4    def __init__(self,db='glue.badc.rl.ac.uk',passwordFile='passwords.txt'):
5        try:
6            f=file(passwordFile,'r')
7        except IOError,e:
8            raise IOError('%s [looking for %s in %s]'%(e,passwordFile,os.getcwd()))
9           
10        pw={}
11        for line in f.readlines():
12            host,userid,password=line.strip().split(' ')
13            pw[host]=(userid,password)
14        f.close()
15        if db not in pw:
16            raise ValueError('Unable to find eXist password for repository [%s]'%db)
17        eXistConstants = InstanceObject(host=db,
18                                userid=pw[db][0],
19                                password=pw[db][1],
20                                base_path="/exist/servlet",
21                                xmlrpc_base_path="/exist/xmlrpc",
22                                port=8080)
23       
24        eXistConnector.__init__(self,eXistConstants)
25        self.ids={}
26       
27    def __buildquery(self,query,target=None):
28        '''Create an NDG full text query '''
29        if target is not None:
30            s='''let $hits := collection('/db/%s')//root()[. &= '%s'] ;
31                 for $i in $hits
32                    return <document>{document-uri($i)}</document>'''%(target,query)
33        else: s="/*[. &='%s']"%query
34
35        return s#xmlrpclib.Binary(s)
36
37    def __buildParamSearch(self,param,value,target):
38        s="for $x in document()//%s where $x[.%s &= '%s'] return $x"%(target,param,value)
39        return s
40
41    def full_text(self,query,target=None):
42        ''' Carry out a full text search within the "target" collection '''
43        id,summary=self.executeQuery(self.__buildquery(query,target))
44        self.ids[id]=0
45        return id,summary
46
47    def retrieveNext(self,id,pos=None):
48        ''' Takes a sessionID from an existing query and gets the next document '''
49        if pos is not None: self.ids[id]=pos
50        try:
51            r=self.retrieve(id, self.ids[id])
52            self.ids[id]+=1
53            return r
54        except xmlrpclib.Fault:
55            return None
56        except KeyError:
57            return None
58   
59    def sessionRelease(self,id):
60        ''' Releases a session and removes the position counter '''
61        try:
62            self.release(id)
63            del self.ids[id]
64            return 1
65        except:
66            return 0
67   
68    def chunkedFullText(self,query,start=1,number=10,target='DIF'):
69        ''' Execute a chunked full text query and return the result
70        set '''
71        return self.executeChunkedQuery(self.__buildquery(query,target),start,number,params={})
72   
73   
74    def getDIF(self,entryID):
75        ''' Get a specific DIF document from a repository by using the entryID '''
76        xq='''for $DE in collection()/DIF[Entry_ID='%s'] return $DE'''%entryID
77        xquery='''for $DE in collection('/db/testdif1')/DIF[Entry_ID='%s'] return $DE'''%entryID
78        id,summary=self.executeQuery(xq)#xquery)
79        if summary['hits']==1:
80            r=self.retrieve(id,0,{})
81            self.sessionRelease(id)
82        else:
83            r=summary['hits']
84        return r
85       
86    def search(self,term,start=1,howmany=20,target=None,scope=None,bbox=None,dateRange=None,geoSearchType=None):
87        ''' Provides a search interface that mimics the WSDL search interface, except that
88        the target used is the exist collection name, and scope, bbox and dateRange are ignored,
89        and a python summary object is returned '''
90        xquery={'ndg_B_metadata':xq.molesSearchSummary,'NumSim':xq.numsimSummary}[target]
91        xquery=xquery.replace('SEARCHSTRING',term)
92        r=self.executeChunkedQuery(xquery,start,howmany)
93        print r
94        x=xmlh(str(r),string=1)
95        h=x.tree.get('hits')
96        self.results=[]
97        self.serverSessionID=''
98        if h is None:
99            self.hits=0
100            self.start=0
101            self.howmany=0
102            self.error=['No results for [%s]'%term,]
103        else:
104            self.hits=int(h)
105            self.error=None
106            self.start=int(x.tree.get('start'))
107            self.howmany=int(x.tree.get('count'))
108            slist=x.tree.findall('summary')
109            for s in slist:
110                t=edict(id=s.find('id').text,name=s.find('name').text,type=s.find('type').text)
111                self.results.append(t)
112        return self.results
Note: See TracBrowser for help on using the repository browser.