/* @include ensontology *******************************************************
**
** Ensembl Ontology functions
**
** @author Copyright (C) 1999 Ensembl Developers
** @author Copyright (C) 2006 Michael K. Schuster
** @version $Revision: 1.5 $
** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
** @modified $Date: 2012/07/02 16:22:01 $ by $Author: rice $
** @@
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library 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
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA  02110-1301,  USA.
**
******************************************************************************/

#ifndef ENSONTOLOGY_H
#define ENSONTOLOGY_H

/* ========================================================================= */
/* ============================= include files ============================= */
/* ========================================================================= */

#include "ensbaseadaptor.h"

AJ_BEGIN_DECLS




/* ========================================================================= */
/* =============================== constants =============================== */
/* ========================================================================= */

/* @const EnsPOntologytermadaptor *********************************************
**
** Ensembl Ontology Term Adaptor.
** Defined as an alias in EnsPBaseadaptor
**
** #alias EnsPBaseadaptor
** ##
******************************************************************************/

#define EnsPOntologytermadaptor EnsPBaseadaptor




/* ========================================================================= */
/* ============================== public data ============================== */
/* ========================================================================= */

/* @data EnsPOntologyadaptor **************************************************
**
** Ensembl Ontology Adaptor
**
** @alias EnsSOntologyadaptor
** @alias EnsOOntologyadaptor
**
** @attr Adaptor [EnsPBaseadaptor] Ensembl Base Adaptor
** @attr CacheByIdentifier [AjPTable] Identifier cache
** @attr CacheByNamespace [AjPTable] Name space cache
** @@
******************************************************************************/

typedef struct EnsSOntologyadaptor
{
    EnsPBaseadaptor Adaptor;
    AjPTable CacheByIdentifier;
    AjPTable CacheByNamespace;
} EnsOOntologyadaptor;

#define EnsPOntologyadaptor EnsOOntologyadaptor*




/* @data EnsPOntology *********************************************************
**
** Ensembl Ontology
**
** @alias EnsSOntology
** @alias EnsOOntology
**
** @attr Use [ajuint] Use counter
** @cc Bio::EnsEMBL::Storable
** @attr Identifier [ajuint] SQL database-internal identifier
** @attr Adaptor [EnsPOntologyadaptor] Ensembl Ontology Adaptor
** @cc Bio::EnsEMBL::OntologyTerm
** @attr Name [AjPStr] Name
** @attr Space [AjPStr] Name space
** @@
******************************************************************************/

typedef struct EnsSOntology
{
    ajuint Use;
    ajuint Identifier;
    EnsPOntologyadaptor Adaptor;
    AjPStr Name;
    AjPStr Space;
} EnsOOntology;

#define EnsPOntology EnsOOntology*




/* @data EnsPOntologysynonym **************************************************
**
** Ensembl Ontology Synonym
**
** @alias EnsSOntologysynonym
** @alias EnsOOntologysynonym
**
** @attr Use [ajuint] Use counter
** @cc Bio::EnsEMBL::Storable
** @attr Identifier [ajuint] SQL database-internal identifier
** @attr Adaptor [EnsPOntologytermadaptor] Ensembl Ontology Term Adaptor
** @cc Bio::EnsEMBL::OntologyTerm
** @attr Name [AjPStr] Name
** @@
******************************************************************************/

typedef struct EnsSOntologysynonym
{
    ajuint Use;
    ajuint Identifier;
    EnsPOntologytermadaptor Adaptor;
    AjPStr Name;
} EnsOOntologysynonym;

#define EnsPOntologysynonym EnsOOntologysynonym*




/* @data EnsPOntologyterm *****************************************************
**
** Ensembl Ontology Term
**
** @alias EnsSOntologyterm
** @alias EnsOOntologyterm
**
** @attr Use [ajuint] Use counter
** @cc Bio::EnsEMBL::Storable
** @attr Identifier [ajuint] SQL database-internal identifier
** @attr Adaptor [EnsPOntologytermadaptor] Ensembl Ontology Term Adaptor
** @cc Bio::EnsEMBL::OntologyTerm
** @attr Ontology [EnsPOntology] Ensembl Ontology
** @attr Accession [AjPStr] Accession
** @attr Definition [AjPStr] Definition
** @attr Name [AjPStr] Name
** @attr Subsets [AjPStr] Subsets
** @attr Children [AjPTable] AJAX Table of child Ensembl Ontology Term objects
** @attr Parents [AjPTable] AJAX Table of parent Ensembl Ontology Term objects
** @attr Ontologysynonyms [AjPList]
** AJAX List of Ensembl Ontology Synonym objects
** @@
******************************************************************************/

