Ignore:
Timestamp:
Feb 7, 2011, 4:07:54 PM (9 years ago)
Author:
robert@…
Message:
  • Number of seconds for the rest controller to keep data in cache is now a configuration option
  • After searching, it is possible to choose which action to perform on the search results.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/groovy/dbnp/query/Search.groovy

    r1487 r1501  
    3030import org.dbnp.gdt.*
    3131
     32/**
     33* Available boolean operators for searches
     34* @author robert
     35*
     36*/
     37enum SearchMode {
     38   and, or
     39}
     40
    3241class Search {
    33         public String entity;
    3442        public SecUser user;
    3543        public Date executionDate;
    3644        public int id;  // Is only used when this query is saved in session
    3745
     46        public String entity;
     47        public SearchMode searchMode = SearchMode.and
     48       
    3849        protected List criteria;
    3950        protected List results;
     
    4253        public List getCriteria() { return criteria; }
    4354        public void setCriteria( List c ) { criteria = c; }
     55        public void addCriterion( Criterion c ) {
     56                if( criteria )
     57                        criteria << c;
     58                else
     59                        criteria = [c];
     60        }
    4461
    4562        public List getResults() { return results; }
    4663        public void setResults( List r ) { results = r; }
     64        public List filterResults( List selectedIds ) {
     65                if( !selectedIds || !results )
     66                        return results
     67                       
     68                return results.findAll {
     69                        selectedIds.contains( it.id )
     70                }
     71        }
     72       
    4773       
    4874        public Map getResultFields() { return resultFields; }
     
    83109
    84110        /**
    85          * Executes a search based on the given criteria. Should be filled in by
    86          * subclasses searching for a specific entity
     111         * Executes a search based on the given criteria.
    87112         */
    88113        public void execute() {
    89114                this.executionDate = new Date();
    90         }
     115               
     116                switch( searchMode ) {
     117                        case SearchMode.and:
     118                                executeAnd();
     119                                break;
     120                        case SearchMode.or:
     121                                executeOr();
     122                                break;
     123                }
     124        }
     125       
     126        /**
     127         * Executes an inclusive (AND) search based on the given criteria. Should be filled in by
     128         * subclasses searching for a specific entity
     129         */
     130        public void executeAnd() {
     131               
     132        }
     133       
     134        /**
     135        * Executes an exclusive (OR) search based on the given criteria. Should be filled in by
     136        * subclasses searching for a specific entity
     137        */
     138   public void executeOr() {
     139           
     140   }
    91141
    92142        /**
     
    112162        protected List filterEntityList( List entities, List<Criterion> criteria, Closure check ) {
    113163                if( !entities || !criteria || criteria.size() == 0 ) {
    114                         return entities;
    115                 }
    116 
     164                        if( searchMode == SearchMode.and )
     165                                return entities;
     166                        else if( searchMode == SearchMode.or )
     167                                return []
     168                }
     169               
    117170                return entities.findAll { entity ->
    118                         for( criterion in criteria ) {
    119                                 if( !check( entity, criterion ) ) {
    120                                         return false;
    121                                 }
     171                        if( searchMode == SearchMode.and ) {
     172                                for( criterion in criteria ) {
     173                                        if( !check( entity, criterion ) ) {
     174                                                return false;
     175                                        }
     176                                }
     177                                return true;
     178                        } else if( searchMode == SearchMode.or ) {
     179                                for( criterion in criteria ) {
     180                                        if( check( entity, criterion ) ) {
     181                                                return true;
     182                                        }
     183                                }
     184                                return false;
    122185                        }
    123                         return true;
    124186                }
    125187        }
     
    133195         */
    134196        public static def prepare( def value, TemplateFieldType type ) {
     197                if( value == null )
     198                        return value
     199                       
    135200                switch (type) {
    136201                        case TemplateFieldType.DATE:
     
    185250                }
    186251
    187         }
    188        
     252        }       
    189253       
    190254        /**
     
    201265                        def value = valueCallback( study, criterion );
    202266                       
    203                         if( value == null )
     267                        if( value == null ) {
    204268                                return false
     269                        }
     270
    205271                        if( value instanceof Collection ) {
    206272                                return criterion.matchAny( value )
     
    230296                def ctx = ApplicationHolder.getApplication().getMainContext();
    231297                def moduleCommunicationService = ctx.getBean("moduleCommunicationService");
    232                        
     298               
     299                def allEntities = []
     300                if( searchMode == SearchMode.or ) {
     301                        allEntities += entities;
     302                        entities = [];
     303                }
     304               
    233305                // Loop through all modules and check whether criteria have been given
    234306                // for that module
     
    250322                                        def json = moduleCommunicationService.callModuleRestMethodJSON( module.url, callUrl );
    251323
    252                                         // The data has been retrieved. Now walk through all criteria to filter the samples
    253                                         entities = filterEntityList( entities, moduleCriteria, { entity, criterion ->
     324                                        Closure checkClosure = { entity, criterion ->
    254325                                                // Find the value of the field in this sample. That value is still in the
    255326                                                // JSON object
     
    268339                                                }
    269340                                               
    270                                                 // Loop through all values and match any
    271                                                 for( val in value ) {
    272                                                         // Convert numbers to a long or double in order to process them correctly
     341                                                // Convert numbers to a long or double in order to process them correctly
     342                                                def values = value.collect { val ->
    273343                                                        val = val.toString();
    274344                                                        if( val.isLong() ) {
     
    277347                                                                val = Double.parseDouble( val );
    278348                                                        }
    279                                                        
     349                                                        return val;
     350                                                }
     351
     352                                                // Loop through all values and match any
     353                                                for( val in values ) {
    280354                                                        if( criterion.match( val ) )
    281355                                                                return true;
     
    283357                                               
    284358                                                return false;
    285                                         });
     359                                        }
     360                                       
     361                                        // The data has been retrieved. Now walk through all criteria to filter the samples
     362                                        if( searchMode == SearchMode.and ) {
     363                                                entities = filterEntityList( entities, moduleCriteria, checkClosure );
     364                                        } else if( searchMode == SearchMode.or ) {
     365                                                entities += filterEntityList( allEntities - entities, moduleCriteria, checkClosure );
     366                                                entities = entities.unique();
     367                                        }
    286368                                                                               
    287369                                } catch( Exception e ) {
     
    321403                        resultFields[ id ] = [:]
    322404               
     405                // Handle special cases
     406                if( value == null )
     407                        value = "";
     408               
     409                if( value instanceof Collection ) {
     410                        value = value.findAll { it != null }
     411                }
     412               
    323413                resultFields[ id ][ fieldName ] = value;
    324414        }
Note: See TracChangeset for help on using the changeset viewer.