EdgeExpressDB

 view release on metacpan or  search on metacpan

lib/EEDB/Tools/MultiLoader.pm  view on Meta::CPAN

    $self->database->execute_sql($sql) if($self->do_store);
    $self->database->do_sql("UNLOCK TABLES");
  }
  
  #
  # now do the expression
  #
  foreach my $feat (@{$self->{'feature_buffer'}}) {
    my $expr_array = $feat->get_expression_array;
    foreach my $express (@$expr_array) {
      if($self->mirror or !defined($express->primary_id)) {
        $express->primary_id(undef);
        $self->store_express($express);
      }
    }
  }  
  $self->store_express();
  #printf("flush the expression buffer\n");

  #
  # do the symbol/metadata linkage now
  #
  $self->build_feature_symbol_links();
  $self->build_feature_metadata_links();
  
  #
  # then do the chunk edges
  #
  $self->build_chunk_links();


  #done now do cleanup and clear out the buffer
  foreach $feature (@{$self->{'feature_buffer'}}) {
    $feature->empty_expression_cache;
  }
  $self->{'feature_buffer'} = [];
}


=head2 update_feature_metadata

  Description  : this method will take a feature which was fetched from a database
                 and which may have new metadata/symbols and it will store that new
                 metadata/symbols and link them to the feature.
  Parameter[1] : feature [EEDB::Feature]
  Returntype   : none
  Exceptions   : none
  Example      :      my $multiLoad = new EEDB::Tools::MultiLoader;
                      $multiLoad->database($eeDB);
                      $multiLoad->do_store(1);
                      foreach my $feature (@feature_array) {
                         #
                         # do some metadata additions here
                         #
                         $multiLoad->update_feature_metadata($feature);
                      }
                      $multiLoad->update_feature_metadata(); #to flush the queues
                      
=cut

sub update_feature_metadata {
  my $self = shift;
  my $feature = shift;
    
  if(defined($feature)) {
    if($feature->database->url ne $self->database->url) { return; }
  
    #first queue up the metadata 
    my $mdata_list = $feature->metadataset->metadata_list;
    my $mdata_count = 0;
    foreach my $mdata (@$mdata_list) {
      if(!defined($mdata->primary_id)) {
        $mdata_count++;
        if($mdata->class eq 'Metadata') { $self->store_metadata($mdata); }
        if($mdata->class eq 'Symbol')   { $self->store_symbol($mdata); }
      }
    }
    if($mdata_count == 0) { return; }
    
    #OK this feature has new mdata, so queue it up for linking
    push @{$self->{'feature_mdata_buffer'}}, $feature; 
    if(scalar(@{$self->{'feature_mdata_buffer'}}) < 500) { return; }
  }
  if(scalar(@{$self->{'feature_mdata_buffer'}}) == 0) { return; }

  # 1st flush the metadata since I need to have the data in the database before I can link
  $self->store_metadata();
  $self->store_symbol();

  # do the symbol/metadata linkage now
  $self->build_feature_symbol_links();
  $self->build_feature_metadata_links();
  
  #done so clear out the buffer
  $self->{'feature_mdata_buffer'} = [];
}


sub build_chunk_links {
  my $self = shift;

  if($self->database->driver eq "sqlite") { return; }

  my $sql = "INSERT ignore INTO feature_2_chunk (feature_id, chrom_chunk_id) VALUES ";
  my $first=1;
  foreach my $feature (@{$self->{'feature_buffer'}}) {
    next unless($feature->chrom and ($feature->chrom_start>0) and ($feature->chrom_end>0));
    my $chunks = EEDB::ChromChunk->fetch_all_by_chrom_range($feature->chrom, $feature->chrom_start, $feature->chrom_end);
    foreach my $chunk (@{$chunks}) {
      if($first) { $first=0; } else { $sql .= ","; }
      $sql .= sprintf("(%s,%s)", $feature->id, $chunk->id);
    }
  }
  if($first) { return; } #no chunks to link
  
  #printf("%s\n", $sql);
  $self->database->execute_sql($sql) if($self->do_store);
  #printf("done\n");
}




( run in 0.676 second using v1.01-cache-2.11-cpan-39bf76dae61 )