#!/usr/bin/perl
package Taxonomy;

#####################################################################
# Author : Shuai Weng
# Date   : July 2003
# 
# 
#
#####################################################################

use strict;
use DBI;
use vars qw (@ISA %allowedConstructors);
use dictyBase_Table;
@ISA = qw (dictyBase_Table); # base class

# Class Globals

# put column names in the hash below, that are able to uniquely
# specify a row in the table

%allowedConstructors = (taxon_id_no=>undef,
			tax_term=>undef);


####################################################################
sub GetParentTaxonIdArrayRef {
####################################################################
    my ($self, %args) = @_;

    my $dbh = $args{'dbh'} || $self->_err_report('dbh');
    my $childTaxId = $args{'taxon_id'} || $self->_err_report('taxon_id');
    my $schema = $self->schema;

    my $sth = $dbh->prepare("
        SELECT parent_id
        FROM   $schema.tax_hierarchy
        WHERE  child_id = ?
    ");

    $sth->execute($childTaxId);

    my $arrayRef = $sth->fetchall_arrayref();

    $sth->finish;

    return $arrayRef;

}

####################################################################
sub GetParentTaxTermsForTaxonId {
####################################################################
    my ($self, %args) = @_;

    my $dbh = $args{'dbh'} || $self->_err_report('dbh');
    my $childTaxId = $args{'taxon_id'} || $self->_err_report('taxon_id');
    my $schema = $self->schema;

    my $sth = $dbh->prepare("
        SELECT T.tax_term
        FROM   $schema.taxonomy T, $schema.tax_hierarchy TH
        WHERE  TH.child_id = ?
        AND    TH.parent_id = T.taxon_id
    ");

    $sth->execute($childTaxId);

    my $parentTermList;

    while(my ($taxTerm) = $sth->fetchrow()) {

	$parentTermList .= ":".$taxTerm;

    }

    $parentTermList .= ":";

    $sth->finish;

    return $parentTermList;

}

####################################################################
sub GetParentTaxTermsForOrganism {
####################################################################
    my ($self, %args) = @_;

    my $dbh = $args{'dbh'} || $self->_err_report('dbh');
    my $organism = $args{'organism'} || $self->_err_report('organism');
    my $schema = $self->schema;

    my $sth = $dbh->prepare("
        SELECT T1.tax_term
        FROM   $schema.taxonomy T1, $schema.taxonomy T2, 
               $schema.tax_hierarchy TH
        WHERE  T2.tax_term = ?
        ANd    T2.taxon_id = TH.child_id
        AND    TH.parent_id = T1.taxon_id
    ");

    $sth->execute($organism);

    my $parentTermList;

    while(my ($taxTerm) = $sth->fetchrow()) {

	$parentTermList .= ":".$taxTerm;

    }

    $parentTermList .= ":";

    $sth->finish;

    return $parentTermList;

}

####################################################################
sub GetChildTaxonIdArrayRef {
####################################################################
    my ($self, %args) = @_;

    my $dbh = $args{'dbh'} || $self->_err_report('dbh');
    my $parentTaxId = $args{'taxon_id'} || $self->_err_report('taxon_id');
    my $schema = $self->schema;

    my $sth = $dbh->prepare("
        SELECT child_id 
        FROM   $schema.tax_hierarchy
        WHERE  parent_id = ?
    ");

    $sth->execute($parentTaxId);

    my $arrayRef = $sth->fetchall_arrayref();

    $sth->finish;

    return $arrayRef;

}

######################################################################
sub _err_report {
######################################################################
    my ($self, $args) = @_;

    my ($file, $line, $method) = (caller(1))[1..3];

    print "The argument '$args' must be passed to '$method' method.",br;

    print "Please add this argument to line $line in $file.",br; 

    exit;

}

####################################################################
sub DESTROY{
####################################################################
# nothing needs to be done 

}


####################################################################
1; #################################################################
####################################################################

=pod

=head1 Name

Taxonomy.pm

=head1 Description

This perl object (Taxonomy.pm) acts as container for taxonomy info in oracle database. Once an object has been instantiated, several methods are available to retrieve the attributes of the object. 


=head1 Instantiating a New Taxonomy Object

To instantiate a new taxonomy object, you may use following syntax: 

my $obj = Taxonomy->new(dbh=>$dbh,
		        taxon_id=>$taxid);


where $dbh is a valid database handle to either dictyBase or SDEV. All passed in values must be valid values for the columns that were provided, otherwise the script will die, with an appropriate error message.
 

=head1 Accessor Methods


All accessor methods take the form of : 


my $column_value = $obj->column_name, eg: 


my $organismNm = $obj->tax_term; 


my $taxonId = $obj->taxon_id;


etc. You can use an accessor for any valid column in the Taxonomy table. 

See valid columns in homolg table:

http:///usr/local/dicty/www_dictybase/db/lib/cgi-bin/dictyBase/tableSpecifications?table=HOMOLOG

=head1 getRow method

Usage:

my $row = $obj->getRow;

This method returns a tab-delimited row from taxonomy table.

=head1 Insert, update and delete Methods

You can also use 'Insert' class method and 'update' and 'delete' 
instance methods for inserting new row into database, updating and 
deleting info for a specified row. 

See dictyBase_Table documentation for usage details :

Update : http:///usr/local/dicty/www_dictybase/db/lib/staff/dictyBase/programmer/dictyBase_Table.html#Update_Method

Insert : http:///usr/local/dicty/www_dictybase/db/lib/staff/dictyBase/programmer/dictyBase_Table.html#Insert_Method

Delete : http:///usr/local/dicty/www_dictybase/db/lib/staff/dictyBase/programmer/dictyBase_Table.html#Delete_Method

=head1 Author

Shuai Weng

shuai@genome.stanford.edu

=cut











