source: trunk/src/groovy/dbnp/query/Search.groovy @ 1424

Last change on this file since 1424 was 1424, checked in by robert@…, 10 years ago

Improved querying and created a possibility to search for assays

File size: 4.2 KB
Line 
1/**
2 * Search Domain Class
3 *
4 * Abstract class containing search criteria and search results when querying.
5 * Should be subclassed in order to enable searching for different entities.
6 *
7 * @author  Robert Horlings (robert@isdat.nl)
8 * @since       20110118
9 * @package     dbnp.query
10 *
11 * Revision information:
12 * $Rev$
13 * $Author$
14 * $Date$
15 */
16package dbnp.query
17
18import dbnp.studycapturing.RelTime
19import dbnp.studycapturing.TemplateEntity
20import dbnp.studycapturing.TemplateFieldType
21import java.util.List;
22import java.text.DateFormat;
23import java.text.SimpleDateFormat
24
25class Search {
26        public String entity;
27
28        protected List criteria;
29        protected List results;
30
31        public List getCriteria() { return criteria; }
32        public void setCriteria( List c ) { criteria = c; }
33
34        public List getResults() { return results; }
35        public void setResults( List r ) { results = r; }
36
37        /**
38         * Returns the number of results found by this search
39         * @return
40         */
41        public int getNumResults() {
42                if( results )
43                        return results.size();
44
45                return 0;
46        }
47
48        /**
49         * Executes a search based on the given criteria. Should be filled in by
50         * subclasses searching for a specific entity
51         *
52         * @param       c       List with criteria to search on
53         */
54        public void execute( List c ) {
55                setCriteria( c );
56                execute();
57        }
58
59        /**
60         * Executes a search based on the given criteria. Should be filled in by
61         * subclasses searching for a specific entity
62         */
63        public void execute() {}
64
65        /**
66         * Returns a list of criteria targeted on the given entity
67         * @param entity        Entity to search criteria for
68         * @return                      List of criteria
69         */
70        protected List getEntityCriteria( String entity ) {
71                return criteria?.findAll { it.entity == entity }
72        }
73       
74        /**
75         * Filters a list with entities, based on the given criteria and a closure to check whether a criterion is matched
76         *
77         * @param entities      Original list with entities to check for these criteria
78         * @param criteria      List with criteria to match on
79         * @param check         Closure to see whether a specific entity matches a criterion. Gets two arguments:
80         *                                              element         The element to check
81         *                                              criterion       The criterion to check on.
82         *                                      Returns true if the criterion holds, false otherwise
83         * @return                      The filtered list of entities
84         */
85        protected List filterEntityList( List entities, List<Criterion> criteria, Closure check ) {
86                if( !entities || !criteria || criteria.size() == 0 ) {
87                        return entities;
88                }
89
90                return entities.findAll { entity ->
91                        for( criterion in criteria ) {
92                                if( !check( entity, criterion ) ) {
93                                        return false;
94                                }
95                        }
96                        return true;
97                }
98        }
99       
100        /**
101         * Prepares a value from a template entity for comparison, by giving it a correct type
102         *
103         * @param value         Value of the field
104         * @param type          TemplateFieldType       Type of the specific field
105         * @return                      The value of the field in the correct entity
106         */
107        public static def prepare( def value, TemplateFieldType type ) {
108                switch (type) {
109                        case TemplateFieldType.DATE:
110                                try {
111                                        return new SimpleDateFormat( "yyyy-MM-dd" ).parse( value )
112                                } catch( Exception e ) {
113                                        return value.toString();
114                                }
115                        case TemplateFieldType.RELTIME:
116                                try {
117                                        if( value instanceof Number ) {
118                                                return new RelTime( value );
119                                        } else if( value.toString().isNumber() ) {
120                                                return new RelTime( Long.parseLong( value.toString() ) ) 
121                                        } else {
122                                                return new RelTime( value );
123                                        }
124                                } catch( Exception e ) {
125                                        try {
126                                                return Long.parseLong( value )
127                                        } catch( Exception e2 ) {
128                                                return value.toString();
129                                        }
130                                }
131                        case TemplateFieldType.DOUBLE:
132                                try {
133                                        return Double.valueOf( value )
134                                } catch( Exception e ) {
135                                        return value.toString();
136                                }
137                        case TemplateFieldType.BOOLEAN:
138                                try {
139                                        return Boolean.valueOf( value )
140                                } catch( Exception e ) {
141                                        println e.getMessage();
142                                        return value.toString();
143                                }
144                        case TemplateFieldType.LONG:
145                                try {
146                                        return Long.valueOf( value )
147                                } catch( Exception e ) {
148                                        return value.toString();
149                                }
150                        case TemplateFieldType.STRING:
151                        case TemplateFieldType.TEXT:
152                        case TemplateFieldType.STRINGLIST:
153                        case TemplateFieldType.TEMPLATE:
154                        case TemplateFieldType.MODULE:
155                        case TemplateFieldType.FILE:
156                        case TemplateFieldType.ONTOLOGYTERM:
157                        default:
158                                return value.toString();
159                }
160
161        }
162}
Note: See TracBrowser for help on using the repository browser.