Changeset 8582 for mauRepo


Ignore:
Timestamp:
28/09/12 17:32:13 (7 years ago)
Author:
mnagni
Message:

Incomplete - # 22558: Formatting of start/end times to conform to OpenSearch? time extension
 http://team.ceda.ac.uk/trac/ceda/ticket/22558

Now can search much faster the CEDA_ObservationCollection on all the given parameters (start, end, q, bbox).

Location:
mauRepo
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • mauRepo/HPFos/trunk/hpfos/HPFos/moles3epb.py

    r8581 r8582  
    3232''' 
    3333from hpfos.libs.epb import EPB 
     34import keyword 
    3435from ea_model.ceda_metadatamodel.ceda_observationcollection.ceda_observationcollection \ 
    3536    import CEDA_ObservationCollection 
     
    8182        return Moles3EPB(self._get_session()) 
    8283 
     84ilogging = logging.getLogger('Moles3EPB') 
     85ilogging.addHandler(StreamHandler()) 
     86ilogging.setLevel(logging.INFO) 
     87 
    8388class Moles3EPB(object): 
    8489 
    8590    def __init__(self, session): 
    8691        self._session = session 
    87         self.logging = logging.getLogger('Moles3EPB') 
    88         self.logging.addHandler(StreamHandler()) 
    89         self.logging.setLevel(logging.INFO) 
     92 
    9093         
    9194    def close(self): 
    9295        return self._session.close()                           
     96 
     97    def getObservationCollections_(self, bbox = None, keywords = None,  
     98                                  start = None, stop = None): 
     99        ''' 
     100            Returns a collection of CEDA_Observation records. 
     101            Each tuple has the following structure 
     102            (id, geometry, start_period, end_period)  
     103        ''' 
     104        intersectCmd = 'SELECT ceda_observationcollection.id, \ 
     105            ST_AsText(mo_observationcollection_ge_view.geometry) as geometry, \ 
     106            ph_time.start_timestamp AS start, \ 
     107            ph_time.end_timestamp AS end \ 
     108            from ' 
     109        if keywords is not None:  
     110            intersectCmd = intersectCmd + ' to_tsquery(\'%s\') as query, ' \ 
     111                % (keywords.replace(' ', '|')) 
     112                 
     113        intersectCmd = intersectCmd +  ' ceda_observationcollection \ 
     114            join mo_observationcollection_ge_view \ 
     115                on ceda_observationcollection.id = mo_observationcollection_ge_view.id \ 
     116            join merge_period_instant_views() as ph_time \ 
     117                on ceda_observationcollection.id = ph_time.mo_observationcollection_id \ 
     118            join mo_observationcollection as mo_obscoll \ 
     119                on ceda_observationcollection.id = mo_obscoll.id \ 
     120            join md_identifier as md_iden \ 
     121                on ceda_observationcollection.id \ 
     122                    = md_iden.mo_observationcollection_identifier ' 
     123                 
     124        if bbox is None \ 
     125            and start is None \ 
     126            and stop is None \ 
     127            and keywords is None: 
     128            ilogging.debug(intersectCmd) 
     129            return self.executeNative(intersectCmd).fetchall() 
     130         
     131        WHERE_DEF = " WHERE " 
     132        where = WHERE_DEF  
     133        if bbox is not None: 
     134            where = where \ 
     135                + 'ST_AsText(ST_Intersection(mo_observationcollection_ge_view.geometry, \ 
     136                    %s)) != \'GEOMETRYCOLLECTION EMPTY\' ' % (bbox) 
     137         
     138        if start is not None: 
     139            if where != WHERE_DEF:  
     140                where = where + " AND "                 
     141            where = where \ 
     142                + 'ph_time.start_timestamp > timestamp \'%s\' ' \ 
     143                % (str(start)) 
     144             
     145        if stop is not None: 
     146            if where != WHERE_DEF:  
     147                where = where + " AND "                 
     148            where = where \ 
     149                + 'ph_time.end_timestamp < timestamp \'%s\' ' \ 
     150                % (str(stop))             
     151             
     152        if keywords is not None: 
     153            if where != WHERE_DEF:  
     154                where = where + " AND "                 
     155            where = where \ 
     156                + '(mo_obscoll.description @@ query \ 
     157                    OR md_iden.code_search_vector @@ query)' 
     158         
     159        intersectCmd = intersectCmd + where         
     160        ilogging.debug(intersectCmd)                 
     161        return self.executeNative(intersectCmd).fetchall() 
     162         
     163    def get_instance_by_ids(self, ids): 
     164            try: 
     165                return self._session.query(CEDA_ObservationCollection)\ 
     166                .filter(CEDA_ObservationCollection.id.in_(ids)).all() 
     167            except: 
     168                pass 
     169         
    93170         
    94171    def getObservationCollections(self, bbox = None, keywords = '*',  
  • mauRepo/HPFos/trunk/hpfos/HPFos/molesSessionMiddleware.py

    r8515 r8582  
    7171 
    7272    def process_exception(self, request, exception): 
    73         if isinstance(exception, SQLAlchemyError): 
    74             MolesSessionMiddleware._epbInitialized = False 
     73        #if isinstance(exception, SQLAlchemyError): 
     74        #    MolesSessionMiddleware._epbInitialized = False 
    7575        c = {} 
    7676        c['exception'] = exception 
  • mauRepo/HPFos/trunk/hpfos/HPFos/osImpl/myimpl.py

    r8580 r8582  
    193193 
    194194    def apply_query_params(self, context, results): 
     195        # A cleaner implementation would require calls to 
     196        # db's merge_period_instant_views() but actually it does not collect  
     197        # infos about CEDA_Results 
     198         
    195199        subresults = [] 
    196200        if results is None: 
     
    202206            ititle = self._extractTitle(result) 
    203207 
    204             kwargs = {}                 
     208            kwargs = {} 
    205209            #------------------------ 
    206210            phenomenonTime = result.phenomenonTime 
     
    209213            kwargs['beginPosition'], kwargs['endPosition'] = \ 
    210214                from_pt_to_string(phenomenonTime) 
    211             #------------------------                                                                
     215            #------------------------ 
     216             
     217            #------------------------ 
    212218            kwargs['geometry'] = self._new_extract_geographic_extent(result) 
    213             kwargs['description'] = result.description             
     219            #------------------------                 
     220 
     221            #------------------------                     
     222            kwargs['description'] = result.description 
     223            #------------------------ 
    214224 
    215225            item = Subresult(result_guid.id, ititle, datetime.now().isoformat(),  
     
    221231        if type(results) == CEDA_ObservationCollection: 
    222232            results = results.member 
    223         elif type(results) == CEDA_Observation: 
    224             results = results.result 
    225         elif type(results) == CEDA_Result: 
    226             results = results.result 
    227233        elif isinstance(results, _ElementInterface): 
    228234            return self._digest_fatcat_atom(context, results)                     
    229235 
    230236        count, start_index, start_page = self._importCountAndPage(context) 
     237 
     238        instances = results 
     239        if type(results) == tuple: 
     240            ids = [id[0] for id in results[1]]  
     241            instances = context['moles3EPB'].get_instance_by_ids(ids)  
     242                            
     243        subresults = filter_results(instances, count, start_index, start_page) 
     244        subresults = self.apply_query_params(context, subresults)                                               
     245 
    231246        tot_results = 0 
    232247        try: 
    233             tot_results = len(results) 
     248            tot_results = len(instances) 
    234249        except: 
    235             pass  
    236                     
    237         # This check is a trick to speed up the response when no query parameter  
    238         # is required (all parameters are None). In this case the results are paged first  
    239         # then the subresults are generated. 
    240         # The opposite, filter first then the subresults are generated,  
    241         # if any query parameter is not None  
    242         if context['start'] is None \ 
    243             or context['stop'] is None \ 
    244             or context[BBOX] is None \ 
    245             or context['q'] is None: 
    246             filtered = filter_results(results, count, start_index, start_page)  
    247             subresults = self.apply_query_params(context, filtered)  
    248         else: 
    249             filtered = self.apply_query_params(context, results) 
    250             subresults = filter_results(filtered, count, start_index, start_page) 
    251             tot_results = len(subresults)                                              
    252                  
     250            pass 
     251                         
    253252        return Result(count, start_index, start_page, tot_results, \ 
    254253                      subresult = subresults, title=HPFOS_TITLE) 
     
    474473         
    475474        if not context.has_key(GUID) or context[GUID] is None: 
    476             return context['moles3EPB'].\ 
    477                 getObservationCollections(bbox = ibbox,  
     475            res = context['moles3EPB'].\ 
     476                getObservationCollections_(bbox = ibbox,  
    478477                                          keywords = context['q'],  
    479478                                          start = start,  
    480                                           stop = stop)         
     479                                          stop = stop) 
     480            return (CEDA_ObservationCollection, res) 
     481            #if res_ids is not None: 
     482            #    ids = [(id[0] for id in res_ids]       
    481483               
    482484        obj = context['moles3EPB'].getInstanceFromGUID(context[GUID])     
  • mauRepo/MolesManager/trunk/cedaMoles/MolesManager/db/ceda_customization.sql

    r8569 r8582  
    4040        DROP VIEW IF EXISTS period_view; 
    4141        RAISE INFO 'Dropped VIEW period_view'; 
    42         --Creates period_view    
     42        -- Creates period_view  
     43        -- which represents a human readable collection the stored periods 
    4344        CREATE VIEW period_view AS 
    4445                SELECT tm_period.id  
     
    6768        DROP VIEW IF EXISTS instant_view; 
    6869        RAISE INFO 'Dropped VIEW instant_view'; 
    69         --Creates instant_view   
     70        -- Creates instant_view 
     71        -- which represents a human readable collection the stored start times   
    7072        CREATE VIEW instant_view AS 
    7173                SELECT tm_instant.id  
     
    8890        DROP VIEW IF EXISTS mo_observationcollection_ge_view; 
    8991        RAISE INFO 'Dropped VIEW mo_observationcollection_ge_view';      
    90         --Creates mo_observationcollection_ge_view       
     92        -- Creates mo_observationcollection_ge_view      
     93        -- which represents postgis encoding of the observationcollection's geometry 
    9194        CREATE VIEW  mo_observationcollection_ge_view AS 
    9295                SELECT mo_observationcollection.id,  
     
    9497                                                                "westBoundLongitude",  
    9598                                                                "northBoundLatitude",  
    96                                                                 "southBoundLatitude") 
     99                                                                "southBoundLatitude") as geometry 
    97100                FROM mo_observationcollection 
    98101                        join ex_geographicboundingbox  
     
    104107        DROP VIEW IF EXISTS mo_observation_ge_view;      
    105108        RAISE INFO 'Dropped VIEW mo_observation_ge_view'; 
    106         --Creates mo_observation_ge_view         
     109        -- Creates mo_observation_ge_view 
     110        -- which represents postgis encoding of the observation's geometry       
    107111        CREATE VIEW  mo_observation_ge_view AS 
    108112        SELECT mo_observation.id,  
     
    110114                                                                "westBoundLongitude",  
    111115                                                                "northBoundLatitude",  
    112                                                                 "southBoundLatitude") 
     116                                                                "southBoundLatitude") as geometry 
    113117                FROM mo_observation 
    114118                        join ex_geographicboundingbox  
     
    132136$$ LANGUAGE plpgsql; 
    133137 
    134 --Executes the patch 
     138--Executes the patch on old DB instances 
    135139SELECT * from  patch_ceda_moles(); 
    136140 
Note: See TracChangeset for help on using the changeset viewer.