Raw content of BioMart::AttributeTable
#
# BioMart module for BioMart::AttributeTable
#
# You may distribute this module under the same terms as perl itself
# POD documentation - main docs before the code
=head1 NAME
BioMart::AttributeTable
=head1 SYNOPSIS
AttributeTables provide access to one or more rows of attribute values, each
containing one or more columns. They are used as placeholders for filters,
and BioMart::ResultTable objects inherit their functionality, and extend them.
=head1 DESCRIPTION
An AttributeTable object contains a table of data in rows and columns (the
minimal table being 1 X 1). It can be used in a variety of contexts within
the BioMart system.
It can be set as the value in a BioMart::Configuration::ValueFilter or
BioMart::Configuration::FilterList object to be used in a Query against a
dataset. BioMart::ResultTable objects inherit all functionality from
BioMart::AttributeTable, and extends it.
It basically presents a FIFO stack of array_ref objects. Adding a row pushes
this onto the stack, increasing its size by 1. Getting a row shifts an
array_ref from the stack, decreasing its size by 1. Thus, it is possible for
an AttributeTable to be exhausted, whereby the next call to getRow will return
null. This can be avoided by prefacing each call to next_row with a call to
hasMoreRows.
=head1 AUTHOR - Arek Kasprzyk, Syed Haider, Darin London, Damian Smedley
=head1 CONTACT
This module is part of the BioMart project http://www.biomart.org
Questions can be posted to the mart-dev mailing list:
mart-dev@ebi.ac.uk
=head1 METHODS
=cut
package BioMart::AttributeTable;
use strict;
use warnings;
use Digest::MD5;
use base qw(BioMart::Root);
=head2 _new
Usage : my $attTable = BioMart::AttributeTable->new();
Description: creates a new AttributeTable object.
Returntype : BioMart::Configuration::AttributeTable
Exceptions : none
Caller : general
=cut
sub _new {
my ($self, @param) = @_;
$self->SUPER::_new(@param);
$self->attr('columns', []);
$self->attr('hashedResults', undef);
#the hashCode for an AttributeTable is
#the digest of its creation time.
my $digest = Digest::MD5->new;
$digest->add(scalar localtime);
$self->attr('hc', $digest->hexdigest);
}
=head2 addRow
Usage : $attTable->addRow($row);
Description: adds a row (array_ref) of data to the AttributeTable.
Note, values from array_ref are harvested to avoid
unintended reference operations.
Returntype : none
Exceptions : none
Caller : caller
=cut
sub addRow {
my ($self,$row) = @_;
my $columns = $self->get('columns');
push @{$columns}, [ @{ $row } ];
$self->set('columns',$columns);#so hash code updated
}
sub getRows {
my $self = shift;
return $self->get('columns');
}
sub setRows {
my ($self,$rows) = @_;
$self->set('columns',$rows);
}
sub hashedResults {
my ($self,$value) = @_;
if ($value){
$self->set('hashedResults',$value);
}
return $self->get('hashedResults');
}
sub addRows {
my ($self,$rows) = @_;
my $columns = $self->get('columns');
push @{$columns}, @{ $rows };
$self->set('columns',$columns);#so hash code updated
}
=head2 hasMoreRows
Usage : if ($table->hasMoreRows) { ... }
Descripton : Determine if an AttributeTable has rows remaining to be
processed.
Note that the return for this method is currently the number of
rows remaining, but this may change in the future.
Returntype : boolean, >1 (true) if there are more rows, 0 (false) otherwise
Exceptions : none
Caller : caller
=cut
sub hasMoreRows {
my $self = shift;
my $columns = $self->get('columns');
my $ret = @{$columns};
return $ret;
}
=head2 nextRow
Usage : my $row = $attTable->nextRow; foreach my $col (@{$row}) { ... }
Description: returns a reference to the next row of data.
Returntype : array_ref. This returns null if the table is exhausted
Problems associated with this can be avoided by prefacing
each call to nextRow with a test of hasMoreRows.
Exceptions : none
Caller : caller
=cut
sub nextRow {
my $self = shift;
if ($self->hasMoreRows) {
my $columns = $self->get('columns');
my $rowref = shift @{$columns};
$self->set('columns', $columns);
return $rowref;
}
return undef;
}
#this is set at creation and never changed
sub _hashCode {
my $self = shift;
return $self->get('hc');
}
1;