typedef struct EnsSOntologyterm
{
    ajuint Use;
    ajuint Identifier;
    EnsPOntologytermadaptor Adaptor;
    EnsPOntology Ontology;
    AjPStr Accession;
    AjPStr Definition;
    AjPStr Name;
    AjPStr Subsets;
    AjPTable Children;
    AjPTable Parents;
    AjPList Ontologysynonyms;
} EnsOOntologyterm;

#define EnsPOntologyterm EnsOOntologyterm*




/* ========================================================================= */
/* =========================== public functions ============================ */
/* ========================================================================= */

/*
** Prototype definitions
*/

/* Ensembl Ontology */

EnsPOntology ensOntologyNewCpy(const EnsPOntology ontology);

EnsPOntology ensOntologyNewIni(EnsPOntologyadaptor oa,
                               ajuint identifier,
                               AjPStr name,
                               AjPStr space);

EnsPOntology ensOntologyNewRef(EnsPOntology ontology);

void ensOntologyDel(EnsPOntology *Pontology);

EnsPOntologyadaptor ensOntologyGetAdaptor(const EnsPOntology ontology);

ajuint ensOntologyGetIdentifier(const EnsPOntology ontology);

AjPStr ensOntologyGetName(const EnsPOntology ontology);

AjPStr ensOntologyGetSpace(const EnsPOntology ontology);

AjBool ensOntologySetAdaptor(EnsPOntology ontology,
                             EnsPOntologyadaptor oa);

AjBool ensOntologySetIdentifier(EnsPOntology ontology,
                                ajuint identifier);

AjBool ensOntologySetName(EnsPOntology ontology,
                          AjPStr name);

AjBool ensOntologySetSpace(EnsPOntology ontology,
                           AjPStr space);

AjBool ensOntologyTrace(const EnsPOntology ontology, ajuint level);

size_t ensOntologyCalculateMemsize(const EnsPOntology ontology);

/* Ensembl Ontology Adaptor */

EnsPOntologyadaptor ensRegistryGetOntologyadaptor(
    EnsPDatabaseadaptor dba);

EnsPOntologyadaptor ensOntologyadaptorNew(
    EnsPDatabaseadaptor dba);

void ensOntologyadaptorDel(EnsPOntologyadaptor *Poa);

EnsPBaseadaptor ensOntologyadaptorGetBaseadaptor(
    const EnsPOntologyadaptor oa);

EnsPDatabaseadaptor ensOntologyadaptorGetDatabaseadaptor(
    const EnsPOntologyadaptor oa);

AjBool ensOntologyadaptorFetchAll(EnsPOntologyadaptor oa,
                                  AjPList ontologies);

AjBool ensOntologyadaptorFetchAllbyName(EnsPOntologyadaptor oa,
                                        const AjPStr name,
                                        AjPList ontologies);

AjBool ensOntologyadaptorFetchByIdentifier(EnsPOntologyadaptor oa,
                                           ajuint identifier,
                                           EnsPOntology *Pontology);

AjBool ensOntologyadaptorFetchByName(EnsPOntologyadaptor oa,
                                     const AjPStr name,
                                     const AjPStr space,
                                     EnsPOntology *Pontology);

/* Ensembl Ontology Synonym */

EnsPOntologysynonym ensOntologysynonymNewCpy(const EnsPOntologysynonym os);

EnsPOntologysynonym ensOntologysynonymNewIni(EnsPOntologytermadaptor ota,
                                             ajuint identifier,
                                             AjPStr name);

EnsPOntologysynonym ensOntologysynonymNewRef(EnsPOntologysynonym os);

void ensOntologysynonymDel(EnsPOntologysynonym *Pos);

EnsPOntologytermadaptor ensOntologysynonymGetAdaptor(
    const EnsPOntologysynonym os);

ajuint ensOntologysynonymGetIdentifier(
    const EnsPOntologysynonym os);

AjPStr ensOntologysynonymGetName(
    const EnsPOntologysynonym os);

AjBool ensOntologysynonymSetAdaptor(EnsPOntologysynonym os,
                                    EnsPOntologytermadaptor ota);

AjBool ensOntologysynonymSetIdentifier(EnsPOntologysynonym os,
                                       ajuint identifier);

AjBool ensOntologysynonymSetName(EnsPOntologysynonym os,
                                 AjPStr name);

AjBool ensOntologysynonymTrace(const EnsPOntologysynonym os, ajuint level);

