diff --git a/modules/Bio/EnsEMBL/External/BlastAdaptor.pm b/modules/Bio/EnsEMBL/External/BlastAdaptor.pm index fcc34a38f32c18c9643d60f04605198bd66dd18b..998615b93781f9d1117662d6aa15d38c994b93e9 100644 --- a/modules/Bio/EnsEMBL/External/BlastAdaptor.pm +++ b/modules/Bio/EnsEMBL/External/BlastAdaptor.pm @@ -34,15 +34,6 @@ CREATE TABLE blast_ticket ( KEY update_time (update_time) ) TYPE=MyISAM"; -our $SQL_CREATE_RESULT = " -CREATE TABLE blast_result ( - result_id int(10) unsigned NOT NULL auto_increment, - ticket varchar(32) default NULL, - object longblob, - PRIMARY KEY (result_id), - KEY ticket (ticket) -) TYPE=MyISAM"; - our $SQL_CREATE_TABLE_LOG = " CREATE TABLE blast_table_log ( table_id int(10) unsigned NOT NULL auto_increment, @@ -60,6 +51,16 @@ CREATE TABLE blast_table_log ( KEY table_status (table_status) ) TYPE=MyISAM"; + +our $SQL_CREATE_DAILY_RESULT = " +CREATE TABLE %s ( + result_id int(10) unsigned NOT NULL auto_increment, + ticket varchar(32) default NULL, + object longblob, + PRIMARY KEY (result_id), + KEY ticket (ticket) +) TYPE=MyISAM"; + our $SQL_CREATE_DAILY_HIT = " CREATE TABLE %s ( hit_id int(10) unsigned NOT NULL auto_increment, @@ -121,18 +122,18 @@ WHERE ticket = ? "; #--- RESULTS --- our $SQL_RESULT_STORE = " -INSERT INTO blast_result ( object, ticket ) +INSERT INTO blast_result%s ( object, ticket ) VALUES ( ? , ? )"; our $SQL_RESULT_UPDATE = " -UPDATE blast_result +UPDATE blast_result%s SET object = ?, ticket = ? WHERE result_id = ?"; our $SQL_RESULT_RETRIEVE = " SELECT object -FROM blast_result +FROM blast_result%s WHERE result_id = ? "; #--- HITS --- @@ -289,26 +290,28 @@ sub store_result{ my $dbh = $self->db->db_handle; - my $ticket = $res->group_ticket; - my $token = $res->token; my $store_obj = $res->_prepare_storable; my $frozen = freeze( $store_obj ); + my $ticket = $res->group_ticket; + my ( $id, $use_date ) = split( '!!', $res->token); + $use_date ||= $self->use_date('RESULT'); my $rv = 0; - if( $token ){ - my $sth = $dbh->prepare( $SQL_RESULT_RETRIEVE ); - $rv = $sth->execute( $token ) || $self->throw( $sth->errstr ); + if( $id ){ + my $sth = $dbh->prepare( sprintf $SQL_RESULT_RETRIEVE, $use_date ); + $rv = $sth->execute( $id ) || $self->throw( $sth->errstr ); $sth->finish; } if( $rv < 1 ){# Insert - my $sth = $dbh->prepare( $SQL_RESULT_STORE ); + my $sth = $dbh->prepare( sprintf $SQL_RESULT_STORE, $use_date ); $sth->execute( $frozen, $ticket ) || $self->throw( $sth->errstr ); - $res->token( $dbh->{mysql_insertid} ); + my $id = $dbh->{mysql_insertid}; + $res->token( join( '!!', $id, $use_date ) ); $sth->finish; } else{ # Update - my $sth = $dbh->prepare( $SQL_RESULT_UPDATE ); - $sth->execute( $frozen, $ticket, $token ) || $self->throw( $sth->errstr ); + my $sth = $dbh->prepare( sprintf $SQL_RESULT_UPDATE, $use_date ); + $sth->execute( $frozen, $ticket, $id ) || $self->throw( $sth->errstr ); $sth->finish; } return $res->token(); @@ -329,10 +332,12 @@ sub store_result{ sub retrieve_result{ my $self = shift; - my $id = shift || $self->throw( "Need a Result token" ); + my $token = shift || $self->throw( "Need a Hit token" ); + my ( $id, $use_date ) = split( '!!',$token); + $use_date ||= ''; my $dbh = $self->db->db_handle; - my $sth = $dbh->prepare( $SQL_RESULT_RETRIEVE ); + my $sth = $dbh->prepare( sprintf $SQL_RESULT_RETRIEVE, $use_date ); my $rv = $sth->execute( $id ) || $self->throw( $sth->errstr ); if( $rv < 1 ){ $self->throw( "Token $id not found" ) } my ( $frozen ) = $sth->fetchrow_array; @@ -629,13 +634,13 @@ sub dynamic_use { =cut -my %valid_table_types = ( HIT=>1, HSP=>1 ); +my %valid_table_types = ( HIT=>1, HSP=>1, RESULT=>1 ); sub use_date { my $key = '_current_table'; my $self = shift; my $type = uc( shift ); $valid_table_types{$type} || - $self->throw( "Need a table type (Hit or HSP)" ); + $self->throw( "Need a table type (Result, Hit or HSP)" ); $self->{$key} ||= {}; if( ! $self->{$key}->{$type} ){ @@ -747,7 +752,7 @@ WHERE ticket like "%s" /; =head2 create_tables Arg [1] : none - Function : Creates the blast_ticket, blast_result and blast_table_log + Function : Creates the blast_ticket and blast_table_log tables in the database indicated by the database handle. Checks first to make sure they do not exist Returntype: boolean @@ -774,11 +779,6 @@ sub create_tables { my $sth = $dbh->prepare( $SQL_CREATE_TICKET ); my $rv = $sth->execute() || $self->throw( $sth->errstr ); } - if( $rv_res == 0 ){ - warn( "Creating blast_result table" ); - my $sth = $dbh->prepare( $SQL_CREATE_RESULT ); - my $rv = $sth->execute() || $self->throw( $sth->errstr ); - } if( $rv_log == 0 ){ warn( "Creating blast_result table" ); my $sth = $dbh->prepare( $SQL_CREATE_TABLE_LOG ); @@ -792,8 +792,9 @@ sub create_tables { =head2 rotate_daily_tables Arg [1] : none - Function : Creates the daily blast_hit{date} and blast_hsp{date} - tables in the database indicated by the database handle. + Function : Creates the daily blast_result{date}, blast_hit{date} + and blast_hsp{date} tables in the database indicated by + the database handle. Checks first to make sure they do not exist. Sets the new table to 'CURRENT' in the blast_table_log. Sets the previous 'CURRENT' table to filled. @@ -812,6 +813,7 @@ sub rotate_daily_tables { my( $day, $month, $year ) = (localtime)[3,4,5]; my $date = sprintf( "%04d%02d%02d", $year+1900, $month+1, $day ); + my $res_table = "blast_result$date"; my $hit_table = "blast_hit$date"; my $hsp_table = "blast_hsp$date"; @@ -819,9 +821,28 @@ sub rotate_daily_tables { my $q = 'show table status like ?'; my $sth = $dbh->prepare( $q ); + my $rv_res = $sth->execute($res_table) || $self->throw($sth->errstr); my $rv_hit = $sth->execute($hit_table) || $self->throw($sth->errstr); my $rv_hsp = $sth->execute($hsp_table) || $self->throw($sth->errstr); + if( $rv_res == 0 ){ + warn( "Creating today's $res_table table\n" ); + + # Create new table + my $q = sprintf($SQL_CREATE_DAILY_RESULT, $res_table); + my $sth = $dbh->prepare( $q ); + my $rv = $sth->execute() || $self->throw( $sth->errstr ); + + # Flip current table in blast_table_tog + my $last_date = $self->use_date( "RESULT" ) || ''; + my $sth2 = $dbh->prepare( $SQL_TABLE_LOG_INSERT ); + my $sth3 = $dbh->prepare( $SQL_TABLE_LOG_UPDATE ); + $sth2->execute( "$res_table",'CURRENT','RESULT',$date ) + || die( $self->throw( $sth2->errstr ) ); + $sth3->execute( 'FILLED','0',0,"blast_result$last_date") + || die( $self->throw( $sth3->errstr ) ); + } + if( $rv_hit == 0 ){ warn( "Creating today's $hit_table table\n" );