Changeset 5711


Ignore:
Timestamp:
14/09/09 14:45:00 (10 years ago)
Author:
aharwood
Message:

Added ordering

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ndgCommon/trunk/ndg/common/src/clients/xmldb/eXist/searchclient.py

    r5304 r5711  
    8383               providerID=None, atomTypeID=None, 
    8484               useChunked = True, orderBy = None, 
    85                orderDirection = None): 
     85               orderDirection = None, 
     86               publicOnly = True): 
    8687        '''  
    8788        Provides a search interface that mimics the WSDL search interface, except  
     
    8990        orderDirection and  
    9091        dateRange are ignored, and a python summary object is returned  
     92         
     93        If publicOnly flag is set then only publically visible records should be returned (currently 'Public' and 'public').  
     94         
    9195        ''' 
    9296        #select the right query according to the docType requested 
    9397        if target == self.ATOM_TARGET: 
    94             xquery = self.__createAtomSearch(providerID, atomTypeID, term) 
     98            if publicOnly: 
     99               xquery = self.__createBrowseAtomSearch(providerID, atomTypeID, term, orderBy=orderBy) 
     100            else: 
     101               xquery = self.__createAtomSearch(providerID, atomTypeID, term, orderBy=orderBy) 
     102                
    95103        else: 
    96104            xqName={'ndg_B_metadata':'molesSummary',\ 
     
    150158     
    151159 
    152     def __createAtomSearch(self, providerID, atomTypeID, term): 
     160    def __createAtomSearch(self, providerID, atomTypeID, term, orderBy=None): 
    153161        ''' 
    154162        Create a valid xquery search for searching atoms 
    155163        ''' 
    156164        logging.debug("Creating xquery for searching atoms") 
    157         logging.debug("providerID: '%s', atomTypeID: '%s', term: '%s'"  
    158                       %(providerID, atomTypeID, term)) 
     165        logging.debug("providerID: '%s', atomTypeID: '%s', term: '%s' orderBy: '%s'"  
     166                      %(providerID, atomTypeID, term, orderBy)) 
     167 
     168        collections = "'/db/atoms'" 
     169         
    159170        xquery = "declare namespace moles='http://ndg.nerc.ac.uk/schema/moles2beta';\n" + \ 
    160171            "declare namespace atom='http://www.w3.org/2005/Atom';\n" + \ 
    161172            "<results>\n{\n" + \ 
    162             "for $DE in collection('/db/atoms')/atom:entry[" 
     173            "for $DE in collection(%s)/atom:entry[" % collections 
    163174 
    164175        # only add the required search clauses - NB, these increase the search time 
    165176        # significantly, so avoid unless really required 
    166177        whereClause = [] 
     178         
     179        term = term.strip() 
     180         
    167181        if term: 
    168             whereClause.append(". &= '" + term + "'") 
     182            if term != '*': 
     183               whereClause.append(". &= '" + term + "'") 
    169184         
    170185        if providerID and providerID != self.DEFAULT_ALL_VAL: 
     
    181196                xquery += " and " 
    182197            xquery += clause 
    183              
    184         xquery += "] return <summary> \ 
     198 
     199        xquery += '] ' 
     200# 
     201#              Add ordering if specified 
     202#        
     203        orderByStr = None 
     204         
     205        if orderBy == 'title': 
     206           orderByStr = "$DE/atom:title" 
     207        elif orderBy == 'date': 
     208           orderByStr = "$DE/moles:entity/moles:molesISO/moles:created" 
     209        elif orderBy == 'providerid': 
     210           orderByStr = "$DE/moles:entity/moles:molesISO/moles:providerID/text()" 
     211        elif orderBy == 'type': 
     212           orderByStr = "string($DE/atom:category[@term='ATOM_TYPE']/@scheme)" 
     213        elif orderBy == 'subtype': 
     214           orderByStr = "string($DE/atom:category[@term='ATOM_SUBTYPE']/@scheme)"           
     215            
     216        if orderByStr: 
     217           xquery += " order by %s " % orderByStr  
     218                                     
     219        xquery += "return <summary> \ 
    185220<id>{$DE/atom:id/text()}</id> \ 
    186221<name>{$DE/atom:title/text()}</name> \ 
     
    197232        logging.debug("Created xquery: '%s'" %xquery) 
    198233        return xquery 
     234 
     235 
     236    def __createBrowseAtomSearch(self, providerID, atomTypeID, term, orderBy=None): 
     237        ''' 
     238        Create a valid xquery search for searching atoms. This is a modified version for use by the read-only 'browse' service. 
     239        Should be possible to integrate with createBrowseSearch, but at the moment I want to avoid messing up the existing search... ASH 
     240        ''' 
     241        logging.debug("Creating BROWSE xquery for searching atoms") 
     242        logging.debug("providerID: '%s', atomTypeID: '%s', term: '%s' orderBy: '%s'"  
     243                      %(providerID, atomTypeID, term, orderBy)) 
     244 
     245        collections = "'/db/atoms/Published', '/db/atoms/published'" 
     246         
     247        xquery = "declare namespace moles='http://ndg.nerc.ac.uk/schema/moles2beta';\n" + \ 
     248            "declare namespace atom='http://www.w3.org/2005/Atom';\n" + \ 
     249            "<results>\n{\n" + \ 
     250            "for $DE in collection(%s)/atom:entry[" % collections 
     251         
     252        # only add the required search clauses - NB, these increase the search time 
     253        # significantly, so avoid unless really required 
     254        whereClause = []         
     255         
     256        term = term.strip() 
     257         
     258        if term: 
     259            if term != '*': 
     260               whereClause.append(". &= '" + term + "'") 
     261         
     262        if providerID and providerID != self.DEFAULT_ALL_VAL: 
     263            whereClause.append("moles:entity/moles:molesISO/moles:providerID = '" + providerID + "'") 
     264         
     265        if atomTypeID and atomTypeID != self.DEFAULT_ALL_VAL: 
     266            whereClause.append("atom:category/@label = '" + atomTypeID + "'") 
     267             
     268        if not whereClause: 
     269            whereClause.append(".") 
     270         
     271        for i, clause in enumerate(whereClause): 
     272            if i > 0: 
     273                xquery += " and " 
     274            xquery += clause 
     275 
     276        xquery += '] ' 
     277# 
     278#              Add ordering if specified 
     279#        
     280        orderByStr = None 
     281         
     282        if orderBy == 'title': 
     283           orderByStr = "lower-case($DE/atom:title)" 
     284        elif orderBy == 'date': 
     285           orderByStr = "$DE/moles:entity/moles:molesISO/moles:created" 
     286        elif orderBy == 'providerid': 
     287           orderByStr = "$DE/moles:entity/moles:molesISO/moles:providerID/text()" 
     288        elif orderBy == 'type': 
     289           orderByStr = "string($DE/atom:category[@term='ATOM_TYPE']/@scheme)" 
     290        elif orderBy == 'subtype': 
     291           orderByStr = "string($DE/atom:category[@term='ATOM_SUBTYPE']/@scheme)"           
     292            
     293        if orderByStr: 
     294           xquery += " order by %s " % orderByStr  
     295                                     
     296        xquery += "return <summary> \ 
     297<id>{$DE/atom:id/text()}</id> \ 
     298<name>{$DE/atom:title/text()}</name> \ 
     299<collection>{util:collection-name($DE)}</collection> \ 
     300<type>{string($DE/atom:category[@term='ATOM_TYPE']/@scheme)}</type> \ 
     301<subtype>{string($DE/atom:category[@term='ATOM_SUBTYPE']/@scheme)}</subtype> \ 
     302<href>{string($DE/atom:link[@rel='self']/@href)}</href> \ 
     303<providerID>{$DE/moles:entity/moles:molesISO/moles:providerID/text()}</providerID> \ 
     304<created>{$DE/moles:entity/moles:molesISO/moles:created/text()}</created> \ 
     305</summary>\ 
     306}\ 
     307</results>" 
     308 
     309        logging.debug("Created xquery: '%s'" %xquery) 
     310        return xquery 
Note: See TracChangeset for help on using the changeset viewer.