size_t ensOntologysynonymCalculateMemsize(const EnsPOntologysynonym os);

/* Ensembl Ontology Term */

EnsPOntologyterm ensOntologytermNewCpy(const EnsPOntologyterm ot);

EnsPOntologyterm ensOntologytermNewIni(EnsPOntologytermadaptor ota,
                                       ajuint identifier,
                                       EnsPOntology ontology,
                                       AjPStr accession,
                                       AjPStr description,
                                       AjPStr name,
                                       AjPStr subsets);

EnsPOntologyterm ensOntologytermNewRef(EnsPOntologyterm ot);

void ensOntologytermDel(EnsPOntologyterm *Pot);

AjPStr ensOntologytermGetAccession(const EnsPOntologyterm ot);

EnsPOntologytermadaptor ensOntologytermGetAdaptor(const EnsPOntologyterm ot);

AjPStr ensOntologytermGetDefinition(const EnsPOntologyterm ot);

ajuint ensOntologytermGetIdentifier(const EnsPOntologyterm ot);

AjPStr ensOntologytermGetName(const EnsPOntologyterm ot);

EnsPOntology ensOntologytermGetOntology(const EnsPOntologyterm ot);

AjPStr ensOntologytermGetSubsets(const EnsPOntologyterm ot);

const AjPList ensOntologytermLoadOntologysynonyms(EnsPOntologyterm ot);

AjBool ensOntologytermSetAccession(EnsPOntologyterm ot,
                                   AjPStr accession);

AjBool ensOntologytermSetAdaptor(EnsPOntologyterm ot,
                                 EnsPOntologytermadaptor ota);

AjBool ensOntologytermSetDefinition(EnsPOntologyterm ot,
                                    AjPStr description);

AjBool ensOntologytermSetIdentifier(EnsPOntologyterm ot,
                                    ajuint identifier);

AjBool ensOntologytermSetName(EnsPOntologyterm ot,
                              AjPStr name);

AjBool ensOntologytermSetOntology(EnsPOntologyterm ot,
                                  EnsPOntology ontology);

AjBool ensOntologytermSetSubsets(EnsPOntologyterm ot,
                                 AjPStr subsets);

AjBool ensOntologytermTrace(const EnsPOntologyterm ot, ajuint level);

size_t ensOntologytermCalculateMemsize(const EnsPOntologyterm ot);

/* Ensembl Ontology Term Adaptor */

EnsPOntologytermadaptor ensRegistryGetOntologytermadaptor(
    EnsPDatabaseadaptor dba);

EnsPOntologytermadaptor ensOntologytermadaptorNew(
    EnsPDatabaseadaptor dba);

void ensOntologytermadaptorDel(EnsPOntologytermadaptor *Pota);

AjBool ensOntologytermadaptorFetchAll(
    EnsPOntologytermadaptor ota,
    AjPList ots);

AjBool ensOntologytermadaptorFetchAllbyAncestor(
    EnsPOntologytermadaptor ota,
    EnsPOntologyterm ot,
    AjPList ots);

AjBool ensOntologytermadaptorFetchAllbyChild(
    EnsPOntologytermadaptor ota,
    EnsPOntologyterm ot,
    AjPList ots);

AjBool ensOntologytermadaptorFetchAllbyDescendant(
    EnsPOntologytermadaptor ota,
    EnsPOntologyterm ot,
    const AjPStr subset,
    AjBool closest,
    AjPList ots);

AjBool ensOntologytermadaptorFetchAllbyName(
    EnsPOntologytermadaptor ota,
    const AjPStr termname,
    const AjPStr ontologyname,
    AjPList ots);

AjBool ensOntologytermadaptorFetchAllbyParent(
    EnsPOntologytermadaptor ota,
    EnsPOntologyterm ot,
    AjPList ots);

AjBool ensOntologytermadaptorFetchByAccession(
    EnsPOntologytermadaptor ota,
    const AjPStr accession,
    EnsPOntologyterm *Pot);

AjBool ensOntologytermadaptorFetchByIdentifier(
    EnsPOntologytermadaptor ota,
    ajuint identifier,
    EnsPOntologyterm *Pot);

AjBool ensOntologytermadaptorRetrieveAllOntologysynonyms(
    EnsPOntologytermadaptor ota,
    const EnsPOntologyterm ot,
    AjPList oss);

/*
** End of prototype definitions
*/

/* not currently defined or used in source code */
AjBool ensOntologyadaptorCacheClear(EnsPOntologyadaptor oa);



AJ_END_DECLS

#endif /* !ENSONTOLOGY_H */
