Changeset 4267 for exist/trunk


Ignore:
Timestamp:
02/10/08 11:49:44 (11 years ago)
Author:
cbyrom
Message:

Extend eXistInterface search method to allow more granulated searches of
atom data - for use in the atom editor pages. Add new method to dynamically
generate the required search xquery. NB, this is done to avoid using
full search query when not needed since this adds significantly to the
search time. Add new search tests.

Location:
exist/trunk/python/ndgUtils
Files:
2 edited

Legend:

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

    r4240 r4267  
    55class ndg_eXist(eXistConnector): 
    66    ''' Adds ndg methods to a "standard" exist Connector ''' 
     7     
     8    ATOM_TARGET = 'Atom' 
     9    DEFAULT_ALL_VAL = 'All' # value used when specifying '*' in searches 
     10 
    711    def __init__(self,db='glue.badc.rl.ac.uk',passwordFile='passwords.txt'): 
    812        logging.debug("Initialising connection to eXist DB ('%s')" %db) 
     
    9296    def search(self,term,start=1,howmany=20, \ 
    9397               target=None,scope=None,bbox=None, \ 
    94                dateRange=None,geoSearchType=None): 
     98               dateRange=None,geoSearchType=None, \ 
     99               providerID=None, atomTypeID=None): 
    95100        ''' Provides a search interface that mimics the WSDL search interface, except that 
    96101        the target used is the exist collection name, and scope, bbox and dateRange are ignored, 
    97102        and a python summary object is returned ''' 
    98103        #select the right query according to the docType 
    99         xqName={'ndg_B_metadata':'molesSummary',\ 
    100                 'NumSim':'numsimSummary',\ 
    101                 'Atom': 'AtomSummary'}[target] 
    102         xquery=ndgXqueries()[xqName] 
    103         xquery=xquery.replace('SEARCHSTRING',term) 
     104         
     105        if target == self.ATOM_TARGET: 
     106            xquery = self.__createAtomSearch(providerID, atomTypeID, term) 
     107        else: 
     108            xqName={'ndg_B_metadata':'molesSummary',\ 
     109                'NumSim':'numsimSummary'}[target] 
     110            xquery=ndgXqueries()[xqName] 
     111            xquery=xquery.replace('SEARCHSTRING',term) 
     112             
    104113        r=self.executeChunkedQuery(xquery,start,howmany) 
    105114        x=xmlHandler2.xmlHandler(str(r),string=1) 
     
    119128            slist=x.tree.findall('summary') 
    120129            for s in slist: 
    121                 t=edict(id=s.find('id').text,name=s.find('name').text,type=s.find('type').text) 
     130                t=edict(id=s.find('id').text,name=s.find('name').text,\ 
     131                        type=s.find('type').text) 
     132                # add extra stuff for atom search (NB, this could be added to all 
     133                # but am unsure of implications elsewhere atm 
     134                if target == self.ATOM_TARGET: 
     135                    for key in ['providerID', 'created', 'href', 'subtype']: 
     136                        t[key] = s.find(key).text 
     137 
     138                        # adjust href to point to atom editor instead of atom view 
     139                        if key == 'href': 
     140                            t[key] = t[key].replace('view', 'editAtom') 
     141                     
    122142                self.results.append(t) 
    123143        return self.results 
     144     
     145 
     146    def __createAtomSearch(self, providerID, atomTypeID, term): 
     147        ''' 
     148        Create a valid xquery search for searching atoms 
     149        ''' 
     150        logging.debug("Creating xquery for searching atoms") 
     151        logging.debug("providerID: '%s', atomTypeID: '%s', term: '%s'"  
     152                      %(providerID, atomTypeID, term)) 
     153        xquery = "declare namespace moles='http://ndg.nerc.ac.uk/schema/moles2alpha';\n" + \ 
     154            "declare namespace atom='http://www.w3.org/2005/Atom';\n" + \ 
     155            "for $DE in collection('/db/atoms')//root()[" 
     156 
     157        # only add the required search clauses - NB, these increase the search time 
     158        # significantly, so avoid unless really required 
     159        whereClause = [] 
     160        if term: 
     161            whereClause.append(". &= '" + term + "'") 
     162         
     163        if providerID and providerID != self.DEFAULT_ALL_VAL: 
     164            whereClause.append("atom:entry/moles:entity/moles:molesISO/moles:providerID = '" + providerID + "'") 
     165         
     166        if atomTypeID and atomTypeID != self.DEFAULT_ALL_VAL: 
     167            whereClause.append("atom:entry/atom:category/@label = '" + atomTypeID + "'") 
     168             
     169        if not whereClause: 
     170            whereClause.append(".") 
     171         
     172        for i, clause in enumerate(whereClause): 
     173            if i > 0: 
     174                xquery += " and " 
     175            xquery += clause 
     176             
     177        xquery += "] return <summary> \ 
     178<id>{$DE/atom:entry/atom:id/text()}</id> \ 
     179<name>{$DE/atom:entry/atom:title/text()}</name> \ 
     180<type>{string($DE/atom:entry/atom:category[@term='ATOM_TYPE']/@label)}</type> \ 
     181<subtype>{string($DE/atom:entry/atom:category[@term='ATOM_SUBTYPE']/@label)}</subtype> \ 
     182<href>{string($DE/atom:entry/atom:link[@rel='self']/@href)}</href> \ 
     183<providerID>{$DE/atom:entry/moles:entity/moles:molesISO/moles:providerID/text()}</providerID> \ 
     184<created>{$DE/atom:entry/moles:entity/moles:molesISO/moles:created/text()}</created> \ 
     185</summary>" 
     186 
     187        logging.debug("Created xquery: '%s'" %xquery) 
     188        return xquery 
  • exist/trunk/python/ndgUtils/test_eXistInterface.py

    r3128 r4267  
    4343        self.assertEqual(True,r,'unable to remove collection') 
    4444 
     45    def testSearch(self): 
     46        host = self.pw.keys()[1] 
     47        xmldb=ndg_eXist(db=host) 
     48        a = xmldb.search('temperature', target='ndg_B_metadata') 
     49        self.assertNotEqual(None, a) 
     50 
     51    def testAtomSearch(self): 
     52        host = self.pw.keys()[1] 
     53        xmldb=ndg_eXist(db=host) 
     54        a = xmldb.search('temperature', target=ndg_eXist.ATOM_TARGET) 
     55        self.assertNotEqual(None, a) 
     56         
    4557    #def test_xqueryLib(self): 
    4658    #    ''' Test the installed xquery lib is the same as the source xquery lib ''' 
Note: See TracChangeset for help on using the changeset viewer.