######### # 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__ =head1 NAME Bio::Das::ProServer::SourceAdaptor::grouped_db =head1 VERSION $LastChangedRevision: 548 $ =head1 SYNOPSIS =head1 DESCRIPTION =head1 SUBROUTINES/METHODS =head2 capabilities =head2 build_features =head2 build_types =head2 build_entry_points =head2 segment_version =head1 DIAGNOSTICS =head1 CONFIGURATION AND ENVIRONMENT =head1 DEPENDENCIES Bio::Das::ProServer::SourceAdaptor =head1 INCOMPATIBILITIES =head1 BUGS AND LIMITATIONS =head1 AUTHOR $Author: Roger Pettett$ =head1 LICENSE AND COPYRIGHT This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . =cut