root/trunk/grails-app/controllers/dbnp/query/SimpleQueryController.groovy @ 755

Revision 755, 8.2 KB (checked in by vinlud, 4 years ago)

Sam module changes including rest interface, merging results, subquery workflow

  • Property svn:keywords set to Date Author Rev
Line 
1/**
2 * SimpleQueryController Controler
3 *
4 * Description of my controller
5 *
6 * @author  vincent@ludden.nl
7 * @since       20100526
8 * @package     dbnp.query
9 *
10 * Revision information:
11 * $Rev$
12 * $Author$
13 * $Date$
14 */
15package dbnp.query
16
17import dbnp.data.*
18import dbnp.studycapturing.Study
19import dbnp.studycapturing.Assay
20import org.compass.core.engine.SearchEngineQueryParseException
21import dbnp.rest.common.CommunicationManager
22
23class SimpleQueryController {
24        /**
25         * index closure
26         */
27    def index = {
28      redirect( action:'pages')
29    }
30
31    def searchableService
32
33    def pagesFlow = {
34
35        // Starting simpleQuery flow, initialize variables
36        onStart {
37            println "Starting webflow simpleQuery"
38            flow.search_term            = null
39            flow.search_sa_compounds    = []
40            flow.search_sa_operators    = []
41            flow.search_sa_values       = []
42            flow.page                   = 0
43                        flow.pages = [
44                [title: 'Query'],
45                                [title: 'Results']
46                        ]
47            }
48
49        // Render the query page and handle its actions
50                query {
51                        render(view: "/simpleQuery/mainPage")
52
53            onRender {
54              println "Rendering mainPage"
55              flow.operators              = ['>', '=', '<']
56
57              if (!flow.search_sa_compounds) {
58                flow.showFirstRowCompounds  = true
59                println "showRow true"
60              } else {
61                flow.showFirstRowCompounds  = false
62                println "showRow false"
63              }
64
65              flow.species = Term.findAll()
66              flow.page = 1
67            }
68
69            on("search") {
70              println "Search!"
71              if (!params.search_term.trim()) {
72                return [:]
73              }
74            }.to "searching"
75
76            on("refresh").to "query"
77                }
78
79
80        // Searching for results
81        searching {
82           action {
83              println "Starting simpleQuery search..."
84              def searchResult
85              def searchGscfResult
86              def searchSamResult   = []
87
88              // TODO: walk parameters, remove empty entries
89
90              // Map GSCF parameters
91              flow.search_term            = params.search_term        // String
92
93              // Map SAM parameters
94              if (params.sa_compound instanceof String) {
95                println "Compounds as String"
96                //flow.search_sam = [:]
97                flow.search_sa_compounds = []
98                flow.search_sa_operators = []
99                flow.search_sa_values    = []
100
101                if (params.sa_compound) {
102                  flow.search_sa_compounds.add(params.sa_compound)
103                  flow.search_sa_operators.add(params.sa_operator)
104                  flow.search_sa_values.add(params.sa_value)
105                }
106              } else {
107                println "Compounds as List"
108                flow.search_sa_compounds  = params.sa_compound as List
109                flow.search_sa_operators  = params.sa_operator as List
110                flow.search_sa_values     = params.sa_value as List
111              }
112
113              // Search the keyword with the Searchable plugin
114              try {
115                searchGscfResult = searchableService.search(flow.search_term)
116                println "RESULT: " + searchGscfResult
117              } catch (SearchEngineQueryParseException ex) {
118                println ex
119                return [parseException: true]
120              }
121
122              // Map non-study objects to Studies
123              // ... todo when the plugin works and I can see the output
124
125              // Search in the SAM module when a compound is entered
126              // Todo: check whether the module is active and to be used
127              // ...
128              def listSamStudies = []
129              def listGscfStudies = []
130              def listStudies = []
131
132              if ((flow.search_sa_compounds) && (flow.search_sa_compounds.size() > 0)) {
133                def resultSAM = [:]
134                resultSAM = this.searchSAM(flow.search_sa_compounds, flow.search_sa_operators, flow.search_sa_values)
135                println "Sam result: " + resultSAM
136                listSamStudies = resultSAM.get('studies')
137              }
138
139             for (i in searchGscfResult.results) {
140               //def x = i.id
141               def objStudy = Study.get(i.id)
142               println objStudy
143               listGscfStudies.add(objStudy.id)
144             }
145
146
147             println "GSCF studies: " + listGscfStudies
148             println "Sam studies " + listSamStudies
149                                         
150             // Merge the results of all searches
151             if (listSamStudies.size() > 0) {
152               listStudies = listGscfStudies.intersect(listSamStudies)
153               println "Combined: " + listStudies
154             } else {
155               listStudies = listGscfStudies
156             }
157
158             def listObjStudies = []
159             for (i in listStudies) {
160               def objStudy = Study.get(i)
161               listObjStudies.add(objStudy)
162             }
163
164             // Save the results in the flow
165             flow.listStudies = listObjStudies
166             println flow.listStudies
167
168           }
169
170          on("error").to "query"
171          on("success").to "results"
172        }
173
174
175        // Render result page including search options
176        results {
177            render(view: "/simpleQuery/mainPage")
178
179            onRender {
180              println "Rendering resultPage"
181              flow.page = 2
182
183              flow.showFirstRowCompounds  = false
184            }
185
186            on("reset") {
187              flow.search_term            = null
188              flow.studies                = null
189              flow.search_sa_compounds    = []
190              flow.search_sa_operators    = []
191              flow.search_sa_values       = []
192              flow.search_tt_genepaths    = null
193              flow.search_tt_regulations  = null
194              println "Resetting query flow"
195            }.to "query"
196
197            on("search").to "searching"
198            on("refresh").to "results"
199        }
200
201    }
202
203 
204   static Map searchSAM (List compounds, List operators, List values) {
205     if (compounds.size() == 1) {
206       println "Single SAM call"
207       def mapSamResult = [:]
208
209       //def listAssays = [3, 1]
210       //mapSamResult.put("assays", listAssays)
211       //println "CommMngr result: " + mapSamResult
212
213       CommunicationManager.addRestWrapper( 'http://localhost:8182/sam/rest', 'getQueryResult', ['query'] )
214       mapSamResult = CommunicationManager.getQueryResult( compounds.get(0) )
215       println "SAM REST query: " + compounds.get(0)
216       println "SAM REST result: " + mapSamResult
217
218       // mapSamResult = CommunicationManager.getQueryResult(compounds.get(0), operators.get(0), values.get(0))
219
220       //objAssay = objAssay.get(i)
221       //println "Assay: " + objAssay
222
223       /*
224       for (i in mapSamResult.assays) {
225         //def listStudies = Study.findAll("from Study as s where s.assays.id = " + i)
226         def listStudies = Study.findAll("from Study as s where exists (from Assay as a where a.id = s.assays and a.id = ${i})")
227         println "Studies found: " + listStudies
228       }
229       */
230
231       def listStudies = []
232
233       for (i in mapSamResult.assays) {
234         def objAssay = Assay.get(i)
235         listStudies.add(objAssay.parent.id)
236       }
237
238       mapSamResult.put("studies", listStudies)
239
240       return mapSamResult
241
242     } else {
243       println "Multiple SAM calls"
244       def tmpSamResult = [:]
245       def mapSamResult = [studies:[], assays:[]]
246       def i = 0
247
248       compounds.each { compound ->
249         println "SAM Search with " + compound
250         tmpSamResult = CommunicationManager.getQueryResult(compound)
251         println tmpSamResult.assays.size() + " results " + compound
252
253         if (i == 0) {
254           mapSamResult.assays = tmpSamResult.assays
255           mapSamResult.studies = tmpSamResult.studies
256         } else {
257           mapSamResult.assays = mapSamResult.assays.intersect(tmpSamResult.assays)
258           mapSamResult.studies = mapSamResult.studies.intersect(tmpSamResult.studies)
259         }
260
261         i++
262       }
263
264       return mapSamResult
265     }
266
267   }
268
269
270
271   static List merge (List list1, List list2) {
272
273     def resultList = []
274     resultList = list1.intersect(list2)
275
276     return resultList
277   }
278
279}
Note: See TracBrowser for help on using the browser.