Bio::Das::ProServer::SourceAdaptor::grouped_db - Bio::Das::ProServer::SourceAdaptor::grouped_db documentation


Bio-Das-ProServer documentation Contained in the Bio-Das-ProServer distribution.

Index


Code Index:

NAME

Top

Bio::Das::ProServer::SourceAdaptor::grouped_db

VERSION

Top

$LastChangedRevision: 548 $

SYNOPSIS

Top

DESCRIPTION

Top

SUBROUTINES/METHODS

Top

capabilities

build_features

build_types

build_entry_points

segment_version

DIAGNOSTICS

Top

CONFIGURATION AND ENVIRONMENT

Top

DEPENDENCIES

Top

Bio::Das::ProServer::SourceAdaptor

INCOMPATIBILITIES

Top

BUGS AND LIMITATIONS

Top

AUTHOR

Top

$Author: Roger Pettett$

LICENSE AND COPYRIGHT

Top


Bio-Das-ProServer documentation Contained in the Bio-Das-ProServer distribution.

#########
# Author:        jws
# Maintainer:    jws, dj3
# Created:       2005-04-19
# Last Modified: $Date: 2008-12-03 23:14:25 +0000 (Wed, 03 Dec 2008) $ $Author: zerojinx $
# Id:            $Id: grouped_db.pm 548 2008-12-03 23:14:25Z zerojinx $
# Source:        $Source: /nfs/team117/rmp/tmp/Bio-Das-ProServer/Bio-Das-ProServer/lib/Bio/Das/ProServer/SourceAdaptor/grouped_db.pm,v $
# $HeadURL: https://proserver.svn.sf.net/svnroot/proserver/trunk/lib/Bio/Das/ProServer/SourceAdaptor/grouped_db.pm $
# Builds DAS features from ProServer mysql database
# schema at eof
#
## no critic (ValuesAndExpressions::ProhibitImplicitNewlines)
#
package Bio::Das::ProServer::SourceAdaptor::grouped_db;
use strict;
use warnings;
use base qw(Bio::Das::ProServer::SourceAdaptor);
use Readonly;

our $VERSION  = do { my ($v) = (q$Revision: 548 $ =~ /\d+/mxg); $v; };

Readonly::Scalar our $SHORT_SEG_LEN => 4;

sub capabilities {
  return {
	  features     => '1.0',
	  stylesheet   => '1.0',
	  entry_points => '1.0',
	  types        => '1.0',
	 };
}

sub build_features {
  my ($self, $opts) = @_;
  my $seg     = $opts->{segment};
  my $start   = $opts->{start};
  my $end     = $opts->{end};
  my $shortsegnamehack = (defined $self->config->{'shortsegnamehack'})?$self->config->{'shortsegnamehack'}:1; #e.g. 1 (default) or 0

  if($shortsegnamehack && (CORE::length($seg) > $SHORT_SEG_LEN)) {
    return;
  }

  my $qbounds = q();

  if(defined $start && $start ne q() && defined $end && $end ne q()) {
    $start   = $self->transport->dbh->quote($start);
    $end     = $self->transport->dbh->quote($end);
    $qbounds = qq(AND start <= $end AND end >= $start);
  }

  my $query = qq(SELECT * FROM feature, fgroup
                                  WHERE  segment          = ? $qbounds
                                  AND    feature.group_id = fgroup.group_id
                                  ORDER BY start);
  my @results;

  for ( @{$self->transport->query($query, $seg)} ) {
    push @results, {
		    id           => $_->{id},
		    start        => $_->{start},
		    end          => $_->{end},
		    label        => $_->{label},
		    score        => $_->{score},
		    ori          => $_->{orient},
		    phase        => $_->{phase},
		    type         => $_->{type_id},
		    typecategory => $_->{type_category},
		    method       => $_->{method},
		    group        => $_->{group_id},
		    grouptype    => $_->{group_type},
		    grouplabel   => $_->{group_label},
		    groupnote    => $_->{group_note},
		    grouplink    => $_->{group_link_url},
		    grouplinktxt => $_->{group_link_text},
		    target_start => $_->{target_start},
		    target_stop  => $_->{target_end},
		    target_id    => $_->{target_id},
		    link         => $_->{link_url},
		    linktxt      => $_->{link_text},
		    note         => $_->{note},
		   };

  }

  return @results;
}

sub build_types {
  my ($self, @args) = @_;
  if(!scalar @args) {
    my $query   = q(SELECT DISTINCT type_id type, method FROM feature);
    return @{$self->transport->query($query)};
  }

  my @r;

  for (@args) {
    my ($seg, $start, $end) = @{$_}{qw(segment start end)};
    my $qbounds = q();

    if(defined $start && $start ne q() && defined $end && $end ne q()) {
      $start   = $self->transport->dbh->quote($start);
      $end     = $self->transport->dbh->quote($end);
      $qbounds = qq(AND start <= $end AND end >= $start);
    }

    my $query   = qq(SELECT DISTINCT type_id type, method FROM feature
                                          WHERE  segment = ? $qbounds);
    push @r, map { $qbounds?$self->_build_types_population($_, $seg, $start, $end):$_; }
                 @{$self->transport->query($query, $seg)};
  }
  return @r;
}

sub _build_types_population {
  my ($self, $ref, $seg, $start, $end) = @_;
  $ref->{segment} = $seg;
  @{$ref}{qw(start end)} = ($start, $end);
  return $ref;
}

sub build_entry_points {
  my ($self) = @_;
  my $query  = q(SELECT DISTINCT segment FROM feature);
  return map { $self->_build_ep_population($_); }
             @{$self->transport->query($query)};
}

sub _build_ep_population {
  my ($self, $ref) = @_;
  $ref->{subparts} = 'no';
  if(exists $self->{config}->{assembly}) {
    $ref->{version}  = $self->{config}->{assembly};
  }
  return $ref;
}

sub segment_version {
  my $self = shift;
  return (exists $self->{config}->{assembly})?$self->{config}->{assembly}:undef;
}

1;

# SCHEMA
# Generic MySQL schema to hold DAS feature data for ProServer
#	
#	feature
#		id		varchar(30)	
#		label		varchar(30)
#		segment		varchar(30)
#		start		int(11)
#		end		int(11)
#		score		float
#		orient		enum('0', '+', '-')
#		phase		enum('0','1','2')
#		type_id		varchar(30)
#		type_category	varchar(30)
#		method		varchar(30)
#		group_id	varchar(30)
#		target_id	varchar(30)
#		target_start	int(11)
#		target_end	int(11)
#		link_url	varchar(255)
#		link_text	varchar(30)
#		note		text
#		
#	fgroup
#		group_id	varchar(30)
#		label		varchar(30)
#		type		varchar(30)
#		note		text
#		link_url	varchar(255)
#		link_text	varchar(30)
#	
#	Note that spec allows multiple groups, targets, and links per feature,
#	but these aren't implemented here.
#	

__END__