PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/Bio/Pipeline/SQL/TransformerAdaptor.pm

https://github.com/bioperl/bioperl-pipeline
Perl | 281 lines | 202 code | 63 blank | 16 comment | 14 complexity | e25e74f38cd09bad216ece5fba1cab05 MD5 | raw file
Possible License(s): LGPL-2.0
  1. # perl module for Bio::Pipeline::SQL::TransformerAdaptor
  2. #
  3. # Creator: Fugu Team <fuguteam@fugu-sg.org>
  4. # Date of creation: 19.02.2003
  5. #
  6. # Copyright IMCB 2003
  7. #
  8. # You may distribute this module under the same terms as perl itself
  9. # POD documentation - main docs before the code
  10. =head1 NAME
  11. Bio::EnsEMBL::Pipeline::DBSQL::TransformerAdaptor
  12. =head1 SYNOPSIS
  13. $transformerAdaptor = $dbobj->getTransformerAdaptor;
  14. =head1 DESCRIPTION
  15. Module to encapsulate all db access for persistent class transformer.
  16. There should be just one per application and database connection.
  17. =head1 CONTACT
  18. Kiran: kiran@fugu-sg.org
  19. Shawn: shawnh@fugu-sg.org
  20. Juguang: juguang@fugu-sg.org
  21. =head1 APPENDIX
  22. The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
  23. =cut
  24. # Let the code begin...
  25. package Bio::Pipeline::SQL::TransformerAdaptor;
  26. use Bio::Pipeline::Transformer;
  27. use Bio::Pipeline::SQL::BaseAdaptor;
  28. use Bio::Pipeline::Method;
  29. use Bio::Pipeline::Argument;
  30. use vars qw(@ISA);
  31. use strict;
  32. @ISA = qw(Bio::Pipeline::SQL::BaseAdaptor);
  33. =head2 store
  34. Title : store
  35. Usage :
  36. my ($transformer1, $transformer2);
  37. $transformer->store[$transformer1, $transformer2]);
  38. (
  39. Function: Stores a array of transformer objects into the db.
  40. Returns : None (dbIDs of transformers would be stored inside of transformers.)
  41. Args : L<Bio::Pipeline::Transformer>
  42. =cut
  43. sub store {
  44. my ($self, $transformer) = @_;
  45. unless(ref($transformer) eq 'ARRAY'){
  46. $self->warn("An array ref wanted: TransformerAdaptor::store");
  47. return $self->_store_single($transformer);
  48. }
  49. foreach(@{$transformer}){
  50. $self->_store_single($_);
  51. }
  52. }
  53. # NOTE: No return value from this method, since we follow the EnsEMBL adaptor's
  54. # store method conventions, e.g. No return dbID, but assign the dbID into the
  55. # object.
  56. # stores transformer module into transformer table
  57. sub _store_single {
  58. my ($self,$transformer) = @_;
  59. $self->throw("A Bio::Pipeline::Transformer needed")
  60. unless ($transformer->isa('Bio::Pipeline::Transformer'));
  61. if (!defined ($transformer->dbID)) {
  62. my $sth = $self->prepare( q{
  63. INSERT INTO transformer
  64. SET module =?} );
  65. $sth->execute( $transformer->module) || $self->throw("Unable to insert into transformer table");
  66. my $dbid = $sth->{mysql_insertid};
  67. $transformer->dbID($dbid);
  68. }
  69. else {
  70. my $sth = $self->prepare( q{
  71. INSERT INTO transformer
  72. SET transformer_id = ?,
  73. module = ?
  74. } );
  75. $sth->execute($transformer->dbID,$transformer->module) || $self->throw("Unable to insert into transformer table");
  76. }
  77. $transformer->adaptor($self);
  78. if($transformer->method) {
  79. my @methods = @{$transformer->method};
  80. foreach my $transformer_method (@methods) {
  81. $self->_store_transformer_method($transformer_method, $transformer->dbID);
  82. }
  83. }
  84. else {
  85. $self->warn("Storing Transformer without methods!");
  86. }
  87. }
  88. #store method information into transformer_method table
  89. sub _store_transformer_method{
  90. my ($self, $transformer_method, $transformer_id) = @_;
  91. if(defined ($transformer_method->dbID)){
  92. my $sql = "INSERT INTO transformer_method SET transformer_method_id=?, transformer_id=?, name=?, rank=?";
  93. my $sth = $self->prepare($sql);
  94. $sth->execute(
  95. $transformer_method->dbID,
  96. $transformer_id,
  97. $transformer_method->name,
  98. $transformer_method->rank);
  99. }else{
  100. my $sql = "INSERT INTO transformer_method SET transformer_id=?, name=?, rank=?";
  101. my $sth = $self->prepare($sql);
  102. $sth->execute($transformer_id,
  103. $transformer_method->name,
  104. $transformer_method->rank);
  105. $transformer_method->dbID($sth->{mysql_insertid});
  106. }
  107. if($transformer_method->arguments){
  108. foreach my $transformer_argument (@{$transformer_method->arguments}) {
  109. $self->_store_transformer_argument($transformer_argument, $transformer_method->dbID);
  110. }
  111. }
  112. return $transformer_method->dbID;
  113. }
  114. #store argument information into transformer_method table
  115. sub _store_transformer_argument{
  116. my ($self, $transformer_argument, $transformer_method_id) = @_;
  117. $transformer_method_id || $self->throw("a method id needed");
  118. if(defined ($transformer_argument->dbID)){
  119. my $sql = "INSERT INTO transformer_argument SET transformer_argument_id=?, transformer_method_id=?, tag=?, value=?, rank=?";
  120. my $sth = $self->prepare($sql);
  121. $sth->execute(
  122. $transformer_argument->dbID,
  123. $transformer_method_id,
  124. $transformer_argument->tag,
  125. $transformer_argument->value,
  126. $transformer_argument->rank);
  127. }else{
  128. my $sql = "INSERT INTO transformer_argument SET transformer_method_id=?, tag=?, value=?, rank=?";
  129. my $sth = $self->prepare($sql);
  130. $sth->execute($transformer_method_id,
  131. $transformer_argument->tag,
  132. $transformer_argument->value,
  133. $transformer_argument->rank);
  134. $transformer_argument->dbID($sth->{mysql_insertid});
  135. }
  136. }
  137. =head2 fetch_by_dbID
  138. Title : fetch_by_dbID
  139. Usage : $transformer->fetch_by_dbID($id)
  140. Function: fetches the transformer object using a dbID
  141. Returns : L<Bio::Pipeline::Transformer>
  142. Args : A dbID
  143. =cut
  144. sub fetch_by_dbID{
  145. my ($self, $id ) = @_;
  146. if(defined $self->{_cache}->{$id}){
  147. return $self->{_cache}->{$id};
  148. }
  149. my $query = "SELECT transformer_id, module FROM transformer WHERE transformer_id = $id";
  150. my $sth = $self->prepare($query);
  151. $sth->execute();
  152. my ($transformer_id, $module) = $sth->fetchrow_array;
  153. $self->_load_module($module);
  154. my $methods_ref = $self->_fetch_transformer_method_by_transformer_dbID($transformer_id);
  155. my @new_arguments = ();
  156. my @methods = @{$methods_ref};
  157. my $first_method = shift @methods;
  158. my @new_params = ();
  159. push @new_params, -dbID => $transformer_id;
  160. push @new_params, -module => $module;
  161. push @new_params, -method => $methods_ref;
  162. my $transformer = Bio::Pipeline::Transformer->new(@new_params);
  163. $self->{_cache}->{$id} = $transformer;
  164. return $transformer;
  165. }
  166. sub _fetch_transformer_method_by_transformer_dbID{
  167. my ($self, $id) = @_;
  168. my $query = "SELECT transformer_method_id, name, rank FROM transformer_method WHERE transformer_id = $id";
  169. my $sth = $self->prepare($query);
  170. $sth->execute();
  171. my @methods;
  172. while(my ($transformer_method_id, $name, $rank) = $sth->fetchrow_array){
  173. my $arguments_ref = $self->_fetch_arguments_by_method_dbID($transformer_method_id);
  174. my $transformer_method = new Bio::Pipeline::Method(
  175. -dbID => $transformer_method_id,
  176. -name => $name,
  177. -rank => $rank,
  178. -argument => $arguments_ref
  179. );
  180. push @methods , $transformer_method;
  181. }
  182. return \@methods;
  183. }
  184. sub _fetch_arguments_by_method_dbID{
  185. my ($self, $id) = @_;
  186. my $query = "SELECT transformer_argument_id, tag, value, rank FROM transformer_argument WHERE transformer_method_id = $id";
  187. my $sth = $self->prepare($query);
  188. $sth->execute;
  189. my @arguments;
  190. while(my ($transformer_argument_id, $tag, $value, $rank) = $sth->fetchrow_array){
  191. my $transformer_argument = Bio::Pipeline::Argument->new (
  192. -dbID => $transformer_argument_id,
  193. -tag => $tag,
  194. -value => $value,
  195. -rank => $rank
  196. );
  197. push @arguments, $transformer_argument;
  198. }
  199. return \@arguments;
  200. }
  201. sub _format_transformer_new_arguments{
  202. my ($self, $arguments_ref) = @_;
  203. my @argument_objs;
  204. @argument_objs = sort {$a->rank <=> $b->rank} @{$arguments_ref};
  205. my @arguments;
  206. my $value;
  207. for(my $i=0; $i <= $#argument_objs; $i++){
  208. my $tag = $argument_objs[$i]->tag;
  209. my $value = $argument_objs[$i]->value;
  210. if(defined $tag){
  211. push @arguments, ($tag => $value);
  212. }else{
  213. push @arguments, $value;
  214. }
  215. }
  216. return \@arguments;
  217. }
  218. 1;