source: exist/trunk/python/ndgUtils/eXistInterface.py @ 3989

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/exist/trunk/python/ndgUtils/eXistInterface.py@4025
Revision 3989, 4.5 KB checked in by cbyrom, 11 years ago (diff)

Fix issue 977 ( http://proj.badc.rl.ac.uk/ndg/ticket/977):

  • add missing code to allow numsim/browse quick searches on ndg portal

+ fix problem with kid template to ensure results display properly
+ add setting up docs to help set up the ows_server app

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