Changeset 3103 for exist


Ignore:
Timestamp:
05/12/07 12:27:53 (12 years ago)
Author:
lawrence
Message:

Initial Commit of exist interface for standalone eggification.

Location:
exist/trunk/python/ndgeXist
Files:
1 added
1 copied

Legend:

Unmodified
Added
Removed
  • exist/trunk/python/ndgeXist/eXistInterface.py

    r3094 r3103  
    111111#        print self.xmlrpc.system.listMethods() 
    112112         
    113 class ndg_eXist(eXist_Connector): 
    114     ''' Adds ndg methods to a "standard" exist Connector ''' 
    115     def __init__(self,db='glue.badc.rl.ac.uk',passwordFile='passwords.txt'): 
    116         try: 
    117             f=file(passwordFile,'r') 
    118         except IOError,e: 
    119             raise IOError('%s [looking for %s in %s]'%(e,passwordFile,os.getcwd())) 
    120              
    121         pw={} 
    122         for line in f.readlines(): 
    123             host,userid,password=line.strip().split(' ') 
    124             pw[host]=(userid,password) 
    125         if db not in pw: 
    126             raise ValueError('Unable to find eXist password for repository [%s]'%db) 
    127         eXistConstants = InstanceObject(host=db, 
    128                                 userid=pw[db][0], 
    129                                 password=pw[db][1], 
    130                                 base_path="/exist/servlet", 
    131                                 xmlrpc_base_path="/exist/xmlrpc", 
    132                                 port=8080) 
    133          
    134         eXist_Connector.__init__(self,eXistConstants) 
    135         self.ids={} 
    136          
    137     def __buildquery(self,query,target=None): 
    138         '''Create an NDG full text query ''' 
    139         if target is not None: 
    140             s='''let $hits := collection('/db/%s')//root()[. &= '%s']  
    141                  for $i in $hits  
    142                     return <document>{document-uri($i)}</document>'''%(target,query) 
    143         else: s="/*[. &='%s']"%query 
    144  
    145         return s#xmlrpclib.Binary(s) 
    146  
    147     def __buildParamSearch(self,param,value,target): 
    148         s="for $x in document()//%s where $x[.%s &= '%s'] return $x"%(target,param,value) 
    149         return s 
    150  
    151     def full_text(self,query,target=None): 
    152         ''' Carry out a full text search within the "target" collection ''' 
    153         id,summary=self.executeQuery(self.__buildquery(query,target)) 
    154         self.ids[id]=0 
    155         return id,summary 
    156  
    157     def retrieveNext(self,id,pos=None): 
    158         ''' Takes a sessionID from an existing query and gets the next document ''' 
    159         if pos is not None: self.ids[id]=pos 
    160         try: 
    161             r=self.retrieve(id, self.ids[id]) 
    162             self.ids[id]+=1 
    163             return r 
    164         except xmlrpclib.Fault: 
    165             return None 
    166         except KeyError: 
    167             return None 
    168      
    169     def sessionRelease(self,id): 
    170         ''' Releases a session and removes the position counter ''' 
    171         try: 
    172             self.release(id) 
    173             del self.ids[id] 
    174             return 1 
    175         except: 
    176             return 0 
    177      
    178     def chunkedFullText(self,query,start=1,number=10,target='DIF'): 
    179         ''' Execute a chunked full text query and return the result 
    180         set ''' 
    181         return self.executeChunkedQuery(self.__buildquery(query,target),start,number,params={}) 
    182      
    183      
    184     def getDIF(self,entryID): 
    185         ''' Get a specific DIF document from a repository by using the entryID ''' 
    186         xq='''for $DE in collection()/DIF[Entry_ID='%s'] return $DE'''%entryID 
    187         xquery='''for $DE in collection('/db/testdif1')/DIF[Entry_ID='%s'] return $DE'''%entryID 
    188         id,summary=self.executeQuery(xq)#xquery) 
    189         if summary['hits']==1: 
    190             r=self.retrieve(id,0,{}) 
    191             self.sessionRelease(id) 
    192         else: 
    193             r=summary['hits'] 
    194         return r 
    195          
    196     def search(self,term,start=1,howmany=20,target=None,scope=None,bbox=None,dateRange=None,geoSearchType=None): 
    197         ''' Provides a search interface that mimics the WSDL search interface, except that 
    198         the target used is the exist collection name, and scope, bbox and dateRange are ignored, 
    199         and a python summary object is returned ''' 
    200         xquery={'ndg_B_metadata':xq.molesSearchSummary,'NumSim':xq.numsimSummary}[target] 
    201         xquery=xquery.replace('SEARCHSTRING',term) 
    202         r=self.executeChunkedQuery(xquery,start,howmany) 
    203         print r 
    204         x=xmlh(str(r),string=1) 
    205         h=x.tree.get('hits') 
    206         self.results=[] 
    207         self.serverSessionID='' 
    208         if h is None: 
    209             self.hits=0 
    210             self.start=0 
    211             self.howmany=0 
    212             self.error=['No results for [%s]'%term,] 
    213         else: 
    214             self.hits=int(h) 
    215             self.error=None 
    216             self.start=int(x.tree.get('start')) 
    217             self.howmany=int(x.tree.get('count')) 
    218             slist=x.tree.findall('summary') 
    219             for s in slist: 
    220                 t=edict(id=s.find('id').text,name=s.find('name').text,type=s.find('type').text) 
    221                 self.results.append(t) 
    222         return self.results 
    223113 
    224114import unittest 
    225115 
    226116class TestCase(unittest.TestCase): 
    227      
    228     def testFullText(self): 
    229              
    230         ''' Exercises some of the methods based on something we hope might exist in the database ''' 
    231          
    232         existDB=ndg_eXist(db='glue.badc.rl.ac.uk') 
    233         id,summary=existDB.full_text('neodc') 
    234          
    235         r=existDB.retrieveNext(id) 
    236         d=summary['documents'][0][0] 
    237         doc=existDB.getDoc('/db/discovery/moles',d) 
    238          
    239         ok=existDB.sessionRelease(id) 
    240         self.assertEqual(1,ok) 
    241          
    242     def testSearch(self): 
    243         existDB=ndg_eXist(db='chinook.badc.rl.ac.uk') 
    244         r=existDB.search('coapec',target='ndg_B_metadata') 
    245         print existDB.hits 
    246         for i in r: print i 
    247         r=existDB.search('HadAM2',target='NumSim') 
    248         print existDB.hits 
    249117         
    250118    def testedict(self): 
Note: See TracChangeset for help on using the changeset viewer.