Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/EnsEMBL/DBSQL/AnalysisAdaptor.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1f6dce3d34e0 |
---|---|
1 =head1 LICENSE | |
2 | |
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and | |
4 Genome Research Limited. All rights reserved. | |
5 | |
6 This software is distributed under a modified Apache license. | |
7 For license details, please see | |
8 | |
9 http://www.ensembl.org/info/about/code_licence.html | |
10 | |
11 =head1 CONTACT | |
12 | |
13 Please email comments or questions to the public Ensembl | |
14 developers list at <dev@ensembl.org>. | |
15 | |
16 Questions may also be sent to the Ensembl help desk at | |
17 <helpdesk@ensembl.org>. | |
18 | |
19 =cut | |
20 | |
21 =head1 NAME | |
22 | |
23 Bio::EnsEMBL::DBSQL::AnalysisAdaptor | |
24 | |
25 =head1 SYNOPSIS | |
26 | |
27 use Bio::EnsEMBL::Registry; | |
28 | |
29 Bio::EnsEMBL::Registry->load_registry_from_db( | |
30 -host => 'ensembldb.ensembl.org', | |
31 -user => 'anonymous' | |
32 ); | |
33 | |
34 $analysis_adaptor = | |
35 Bio::EnsEMBL::Registry->get_adaptor( "human", "core", "analysis" ); | |
36 | |
37 my $analysis = $analysis_adaptor->fetch_by_logic_name('genscan'); | |
38 | |
39 =head1 DESCRIPTION | |
40 | |
41 Module to encapsulate all db access for persistent class Analysis. | |
42 There should be just one per application and database connection. | |
43 | |
44 =head1 METHODS | |
45 | |
46 =cut | |
47 | |
48 | |
49 package Bio::EnsEMBL::DBSQL::AnalysisAdaptor; | |
50 | |
51 use Bio::EnsEMBL::Analysis; | |
52 use Bio::EnsEMBL::DBSQL::BaseAdaptor; | |
53 use Bio::EnsEMBL::Utils::Exception; | |
54 | |
55 | |
56 use vars qw(@ISA); | |
57 use strict; | |
58 | |
59 @ISA = qw( Bio::EnsEMBL::DBSQL::BaseAdaptor); | |
60 | |
61 | |
62 =head2 new | |
63 | |
64 Args : Bio::EnsEMBL::DBSQL::DBAdaptor | |
65 Example : my $aa = new Bio::EnsEMBL::DBSQL::AnalysisAdaptor(); | |
66 Description: Creates a new Bio::EnsEMBL::DBSQL::AnalysisAdaptor object and | |
67 internally loads and caches all the Analysis objects from the | |
68 database. | |
69 Returntype : Bio::EnsEMBL::DBSQL::AnalysisAdaptor | |
70 Exceptions : none | |
71 Caller : Bio::EnsEMBL::DBSQL::DBAdaptor | |
72 Status : Stable | |
73 | |
74 =cut | |
75 | |
76 sub new { | |
77 my ($class, $db) = @_; | |
78 | |
79 my $self = $class->SUPER::new($db); | |
80 | |
81 #load and cache all of the Analysis objects | |
82 $self->fetch_all; | |
83 | |
84 return $self; | |
85 } | |
86 | |
87 | |
88 =head2 fetch_all | |
89 | |
90 Args : none | |
91 Example : my @analysis = @{$analysis_adaptor->fetch_all()}; | |
92 Description: fetches all of the Analysis objects from the database and caches | |
93 them internally. | |
94 Returntype : listref of Bio::EnsEMBL::Analysis retrieved from the database | |
95 Exceptions : none | |
96 Caller : AnalysisAdaptor::new | |
97 Status : Stable | |
98 | |
99 =cut | |
100 | |
101 sub fetch_all { | |
102 my $self = shift; | |
103 my ( $analysis, $dbID ); | |
104 my $rowHashRef; | |
105 | |
106 $self->{_cache} = {}; | |
107 $self->{_logic_name_cache} = {}; | |
108 | |
109 my $sth = $self->prepare( q { | |
110 SELECT analysis.analysis_id, logic_name, | |
111 program, program_version, program_file, | |
112 db, db_version, db_file, | |
113 module, module_version, | |
114 gff_source, gff_feature, | |
115 created, parameters, description, display_label, displayable, web_data | |
116 FROM analysis | |
117 LEFT JOIN analysis_description | |
118 ON analysis.analysis_id = analysis_description.analysis_id } ); | |
119 $sth->execute; | |
120 | |
121 while( $rowHashRef = $sth->fetchrow_hashref ) { | |
122 my $analysis = $self->_objFromHashref( $rowHashRef ); | |
123 | |
124 $self->{_cache}->{$analysis->dbID} = $analysis; | |
125 $self->{_logic_name_cache}->{lc($analysis->logic_name())} = $analysis; | |
126 } | |
127 | |
128 my @ana = values %{$self->{_cache}}; | |
129 | |
130 return \@ana; | |
131 } | |
132 | |
133 | |
134 =head2 fetch_all_by_feature_class | |
135 | |
136 Arg [1] : string $feature_cless - The name of the feature class | |
137 Example : my @analyses = @{$analysis_adaptor->fetch_all_by_feature_class('Gene'); | |
138 Description: Returns all analyses that correspond to a given | |
139 feature class; see feature_classes method for a list. | |
140 Returntype : Listref of Bio::EnsEMBL::Analysis | |
141 Exceptions : none | |
142 Caller : general | |
143 Status : Stable | |
144 | |
145 =cut | |
146 | |
147 sub fetch_all_by_feature_class { | |
148 my $self = shift; | |
149 deprecate("Deprecated. Hard-coded logic is not supported"); | |
150 my $feat_class = shift || throw( "Need a feature type, e.g. SimpleFeature" ); | |
151 | |
152 my @feature_classes = $self->feature_classes; # List of all feature classes | |
153 my %feat_table_map; | |
154 foreach my $class( @feature_classes ){ | |
155 # Map e.g. DnaAlignFeature to dna_align_feature | |
156 my $table = join( "_", map lc, ( $class =~ /([A-Z][a-z]+)/g ) ); | |
157 $feat_table_map{$class} = $table; | |
158 } | |
159 $feat_table_map{DensityFeature}='density_type'; # analysis_id in diff table | |
160 my $feat_table = $feat_table_map{$feat_class} || | |
161 ( warning( "No feature type corresponding to $feat_class" ) && | |
162 return [] ); | |
163 | |
164 my $sql_t = qq| | |
165 SELECT DISTINCT analysis_id FROM %s |; | |
166 | |
167 my $sql = sprintf( $sql_t, $feat_table ); | |
168 my $sth = $self->prepare( $sql ); | |
169 my $rv = $sth->execute(); | |
170 my $res = $sth->fetchall_arrayref; | |
171 my @analyses; | |
172 foreach my $r( @{$res} ){ | |
173 my $analysis = $self->fetch_by_dbID($r->[0]) | |
174 || throw( "analysis_id $r->[0] from $feat_table table " | |
175 . "is not in the analysis table!" ); | |
176 push @analyses, $analysis; | |
177 } | |
178 return [@analyses]; | |
179 } | |
180 | |
181 | |
182 =head2 feature_classes | |
183 | |
184 Arg [1] : NONE | |
185 Example : my @fclasses = $analysis_adaptor->feature_classes; | |
186 Description: Returns a list of the different classes of Ensembl feature | |
187 object that have an analysis | |
188 Returntype : List of feature classes | |
189 Exceptions : none | |
190 Caller : general | |
191 Status : Stable | |
192 | |
193 =cut | |
194 | |
195 sub feature_classes{ | |
196 deprecate("Deprecated. Hard-coded logic is not supported"); | |
197 # Can't think of a way to do this programatically, so hard-coded | |
198 return qw( | |
199 DensityFeature | |
200 DnaAlignFeature | |
201 Gene | |
202 MarkerFeature | |
203 PredictionTranscript | |
204 ProteinAlignFeature | |
205 ProteinFeature | |
206 QtlFeature | |
207 RepeatFeature | |
208 SimpleFeature | |
209 ); | |
210 } | |
211 | |
212 =head2 fetch_by_dbID | |
213 | |
214 Arg [1] : int $internal_analysis_id - the database id of the analysis | |
215 record to retrieve | |
216 Example : my $analysis = $analysis_adaptor->fetch_by_dbID(1); | |
217 Description: Retrieves an Analysis object from the database via its internal | |
218 id. | |
219 Returntype : Bio::EnsEMBL::Analysis | |
220 Exceptions : none | |
221 Caller : general | |
222 Status : Stable | |
223 | |
224 =cut | |
225 | |
226 sub fetch_by_dbID { | |
227 my $self = shift; | |
228 my $id = shift; | |
229 | |
230 if( defined $self->{_cache}->{$id} ) { | |
231 return $self->{_cache}->{$id}; | |
232 } | |
233 | |
234 my $query = q{ | |
235 SELECT analysis.analysis_id, logic_name, | |
236 program, program_version, program_file, | |
237 db, db_version, db_file, | |
238 module, module_version, | |
239 gff_source, gff_feature, | |
240 created, parameters, description, display_label, displayable, web_data | |
241 FROM analysis | |
242 LEFT JOIN analysis_description | |
243 ON analysis.analysis_id = analysis_description.analysis_id | |
244 WHERE analysis.analysis_id = ? }; | |
245 | |
246 my $sth = $self->prepare($query); | |
247 $sth->bind_param(1,$id,SQL_INTEGER); | |
248 $sth->execute(); | |
249 my $rowHashRef = $sth->fetchrow_hashref; | |
250 if( ! defined $rowHashRef ) { | |
251 return undef; | |
252 } | |
253 | |
254 my $anal = $self->_objFromHashref( $rowHashRef ); | |
255 $self->{_cache}->{$anal->dbID} = $anal; | |
256 $self->{_logic_name_cache}->{lc($anal->logic_name())} = $anal; | |
257 return $anal; | |
258 } | |
259 | |
260 | |
261 =head2 fetch_by_logic_name | |
262 | |
263 Arg [1] : string $logic_name the logic name of the analysis to retrieve | |
264 Example : my $analysis = $a_adaptor->fetch_by_logic_name('Eponine'); | |
265 Description: Retrieves an analysis object from the database using its unique | |
266 logic name. | |
267 Returntype : Bio::EnsEMBL::Analysis | |
268 Exceptions : none | |
269 Caller : general | |
270 Status : Stable | |
271 | |
272 =cut | |
273 | |
274 sub fetch_by_logic_name { | |
275 my ( $self, $logic_name ) = @_; | |
276 | |
277 my $analysis; | |
278 my $rowHash; | |
279 | |
280 # Check the cache for the logic name | |
281 if ( defined( $self->{_logic_name_cache}{ lc($logic_name) } ) ) { | |
282 return $self->{_logic_name_cache}{ lc($logic_name) }; | |
283 } | |
284 | |
285 my $sth = $self->prepare( | |
286 qq( | |
287 SELECT analysis.analysis_id, | |
288 logic_name, | |
289 program, | |
290 program_version, | |
291 program_file, | |
292 db, | |
293 db_version, | |
294 db_file, | |
295 module, | |
296 module_version, | |
297 gff_source, | |
298 gff_feature, | |
299 created, | |
300 parameters, | |
301 description, | |
302 display_label, | |
303 displayable, | |
304 web_data | |
305 FROM analysis | |
306 LEFT JOIN analysis_description | |
307 ON ( analysis.analysis_id = analysis_description.analysis_id ) | |
308 WHERE LOWER(logic_name) = ?) | |
309 ); | |
310 | |
311 $sth->bind_param( 1, lc($logic_name), SQL_VARCHAR ); | |
312 $sth->execute(); | |
313 my $rowHashRef = $sth->fetchrow_hashref(); | |
314 | |
315 if ( !defined($rowHashRef) ) { return undef } | |
316 | |
317 $analysis = $self->_objFromHashref($rowHashRef); | |
318 | |
319 # place the analysis in the caches, cross referenced by dbID and | |
320 # logic_name | |
321 $self->{_cache}->{ $analysis->dbID() } = $analysis; | |
322 $self->{_logic_name_cache}->{ lc($logic_name) } = $analysis; | |
323 | |
324 return $analysis; | |
325 } ## end sub fetch_by_logic_name | |
326 | |
327 | |
328 =head2 store | |
329 | |
330 Arg [1] : Bio:EnsEMBL::Analysis $analysis | |
331 Example : $analysis_adaptor->store($analysis); | |
332 Description: Stores $analysis in db. If the analysis is already stored in | |
333 the database its dbID and adaptor are updated, but the analysis | |
334 is not stored a second time. | |
335 Sets created date if not already set. Sets dbID and adaptor | |
336 inside $analysis. Returns dbID. | |
337 Returntype : int - dbID of stored analysis | |
338 Exceptions : throw on incorrect argument | |
339 throw if analysis argument does not have a logic name | |
340 Caller : general | |
341 Status : Stable | |
342 | |
343 =cut | |
344 | |
345 sub store { | |
346 my $self = shift; | |
347 my $analysis = shift; | |
348 | |
349 if(!ref($analysis) || !$analysis->isa('Bio::EnsEMBL::Analysis')) { | |
350 throw("Bio::EnsEMBL::Analysis argument expected."); | |
351 } | |
352 | |
353 if($analysis->is_stored($self->db())) { | |
354 return $analysis->dbID(); | |
355 } | |
356 | |
357 if(!$analysis->logic_name()) { | |
358 throw("Analysis cannot be stored without a valid logic_name"); | |
359 } | |
360 | |
361 my $insertion_method = (lc($self->dbc->driver) eq 'sqlite') ? 'INSERT OR IGNORE' : 'INSERT IGNORE'; | |
362 | |
363 my $rows_inserted = 0; | |
364 my $sth; | |
365 | |
366 if ( $analysis->created() ) { | |
367 | |
368 # We use insert IGNORE so that this method can be used in a | |
369 # multi-process environment. If another process has already written | |
370 # this record then there will not be a problem. | |
371 | |
372 $sth = $self->prepare( | |
373 qq{ | |
374 $insertion_method INTO analysis | |
375 (created, logic_name, db, db_version, db_file, program, program_version, program_file, parameters, module, module_version, gff_source, gff_feature) | |
376 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) | |
377 } | |
378 ); | |
379 $sth->bind_param( 1, $analysis->created(), SQL_DATETIME ); | |
380 $sth->bind_param( 2, lc( $analysis->logic_name() ), SQL_VARCHAR ); | |
381 $sth->bind_param( 3, $analysis->db(), SQL_VARCHAR ); | |
382 $sth->bind_param( 4, $analysis->db_version(), SQL_VARCHAR ); | |
383 $sth->bind_param( 5, $analysis->db_file(), SQL_VARCHAR ); | |
384 $sth->bind_param( 6, $analysis->program(), SQL_VARCHAR ); | |
385 $sth->bind_param( 7, $analysis->program_version(), SQL_VARCHAR ); | |
386 $sth->bind_param( 8, $analysis->program_file(), SQL_VARCHAR ); | |
387 $sth->bind_param( 9, $analysis->parameters(), SQL_VARCHAR ); | |
388 $sth->bind_param( 10, $analysis->module(), SQL_VARCHAR ); | |
389 $sth->bind_param( 11, $analysis->module_version(), SQL_VARCHAR ); | |
390 $sth->bind_param( 12, $analysis->gff_source(), SQL_VARCHAR ); | |
391 $sth->bind_param( 13, $analysis->gff_feature(), SQL_VARCHAR ); | |
392 | |
393 $rows_inserted = $sth->execute(); | |
394 | |
395 } else { | |
396 $sth = $self->prepare( | |
397 qq{ | |
398 $insertion_method INTO analysis | |
399 (created, logic_name, db, db_version, db_file, program, program_version, program_file, parameters, module, module_version, gff_source, gff_feature) | |
400 VALUES (CURRENT_TIMESTAMP, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) | |
401 } | |
402 ); | |
403 | |
404 $sth->bind_param( 1, $analysis->logic_name, SQL_VARCHAR ); | |
405 $sth->bind_param( 2, $analysis->db, SQL_VARCHAR ); | |
406 $sth->bind_param( 3, $analysis->db_version, SQL_VARCHAR ); | |
407 $sth->bind_param( 4, $analysis->db_file, SQL_VARCHAR ); | |
408 $sth->bind_param( 5, $analysis->program, SQL_VARCHAR ); | |
409 $sth->bind_param( 6, $analysis->program_version, SQL_VARCHAR ); | |
410 $sth->bind_param( 7, $analysis->program_file, SQL_VARCHAR ); | |
411 $sth->bind_param( 8, $analysis->parameters, SQL_VARCHAR ); | |
412 $sth->bind_param( 9, $analysis->module, SQL_VARCHAR ); | |
413 $sth->bind_param( 10, $analysis->module_version, SQL_VARCHAR ); | |
414 $sth->bind_param( 11, $analysis->gff_source, SQL_VARCHAR ); | |
415 $sth->bind_param( 12, $analysis->gff_feature, SQL_VARCHAR ); | |
416 | |
417 $rows_inserted = $sth->execute(); | |
418 | |
419 } ## end else [ if ( $analysis->created...)] | |
420 | |
421 my $dbID; | |
422 # If we need to fetch the timestamp, or the insert failed due to | |
423 # existance of an existing entry, we need to retrieve the entry from | |
424 # the database. Note: $sth->execute() may return 0E0 on error which | |
425 # is zero, but true which is why the $rows_inserted clause was added. | |
426 if ( !$analysis->created() || !$rows_inserted || $rows_inserted == 0 ) | |
427 { | |
428 my $new_analysis = | |
429 $self->fetch_by_logic_name( $analysis->logic_name ); | |
430 | |
431 if ( !$new_analysis ) { | |
432 throw("Could not retrieve just stored analysis from database.\n" | |
433 . "Possibly incorrect db permissions or missing analysis table\n" | |
434 ); | |
435 } | |
436 | |
437 $dbID = $new_analysis->dbID(); | |
438 $analysis->created( $new_analysis->created() ); | |
439 } | |
440 | |
441 $dbID ||= $sth->{'mysql_insertid'}; | |
442 $sth->finish(); | |
443 | |
444 # store description and display_label | |
445 if( defined( $analysis->description() ) || defined( $analysis->display_label() )|| defined( $analysis->web_data() )) { | |
446 $sth = $self->prepare( "INSERT IGNORE INTO analysis_description (analysis_id, display_label, description, displayable, web_data) VALUES (?,?,?,?, ?)"); | |
447 | |
448 $sth->bind_param(1,$dbID,SQL_INTEGER); | |
449 $sth->bind_param(2,$analysis->display_label(),SQL_VARCHAR); | |
450 $sth->bind_param(3,$analysis->description,SQL_LONGVARCHAR); | |
451 $sth->bind_param(4,$analysis->displayable,SQL_TINYINT); | |
452 #$sth->bind_param(5,$analysis->web_data(),SQL_LONGVARCHAR); | |
453 my $web_data; | |
454 $web_data = $self->dump_data($analysis->web_data()) if ($analysis->web_data()); | |
455 $sth->bind_param(5,$web_data,SQL_LONGVARCHAR); | |
456 $sth->execute(); | |
457 | |
458 $sth->finish(); | |
459 } | |
460 | |
461 | |
462 | |
463 $self->{_cache}->{$dbID} = $analysis; | |
464 $self->{_logic_name_cache}{lc($analysis->logic_name)} = $analysis; | |
465 | |
466 $analysis->adaptor( $self ); | |
467 $analysis->dbID( $dbID ); | |
468 | |
469 return $dbID; | |
470 } | |
471 | |
472 | |
473 | |
474 =head2 update | |
475 | |
476 Arg [1] : Bio::EnsEMBL::Analysis $anal | |
477 Example : $adaptor->update($anal) | |
478 Description: Updates this analysis in the database | |
479 Returntype : int 1 if update is performed, undef if it is not | |
480 Exceptions : throw if arg is not an analysis object | |
481 Caller : ? | |
482 Status : Stable | |
483 | |
484 =cut | |
485 | |
486 sub update { | |
487 my $self = shift; | |
488 my $a = shift; | |
489 | |
490 if (!ref($a) || !$a->isa('Bio::EnsEMBL::Analysis')) { | |
491 throw("Expected Bio::EnsEMBL::Analysis argument."); | |
492 } | |
493 | |
494 if(!$a->is_stored($self->db())) { | |
495 return undef; | |
496 } | |
497 | |
498 my $sth = $self->prepare | |
499 ("UPDATE analysis " . | |
500 "SET created = ?, logic_name = ?, db = ?, db_version = ?, db_file = ?, ". | |
501 " program = ?, program_version = ?, program_file = ?, ". | |
502 " parameters = ?, module = ?, module_version = ?, ". | |
503 " gff_source = ?, gff_feature = ? " . | |
504 "WHERE analysis_id = ?"); | |
505 | |
506 | |
507 | |
508 $sth->bind_param(1,$a->created,SQL_DATETIME); | |
509 $sth->bind_param(2,$a->logic_name,SQL_VARCHAR); | |
510 $sth->bind_param(3,$a->db,SQL_VARCHAR); | |
511 $sth->bind_param(4,$a->db_version,SQL_VARCHAR); | |
512 $sth->bind_param(5,$a->db_file,SQL_VARCHAR); | |
513 $sth->bind_param(6,$a->program,SQL_VARCHAR); | |
514 $sth->bind_param(7,$a->program_version,SQL_VARCHAR); | |
515 $sth->bind_param(8,$a->program_file,SQL_VARCHAR); | |
516 $sth->bind_param(9,$a->parameters,SQL_VARCHAR); | |
517 $sth->bind_param(10,$a->module,SQL_VARCHAR); | |
518 $sth->bind_param(11,$a->module_version,SQL_VARCHAR); | |
519 $sth->bind_param(12,$a->gff_source,SQL_VARCHAR); | |
520 $sth->bind_param(13,$a->gff_feature,SQL_VARCHAR); | |
521 $sth->bind_param(14,$a->dbID,SQL_INTEGER); | |
522 | |
523 $sth->execute(); | |
524 | |
525 $sth->finish(); | |
526 | |
527 # also update description & display label - may need to create these if | |
528 # not already there | |
529 $sth = $self->prepare("SELECT description FROM analysis_description WHERE analysis_id= ?"); | |
530 $sth->execute($a->dbID); | |
531 my $web_data; #this is an anonymous reference to a hash, will have to be dumped into string before writing to db | |
532 if ($sth->fetchrow_hashref) { # update if exists | |
533 $web_data = $self->dump_data($a->web_data()) if ($a->web_data()); | |
534 $sth = $self->prepare | |
535 ("UPDATE analysis_description SET description = ?, display_label = ?, displayable = ?, web_data = ? WHERE analysis_id = ?"); | |
536 $sth->bind_param(1,$a->description,SQL_LONGVARCHAR); | |
537 $sth->bind_param(2,$a->display_label(),SQL_VARCHAR); | |
538 $sth->bind_param(3,$a->displayable,SQL_TINYINT); | |
539 # print "after $web_data\n"; | |
540 $sth->bind_param(4,$web_data,SQL_LONGVARCHAR); | |
541 $sth->bind_param(5,$a->dbID,SQL_INTEGER); | |
542 $sth->execute(); | |
543 | |
544 } else { # create new entry | |
545 | |
546 if( $a->description() || $a->display_label() || $a->web_data) { | |
547 $web_data = $self->dump_data($a->web_data()) if ($a->web_data()); | |
548 #my $web_data = $self->dump_data($a->web_data()); | |
549 $sth = $self->prepare( "INSERT IGNORE INTO analysis_description (analysis_id, display_label, description, displayable, web_data) VALUES (?,?,?,?,?)"); | |
550 $sth->bind_param(1,$a->dbID,SQL_INTEGER); | |
551 $sth->bind_param(2,$a->display_label(),SQL_VARCHAR); | |
552 $sth->bind_param(3,$a->description,SQL_LONGVARCHAR); | |
553 $sth->bind_param(4,$a->displayable,SQL_TINYINT); | |
554 #my $web_data = $self->dump_data($a->web_data()); | |
555 $sth->bind_param(5,$web_data,SQL_LONGVARCHAR); | |
556 $sth->execute(); | |
557 | |
558 } | |
559 | |
560 } | |
561 | |
562 | |
563 $sth->finish(); | |
564 | |
565 # the logic_name cache needs to be re-updated now, since we may have just | |
566 # changed the logic_name | |
567 $self->fetch_all(); | |
568 | |
569 return 1; | |
570 } | |
571 | |
572 | |
573 | |
574 =head2 remove | |
575 | |
576 Arg [1] : Bio::EnsEMBL::Analysis $anal | |
577 Example : $adaptor->remove($anal) | |
578 Description: Removes this analysis from the database. This is not really | |
579 safe to execute in a multi process environment, so programs | |
580 should not remove analysis while out on the farm. | |
581 Returntype : none | |
582 Exceptions : thrown if $anal arg is not an analysis object | |
583 Caller : ? | |
584 Status : Stable | |
585 | |
586 =cut | |
587 | |
588 sub remove { | |
589 my ($self, $analysis) = @_; | |
590 | |
591 if (!defined $analysis || !ref $analysis) { | |
592 throw("called remove on AnalysisAdaptor with a [$analysis]"); | |
593 } | |
594 | |
595 if(!$analysis->is_stored($self->db())) { | |
596 return undef; | |
597 } | |
598 | |
599 my $sth = $self->prepare("DELETE FROM analysis WHERE analysis_id = ?"); | |
600 $sth->bind_param(1,$analysis->dbID,SQL_INTEGER); | |
601 $sth->execute(); | |
602 | |
603 $sth = $self->prepare("DELETE FROM analysis_description WHERE analysis_id = ?"); | |
604 $sth->execute($analysis->dbID()); | |
605 | |
606 # remove this analysis from the cache | |
607 delete $self->{'_cache'}->{$analysis->dbID()}; | |
608 delete $self->{'_logic_name_cache'}->{lc($analysis->logic_name)}; | |
609 | |
610 | |
611 # unset the adaptor and dbID | |
612 $analysis->dbID(undef); | |
613 $analysis->adaptor(undef); | |
614 | |
615 return; | |
616 } | |
617 | |
618 | |
619 | |
620 =head2 exists | |
621 | |
622 Arg [1] : Bio::EnsEMBL::Analysis $anal | |
623 Example : if($adaptor->exists($anal)) #do something | |
624 Description: Tests whether this Analysis already exists in the database | |
625 by checking first if the adaptor and dbID are set and | |
626 secondly by whether it is in this adaptors internal cache. | |
627 Note that this will not actually check the database and will | |
628 not find and analysis which were recently added by other | |
629 processes. You are better off simply trying to store an | |
630 analysis which will reliably ensure that it is not stored twice | |
631 in the database. | |
632 Returntype : int dbID if analysis is found, otherwise returns undef | |
633 Exceptions : thrown if $anal arg is not an analysis object | |
634 Caller : store | |
635 Status : Stable | |
636 | |
637 =cut | |
638 | |
639 sub exists { | |
640 my ($self,$anal) = @_; | |
641 | |
642 if(!ref($anal) || !$anal->isa("Bio::EnsEMBL::Analysis")) { | |
643 throw("Object is not a Bio::EnsEMBL::Analysis"); | |
644 } | |
645 | |
646 #if this analysis is stored in this db already return its dbID | |
647 if($anal->is_stored($self->db())) { | |
648 return $anal->dbID(); | |
649 } | |
650 | |
651 #this analysis object is not stored but one exactly like it may have been | |
652 foreach my $cacheId (keys %{$self->{_cache}}) { | |
653 if ($self->{_cache}->{$cacheId}->compare($anal) >= 0) { | |
654 # $anal->dbID( $cacheId ); | |
655 # $anal->adaptor( $self ); | |
656 return $cacheId; | |
657 } | |
658 } | |
659 | |
660 #no analysis like this one exists in the database | |
661 return undef; | |
662 } | |
663 | |
664 | |
665 =head2 _objFromHashref | |
666 | |
667 Arg [1] : hashref $rowHash | |
668 Description: Private helper function generates an Analysis object from a | |
669 mysql row hash reference. | |
670 Returntype : Bio::EnsEMBL::Analysis | |
671 Exceptions : none | |
672 Caller : Bio::EnsEMBL::DBSQL::AnalsisAdaptor::fetch_* methods | |
673 Status : Stable | |
674 | |
675 =cut | |
676 | |
677 sub _objFromHashref { | |
678 my $self = shift; | |
679 my $h = shift; | |
680 | |
681 my $web_data = $h->{web_data} ? $self->get_dumped_data($h->{web_data}) : ''; | |
682 | |
683 return Bio::EnsEMBL::Analysis->new_fast({ | |
684 dbID => $h->{analysis_id}, | |
685 adaptor => $self, | |
686 _db => $h->{db}, | |
687 _db_file => $h->{db_file}, | |
688 _db_version => $h->{db_version}, | |
689 _program => $h->{program}, | |
690 _program_version => $h->{program_version}, | |
691 _program_file => $h->{program_file}, | |
692 _gff_source => $h->{gff_source}, | |
693 _gff_feature => $h->{gff_feature}, | |
694 _module => $h->{module}, | |
695 _module_version => $h->{module_version}, | |
696 _parameters => $h->{parameters}, | |
697 _created => $h->{created}, | |
698 _logic_name => $h->{logic_name}, | |
699 _description => $h->{description}, | |
700 _display_label => $h->{display_label}, | |
701 _displayable => $h->{displayable}, | |
702 _web_data => $web_data, | |
703 }); | |
704 } | |
705 | |
706 | |
707 | |
708 1; |