The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#########
# Author:        rmp
# Maintainer:    rmp
# Created:       2003-10-28
# Last Modified: $Date: 2010-11-02 11:37:11 +0000 (Tue, 02 Nov 2010) $ $Author: zerojinx $
# $Id: simple.pm 687 2010-11-02 11:37:11Z zerojinx $
# $HeadURL: https://proserver.svn.sourceforge.net/svnroot/proserver/trunk/lib/Bio/Das/ProServer/SourceAdaptor/simple.pm $
#
## no critic (ValuesAndExpressions::ProhibitMagicNumbers)
#
package Bio::Das::ProServer::SourceAdaptor::simple;

use strict;
use warnings;

use Carp;
use POSIX;

use base qw(Bio::Das::ProServer::SourceAdaptor);

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

sub capabilities {
  my $ref = {
             'features'      => '1.1',
             'types'         => '1.1',
             'feature-by-id' => '1.0',
             'stylesheet'    => '1.1',
            };
  return $ref;
}

sub build_features {
  my ($self, $opts) = @_;

  my $baseurl = $self->config->{'baseurl'};

  my @rows;
  my @features;

  if ($opts->{'feature_id'}) {
    my $tmp = $self->transport->query(sprintf 'field5 lceq "%s"', $opts->{'feature_id'});
    $tmp->[0] || return ();
    $opts->{'segment'} = $tmp->[0]->[0];
    $opts->{'start'} = $tmp->[0]->[1];
    $opts->{'end'} = $tmp->[0]->[2];
  }

  if ($opts->{'segment'}) {
    $opts->{'start'} ||= 1;
    $opts->{'end'}   ||= INT_MAX;
    @rows = @{ $self->transport->query(sprintf 'field0 lceq "%s" AND field2 >= "%d" AND field1 <= "%d"', $opts->{'segment'}, $opts->{'start'}, $opts->{'end'}) };
  } else {
    @rows = @{ $self->transport->query('field0 like .*') };
  }

  # segment	start	end	type	note	id	parents	parts
  # Y	01	89	transcript	This is transcript 3	TRANS003		EXON005,EXON006,EXON007
  my %features_seen;
  while (scalar @rows) {

    my @related;

    while (my $row = shift @rows) {
      my $id = $row->[5] || q();
      my @parentstmp = split /,/mxs, ($row->[6]||q());
      my @partstmp   = split /,/mxs, ($row->[7]||q());
      push @related, @parentstmp;
      push @related, @partstmp;
      push @features, {
        'type'    => $row->[3],
        'method'  => $row->[3],
        'segment' => $row->[0],
        'id'      => $id,
        'start'   => $row->[1],
        'end'     => $row->[2],
        'parent'  => \@parentstmp,
        'part'    => \@partstmp,
        'note'    => $row->[4],
        'link'    => $baseurl.$row->[5],
      };
      $features_seen{$id} = 1;
    }

    # Fill in any parents or parts features not already included:
    for my $id (@related) {
      if (!$features_seen{$id}) {
        $self->{debug} && print {*STDERR} "Adding in parent/part outside of range: $id\n";
        push @rows, @{ $self->transport->query(sprintf 'field5 = "%s"', $id) };
      }
    }

  }

  return @features;
}

sub das_stylesheet {
  return q(<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DASSTYLE SYSTEM "http://www.biodas.org/dtd/dasstyle.dtd">
<DASSTYLE>
  <STYLESHEET version="1.0">
    <CATEGORY id="default">
      <TYPE id="default">
        <GLYPH>
          <BOX>
            <FGCOLOR>red</FGCOLOR>
            <BGCOLOR>black</BGCOLOR>
          </BOX>
        </GLYPH>
      </TYPE>
      <TYPE id="transcript">
        <GLYPH>
          <LINE>
            <FGCOLOR>red</FGCOLOR>
            <STYLE>hat</STYLE>
          </LINE>
        </GLYPH>
      </TYPE>
    </CATEGORY>
  </STYLESHEET>
</DASSTYLE>);
}

sub known_segments {
  my $self = shift;

  my $rows = $self->transport->query('field0 like .*');
  my %segs;
  map { $segs{$_->[0]} = 1 } @{ $rows || [] };

  return keys %segs;
}

1;
__END__

=head1 NAME

Bio::Das::ProServer::SourceAdaptor::simple

=head1 VERSION

$Revision: 687 $

=head1 SYNOPSIS

Builds das from parser genesat tab-delimited flat files of the form:

 gene.name	gene.id

=head1 DESCRIPTION

=head1 SUBROUTINES/METHODS

=head2 init - Initialise capabilities for this source

  $oSourceAdaptor->init();

=head2 build_features - Return an array of features based on a query given in the config file

  my @aFeatures = $oSourceAdaptor->build_features({
                                                   'segment'    => $sSegmentId,
                                                   'start'      => $iSegmentStart, # Optional
                                                   'end'        => $iSegmentEnd,   # Optional
                                                  });
  my @aFeatures = $oSourceAdaptor->build_features({
                                                   'feature_id' => $sFeatureId,
                                                  });

=head2 das_stylesheet - Return a DAS XML stylesheet

  Overrides the superclass method to return a hardcoded XML DAS stylesheet.

=head2 known_segments - Return a list of known entry point segment IDs

  Returns a list of all segment identifiers in the file.

=head1 DIAGNOSTICS

=head1 CONFIGURATION AND ENVIRONMENT

=head1 DEPENDENCIES

 Bio::Das::ProServer::SourceAdaptor
 Carp
 POSIX

=head1 INCOMPATIBILITIES

=head1 BUGS AND LIMITATIONS

=head1 AUTHOR

Andy Jenkinson <andy.jenkinson@ebi.ac.uk>

=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 <http://www.gnu.org/licenses/>.

=cut