source: trunk/grails-app/services/nl/tno/metagenomics/integration/TrashService.groovy @ 9

Last change on this file since 9 was 9, checked in by robert@…, 8 years ago
File size: 10.9 KB
Line 
1package nl.tno.metagenomics.integration
2
3import nl.tno.metagenomics.*
4
5class TrashService {
6
7        static transactional = true
8
9        /**
10         * Moves the valuable data from a study to trash and deletes the study
11         * @param               Study to move to trash
12         */
13        def moveToTrash( Study study ) {
14                log.trace "Moving study " + study + " to trash";
15                if( study.trashcan )
16                        return
17
18                saveDataInTrash( study );
19               
20                def l = []
21                if( study.auth ) {
22                        l += study.auth
23                       
24                        l.each { auth ->
25                                auth.user?.removeFromAuth( auth );
26                                study.removeFromAuth( auth );
27                        }
28                }
29               
30                study.delete(flush:true);
31        }
32
33        /**
34         * Moves the valuable data from an assay to trash and deletes the assay
35         * @param               Assay to move to trash
36         */
37        def moveToTrash( Assay assay ) {
38                saveDataInTrash( assay );
39
40                // Remove associations
41                def l = []
42                if( assay.runs ) {
43                        l += assay.runs
44                       
45                        l.each {
46                                if( it ) {
47                                        assay.removeFromRuns( it );
48                                        it.removeFromAssays( assay );
49                                }
50                        }
51                }
52               
53                l = []
54                if( assay.assaySamples ) {
55                        l += assay.assaySamples
56                       
57                        l.each {
58                                it.sample.removeFromAssaySamples( it );
59                                assay.removeFromAssaySamples( it );
60                        }
61                }
62
63                def study = assay.study
64                if( study ) {
65                        study.removeFromAssays( assay );
66                }
67        }
68
69        /**
70         * Moves the valuable data from a sample to trash and deletes the sample
71         * @param               Sample to move to trash
72         */
73        def moveToTrash( Sample sample ) {
74                saveDataInTrash( sample );
75
76                // Remove associations
77                def l = []
78                if( sample.assaySamples ) {
79                        l += sample.assaySamples
80                       
81                        l.each {
82                                it.assay.removeFromAssaySamples( it );
83                                sample.removeFromAssaySamples( it );
84                        }
85                }
86               
87                def study = sample.study
88                sample.study.removeFromSamples( sample );
89                study.save();
90        }
91
92        /**
93        * Moves the valuable data from an assaySample to trash and deletes the assay
94        * @param                Assay to move to trash
95        */
96   def moveToTrash( AssaySample assaySample ) {
97           saveDataInTrash( assaySample );
98
99           // Remove associations
100           if( assaySample.run ) {
101                   assaySample.run.removeFromAssaySamples( assaySample );
102           }
103           
104           if( assaySample.assay ) {
105                   assaySample.assay.removeFromAssaySamples( assaySample );
106           }
107
108           if( assaySample.sample ) {
109                   assaySample.sample.removeFromAssaySamples( assaySample );
110           }
111           
112           def l = []
113           if( assaySample.sequenceData ) {
114                   l += assaySample.sequenceData
115                   
116                   l.each {
117                           if( it ) {
118                                        assaySample.removeFromSequenceData( it );
119                           }
120                   }
121           }
122           
123   }
124       
125        /**
126         * Saves data from the study in the trash can (if any data exists)
127         * @param study         Study to save data from
128         * @return
129         */
130        def saveDataInTrash( Study study ) {
131                Study trashcan = this.giveTrashcan()
132
133                if( !trashcan ) {
134                        log.warn "No trashcan (study with trashcan property set to true) found in the database when deleting study " + study.name + ". Possibly valuable data is deleted forever."
135                        return;
136                }
137
138                // Loop through all assays, and see if there are assay samples
139                // that have data
140                study.assays.each { assay ->
141                        saveDataInTrash( assay );
142                }
143        }
144
145        /**
146         * Saves data from the assay in the trash can (if any data exists)
147         * @param study         Assay to save data from
148         * @return
149         */
150        def saveDataInTrash( Assay assay ) {
151                Study trashcan = this.giveTrashcan()
152
153                if( !trashcan ) {
154                        log.warn "No trashcan (study with trashcan property set to true) found in the database when deleting assay " + assay.name + ". Possibly valuable data is deleted forever."
155                        return;
156                }
157
158                def assaySamples = assay.assaySamples.findAll { it.containsData() }
159
160                // For every assay sample that contains data, save that data in the trashcan
161                if( assaySamples.size() > 0 ) {
162                        // Create a dummy assay copy of the existing assay
163                        String newAssayToken = 'TrashAssay ' + new Date().format( 'yyyyMMddHHmmssSSS') + ( Math.random() * 10000 );
164
165                        Assay dummyAssay = new Assay( assayToken: newAssayToken, name: assay.name, study: trashcan );
166                        trashcan.addToAssays( dummyAssay );
167                        dummyAssay.save()
168
169                        assaySamples.each { assaySample ->
170                                Sample sample = assaySample.sample
171
172                                // Create dummy sample
173                                String newSampleToken = 'TrashSample ' + new Date().format( 'yyyyMMddHHmmssSSS') + ( Math.random() * 10000 );
174                                Sample dummySample = Sample.cloneSample( sample, newSampleToken, trashcan );
175                                trashcan.addToSamples( dummySample );
176                                dummySample.save()
177
178                                // Create dummy assay sample
179                                AssaySample dummyAssaySample = new AssaySample( assay: dummyAssay, sample: dummySample );
180
181                                dummyAssay.addToAssaySamples( dummyAssaySample );
182                                dummySample.addToAssaySamples( dummyAssaySample );
183                                dummyAssaySample.save();
184
185                                // Move data from this assay sample to the trash version of it
186                                assaySample.moveValuableDataTo( dummyAssaySample );
187                                dummyAssaySample.save();
188                        }
189                }
190        }
191
192        /**
193         * Saves data from the sample in the trash can (if any data exists)
194         * @param study         Sample to save data from
195         * @return
196         */
197        def saveDataInTrash( Sample sample ) {
198                Study trashcan = this.giveTrashcan()
199
200                if( !trashcan ) {
201                        log.warn "No trashcan (study with trashcan property set to true) found in the database when deleting sample " + sample.name + ". Possibly valuable data is deleted forever."
202                        return;
203                }
204
205                def assaySamples = sample.assaySamples.findAll { it.containsData() }
206
207                // For every assay sample that contains data, save that data in the trashcan
208                if( assaySamples.size() > 0 ) {
209                        // Create dummy sample
210                        String newSampleToken = 'TrashSample ' + new Date().format( 'yyyyMMddHHmmssSSS') + ( Math.random() * 10000 );
211                        Sample dummySample = Sample.cloneSample( sample, newSampleToken, trashcan );
212                        trashcan.addToSamples( dummySample );
213                        dummySample.save()
214
215                        assaySamples.each { assaySample ->
216                                Assay assay = assaySample.assay;
217
218                                // Create a dummy assay copy of the existing assay
219                                String newAssayToken = 'TrashAssay ' + new Date().format( 'yyyyMMddHHmmssSSS') + ( Math.random() * 10000 );
220
221                                Assay dummyAssay = new Assay( assayToken: newAssayToken, name: assay.name, study: trashcan );
222                                trashcan.addToAssays( dummyAssay );
223                                dummyAssay.save()
224
225                                // Create dummy assay sample
226                                AssaySample dummyAssaySample = new AssaySample( assay: dummyAssay, sample: dummySample );
227
228                                dummyAssay.addToAssaySamples( dummyAssaySample );
229                                dummySample.addToAssaySamples( dummyAssaySample );
230                                dummyAssaySample.save();
231
232                                // Move data from this assay sample to the trash version of it
233                                assaySample.moveValuableDataTo( dummyAssaySample );
234                                dummyAssaySample.save();
235                        }
236                }
237        }
238
239       
240        /**
241        * Saves data from the assay-sample in the trash can (if any data exists)
242        * @param study          Sample to save data from
243        * @return
244        */
245   def saveDataInTrash( AssaySample assaySample ) {
246           Study trashcan = this.giveTrashcan()
247
248           if( !trashcan ) {
249                   log.warn "No trashcan (study with trashcan property set to true) found in the database when deleting sample " + sample.name + ". Possibly valuable data is deleted forever."
250                   return;
251           }
252
253           // For every assay sample that contains data, save that data in the trashcan
254           if( assaySample.containsData() ) {
255                   // Create dummy sample
256                   String newSampleToken = 'TrashSample ' + new Date().format( 'yyyyMMddHHmmssSSS') + ( Math.random() * 10000 );
257                   Sample dummySample = Sample.cloneSample( assaySample.sample, newSampleToken, trashcan );
258                   trashcan.addToSamples( dummySample );
259                   dummySample.save()
260
261                   Assay assay = assaySample.assay;
262
263                   // Create a dummy assay copy of the existing assay
264                   String newAssayToken = 'TrashAssay ' + new Date().format( 'yyyyMMddHHmmssSSS') + ( Math.random() * 10000 );
265
266                   Assay dummyAssay = new Assay( assayToken: newAssayToken, name: assay.name, study: trashcan );
267                   trashcan.addToAssays( dummyAssay );
268                   dummyAssay.save()
269
270                   // Create dummy assay sample
271                   AssaySample dummyAssaySample = new AssaySample( assay: dummyAssay, sample: dummySample );
272
273                   dummyAssay.addToAssaySamples( dummyAssaySample );
274                   dummySample.addToAssaySamples( dummyAssaySample );
275                   dummyAssaySample.save();
276
277                   // Move data from this assay sample to the trash version of it
278                   assaySample.moveValuableDataTo( dummyAssaySample );
279                   dummyAssaySample.save();
280           }
281   }
282
283        /**
284         * Retrieves the trashcan study from the database
285         */
286        def giveTrashcan = {
287                def study = Study.findByTrashcan( true );
288
289                if( !study )
290                        return null;
291                else
292                        return study
293        }
294       
295        /**
296         * Creates a new trashcan study. Should only be used by the bootstrap to create a trashcan
297         */
298        def createTrashcan = {
299                def study = new Study( name: "Trashcan", studyToken: "trash", trashcan: true )
300                study.save();
301        }
302
303        /**
304         * Cleans up the trash by removing empty assays or samples. Empty means:
305         *      - an assay with samples
306         *  - a sample without sequences, tag sequence and oligo number
307         * 
308         *  Also removes samples in trash that are not referenced by an assaysample
309         */
310        def cleanTrash = {
311                def studies = Study.findAllByTrashcan( true );
312
313                studies.each { study ->
314                        def numAssays = study.assays?.size()
315                        def assayList = study.assays?.toList();
316
317                        def numSamples
318                        def sampleList
319
320                        // Loop backwards through the assays in order to facilitate removing assays
321                        for( def i = numAssays -1; i >= 0; i-- ) {
322                                // Loop through all samples and remove the ones that are empty
323                                if( assayList[ i ].assaySamples != null ) {
324                                        numSamples = assayList[ i ].assaySamples.size()
325                                        sampleList = assayList[ i ].assaySamples.toList();
326
327                                        for( def j = numSamples - 1; j >= 0; j-- ) {
328                                                def s = sampleList[ j ];
329                                                if( !s.containsData() ) {
330                                                        assayList[ i ].removeFromAssaySamples( s );
331                                                        s.sample?.delete();
332                                                        s.delete();
333                                                }
334                                        }
335                                }
336
337                                // Now check if there are samples left. Otherwise, remove the assay
338                                if( assayList[i].assaySamples == null || assayList[i].assaySamples.size() == 0 ) {
339                                        study.removeFromAssays( assayList[ i ] );
340                                        assayList[i].delete();
341                                }
342                        }
343
344                        // Loop through samples and delete the ones not referenced by an assaysample
345                        /*
346                         numSamples = study.samples?.size()
347                         sampleList = study.samples?.toList();
348                         for( def j = numSamples - 1; j >= 0; j-- ) {
349                         def s = sampleList[ j ];
350                         if( s.assaySamples == null || s.assaySamples.size() == 0 ) {
351                         study.removeFromSamples(s);
352                         s.delete(flush:true);
353                         }
354                         }
355                         */
356                }
357        }
358
359        /**
360         * Restore an assay from trash and put the contents of the assay in another assay
361         * @param assay
362         * @param restoreTo
363         */
364        public void restoreAssay( Assay assay, Assay restoreTo ) {
365                // Loop through all assaysamples and restore the ones that have a matching name
366                assay.assaySamples.each { assaySample ->
367                        if( assaySample ) {
368                                // Find a sample with the same name
369                                def restoreSample = restoreTo.assaySamples.find { it.sample?.name == assaySample.sample?.name }
370
371                                if( restoreSample ) {
372                                        this.restoreSample( assaySample, restoreSample );
373                                }
374                        }
375                }
376        }
377
378        /**
379         * Restore a sample from trash and put the contents of the sample into another sample
380         * @param sample
381         * @param restoreTo
382         */
383        public void restoreSample( AssaySample sample, AssaySample restoreTo ) {
384                sample.moveValuableDataTo( restoreTo );
385                restoreTo.save();
386        }
387}
Note: See TracBrowser for help on using the repository browser.