Raw content of BioMart::Links
# $Id: Links.pm,v 1.3 2008/04/09 12:52:33 syed Exp $
#
# BioMart module for BioMart::Links.
#
# You may distribute this module under the same terms as perl
# itself.
# POD documentation - main docs before the code.
=head1 NAME
BioMart::Links
=head1 SYNOPSIS
Object representing a directional link between two BioMart datasets.
=head1 DESCRIPTION
The BioMart::Links class holds the links between two
BioMart::DatasetI objects.
Two BioMart::DatasetI objects are connected through
their exportable BioMart::Configuration::AttributeList ("the
exportable") and importable BioMart::Configuration::FilterList
("the importable") objects using named links.
To link two datasets, the exportable and the importable must
have the same name.
A BioMart::Links object stores the names of the exportable
and the importable and the names of the source and target
datasets (eg, it is directional).
It also provides a method to override the default link
between the datasets (eg, use a different
exportable<->importable name than that specified in the
XML for the two datasets as the default).
Finally, it holds a reference to the BioMart::Registry object
that created it.
=head1 AUTHOR - Arek Kasprzyk, Andreas Kahari, 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::Links;
use strict;
use warnings;
# Extends BioMart::Root
use base qw(BioMart::Root);
#------------------------------------------------------------------------
=head2 new
Usage : my $links = BioMart::Links->new($registry);
Description: Creates a new BioMart::Links object.
Return type: A BioMart::Links object.
Exceptions : none
Caller : BioMart::Registry
=cut
sub _new {
my ($self, $registry, @params) = @_;
$self->SUPER::_new(@params);
# Links are a stored in a hash where the link name is the
# hash key. Each hash entry points to the name of the
# exportable in the source dataset and the importable in
# the target dataset (the names are the same for both).
$self->attr('linkHash', { });
$self->attr('sourceDatasetName', undef);
$self->attr('targetDatasetName', undef);
$self->attr('defaultLinkName', undef);
$self->attr('registry', $registry);
$self->attr('operation', 'join');# default to join til union is implemented
}
#------------------------------------------------------------------------
=head2 operation
Usage : $links->operation($operation);
$operation = $links->operation();
Description: Sets or gets the the operation between the source and target
dataset. Default is a join in which case a link is created
between the two datasets but can also be a union in which case
no link is required
Return type: A scalar (string).
Exceptions : none
Caller :
=cut
sub operation {
my ($self, $operation) = @_;
if (defined $operation) {
$self->set('operation', $operation);
}
return $self->get('operation');
}
#------------------------------------------------------------------------
=head2 validateLink
Usage : $links->validateLink($virtualSchema,$sourceInterface,
$targetInterface,$linkName);
Description: Tests whether appropiately named exportables and importables
exist in the soucre and target datasets for the given
interfaces
Return type: 1 or undef if link is not validated
Exceptions : none
Caller :
=cut
sub validateLink {
my ($self, $virtualSchema, $sourceInterface, $targetInterface,
$linkName) = @_;
my $registry = $self->get('registry');
my $sourceDataset = $registry->getDatasetByName($virtualSchema,
$self->sourceDataset);
my $targetDataset = $registry->getDatasetByName($virtualSchema,
$self->targetDataset);
if ($targetDataset->getImportables($linkName,$targetInterface) &&
$sourceDataset->getExportables($linkName,$sourceInterface)){
return 1;
}
return undef;
}
#------------------------------------------------------------------------
=head2 sourceDataset
Usage : $links->sourceDataset($dataSetName);
$dataSetName = $links->sourceDataset();
Description: Sets or gets the the source dataset by name.
Resetting the source dataset will invalidate
(remove) all the already existing links within
this BioMart::Links object.
Return type: A scalar (string).
Exceptions : none
Caller :
=cut
sub sourceDataset {
my ($self, $dataSetName) = @_;
if (defined $dataSetName || scalar(@_) > 1) {
$self->set('sourceDatasetName', $dataSetName);
$self->set('linkHash', { });
}
return $self->get('sourceDatasetName');
}
#------------------------------------------------------------------------
=head2 targetDataset
Usage : $links->targetDataset($dataSetName);
$dataSetName = $links->targetDataset();
Description: Sets or gets the target dataset by name.
Resetting the target dataset will invalidate
(remove) all the already existing links within
this BioMart::Links object.
Return type: A scalar (string).
Exceptions : none
Caller :
=cut
sub targetDataset {
my ($self, $dataSetName) = @_;
if (defined $dataSetName || scalar(@_) > 1) {
$self->set('targetDatasetName', $dataSetName);
$self->set('linkHash', { });
}
return $self->get('targetDatasetName');
}
#------------------------------------------------------------------------
=head2 defaultLink
Usage : $links->defaultLink($linkName);
$linkName = $links->defaultLink();
Description: Sets or gets the name of the default link
between the two datasets associated through
this BioMart::Links object.
Return type: A scalar (string).
Exceptions : none
Caller :
=cut
sub defaultLink {
my ($self, $linkName) = @_;
if (defined $linkName || scalar(@_) > 1) {
my $linkHash = $self->get('linkHash');
if (!defined $linkName || defined $linkHash->{$linkName}) {
$self->set('defaultLinkName', $linkName);
} else {
BioMart::Exception::Configuration->throw("Can not set default link to '$linkName', no such link");
}
}
return $self->get('defaultLinkName');
}
#------------------------------------------------------------------------
=head2 addLink
Usage : $links->addLink($linkName, $listName);
$links->addLink($linkName);
Description: Adds a named link between one of the
BioMart::Configuration::AttributeList objects
(the exportable) of the source dataset to one
of the BioMart::Configuration::FilterList objects
(the importable) of the target dataset.
The $listName parameter must be the name
of a BioMart::Configuration::AttributeList
object in the source dataset and of a
BioMart::Configuration::FilterList object in the
target dataset.
If $listName is left undefined (the method is
only called with one paramater, $linkName), then
$linkName will be used instead.
The newly added link will be the default link if
no default link was previously specified.
Return type: none
Exceptions : none
Caller :
=cut
sub addLink {
my ($self, $virtualSchema, $linkName, $listName) = @_;
if (!defined $listName) {
$listName = $linkName;
}
my $registry = $self->get('registry');
my $linkHash = $self->get('linkHash');
my $sourceDatasetName = $self->get('sourceDatasetName');
if (!defined $sourceDatasetName) {
BioMart::Exception::Configuration->throw("Can not add link '$linkName', no source dataset");
}
my $exportableFound = 0;
my $sourceDataset = $registry->getDatasetByName($virtualSchema,
$sourceDatasetName);
my $attList;
foreach my $attributeList (@{ $sourceDataset->getExportables() }) {
if ($listName eq $attributeList->name()) {
$exportableFound = 1;
$attList = $attributeList;
last;
}
}
if (!$exportableFound) {
BioMart::Exception::Configuration->throw("Can not add link '$linkName', exportable '$listName' not found in source dataset: $sourceDatasetName ");
}
my $targetDatasetName = $self->get('targetDatasetName');
if (!defined $targetDatasetName) {
BioMart::Exception::Configuration->throw("Can not add link '$linkName', no target dataset");
}
my $importableFound = 0;
my $targetDataset = $registry->getDatasetByName($virtualSchema,
$targetDatasetName);
foreach my $filterList (@{ $targetDataset->getImportables() }) {
if ($listName eq $filterList->name()) {
$importableFound = 1;
last;
}
}
if (!$importableFound) {
BioMart::Exception::Configuration->throw("Can not add link '$linkName', importable '$listName' not found in target dataset: $targetDatasetName source dataset: $sourceDatasetName");
}
$linkHash->{$linkName} = $listName;
$self->set('linkHash', $linkHash);
# make the first link the default or if AttList set as default
# make this link the default
if ((!defined $self->defaultLink()) || $attList->defaultList){
$self->defaultLink($linkName);
}
}
#------------------------------------------------------------------------
=head2 getAllLinks
Usage : my @allLinks = $links->getAllLinks();
my $allLinksref = $links->getAllLinks();
Description: Returns the names of all links associated with
this BioMart::Links object, either as an
array_ref (recommended), or as an array.
Return type: An array of strings in list context, or a
reference to such an array in scalar context.
Exceptions : none
Caller :
=cut
sub getAllLinks {
my ($self) = @_;
my $linkHash = $self->get('linkHash');
my @linkNames = keys %{ $linkHash };
return (wantarray() ? @linkNames : \@linkNames);
}
1;
# vim: et