1 /* @source ensanalysis ********************************************************
2 **
3 ** Ensembl Analysis functions
4 **
5 ** @author Copyright (C) 1999 Ensembl Developers
6 ** @author Copyright (C) 2006 Michael K. Schuster
7 ** @version $Revision: 1.59 $
8 ** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
9 ** @modified $Date: 2013/02/17 13:02:10 $ by $Author: mks $
10 ** @@
11 **
12 ** This library is free software; you can redistribute it and/or
13 ** modify it under the terms of the GNU Lesser General Public
14 ** License as published by the Free Software Foundation; either
15 ** version 2.1 of the License, or (at your option) any later version.
16 **
17 ** This library is distributed in the hope that it will be useful,
18 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 ** Lesser General Public License for more details.
21 **
22 ** You should have received a copy of the GNU Lesser General Public
23 ** License along with this library; if not, write to the Free Software
24 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 ** MA 02110-1301, USA.
26 **
27 ******************************************************************************/
28
29 /* ========================================================================= */
30 /* ============================= include files ============================= */
31 /* ========================================================================= */
32
33 #include "ensanalysis.h"
34 #include "enstable.h"
35
36
37
38
39 /* ========================================================================= */
40 /* =============================== constants =============================== */
41 /* ========================================================================= */
42
43
44
45
46 /* ========================================================================= */
47 /* =========================== global variables ============================ */
48 /* ========================================================================= */
49
50
51
52
53 /* ========================================================================= */
54 /* ============================= private data ============================== */
55 /* ========================================================================= */
56
57
58
59
60 /* ========================================================================= */
61 /* =========================== private constants =========================== */
62 /* ========================================================================= */
63
64 /* @conststatic analysisadaptorKTablenames ************************************
65 **
66 ** Array of Ensembl Analysis Adaptor SQL table names
67 **
68 ******************************************************************************/
69
70 static const char *const analysisadaptorKTablenames[] =
71 {
72 "analysis",
73 "analysis_description",
74 (const char *) NULL
75 };
76
77
78
79
80 /* @conststatic analysisadaptorKColumnnames ***********************************
81 **
82 ** Array of Ensembl Analysis Adaptor SQL column names
83 **
84 ******************************************************************************/
85
86 static const char *const analysisadaptorKColumnnames[] =
87 {
88 "analysis.analysis_id",
89 "analysis.created",
90 "analysis.logic_name",
91 "analysis.db",
92 "analysis.db_version",
93 "analysis.db_file",
94 "analysis.program",
95 "analysis.program_version",
96 "analysis.program_file",
97 "analysis.parameters",
98 "analysis.module",
99 "analysis.module_version",
100 "analysis.gff_source",
101 "analysis.gff_feature",
102 "analysis_description.description",
103 "analysis_description.display_label",
104 "analysis_description.displayable",
105 "analysis_description.web_data",
106 (const char *) NULL
107 };
108
109
110
111
112 /* @conststatic analysisadaptorKLeftjoins *************************************
113 **
114 ** Array of Ensembl Analysis Adaptor SQL LEFT JOIN conditions
115 **
116 ******************************************************************************/
117
118 static const EnsOBaseadaptorLeftjoin analysisadaptorKLeftjoins[] =
119 {
120 {
121 "analysis_description",
122 "analysis.analysis_id = analysis_description.analysis_id"
123 },
124 {(const char *) NULL, (const char *) NULL}
125 };
126
127
128
129
130 /* @conststatic analysisadaptorKFeatureClasses ********************************
131 **
132 ** Correlation of Ensembl data object types and SQL table names
133 **
134 ******************************************************************************/
135
136 static const char *const analysisadaptorKFeatureClasses[] =
137 {
138 "AffyFeature", "affy_feature",
139 "Densityfeature", "density_type", /* density_type.analysis_id */
140 "Dnaalignfeature", "dna_align_feature",
141 "Gene", "gene",
142 "Markerfeature", "marker_feature",
143 "Predictiontranscript", "prediction_transcript",
144 "OligoFeature", "oligo_feature",
145 "Proteinalignfeature", "protein_align_feature",
146 "Proteinfeature", "protein_feature",
147 "QtlFeature", "qtl_feature",
148 "Repeatfeature", "repeat_feature",
149 "Simplefeature", "simple_feature",
150 (const char *) NULL, (const char *) NULL
151 };
152
153
154
155
156 /* ========================================================================= */
157 /* =========================== private variables =========================== */
158 /* ========================================================================= */
159
160
161
162
163 /* ========================================================================= */
164 /* =========================== private functions =========================== */
165 /* ========================================================================= */
166
167 static int listAnalysisCompareIdentifierAscending(
168 const void *item1,
169 const void *item2);
170
171 static int listAnalysisCompareIdentifierDescending(
172 const void *item1,
173 const void *item2);
174
175 static int listAnalysisCompareNameAscending(
176 const void *item1,
177 const void *item2);
178
179 static int listAnalysisCompareNameDescending(
180 const void *item1,
181 const void *item2);
182
183 static AjBool analysisadaptorFetchAllbyStatement(
184 EnsPBaseadaptor ba,
185 const AjPStr statement,
186 EnsPAssemblymapper am,
187 EnsPSlice slice,
188 AjPList analyses);
189
190 static AjBool analysisadaptorCacheInit(
191 EnsPAnalysisadaptor aa);
192
193 static AjBool analysisadaptorCacheInsert(
194 EnsPAnalysisadaptor aa,
195 EnsPAnalysis *Panalysis);
196
197 static void analysisadaptorFetchAll(const void *key,
198 void **Pvalue,
199 void *cl);
200
201
202
203
204 /* ========================================================================= */
205 /* ======================= All functions by section ======================== */
206 /* ========================================================================= */
207
208
209
210
211 /* @filesection ensanalysis ***************************************************
212 **
213 ** @nam1rule ens Function belongs to the Ensembl library
214 **
215 ******************************************************************************/
216
217
218
219
220 /* @datasection [EnsPAnalysis] Ensembl Analysis *******************************
221 **
222 ** @nam2rule Analysis Functions for manipulating Ensembl Analysis objects
223 **
224 ** @cc Bio::EnsEMBL::Analysis
225 ** @cc CVS Revision: 1.33
226 ** @cc CVS Tag: branch-ensembl-68
227 **
228 ******************************************************************************/
229
230
231
232
233 /* @section constructors ******************************************************
234 **
235 ** All constructors return a new Ensembl Analysis by pointer.
236 ** It is the responsibility of the user to first destroy any previous
237 ** Ensembl Analysis.
238 ** The target pointer does not need to be initialised to NULL, but it is good
239 ** programming practice to do so anyway.
240 **
241 ** @fdata [EnsPAnalysis]
242 **
243 ** @nam3rule New Constructor
244 ** @nam4rule Cpy Constructor with existing object
245 ** @nam4rule Ini Constructor with initial values
246 ** @nam4rule Ref Constructor by incrementing the reference counter
247 **
248 ** @argrule Cpy analysis [const EnsPAnalysis] Ensembl Analysis
249 ** @argrule Ini aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
250 ** @argrule Ini identifier [ajuint] SQL database-internal identifier
251 ** @argrule Ini cdate [AjPStr] Creation date
252 ** @argrule Ini name [AjPStr] Name
253 ** @argrule Ini databasename [AjPStr] Database name
254 ** @argrule Ini databaseversion [AjPStr] Database version
255 ** @argrule Ini databasefile [AjPStr] Database file
256 ** @argrule Ini programname [AjPStr] Program name
257 ** @argrule Ini programversion [AjPStr] Program version
258 ** @argrule Ini programfile [AjPStr] Program file
259 ** @argrule Ini parameters [AjPStr] Parameters
260 ** @argrule Ini modulename [AjPStr] Module name
261 ** @argrule Ini moduleversion [AjPStr] Module version
262 ** @argrule Ini gffsource [AjPStr] GFF source
263 ** @argrule Ini gfffeature [AjPStr] GFF feature
264 ** @argrule Ini description [AjPStr] Description
265 ** @argrule Ini displaylabel [AjPStr] Display label
266 ** @argrule Ini webdata [AjPStr] Web data
267 ** @argrule Ini displayable [AjBool] Displayable flag
268 ** @argrule Ref analysis [EnsPAnalysis] Ensembl Analysis
269 **
270 ** @valrule * [EnsPAnalysis] Ensembl Analysis or NULL
271 **
272 ** @fcategory new
273 ******************************************************************************/
274
275
276
277
278 /* @func ensAnalysisNewCpy ****************************************************
279 **
280 ** Object-based constructor function, which returns an independent object.
281 **
282 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
283 **
284 ** @return [EnsPAnalysis] Ensembl Analysis or NULL
285 **
286 ** @release 6.4.0
287 ** @@
288 ******************************************************************************/
289
ensAnalysisNewCpy(const EnsPAnalysis analysis)290 EnsPAnalysis ensAnalysisNewCpy(const EnsPAnalysis analysis)
291 {
292 EnsPAnalysis pthis = NULL;
293
294 if (!analysis)
295 return NULL;
296
297 AJNEW0(pthis);
298
299 pthis->Use = 1U;
300
301 pthis->Identifier = analysis->Identifier;
302
303 pthis->Adaptor = analysis->Adaptor;
304
305 if (analysis->DateCreation)
306 pthis->DateCreation = ajStrNewRef(analysis->DateCreation);
307
308 if (analysis->Name)
309 pthis->Name = ajStrNewRef(analysis->Name);
310
311 if (analysis->Databasename)
312 pthis->Databasename = ajStrNewRef(analysis->Databasename);
313
314 if (analysis->Databaseversion)
315 pthis->Databaseversion = ajStrNewRef(analysis->Databaseversion);
316
317 if (analysis->Databasefile)
318 pthis->Databasefile = ajStrNewRef(analysis->Databasefile);
319
320 if (analysis->Programname)
321 pthis->Programname = ajStrNewRef(analysis->Programname);
322
323 if (analysis->Programversion)
324 pthis->Programversion = ajStrNewRef(analysis->Programversion);
325
326 if (analysis->Programfile)
327 pthis->Programfile = ajStrNewRef(analysis->Programfile);
328
329 if (analysis->Parameters)
330 pthis->Parameters = ajStrNewRef(analysis->Parameters);
331
332 if (analysis->Modulename)
333 pthis->Modulename = ajStrNewRef(analysis->Modulename);
334
335 if (analysis->Moduleversion)
336 pthis->Moduleversion = ajStrNewRef(analysis->Moduleversion);
337
338 if (analysis->Gffsource)
339 pthis->Gffsource = ajStrNewRef(analysis->Gffsource);
340
341 if (analysis->Gfffeature)
342 pthis->Gfffeature = ajStrNewRef(analysis->Gfffeature);
343
344 if (analysis->Description)
345 pthis->Description = ajStrNewRef(analysis->Description);
346
347 if (analysis->Displaylabel)
348 pthis->Displaylabel = ajStrNewRef(analysis->Displaylabel);
349
350 if (analysis->Webdata)
351 pthis->Webdata = ajStrNewRef(analysis->Webdata);
352
353 pthis->Displayable = analysis->Displayable;
354
355 return pthis;
356 }
357
358
359
360
361 /* @func ensAnalysisNewIni ****************************************************
362 **
363 ** Constructor for an Ensembl Analysis object with initial values.
364 **
365 ** @cc Bio::EnsEMBL::Storable::new
366 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
367 ** @param [r] identifier [ajuint] SQL database-internal identifier
368 ** @cc Bio::EnsEMBL::Analysis::new
369 ** @param [u] cdate [AjPStr] Creation date
370 ** @param [u] name [AjPStr] Name
371 ** @param [u] databasename [AjPStr] Database name
372 ** @param [u] databaseversion [AjPStr] Database version
373 ** @param [u] databasefile [AjPStr] Database file
374 ** @param [u] programname [AjPStr] Program name
375 ** @param [u] programversion [AjPStr] Program version
376 ** @param [u] programfile [AjPStr] Program file
377 ** @param [u] parameters [AjPStr] Parameters
378 ** @param [u] modulename [AjPStr] Module name
379 ** @param [u] moduleversion [AjPStr] Module version
380 ** @param [u] gffsource [AjPStr] GFF source
381 ** @param [u] gfffeature [AjPStr] GFF feature
382 ** @param [u] description [AjPStr] Description
383 ** @param [u] displaylabel [AjPStr] Display label
384 ** @param [u] webdata [AjPStr] Web data
385 ** @param [r] displayable [AjBool] Displayable flag
386 **
387 ** @return [EnsPAnalysis] Ensembl Analysis or NULL
388 **
389 ** @release 6.4.0
390 ** @@
391 ******************************************************************************/
392
ensAnalysisNewIni(EnsPAnalysisadaptor aa,ajuint identifier,AjPStr cdate,AjPStr name,AjPStr databasename,AjPStr databaseversion,AjPStr databasefile,AjPStr programname,AjPStr programversion,AjPStr programfile,AjPStr parameters,AjPStr modulename,AjPStr moduleversion,AjPStr gffsource,AjPStr gfffeature,AjPStr description,AjPStr displaylabel,AjPStr webdata,AjBool displayable)393 EnsPAnalysis ensAnalysisNewIni(EnsPAnalysisadaptor aa,
394 ajuint identifier,
395 AjPStr cdate,
396 AjPStr name,
397 AjPStr databasename,
398 AjPStr databaseversion,
399 AjPStr databasefile,
400 AjPStr programname,
401 AjPStr programversion,
402 AjPStr programfile,
403 AjPStr parameters,
404 AjPStr modulename,
405 AjPStr moduleversion,
406 AjPStr gffsource,
407 AjPStr gfffeature,
408 AjPStr description,
409 AjPStr displaylabel,
410 AjPStr webdata,
411 AjBool displayable)
412 {
413 EnsPAnalysis analysis = NULL;
414
415 if (!name)
416 return NULL;
417
418 AJNEW0(analysis);
419
420 analysis->Use = 1U;
421
422 analysis->Identifier = identifier;
423
424 analysis->Adaptor = aa;
425
426 if (cdate)
427 analysis->DateCreation = ajStrNewRef(cdate);
428
429 if (name)
430 analysis->Name = ajStrNewRef(name);
431
432 if (databasename)
433 analysis->Databasename = ajStrNewRef(databasename);
434
435 if (databaseversion)
436 analysis->Databaseversion = ajStrNewRef(databaseversion);
437
438 if (databasefile)
439 analysis->Databasefile = ajStrNewRef(databasefile);
440
441 if (programname)
442 analysis->Programname = ajStrNewRef(programname);
443
444 if (programversion)
445 analysis->Programversion = ajStrNewRef(programversion);
446
447 if (programfile)
448 analysis->Programfile = ajStrNewRef(programfile);
449
450 if (parameters)
451 analysis->Parameters = ajStrNewRef(parameters);
452
453 if (modulename)
454 analysis->Modulename = ajStrNewRef(modulename);
455
456 if (moduleversion)
457 analysis->Moduleversion = ajStrNewRef(moduleversion);
458
459 if (gffsource)
460 analysis->Gffsource = ajStrNewRef(gffsource);
461
462 if (gfffeature)
463 analysis->Gfffeature = ajStrNewRef(gfffeature);
464
465 if (description)
466 analysis->Description = ajStrNewRef(description);
467
468 if (displaylabel)
469 analysis->Displaylabel = ajStrNewRef(displaylabel);
470
471 analysis->Displayable = displayable;
472
473 if (webdata)
474 analysis->Webdata = ajStrNewRef(webdata);
475
476 return analysis;
477 }
478
479
480
481
482 /* @func ensAnalysisNewRef ****************************************************
483 **
484 ** Ensembl Object referencing function, which returns a pointer to the
485 ** Ensembl Object passed in and increases its reference count.
486 **
487 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
488 **
489 ** @return [EnsPAnalysis] Ensembl Analysis or NULL
490 **
491 ** @release 6.2.0
492 ** @@
493 ******************************************************************************/
494
ensAnalysisNewRef(EnsPAnalysis analysis)495 EnsPAnalysis ensAnalysisNewRef(EnsPAnalysis analysis)
496 {
497 if (!analysis)
498 return NULL;
499
500 analysis->Use++;
501
502 return analysis;
503 }
504
505
506
507
508 /* @section destructors *******************************************************
509 **
510 ** Destruction destroys all internal data structures and frees the memory
511 ** allocated for an Ensembl Analysis object.
512 **
513 ** @fdata [EnsPAnalysis]
514 **
515 ** @nam3rule Del Destroy (free) an Ensembl Analysis
516 **
517 ** @argrule * Panalysis [EnsPAnalysis*] Ensembl Analysis address
518 **
519 ** @valrule * [void]
520 **
521 ** @fcategory delete
522 ******************************************************************************/
523
524
525
526
527 /* @func ensAnalysisDel *******************************************************
528 **
529 ** Default destructor for an Ensembl Analysis.
530 **
531 ** @param [d] Panalysis [EnsPAnalysis*] Ensembl Analysis address
532 **
533 ** @return [void]
534 **
535 ** @release 6.2.0
536 ** @@
537 ******************************************************************************/
538
ensAnalysisDel(EnsPAnalysis * Panalysis)539 void ensAnalysisDel(EnsPAnalysis *Panalysis)
540 {
541 EnsPAnalysis pthis = NULL;
542
543 if (!Panalysis)
544 return;
545
546 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
547 if (ajDebugTest("ensAnalysisDel"))
548 {
549 ajDebug("ensAnalysisDel\n"
550 " *Panalysis %p\n",
551 *Panalysis);
552
553 ensAnalysisTrace(*Panalysis, 1);
554 }
555 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
556
557 if (!(pthis = *Panalysis) || --pthis->Use)
558 {
559 *Panalysis = NULL;
560
561 return;
562 }
563
564 ajStrDel(&pthis->DateCreation);
565 ajStrDel(&pthis->Name);
566 ajStrDel(&pthis->Databasename);
567 ajStrDel(&pthis->Databaseversion);
568 ajStrDel(&pthis->Databasefile);
569 ajStrDel(&pthis->Programname);
570 ajStrDel(&pthis->Programversion);
571 ajStrDel(&pthis->Programfile);
572 ajStrDel(&pthis->Parameters);
573 ajStrDel(&pthis->Modulename);
574 ajStrDel(&pthis->Moduleversion);
575 ajStrDel(&pthis->Gffsource);
576 ajStrDel(&pthis->Gfffeature);
577 ajStrDel(&pthis->Description);
578 ajStrDel(&pthis->Displaylabel);
579 ajStrDel(&pthis->Webdata);
580
581 ajMemFree((void **) Panalysis);
582
583 return;
584 }
585
586
587
588
589 /* @section member retrieval **************************************************
590 **
591 ** Functions for returning members of an Ensembl Analysis object.
592 **
593 ** @fdata [EnsPAnalysis]
594 **
595 ** @nam3rule Get Return Ensembl Analysis attribute(s)
596 ** @nam4rule Adaptor Return the Ensembl Analysis Adaptor
597 ** @nam4rule Databasefile Return the database file
598 ** @nam4rule Databasename Return the database name
599 ** @nam4rule Databaseversion Return the database version
600 ** @nam4rule Date Return a date
601 ** @nam5rule Creation Return the date of creation
602 ** @nam4rule Description Return the description
603 ** @nam4rule Displayable Return the displayable flag
604 ** @nam4rule Displaylabel Return the display label
605 ** @nam4rule Gfffeature Return the GFF feature
606 ** @nam4rule Gffsource Return the GFF source
607 ** @nam4rule Identifier Return the SQL database-internal identifier
608 ** @nam4rule Modulename Return the module name
609 ** @nam4rule Moduleversion Return the module version
610 ** @nam4rule Name Return the name
611 ** @nam4rule Parameters Return the parameters
612 ** @nam4rule Programfile Return the program file
613 ** @nam4rule Programname Return the program name
614 ** @nam4rule Programversion Return the program version
615 ** @nam4rule Webdata Return the web data
616 **
617 ** @argrule * analysis [const EnsPAnalysis] Ensembl Analysis
618 **
619 ** @valrule Adaptor [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
620 ** @valrule Databasefile [AjPStr] Database file or NULL
621 ** @valrule Databasename [AjPStr] Database name or NULL
622 ** @valrule Databaseversion [AjPStr] Database version or NULL
623 ** @valrule DateCreation [AjPStr] Creation date or NULL
624 ** @valrule Description [AjPStr] Description or NULL
625 ** @valrule Displayable [AjBool] Displayable flag or ajFalse
626 ** @valrule Displaylabel [AjPStr] Display label or NULL
627 ** @valrule Gfffeature [AjPStr] GFF feature or NULL
628 ** @valrule Gffsource [AjPStr] GFF source or NULL
629 ** @valrule Identifier [ajuint] SQL database-internal identifier or 0U
630 ** @valrule Modulename [AjPStr] Module name or NULL
631 ** @valrule Moduleversion [AjPStr] Module version or NULL
632 ** @valrule Name [AjPStr] Name or NULL
633 ** @valrule Parameters [AjPStr] Parameters or NULL
634 ** @valrule Programfile [AjPStr] Program file or NULL
635 ** @valrule Programname [AjPStr] Program name or NULL
636 ** @valrule Programversion [AjPStr] Program version or NULL
637 ** @valrule Webdata [AjPStr] Web data or NULL
638 **
639 ** @fcategory use
640 ******************************************************************************/
641
642
643
644
645 /* @func ensAnalysisGetAdaptor ************************************************
646 **
647 ** Get the Ensembl Analysis Adaptor member of an Ensembl Analysis.
648 **
649 ** @cc Bio::EnsEMBL::Storable::adaptor
650 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
651 **
652 ** @return [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
653 **
654 ** @release 6.2.0
655 ** @@
656 ******************************************************************************/
657
ensAnalysisGetAdaptor(const EnsPAnalysis analysis)658 EnsPAnalysisadaptor ensAnalysisGetAdaptor(const EnsPAnalysis analysis)
659 {
660 return (analysis) ? analysis->Adaptor : NULL;
661 }
662
663
664
665
666 /* @func ensAnalysisGetDatabasefile *******************************************
667 **
668 ** Get the database file member of an Ensembl Analysis.
669 **
670 ** @cc Bio::EnsEMBL::Analysis::db_file
671 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
672 **
673 ** @return [AjPStr] Database file or NULL
674 **
675 ** @release 6.3.0
676 ** @@
677 ******************************************************************************/
678
ensAnalysisGetDatabasefile(const EnsPAnalysis analysis)679 AjPStr ensAnalysisGetDatabasefile(const EnsPAnalysis analysis)
680 {
681 return (analysis) ? analysis->Databasefile : NULL;
682 }
683
684
685
686
687 /* @func ensAnalysisGetDatabasename *******************************************
688 **
689 ** Get the database name member of an Ensembl Analysis.
690 **
691 ** @cc Bio::EnsEMBL::Analysis::db
692 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
693 **
694 ** @return [AjPStr] Database name or NULL
695 **
696 ** @release 6.3.0
697 ** @@
698 ******************************************************************************/
699
ensAnalysisGetDatabasename(const EnsPAnalysis analysis)700 AjPStr ensAnalysisGetDatabasename(const EnsPAnalysis analysis)
701 {
702 return (analysis) ? analysis->Databasename : NULL;
703 }
704
705
706
707
708 /* @func ensAnalysisGetDatabaseversion ****************************************
709 **
710 ** Get the database version member of an Ensembl Analysis.
711 **
712 ** @cc Bio::EnsEMBL::Analysis::db_version
713 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
714 **
715 ** @return [AjPStr] Database version or NULL
716 **
717 ** @release 6.3.0
718 ** @@
719 ******************************************************************************/
720
ensAnalysisGetDatabaseversion(const EnsPAnalysis analysis)721 AjPStr ensAnalysisGetDatabaseversion(const EnsPAnalysis analysis)
722 {
723 return (analysis) ? analysis->Databaseversion : NULL;
724 }
725
726
727
728
729 /* @func ensAnalysisGetDateCreation *******************************************
730 **
731 ** Get the date of creation member of an Ensembl Analysis.
732 **
733 ** @cc Bio::EnsEMBL::Analysis::created
734 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
735 **
736 ** @return [AjPStr] Creation date or NULL
737 **
738 ** @release 6.4.0
739 ** @@
740 ******************************************************************************/
741
ensAnalysisGetDateCreation(const EnsPAnalysis analysis)742 AjPStr ensAnalysisGetDateCreation(const EnsPAnalysis analysis)
743 {
744 return (analysis) ? analysis->DateCreation : NULL;
745 }
746
747
748
749
750 /* @func ensAnalysisGetDescription ********************************************
751 **
752 ** Get the description member of an Ensembl Analysis.
753 **
754 ** @cc Bio::EnsEMBL::Analysis::description
755 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
756 **
757 ** @return [AjPStr] Description or NULL
758 **
759 ** @release 6.2.0
760 ** @@
761 ******************************************************************************/
762
ensAnalysisGetDescription(const EnsPAnalysis analysis)763 AjPStr ensAnalysisGetDescription(const EnsPAnalysis analysis)
764 {
765 return (analysis) ? analysis->Description : NULL;
766 }
767
768
769
770
771 /* @func ensAnalysisGetDisplayable ********************************************
772 **
773 ** Get the displayable member of an Ensembl Analysis.
774 **
775 ** @cc Bio::EnsEMBL::Analysis::displayable
776 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
777 **
778 ** @return [AjBool] Displayable flag or ajFalse
779 **
780 ** @release 6.2.0
781 ** @@
782 ******************************************************************************/
783
ensAnalysisGetDisplayable(const EnsPAnalysis analysis)784 AjBool ensAnalysisGetDisplayable(const EnsPAnalysis analysis)
785 {
786 return (analysis) ? analysis->Displayable : ajFalse;
787 }
788
789
790
791
792 /* @func ensAnalysisGetDisplaylabel *******************************************
793 **
794 ** Get the display label member of an Ensembl Analysis.
795 **
796 ** @cc Bio::EnsEMBL::Analysis::display_label
797 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
798 **
799 ** @return [AjPStr] Display label or NULL
800 **
801 ** @release 6.3.0
802 ** @@
803 ******************************************************************************/
804
ensAnalysisGetDisplaylabel(const EnsPAnalysis analysis)805 AjPStr ensAnalysisGetDisplaylabel(const EnsPAnalysis analysis)
806 {
807 return (analysis) ? analysis->Displaylabel : NULL;
808 }
809
810
811
812
813 /* @func ensAnalysisGetGfffeature *********************************************
814 **
815 ** Get the GFF feature member of an Ensembl Analysis.
816 **
817 ** @cc Bio::EnsEMBL::Analysis::gff_feature
818 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
819 **
820 ** @return [AjPStr] GFF feature or NULL
821 **
822 ** @release 6.3.0
823 ** @@
824 ******************************************************************************/
825
ensAnalysisGetGfffeature(const EnsPAnalysis analysis)826 AjPStr ensAnalysisGetGfffeature(const EnsPAnalysis analysis)
827 {
828 return (analysis) ? analysis->Gfffeature : NULL;
829 }
830
831
832
833
834 /* @func ensAnalysisGetGffsource **********************************************
835 **
836 ** Get the GFF source member of an Ensembl Analysis.
837 **
838 ** @cc Bio::EnsEMBL::Analysis::gff_source
839 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
840 **
841 ** @return [AjPStr] GFF source or NULL
842 **
843 ** @release 6.3.0
844 ** @@
845 ******************************************************************************/
846
ensAnalysisGetGffsource(const EnsPAnalysis analysis)847 AjPStr ensAnalysisGetGffsource(const EnsPAnalysis analysis)
848 {
849 return (analysis) ? analysis->Gffsource : NULL;
850 }
851
852
853
854
855 /* @func ensAnalysisGetIdentifier *********************************************
856 **
857 ** Get the SQL database-internal identifier member of an Ensembl Analysis.
858 **
859 ** @cc Bio::EnsEMBL::Storable::dbID
860 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
861 **
862 ** @return [ajuint] SQL database-internal identifier or 0U
863 **
864 ** @release 6.2.0
865 ** @@
866 ******************************************************************************/
867
ensAnalysisGetIdentifier(const EnsPAnalysis analysis)868 ajuint ensAnalysisGetIdentifier(const EnsPAnalysis analysis)
869 {
870 return (analysis) ? analysis->Identifier : 0U;
871 }
872
873
874
875
876 /* @func ensAnalysisGetModulename *********************************************
877 **
878 ** Get the module name member of an Ensembl Analysis.
879 **
880 ** @cc Bio::EnsEMBL::Analysis::module
881 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
882 **
883 ** @return [AjPStr] Module name or NULL
884 **
885 ** @release 6.3.0
886 ** @@
887 ******************************************************************************/
888
ensAnalysisGetModulename(const EnsPAnalysis analysis)889 AjPStr ensAnalysisGetModulename(const EnsPAnalysis analysis)
890 {
891 return (analysis) ? analysis->Modulename : NULL;
892 }
893
894
895
896
897 /* @func ensAnalysisGetModuleversion ******************************************
898 **
899 ** Get the module version member of an Ensembl Analysis.
900 **
901 ** @cc Bio::EnsEMBL::Analysis::module_version
902 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
903 **
904 ** @return [AjPStr] Module version or NULL
905 **
906 ** @release 6.3.0
907 ** @@
908 ******************************************************************************/
909
ensAnalysisGetModuleversion(const EnsPAnalysis analysis)910 AjPStr ensAnalysisGetModuleversion(const EnsPAnalysis analysis)
911 {
912 return (analysis) ? analysis->Moduleversion : NULL;
913 }
914
915
916
917
918 /* @func ensAnalysisGetName ***************************************************
919 **
920 ** Get the name member of an Ensembl Analysis.
921 **
922 ** @cc Bio::EnsEMBL::Analysis::logic_name
923 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
924 **
925 ** @return [AjPStr] Name or NULL
926 **
927 ** @release 6.2.0
928 ** @@
929 ******************************************************************************/
930
ensAnalysisGetName(const EnsPAnalysis analysis)931 AjPStr ensAnalysisGetName(const EnsPAnalysis analysis)
932 {
933 return (analysis) ? analysis->Name : NULL;
934 }
935
936
937
938
939 /* @func ensAnalysisGetParameters *********************************************
940 **
941 ** Get the parameters member of an Ensembl Analysis.
942 **
943 ** @cc Bio::EnsEMBL::Analysis::parameters
944 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
945 **
946 ** @return [AjPStr] Parameters or NULL
947 **
948 ** @release 6.2.0
949 ** @@
950 ******************************************************************************/
951
ensAnalysisGetParameters(const EnsPAnalysis analysis)952 AjPStr ensAnalysisGetParameters(const EnsPAnalysis analysis)
953 {
954 return (analysis) ? analysis->Parameters : NULL;
955 }
956
957
958
959
960 /* @func ensAnalysisGetProgramfile ********************************************
961 **
962 ** Get the program file member of an Ensembl Analysis.
963 **
964 ** @cc Bio::EnsEMBL::Analysis::program_file
965 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
966 **
967 ** @return [AjPStr] Program file or NULL
968 **
969 ** @release 6.3.0
970 ** @@
971 ******************************************************************************/
972
ensAnalysisGetProgramfile(const EnsPAnalysis analysis)973 AjPStr ensAnalysisGetProgramfile(const EnsPAnalysis analysis)
974 {
975 return (analysis) ? analysis->Programfile : NULL;
976 }
977
978
979
980
981 /* @func ensAnalysisGetProgramname ********************************************
982 **
983 ** Get the program name member of an Ensembl Analysis.
984 **
985 ** @cc Bio::EnsEMBL::Analysis::program
986 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
987 **
988 ** @return [AjPStr] Program name or NULL
989 **
990 ** @release 6.3.0
991 ** @@
992 ******************************************************************************/
993
ensAnalysisGetProgramname(const EnsPAnalysis analysis)994 AjPStr ensAnalysisGetProgramname(const EnsPAnalysis analysis)
995 {
996 return (analysis) ? analysis->Programname : NULL;
997 }
998
999
1000
1001
1002 /* @func ensAnalysisGetProgramversion *****************************************
1003 **
1004 ** Get the program version member of an Ensembl Analysis.
1005 **
1006 ** @cc Bio::EnsEMBL::Analysis::program_version
1007 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1008 **
1009 ** @return [AjPStr] Program version or NULL
1010 **
1011 ** @release 6.3.0
1012 ** @@
1013 ******************************************************************************/
1014
ensAnalysisGetProgramversion(const EnsPAnalysis analysis)1015 AjPStr ensAnalysisGetProgramversion(const EnsPAnalysis analysis)
1016 {
1017 return (analysis) ? analysis->Programversion : NULL;
1018 }
1019
1020
1021
1022
1023
1024 /* @func ensAnalysisGetWebdata ************************************************
1025 **
1026 ** Get the web data member of an Ensembl Analysis.
1027 **
1028 ** @cc Bio::EnsEMBL::Analysis::web_data
1029 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1030 **
1031 ** @return [AjPStr] Web data or NULL
1032 **
1033 ** @release 6.3.0
1034 ** @@
1035 ******************************************************************************/
1036
ensAnalysisGetWebdata(const EnsPAnalysis analysis)1037 AjPStr ensAnalysisGetWebdata(const EnsPAnalysis analysis)
1038 {
1039 return (analysis) ? analysis->Webdata : NULL;
1040 }
1041
1042
1043
1044
1045 /* @section member assignment *************************************************
1046 **
1047 ** Functions for assigning members of an Ensembl Analysis object.
1048 **
1049 ** @fdata [EnsPAnalysis]
1050 **
1051 ** @nam3rule Set Set one member of an Ensembl Analysis
1052 ** @nam4rule Adaptor Set the Ensembl Analysis Adaptor
1053 ** @nam4rule Databasefile Set the database file
1054 ** @nam4rule Databasename Set the database name
1055 ** @nam4rule Databaseversion Set the database version
1056 ** @nam4rule Date Set a date
1057 ** @nam5rule Creation Set the date of creation
1058 ** @nam4rule Description Set the description
1059 ** @nam4rule Displayable Set the displayable flag
1060 ** @nam4rule Displaylabel Set the display label
1061 ** @nam4rule Gfffeature Set the GFF feature
1062 ** @nam4rule Gffsource Set the GFF source
1063 ** @nam4rule Identifier Set the SQL database-internal identifier
1064 ** @nam4rule Modulename Set the module name
1065 ** @nam4rule Moduleversion Set the module version
1066 ** @nam4rule Name Set the name
1067 ** @nam4rule Parameters Set the parameters
1068 ** @nam4rule Programfile Set the program file
1069 ** @nam4rule Programname Set the program name
1070 ** @nam4rule Programversion Set the program version
1071 ** @nam4rule Webdata Set the web data
1072 **
1073 ** @argrule * analysis [EnsPAnalysis] Ensembl Analysis object
1074 ** @argrule Adaptor aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
1075 ** @argrule Databasefile databasefile [AjPStr] Database file
1076 ** @argrule Databasename databasename [AjPStr] Database name
1077 ** @argrule Databaseversion databaseversion [AjPStr] Database version
1078 ** @argrule DateCreation cdate [AjPStr] Creation date
1079 ** @argrule Description description [AjPStr] Description
1080 ** @argrule Displayable displayable [AjBool] Displayable flag
1081 ** @argrule Displaylabel displaylabel [AjPStr] Display label
1082 ** @argrule Gfffeature gfffeature [AjPStr] GFF feature
1083 ** @argrule Gffsource gffsource [AjPStr] GFF source
1084 ** @argrule Identifier identifier [ajuint] SQL database-internal identifier
1085 ** @argrule Modulename modulename [AjPStr] Module name
1086 ** @argrule Moduleversion moduleversion [AjPStr] Module version
1087 ** @argrule Name name [AjPStr] Name
1088 ** @argrule Parameters parameters [AjPStr] Parameters
1089 ** @argrule Programfile programfile [AjPStr] Program file
1090 ** @argrule Programname programname [AjPStr] Program name
1091 ** @argrule Programversion programversion [AjPStr] Program version
1092 ** @argrule Webdata webdata [AjPStr] Web data
1093 **
1094 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1095 **
1096 ** @fcategory modify
1097 ******************************************************************************/
1098
1099
1100
1101
1102 /* @func ensAnalysisSetAdaptor ************************************************
1103 **
1104 ** Set the Ensembl Analysis Adaptor member of an Ensembl Analysis.
1105 **
1106 ** @cc Bio::EnsEMBL::Storable::adaptor
1107 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1108 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
1109 **
1110 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1111 **
1112 ** @release 6.2.0
1113 ** @@
1114 ******************************************************************************/
1115
ensAnalysisSetAdaptor(EnsPAnalysis analysis,EnsPAnalysisadaptor aa)1116 AjBool ensAnalysisSetAdaptor(EnsPAnalysis analysis,
1117 EnsPAnalysisadaptor aa)
1118 {
1119 if (!analysis)
1120 return ajFalse;
1121
1122 analysis->Adaptor = aa;
1123
1124 return ajTrue;
1125 }
1126
1127
1128
1129
1130 /* @func ensAnalysisSetDatabasefile *******************************************
1131 **
1132 ** Set the database file member of an Ensembl Analysis.
1133 **
1134 ** @cc Bio::EnsEMBL::Analysis::db_file
1135 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1136 ** @param [u] databasefile [AjPStr] Database file
1137 **
1138 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1139 **
1140 ** @release 6.3.0
1141 ** @@
1142 ******************************************************************************/
1143
ensAnalysisSetDatabasefile(EnsPAnalysis analysis,AjPStr databasefile)1144 AjBool ensAnalysisSetDatabasefile(EnsPAnalysis analysis,
1145 AjPStr databasefile)
1146 {
1147 if (!analysis)
1148 return ajFalse;
1149
1150 ajStrDel(&analysis->Databasefile);
1151
1152 analysis->Databasefile = ajStrNewRef(databasefile);
1153
1154 return ajTrue;
1155 }
1156
1157
1158
1159
1160 /* @func ensAnalysisSetDatabasename *******************************************
1161 **
1162 ** Set the database name member of an Ensembl Analysis.
1163 **
1164 ** @cc Bio::EnsEMBL::Analysis::db
1165 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1166 ** @param [u] databasename [AjPStr] Database name
1167 **
1168 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1169 **
1170 ** @release 6.3.0
1171 ** @@
1172 ******************************************************************************/
1173
ensAnalysisSetDatabasename(EnsPAnalysis analysis,AjPStr databasename)1174 AjBool ensAnalysisSetDatabasename(EnsPAnalysis analysis,
1175 AjPStr databasename)
1176 {
1177 if (!analysis)
1178 return ajFalse;
1179
1180 ajStrDel(&analysis->Databasename);
1181
1182 analysis->Databasename = ajStrNewRef(databasename);
1183
1184 return ajTrue;
1185 }
1186
1187
1188
1189
1190 /* @func ensAnalysisSetDatabaseversion ****************************************
1191 **
1192 ** Set the database version member of an Ensembl Analysis.
1193 **
1194 ** @cc Bio::EnsEMBL::Analysis::db_version
1195 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1196 ** @param [u] databaseversion [AjPStr] Database version
1197 **
1198 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1199 **
1200 ** @release 6.3.0
1201 ** @@
1202 ******************************************************************************/
1203
ensAnalysisSetDatabaseversion(EnsPAnalysis analysis,AjPStr databaseversion)1204 AjBool ensAnalysisSetDatabaseversion(EnsPAnalysis analysis,
1205 AjPStr databaseversion)
1206 {
1207 if (!analysis)
1208 return ajFalse;
1209
1210 ajStrDel(&analysis->Databaseversion);
1211
1212 analysis->Databaseversion = ajStrNewRef(databaseversion);
1213
1214 return ajTrue;
1215 }
1216
1217
1218
1219
1220 /* @func ensAnalysisSetDateCreation *******************************************
1221 **
1222 ** Set the date of creation member of an Ensembl Analysis.
1223 **
1224 ** @cc Bio::EnsEMBL::Analysis::created
1225 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1226 ** @param [u] cdate [AjPStr] Creation date
1227 **
1228 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1229 **
1230 ** @release 6.4.0
1231 ** @@
1232 ******************************************************************************/
1233
ensAnalysisSetDateCreation(EnsPAnalysis analysis,AjPStr cdate)1234 AjBool ensAnalysisSetDateCreation(EnsPAnalysis analysis,
1235 AjPStr cdate)
1236 {
1237 if (!analysis)
1238 return ajFalse;
1239
1240 ajStrDel(&analysis->DateCreation);
1241
1242 analysis->DateCreation = ajStrNewRef(cdate);
1243
1244 return ajTrue;
1245 }
1246
1247
1248
1249
1250 /* @func ensAnalysisSetDescription ********************************************
1251 **
1252 ** Set the description member of an Ensembl Analysis.
1253 **
1254 ** @cc Bio::EnsEMBL::Analysis::description
1255 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1256 ** @param [u] description [AjPStr] Description
1257 **
1258 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1259 **
1260 ** @release 6.2.0
1261 ** @@
1262 ******************************************************************************/
1263
ensAnalysisSetDescription(EnsPAnalysis analysis,AjPStr description)1264 AjBool ensAnalysisSetDescription(EnsPAnalysis analysis,
1265 AjPStr description)
1266 {
1267 if (!analysis)
1268 return ajFalse;
1269
1270 ajStrDel(&analysis->Description);
1271
1272 analysis->Description = ajStrNewRef(description);
1273
1274 return ajTrue;
1275 }
1276
1277
1278
1279
1280 /* @func ensAnalysisSetDisplayable ********************************************
1281 **
1282 ** Set the displayable member of an Ensembl Analysis.
1283 **
1284 ** @cc Bio::EnsEMBL::Analysis::displayable
1285 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1286 ** @param [r] displayable [AjBool] Displayable flag
1287 **
1288 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1289 **
1290 ** @release 6.2.0
1291 ** @@
1292 ******************************************************************************/
1293
ensAnalysisSetDisplayable(EnsPAnalysis analysis,AjBool displayable)1294 AjBool ensAnalysisSetDisplayable(EnsPAnalysis analysis,
1295 AjBool displayable)
1296 {
1297 if (!analysis)
1298 return ajFalse;
1299
1300 analysis->Displayable = displayable;
1301
1302 return ajTrue;
1303 }
1304
1305
1306
1307
1308 /* @func ensAnalysisSetDisplaylabel *******************************************
1309 **
1310 ** Set the display label member of an Ensembl Analysis.
1311 **
1312 ** @cc Bio::EnsEMBL::Analysis::display_label
1313 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1314 ** @param [u] displaylabel [AjPStr] Display label
1315 **
1316 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1317 **
1318 ** @release 6.3.0
1319 ** @@
1320 ******************************************************************************/
1321
ensAnalysisSetDisplaylabel(EnsPAnalysis analysis,AjPStr displaylabel)1322 AjBool ensAnalysisSetDisplaylabel(EnsPAnalysis analysis,
1323 AjPStr displaylabel)
1324 {
1325 if (!analysis)
1326 return ajFalse;
1327
1328 ajStrDel(&analysis->Displaylabel);
1329
1330 analysis->Displaylabel = ajStrNewRef(displaylabel);
1331
1332 return ajTrue;
1333 }
1334
1335
1336
1337
1338 /* @func ensAnalysisSetGfffeature *********************************************
1339 **
1340 ** Set the GFF feature member of an Ensembl Analysis.
1341 **
1342 ** @cc Bio::EnsEMBL::Analysis::gff_feature
1343 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1344 ** @param [u] gfffeature [AjPStr] GFF feature
1345 **
1346 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1347 **
1348 ** @release 6.3.0
1349 ** @@
1350 ******************************************************************************/
1351
ensAnalysisSetGfffeature(EnsPAnalysis analysis,AjPStr gfffeature)1352 AjBool ensAnalysisSetGfffeature(EnsPAnalysis analysis,
1353 AjPStr gfffeature)
1354 {
1355 if (!analysis)
1356 return ajFalse;
1357
1358 ajStrDel(&analysis->Gfffeature);
1359
1360 analysis->Gfffeature = ajStrNewRef(gfffeature);
1361
1362 return ajTrue;
1363 }
1364
1365
1366
1367
1368 /* @func ensAnalysisSetGffsource **********************************************
1369 **
1370 ** Set the GFF source member of an Ensembl Analysis.
1371 **
1372 ** @cc Bio::EnsEMBL::Analysis::gff_source
1373 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1374 ** @param [u] gffsource [AjPStr] GFF source
1375 **
1376 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1377 **
1378 ** @release 6.3.0
1379 ** @@
1380 ******************************************************************************/
1381
ensAnalysisSetGffsource(EnsPAnalysis analysis,AjPStr gffsource)1382 AjBool ensAnalysisSetGffsource(EnsPAnalysis analysis,
1383 AjPStr gffsource)
1384 {
1385 if (!analysis)
1386 return ajFalse;
1387
1388 ajStrDel(&analysis->Gffsource);
1389
1390 analysis->Gffsource = ajStrNewRef(gffsource);
1391
1392 return ajTrue;
1393 }
1394
1395
1396
1397
1398 /* @func ensAnalysisSetIdentifier *********************************************
1399 **
1400 ** Set the SQL database-internal identifier member of an Ensembl Analysis.
1401 **
1402 ** @cc Bio::EnsEMBL::Storable::dbID
1403 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1404 ** @param [r] identifier [ajuint] SQL database-internal identifier
1405 **
1406 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1407 **
1408 ** @release 6.2.0
1409 ** @@
1410 ******************************************************************************/
1411
ensAnalysisSetIdentifier(EnsPAnalysis analysis,ajuint identifier)1412 AjBool ensAnalysisSetIdentifier(EnsPAnalysis analysis,
1413 ajuint identifier)
1414 {
1415 if (!analysis)
1416 return ajFalse;
1417
1418 analysis->Identifier = identifier;
1419
1420 return ajTrue;
1421 }
1422
1423
1424
1425
1426 /* @func ensAnalysisSetModulename *********************************************
1427 **
1428 ** Set the module name member of an Ensembl Analysis.
1429 **
1430 ** @cc Bio::EnsEMBL::Analysis::module
1431 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1432 ** @param [u] modulename [AjPStr] Module name
1433 **
1434 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1435 **
1436 ** @release 6.3.0
1437 ** @@
1438 ******************************************************************************/
1439
ensAnalysisSetModulename(EnsPAnalysis analysis,AjPStr modulename)1440 AjBool ensAnalysisSetModulename(EnsPAnalysis analysis,
1441 AjPStr modulename)
1442 {
1443 if (!analysis)
1444 return ajFalse;
1445
1446 ajStrDel(&analysis->Modulename);
1447
1448 analysis->Modulename = ajStrNewRef(modulename);
1449
1450 return ajTrue;
1451 }
1452
1453
1454
1455
1456 /* @func ensAnalysisSetModuleversion ******************************************
1457 **
1458 ** Set the module version member of an Ensembl Analysis.
1459 **
1460 ** @cc Bio::EnsEMBL::Analysis::module_version
1461 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1462 ** @param [u] moduleversion [AjPStr] Module version
1463 **
1464 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1465 **
1466 ** @release 6.3.0
1467 ** @@
1468 ******************************************************************************/
1469
ensAnalysisSetModuleversion(EnsPAnalysis analysis,AjPStr moduleversion)1470 AjBool ensAnalysisSetModuleversion(EnsPAnalysis analysis,
1471 AjPStr moduleversion)
1472 {
1473 if (!analysis)
1474 return ajFalse;
1475
1476 ajStrDel(&analysis->Moduleversion);
1477
1478 analysis->Moduleversion = ajStrNewRef(moduleversion);
1479
1480 return ajTrue;
1481 }
1482
1483
1484
1485
1486 /* @func ensAnalysisSetName ***************************************************
1487 **
1488 ** Set the name member of an Ensembl Analysis.
1489 **
1490 ** @cc Bio::EnsEMBL::Analysis::logic_name
1491 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1492 ** @param [u] name [AjPStr] Name
1493 **
1494 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1495 **
1496 ** @release 6.2.0
1497 ** @@
1498 ******************************************************************************/
1499
ensAnalysisSetName(EnsPAnalysis analysis,AjPStr name)1500 AjBool ensAnalysisSetName(EnsPAnalysis analysis,
1501 AjPStr name)
1502 {
1503 if (!analysis)
1504 return ajFalse;
1505
1506 ajStrDel(&analysis->Name);
1507
1508 analysis->Name = ajStrNewRef(name);
1509
1510 return ajTrue;
1511 }
1512
1513
1514
1515
1516 /* @func ensAnalysisSetParameters *********************************************
1517 **
1518 ** Set the parameters member of an Ensembl Analysis.
1519 **
1520 ** @cc Bio::EnsEMBL::Analysis::parameters
1521 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1522 ** @param [u] parameters [AjPStr] Parameters
1523 **
1524 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1525 **
1526 ** @release 6.2.0
1527 ** @@
1528 ******************************************************************************/
1529
ensAnalysisSetParameters(EnsPAnalysis analysis,AjPStr parameters)1530 AjBool ensAnalysisSetParameters(EnsPAnalysis analysis,
1531 AjPStr parameters)
1532 {
1533 if (!analysis)
1534 return ajFalse;
1535
1536 ajStrDel(&analysis->Parameters);
1537
1538 analysis->Parameters = ajStrNewRef(parameters);
1539
1540 return ajTrue;
1541 }
1542
1543
1544
1545
1546 /* @func ensAnalysisSetProgramfile ********************************************
1547 **
1548 ** Set the program file member of an Ensembl Analysis.
1549 **
1550 ** @cc Bio::EnsEMBL::Analysis::program_file
1551 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1552 ** @param [u] programfile [AjPStr] Program file
1553 **
1554 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1555 **
1556 ** @release 6.3.0
1557 ** @@
1558 ******************************************************************************/
1559
ensAnalysisSetProgramfile(EnsPAnalysis analysis,AjPStr programfile)1560 AjBool ensAnalysisSetProgramfile(EnsPAnalysis analysis,
1561 AjPStr programfile)
1562 {
1563 if (!analysis)
1564 return ajFalse;
1565
1566 ajStrDel(&analysis->Programfile);
1567
1568 analysis->Programfile = ajStrNewRef(programfile);
1569
1570 return ajTrue;
1571 }
1572
1573
1574
1575
1576 /* @func ensAnalysisSetProgramname ********************************************
1577 **
1578 ** Set the program name member of an Ensembl Analysis.
1579 **
1580 ** @cc Bio::EnsEMBL::Analysis::program
1581 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1582 ** @param [u] programname [AjPStr] Program name
1583 **
1584 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1585 **
1586 ** @release 6.3.0
1587 ** @@
1588 ******************************************************************************/
1589
ensAnalysisSetProgramname(EnsPAnalysis analysis,AjPStr programname)1590 AjBool ensAnalysisSetProgramname(EnsPAnalysis analysis,
1591 AjPStr programname)
1592 {
1593 if (!analysis)
1594 return ajFalse;
1595
1596 ajStrDel(&analysis->Programname);
1597
1598 analysis->Programname = ajStrNewRef(programname);
1599
1600 return ajTrue;
1601 }
1602
1603
1604
1605
1606 /* @func ensAnalysisSetProgramversion *****************************************
1607 **
1608 ** Set the program version member of an Ensembl Analysis.
1609 **
1610 ** @cc Bio::EnsEMBL::Analysis::program_version
1611 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1612 ** @param [u] programversion [AjPStr] Program version
1613 **
1614 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1615 **
1616 ** @release 6.3.0
1617 ** @@
1618 ******************************************************************************/
1619
ensAnalysisSetProgramversion(EnsPAnalysis analysis,AjPStr programversion)1620 AjBool ensAnalysisSetProgramversion(EnsPAnalysis analysis,
1621 AjPStr programversion)
1622 {
1623 if (!analysis)
1624 return ajFalse;
1625
1626 ajStrDel(&analysis->Programversion);
1627
1628 analysis->Programversion = ajStrNewRef(programversion);
1629
1630 return ajTrue;
1631 }
1632
1633
1634
1635
1636 /* @func ensAnalysisSetWebdata ************************************************
1637 **
1638 ** Set the web data member of an Ensembl Analysis.
1639 **
1640 ** @cc Bio::EnsEMBL::Analysis::web_data
1641 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1642 ** @param [u] webdata [AjPStr] Web data
1643 **
1644 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1645 **
1646 ** @release 6.3.0
1647 ** @@
1648 ******************************************************************************/
1649
ensAnalysisSetWebdata(EnsPAnalysis analysis,AjPStr webdata)1650 AjBool ensAnalysisSetWebdata(EnsPAnalysis analysis,
1651 AjPStr webdata)
1652 {
1653 if (!analysis)
1654 return ajFalse;
1655
1656 ajStrDel(&analysis->Webdata);
1657
1658 analysis->Webdata = ajStrNewRef(webdata);
1659
1660 return ajTrue;
1661 }
1662
1663
1664
1665
1666 /* @section debugging *********************************************************
1667 **
1668 ** Functions for reporting of an Ensembl Analysis object.
1669 **
1670 ** @fdata [EnsPAnalysis]
1671 **
1672 ** @nam3rule Trace Report Ensembl Analysis members to debug file.
1673 **
1674 ** @argrule Trace analysis [const EnsPAnalysis] Ensembl Analysis
1675 ** @argrule Trace level [ajuint] Indentation level
1676 **
1677 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1678 **
1679 ** @fcategory misc
1680 ******************************************************************************/
1681
1682
1683
1684
1685 /* @func ensAnalysisTrace *****************************************************
1686 **
1687 ** Trace an Ensembl Analysis.
1688 **
1689 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1690 ** @param [r] level [ajuint] Indentation level
1691 **
1692 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1693 **
1694 ** @release 6.2.0
1695 ** @@
1696 ******************************************************************************/
1697
ensAnalysisTrace(const EnsPAnalysis analysis,ajuint level)1698 AjBool ensAnalysisTrace(const EnsPAnalysis analysis, ajuint level)
1699 {
1700 AjPStr indent = NULL;
1701
1702 if (!analysis)
1703 return ajFalse;
1704
1705 indent = ajStrNew();
1706
1707 ajStrAppendCountK(&indent, ' ', level * 2);
1708
1709 ajDebug("%SensAnalysisTrace %p\n"
1710 "%S Use %u\n"
1711 "%S Identifier %u\n"
1712 "%S Adaptor %p\n"
1713 "%S DateCreation '%S'\n"
1714 "%S Name '%S'\n"
1715 "%S Databasename '%S'\n"
1716 "%S Databaseversion '%S'\n"
1717 "%S Databasefile '%S'\n"
1718 "%S Programname '%S'\n"
1719 "%S Programversion '%S'\n"
1720 "%S Programfile '%S'\n"
1721 "%S Parameters '%S'\n"
1722 "%S Modulename '%S'\n"
1723 "%S Moduleversion '%S'\n"
1724 "%S Gffsource '%S'\n"
1725 "%S Gfffeature '%S'\n"
1726 "%S Description %p\n"
1727 "%S Displaylabel '%S'\n"
1728 "%S Displayable '%B'\n"
1729 "%S Webdata %p\n",
1730 indent, analysis,
1731 indent, analysis->Use,
1732 indent, analysis->Identifier,
1733 indent, analysis->Adaptor,
1734 indent, analysis->DateCreation,
1735 indent, analysis->Name,
1736 indent, analysis->Databasename,
1737 indent, analysis->Databaseversion,
1738 indent, analysis->Databasefile,
1739 indent, analysis->Programname,
1740 indent, analysis->Programversion,
1741 indent, analysis->Programfile,
1742 indent, analysis->Parameters,
1743 indent, analysis->Modulename,
1744 indent, analysis->Moduleversion,
1745 indent, analysis->Gffsource,
1746 indent, analysis->Gfffeature,
1747 indent, analysis->Description,
1748 indent, analysis->Displaylabel,
1749 indent, analysis->Displayable,
1750 indent, analysis->Webdata);
1751
1752 ajStrDel(&indent);
1753
1754 return ajTrue;
1755 }
1756
1757
1758
1759
1760 /* @section calculate *********************************************************
1761 **
1762 ** Functions for calculating information from an Ensembl Analysis object.
1763 **
1764 ** @fdata [EnsPAnalysis]
1765 **
1766 ** @nam3rule Calculate Calculate Ensembl Analysis information
1767 ** @nam4rule Memsize Calculate the memory size in bytes
1768 **
1769 ** @argrule * analysis [const EnsPAnalysis] Ensembl Analysis
1770 **
1771 ** @valrule Memsize [size_t] Memory size in bytes or 0
1772 **
1773 ** @fcategory misc
1774 ******************************************************************************/
1775
1776
1777
1778
1779 /* @func ensAnalysisCalculateMemsize ******************************************
1780 **
1781 ** Get the memory size in bytes of an Ensembl Analysis.
1782 **
1783 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1784 **
1785 ** @return [size_t] Memory size in bytes or 0
1786 **
1787 ** @release 6.4.0
1788 ** @@
1789 ******************************************************************************/
1790
ensAnalysisCalculateMemsize(const EnsPAnalysis analysis)1791 size_t ensAnalysisCalculateMemsize(const EnsPAnalysis analysis)
1792 {
1793 size_t size = 0;
1794
1795 if (!analysis)
1796 return 0;
1797
1798 size += sizeof (EnsOAnalysis);
1799
1800 if (analysis->DateCreation)
1801 {
1802 size += sizeof (AjOStr);
1803
1804 size += ajStrGetRes(analysis->DateCreation);
1805 }
1806
1807 if (analysis->Name)
1808 {
1809 size += sizeof (AjOStr);
1810
1811 size += ajStrGetRes(analysis->Name);
1812 }
1813
1814 if (analysis->Databasename)
1815 {
1816 size += sizeof (AjOStr);
1817
1818 size += ajStrGetRes(analysis->Databasename);
1819 }
1820
1821 if (analysis->Databaseversion)
1822 {
1823 size += sizeof (AjOStr);
1824
1825 size += ajStrGetRes(analysis->Databaseversion);
1826 }
1827
1828 if (analysis->Databasefile)
1829 {
1830 size += sizeof (AjOStr);
1831
1832 size += ajStrGetRes(analysis->Databasefile);
1833 }
1834
1835 if (analysis->Programname)
1836 {
1837 size += sizeof (AjOStr);
1838
1839 size += ajStrGetRes(analysis->Programname);
1840 }
1841
1842 if (analysis->Programversion)
1843 {
1844 size += sizeof (AjOStr);
1845
1846 size += ajStrGetRes(analysis->Programversion);
1847 }
1848
1849 if (analysis->Programfile)
1850 {
1851 size += sizeof (AjOStr);
1852
1853 size += ajStrGetRes(analysis->Programfile);
1854 }
1855
1856 if (analysis->Parameters)
1857 {
1858 size += sizeof (AjOStr);
1859
1860 size += ajStrGetRes(analysis->Parameters);
1861 }
1862
1863 if (analysis->Modulename)
1864 {
1865 size += sizeof (AjOStr);
1866
1867 size += ajStrGetRes(analysis->Modulename);
1868 }
1869
1870 if (analysis->Moduleversion)
1871 {
1872 size += sizeof (AjOStr);
1873
1874 size += ajStrGetRes(analysis->Moduleversion);
1875 }
1876
1877 if (analysis->Gffsource)
1878 {
1879 size += sizeof (AjOStr);
1880
1881 size += ajStrGetRes(analysis->Gffsource);
1882 }
1883
1884 if (analysis->Gfffeature)
1885 {
1886 size += sizeof (AjOStr);
1887
1888 size += ajStrGetRes(analysis->Gfffeature);
1889 }
1890
1891 if (analysis->Description)
1892 {
1893 size += sizeof (AjOStr);
1894
1895 size += ajStrGetRes(analysis->Description);
1896 }
1897
1898 if (analysis->Displaylabel)
1899 {
1900 size += sizeof (AjOStr);
1901
1902 size += ajStrGetRes(analysis->Displaylabel);
1903 }
1904
1905 if (analysis->Webdata)
1906 {
1907 size += sizeof (AjOStr);
1908
1909 size += ajStrGetRes(analysis->Webdata);
1910 }
1911
1912 return size;
1913 }
1914
1915
1916
1917
1918 /* @section testing properties ************************************************
1919 **
1920 ** @fdata [EnsPAnalysis]
1921 **
1922 ** @nam3rule Is Test an Ensembl Analysis property
1923 ** @nam4rule Database Ensembl Analysis is based on a database
1924 **
1925 ** @argrule Is analysis [const EnsPAnalysis] Ensembl Analysis
1926 **
1927 ** @valrule * [AjBool] Ensembl Analysis boolean property
1928 **
1929 ** @fcategory use
1930 ******************************************************************************/
1931
1932
1933
1934
1935 /* @func ensAnalysisIsDatabase ************************************************
1936 **
1937 ** Test whether an Ensembl Analysis is based on a database.
1938 **
1939 ** @cc Bio::EnsEMBL::Analysis::has_database
1940 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1941 **
1942 ** @return [AjBool]
1943 ** ajTrue if the Ensembl Analysis was defined and has a database attached
1944 **
1945 ** @release 6.2.0
1946 ** @@
1947 ******************************************************************************/
1948
ensAnalysisIsDatabase(const EnsPAnalysis analysis)1949 AjBool ensAnalysisIsDatabase(const EnsPAnalysis analysis)
1950 {
1951 if (!analysis)
1952 return ajFalse;
1953
1954 if (analysis->Databasename && ajStrGetLen(analysis->Databasename))
1955 return ajTrue;
1956 else
1957 return ajFalse;
1958 }
1959
1960
1961
1962
1963 /* @section comparison ********************************************************
1964 **
1965 ** Functions for comparing Ensembl Analysis objects
1966 **
1967 ** @fdata [EnsPAnalysis]
1968 **
1969 ** @nam3rule Match Compare two Ensembl Analysis objects
1970 **
1971 ** @argrule * analysis1 [const EnsPAnalysis] Ensembl Analysis
1972 ** @argrule * analysis2 [const EnsPAnalysis] Ensembl Analysis
1973 **
1974 ** @valrule * [AjBool] ajTrue if the Ensembl Analysis objects are equal
1975 **
1976 ** @fcategory use
1977 ******************************************************************************/
1978
1979
1980
1981
1982 /* @func ensAnalysisMatch *****************************************************
1983 **
1984 ** Test for matching two Ensembl Analysis objects.
1985 **
1986 ** @cc Bio::EnsEMBL::Analysis::compare
1987 ** @param [r] analysis1 [const EnsPAnalysis] First Ensembl Analysis
1988 ** @param [r] analysis2 [const EnsPAnalysis] Second Ensembl Analysis
1989 **
1990 ** @return [AjBool] ajTrue if the Ensembl Analysis objects are equal
1991 **
1992 ** @release 6.2.0
1993 ** @@
1994 ** The comparison is based on an initial pointer equality test and if that
1995 ** fails, a case-insensitive string comparison of the name and version members
1996 ** is performed.
1997 ******************************************************************************/
1998
ensAnalysisMatch(const EnsPAnalysis analysis1,const EnsPAnalysis analysis2)1999 AjBool ensAnalysisMatch(const EnsPAnalysis analysis1,
2000 const EnsPAnalysis analysis2)
2001 {
2002 if (ajDebugTest("ensAnalysisMatch"))
2003 ajDebug("ensAnalysisMatch\n"
2004 " analysis1 %p\n"
2005 " analysis2 %p\n",
2006 analysis1,
2007 analysis2);
2008
2009 if (!analysis1)
2010 return ajFalse;
2011
2012 if (!analysis2)
2013 return ajFalse;
2014
2015 if (analysis1 == analysis2)
2016 return ajTrue;
2017
2018 if (!ajStrMatchCaseS(analysis1->Name,
2019 analysis2->Name))
2020 return ajFalse;
2021
2022 if (!ajStrMatchCaseS(analysis1->Databasename,
2023 analysis2->Databasename))
2024 return ajFalse;
2025
2026 if (!ajStrMatchCaseS(analysis1->Databaseversion,
2027 analysis2->Databaseversion))
2028 return ajFalse;
2029
2030 if (!ajStrMatchCaseS(analysis1->Databasefile,
2031 analysis2->Databasefile))
2032 return ajFalse;
2033
2034 if (!ajStrMatchCaseS(analysis1->Programname,
2035 analysis2->Programname))
2036 return ajFalse;
2037
2038 if (!ajStrMatchCaseS(analysis1->Programversion,
2039 analysis2->Programversion))
2040 return ajFalse;
2041
2042 if (!ajStrMatchCaseS(analysis1->Programfile,
2043 analysis2->Programfile))
2044 return ajFalse;
2045
2046 if (!ajStrMatchCaseS(analysis1->Parameters,
2047 analysis2->Parameters))
2048 return ajFalse;
2049
2050 if (!ajStrMatchCaseS(analysis1->Modulename,
2051 analysis2->Modulename))
2052 return ajFalse;
2053
2054 if (!ajStrMatchCaseS(analysis1->Moduleversion,
2055 analysis2->Moduleversion))
2056 return ajFalse;
2057
2058 if (!ajStrMatchCaseS(analysis1->Gffsource,
2059 analysis2->Gffsource))
2060 return ajFalse;
2061
2062 if (!ajStrMatchCaseS(analysis1->Gfffeature,
2063 analysis2->Gfffeature))
2064 return ajFalse;
2065
2066 return ajTrue;
2067 }
2068
2069
2070
2071
2072 /* @datasection [AjPList] AJAX List *******************************************
2073 **
2074 ** @nam2rule List Functions for manipulating AJAX List objects
2075 **
2076 ******************************************************************************/
2077
2078
2079
2080
2081 /* @funcstatic listAnalysisCompareIdentifierAscending *************************
2082 **
2083 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2084 ** Ensembl Analysis identifier in ascending order.
2085 **
2086 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2087 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2088 ** @see ajListSort
2089 **
2090 ** @return [int] The comparison function returns an integer less than,
2091 ** equal to, or greater than zero if the first argument is
2092 ** considered to be respectively less than, equal to, or
2093 ** greater than the second.
2094 **
2095 ** @release 6.4.0
2096 ** @@
2097 ******************************************************************************/
2098
listAnalysisCompareIdentifierAscending(const void * item1,const void * item2)2099 static int listAnalysisCompareIdentifierAscending(
2100 const void *item1,
2101 const void *item2)
2102 {
2103 EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2104 EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2105
2106 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2107 if (ajDebugTest("listAnalysisCompareIdentifierAscending"))
2108 ajDebug("listAnalysisCompareIdentifierAscending\n"
2109 " analysis1 %p\n"
2110 " analysis2 %p\n",
2111 analysis1,
2112 analysis2);
2113 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2114
2115 /* Sort empty values towards the end of the AJAX List. */
2116
2117 if (analysis1 && (!analysis2))
2118 return -1;
2119
2120 if ((!analysis1) && (!analysis2))
2121 return 0;
2122
2123 if ((!analysis1) && analysis2)
2124 return +1;
2125
2126 if (analysis1->Identifier < analysis2->Identifier)
2127 return -1;
2128
2129 if (analysis1->Identifier > analysis2->Identifier)
2130 return +1;
2131
2132 return 0;
2133 }
2134
2135
2136
2137
2138 /* @funcstatic listAnalysisCompareIdentifierDescending ************************
2139 **
2140 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2141 ** Ensembl Analysis identifier in descending order.
2142 **
2143 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2144 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2145 ** @see ajListSort
2146 **
2147 ** @return [int] The comparison function returns an integer less than,
2148 ** equal to, or greater than zero if the first argument is
2149 ** considered to be respectively less than, equal to, or
2150 ** greater than the second.
2151 **
2152 ** @release 6.4.0
2153 ** @@
2154 ******************************************************************************/
2155
listAnalysisCompareIdentifierDescending(const void * item1,const void * item2)2156 static int listAnalysisCompareIdentifierDescending(
2157 const void *item1,
2158 const void *item2)
2159 {
2160 EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2161 EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2162
2163 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2164 if (ajDebugTest("listAnalysisCompareIdentifierDescending"))
2165 ajDebug("listAnalysisCompareIdentifierDescending\n"
2166 " analysis1 %p\n"
2167 " analysis2 %p\n",
2168 analysis1,
2169 analysis2);
2170 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2171
2172 /* Sort empty values towards the end of the AJAX List. */
2173
2174 if (analysis1 && (!analysis2))
2175 return -1;
2176
2177 if ((!analysis1) && (!analysis2))
2178 return 0;
2179
2180 if ((!analysis1) && analysis2)
2181 return +1;
2182
2183 if (analysis1->Identifier > analysis2->Identifier)
2184 return -1;
2185
2186 if (analysis1->Identifier < analysis2->Identifier)
2187 return +1;
2188
2189 return 0;
2190 }
2191
2192
2193
2194
2195 /* @funcstatic listAnalysisCompareNameAscending *******************************
2196 **
2197 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2198 ** Ensembl Analysis name in ascending order.
2199 **
2200 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2201 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2202 ** @see ajListSort
2203 **
2204 ** @return [int] The comparison function returns an integer less than,
2205 ** equal to, or greater than zero if the first argument is
2206 ** considered to be respectively less than, equal to, or
2207 ** greater than the second.
2208 **
2209 ** @release 6.4.0
2210 ** @@
2211 ******************************************************************************/
2212
listAnalysisCompareNameAscending(const void * item1,const void * item2)2213 static int listAnalysisCompareNameAscending(
2214 const void *item1,
2215 const void *item2)
2216 {
2217 EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2218 EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2219
2220 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2221 if (ajDebugTest("listAnalysisCompareNameAscending"))
2222 ajDebug("listAnalysisCompareNameAscending\n"
2223 " analysis1 %p\n"
2224 " analysis2 %p\n",
2225 analysis1,
2226 analysis2);
2227 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2228
2229 /* Sort empty values towards the end of the AJAX List. */
2230
2231 if (analysis1 && (!analysis2))
2232 return -1;
2233
2234 if ((!analysis1) && (!analysis2))
2235 return 0;
2236
2237 if ((!analysis1) && analysis2)
2238 return +1;
2239
2240 return ajStrCmpS(analysis1->Name, analysis2->Name);
2241 }
2242
2243
2244
2245
2246 /* @funcstatic listAnalysisCompareNameDescending ******************************
2247 **
2248 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2249 ** Ensembl Analysis name in descending order.
2250 **
2251 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2252 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2253 ** @see ajListSort
2254 **
2255 ** @return [int] The comparison function returns an integer less than,
2256 ** equal to, or greater than zero if the first argument is
2257 ** considered to be respectively less than, equal to, or
2258 ** greater than the second.
2259 **
2260 ** @release 6.4.0
2261 ** @@
2262 ******************************************************************************/
2263
listAnalysisCompareNameDescending(const void * item1,const void * item2)2264 static int listAnalysisCompareNameDescending(
2265 const void *item1,
2266 const void *item2)
2267 {
2268 EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2269 EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2270
2271 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2272 if (ajDebugTest("listAnalysisCompareNameDescending"))
2273 ajDebug("listAnalysisCompareNameDescending\n"
2274 " analysis1 %p\n"
2275 " analysis2 %p\n",
2276 analysis1,
2277 analysis2);
2278 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2279
2280 /* Sort empty values towards the end of the AJAX List. */
2281
2282 if (analysis1 && (!analysis2))
2283 return -1;
2284
2285 if ((!analysis1) && (!analysis2))
2286 return 0;
2287
2288 if ((!analysis1) && analysis2)
2289 return +1;
2290
2291 return -1 * ajStrCmpS(analysis1->Name, analysis2->Name);
2292 }
2293
2294
2295
2296
2297 /* @section list **************************************************************
2298 **
2299 ** Functions for manipulating AJAX List objects.
2300 **
2301 ** @fdata [AjPList]
2302 **
2303 ** @nam3rule Analysis Functions for manipulating AJAX List objects of
2304 ** Ensembl Analysis objects
2305 ** @nam4rule Sort Sort functions
2306 ** @nam5rule Identifier Sort by Ensembl Analysis identifier member
2307 ** @nam5rule Name Sort by Ensembl Analysis name member
2308 ** @nam6rule Ascending Sort in ascending order
2309 ** @nam6rule Descending Sort in descending order
2310 **
2311 ** @argrule Sort analyses [AjPList] AJAX List of Ensembl Analysis objects
2312 **
2313 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
2314 **
2315 ** @fcategory misc
2316 ******************************************************************************/
2317
2318
2319
2320
2321 /* @func ensListAnalysisSortIdentifierAscending *******************************
2322 **
2323 ** Sort an AJAX List of Ensembl Analysis objects by their
2324 ** Ensembl Analysis identifier in ascending order.
2325 **
2326 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2327 **
2328 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2329 **
2330 ** @release 6.4.0
2331 ** @@
2332 ******************************************************************************/
2333
ensListAnalysisSortIdentifierAscending(AjPList analyses)2334 AjBool ensListAnalysisSortIdentifierAscending(AjPList analyses)
2335 {
2336 if (!analyses)
2337 return ajFalse;
2338
2339 ajListSort(analyses, &listAnalysisCompareIdentifierAscending);
2340
2341 return ajTrue;
2342 }
2343
2344
2345
2346
2347 /* @func ensListAnalysisSortIdentifierDescending ******************************
2348 **
2349 ** Sort an AJAX List of Ensembl Analysis objects by their
2350 ** Ensembl Analysis identifier in descending order.
2351 **
2352 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2353 **
2354 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2355 **
2356 ** @release 6.4.0
2357 ** @@
2358 ******************************************************************************/
2359
ensListAnalysisSortIdentifierDescending(AjPList analyses)2360 AjBool ensListAnalysisSortIdentifierDescending(AjPList analyses)
2361 {
2362 if (!analyses)
2363 return ajFalse;
2364
2365 ajListSort(analyses, &listAnalysisCompareIdentifierDescending);
2366
2367 return ajTrue;
2368 }
2369
2370
2371
2372
2373 /* @func ensListAnalysisSortNameAscending *************************************
2374 **
2375 ** Sort an AJAX List of Ensembl Analysis objects by their
2376 ** Ensembl Analysis name in ascending order.
2377 **
2378 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2379 **
2380 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2381 **
2382 ** @release 6.4.0
2383 ** @@
2384 ******************************************************************************/
2385
ensListAnalysisSortNameAscending(AjPList analyses)2386 AjBool ensListAnalysisSortNameAscending(AjPList analyses)
2387 {
2388 if (!analyses)
2389 return ajFalse;
2390
2391 ajListSort(analyses, &listAnalysisCompareNameAscending);
2392
2393 return ajTrue;
2394 }
2395
2396
2397
2398
2399 /* @func ensListAnalysisSortNameDescending ************************************
2400 **
2401 ** Sort an AJAX List of Ensembl Analysis objects by their
2402 ** Ensembl Analysis name in descending order.
2403 **
2404 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2405 **
2406 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2407 **
2408 ** @release 6.4.0
2409 ** @@
2410 ******************************************************************************/
2411
ensListAnalysisSortNameDescending(AjPList analyses)2412 AjBool ensListAnalysisSortNameDescending(AjPList analyses)
2413 {
2414 if (!analyses)
2415 return ajFalse;
2416
2417 ajListSort(analyses, &listAnalysisCompareNameDescending);
2418
2419 return ajTrue;
2420 }
2421
2422
2423
2424
2425 /* @datasection [EnsPAnalysisadaptor] Ensembl Analysis Adaptor ****************
2426 **
2427 ** @nam2rule Analysisadaptor Functions for manipulating
2428 ** Ensembl Analysis Adaptor objects
2429 **
2430 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor
2431 ** @cc CVS Revision: 1.76
2432 ** @cc CVS Tag: branch-ensembl-68
2433 **
2434 ******************************************************************************/
2435
2436
2437
2438
2439 /* @funcstatic analysisadaptorFetchAllbyStatement *****************************
2440 **
2441 ** Run a SQL statement against an Ensembl Database Adaptor and consolidate the
2442 ** results into an AJAX List of Ensembl Analysis objects.
2443 **
2444 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::_objFromHashref
2445 ** @param [u] ba [EnsPBaseadaptor] Ensembl Base Adaptor
2446 ** @param [r] statement [const AjPStr] SQL statement
2447 ** @param [uN] am [EnsPAssemblymapper] Ensembl Assembly Mapper
2448 ** @param [uN] slice [EnsPSlice] Ensembl Slice
2449 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2450 **
2451 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2452 **
2453 ** @release 6.4.0
2454 ** @@
2455 ******************************************************************************/
2456
analysisadaptorFetchAllbyStatement(EnsPBaseadaptor ba,const AjPStr statement,EnsPAssemblymapper am,EnsPSlice slice,AjPList analyses)2457 static AjBool analysisadaptorFetchAllbyStatement(
2458 EnsPBaseadaptor ba,
2459 const AjPStr statement,
2460 EnsPAssemblymapper am,
2461 EnsPSlice slice,
2462 AjPList analyses)
2463 {
2464 ajuint identifier = 0U;
2465
2466 AjBool displayable = AJFALSE;
2467
2468 AjPSqlstatement sqls = NULL;
2469 AjISqlrow sqli = NULL;
2470 AjPSqlrow sqlr = NULL;
2471
2472 AjPStr cdate = NULL;
2473 AjPStr name = NULL;
2474 AjPStr databasename = NULL;
2475 AjPStr databaseversion = NULL;
2476 AjPStr databasefile = NULL;
2477 AjPStr programname = NULL;
2478 AjPStr programversion = NULL;
2479 AjPStr programfile = NULL;
2480 AjPStr parameters = NULL;
2481 AjPStr modulename = NULL;
2482 AjPStr moduleversion = NULL;
2483 AjPStr gffsource = NULL;
2484 AjPStr gfffeature = NULL;
2485 AjPStr description = NULL;
2486 AjPStr displaylabel = NULL;
2487 AjPStr webdata = NULL;
2488
2489 EnsPAnalysis analysis = NULL;
2490 EnsPAnalysisadaptor aa = NULL;
2491
2492 EnsPDatabaseadaptor dba = NULL;
2493
2494 if (ajDebugTest("analysisadaptorFetchAllbyStatement"))
2495 ajDebug("analysisadaptorFetchAllbyStatement\n"
2496 " ba %p\n"
2497 " statement %p\n"
2498 " am %p\n"
2499 " slice %p\n"
2500 " analyses %p\n",
2501 ba,
2502 statement,
2503 am,
2504 slice,
2505 analyses);
2506
2507 if (!ba)
2508 return ajFalse;
2509
2510 if (!statement)
2511 return ajFalse;
2512
2513 if (!analyses)
2514 return ajFalse;
2515
2516 dba = ensBaseadaptorGetDatabaseadaptor(ba);
2517
2518 aa = ensRegistryGetAnalysisadaptor(dba);
2519
2520 sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
2521
2522 sqli = ajSqlrowiterNew(sqls);
2523
2524 while (!ajSqlrowiterDone(sqli))
2525 {
2526 identifier = 0;
2527 cdate = ajStrNew();
2528 name = ajStrNew();
2529 databasename = ajStrNew();
2530 databaseversion = ajStrNew();
2531 databasefile = ajStrNew();
2532 programname = ajStrNew();
2533 programversion = ajStrNew();
2534 programfile = ajStrNew();
2535 parameters = ajStrNew();
2536 modulename = ajStrNew();
2537 moduleversion = ajStrNew();
2538 gffsource = ajStrNew();
2539 gfffeature = ajStrNew();
2540 description = ajStrNew();
2541 displaylabel = ajStrNew();
2542 displayable = ajFalse;
2543 webdata = ajStrNew();
2544
2545 sqlr = ajSqlrowiterGet(sqli);
2546
2547 ajSqlcolumnToUint(sqlr, &identifier);
2548 ajSqlcolumnToStr(sqlr, &cdate);
2549 ajSqlcolumnToStr(sqlr, &name);
2550 ajSqlcolumnToStr(sqlr, &databasename);
2551 ajSqlcolumnToStr(sqlr, &databaseversion);
2552 ajSqlcolumnToStr(sqlr, &databasefile);
2553 ajSqlcolumnToStr(sqlr, &programname);
2554 ajSqlcolumnToStr(sqlr, &programversion);
2555 ajSqlcolumnToStr(sqlr, &programfile);
2556 ajSqlcolumnToStr(sqlr, ¶meters);
2557 ajSqlcolumnToStr(sqlr, &modulename);
2558 ajSqlcolumnToStr(sqlr, &moduleversion);
2559 ajSqlcolumnToStr(sqlr, &gffsource);
2560 ajSqlcolumnToStr(sqlr, &gfffeature);
2561 ajSqlcolumnToStr(sqlr, &description);
2562 ajSqlcolumnToStr(sqlr, &displaylabel);
2563 ajSqlcolumnToBool(sqlr, &displayable);
2564 ajSqlcolumnToStr(sqlr, &webdata);
2565
2566 analysis = ensAnalysisNewIni(aa,
2567 identifier,
2568 cdate,
2569 name,
2570 databasename,
2571 databaseversion,
2572 databasefile,
2573 programname,
2574 programversion,
2575 programfile,
2576 parameters,
2577 modulename,
2578 moduleversion,
2579 gffsource,
2580 gfffeature,
2581 description,
2582 displaylabel,
2583 webdata,
2584 displayable);
2585
2586 ajListPushAppend(analyses, (void *) analysis);
2587
2588 ajStrDel(&cdate);
2589 ajStrDel(&name);
2590 ajStrDel(&databasename);
2591 ajStrDel(&databaseversion);
2592 ajStrDel(&databasefile);
2593 ajStrDel(&programname);
2594 ajStrDel(&programversion);
2595 ajStrDel(&programfile);
2596 ajStrDel(¶meters);
2597 ajStrDel(&modulename);
2598 ajStrDel(&moduleversion);
2599 ajStrDel(&gffsource);
2600 ajStrDel(&gfffeature);
2601 ajStrDel(&description);
2602 ajStrDel(&displaylabel);
2603 ajStrDel(&webdata);
2604 }
2605
2606 ajSqlrowiterDel(&sqli);
2607
2608 ensDatabaseadaptorSqlstatementDel(dba, &sqls);
2609
2610 return ajTrue;
2611 }
2612
2613
2614
2615
2616 /* @section constructors ******************************************************
2617 **
2618 ** All constructors return a new Ensembl Analysis Adaptor by pointer.
2619 ** It is the responsibility of the user to first destroy any previous
2620 ** Ensembl Analysis Adaptor.
2621 ** The target pointer does not need to be initialised to NULL, but it is good
2622 ** programming practice to do so anyway.
2623 **
2624 ** @fdata [EnsPAnalysisadaptor]
2625 **
2626 ** @nam3rule New Constructor
2627 **
2628 ** @argrule New dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
2629 **
2630 ** @valrule * [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
2631 **
2632 ** @fcategory new
2633 ******************************************************************************/
2634
2635
2636
2637
2638 /* @func ensAnalysisadaptorNew ************************************************
2639 **
2640 ** Default constructor for an Ensembl Analysis Adaptor.
2641 **
2642 ** Ensembl Object Adaptors are singleton objects in the sense that a single
2643 ** instance of an Ensembl Object Adaptor connected to a particular database is
2644 ** sufficient to instantiate any number of Ensembl Objects from the database.
2645 ** Each Ensembl Object will have a weak reference to the Object Adaptor that
2646 ** instantiated it. Therefore, Ensembl Object Adaptors should not be
2647 ** instantiated directly, but rather obtained from the Ensembl Registry,
2648 ** which will in turn call this function if neccessary.
2649 **
2650 ** @see ensRegistryGetDatabaseadaptor
2651 ** @see ensRegistryGetAnalysisadaptor
2652 **
2653 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::new
2654 ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
2655 **
2656 ** @return [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
2657 **
2658 ** @release 6.2.0
2659 ** @@
2660 ******************************************************************************/
2661
ensAnalysisadaptorNew(EnsPDatabaseadaptor dba)2662 EnsPAnalysisadaptor ensAnalysisadaptorNew(
2663 EnsPDatabaseadaptor dba)
2664 {
2665 EnsPAnalysisadaptor aa = NULL;
2666
2667 if (!dba)
2668 return NULL;
2669
2670 if (ajDebugTest("ensAnalysisadaptorNew"))
2671 ajDebug("ensAnalysisadaptorNew\n"
2672 " dba %p\n",
2673 dba);
2674
2675 AJNEW0(aa);
2676
2677 aa->Adaptor = ensBaseadaptorNew(
2678 dba,
2679 analysisadaptorKTablenames,
2680 analysisadaptorKColumnnames,
2681 analysisadaptorKLeftjoins,
2682 (const char *) NULL,
2683 (const char *) NULL,
2684 &analysisadaptorFetchAllbyStatement);
2685
2686 /*
2687 ** NOTE: The cache cannot be initialised here because the
2688 ** analysisadaptorCacheInit function calls
2689 ** ensBaseadaptorFetchAllbyConstraint,
2690 ** which calls analysisadaptorFetchAllbyStatement, which calls
2691 ** ensRegistryGetAnalysisadaptor. At that point, however,
2692 ** the Ensembl Analysis Adaptor has not been stored in the Registry.
2693 ** Therefore, each ensAnalysisadaptorFetch function has to test the
2694 ** presence of the adaptor-internal cache and eventually initialise
2695 ** before accessing it.
2696 **
2697 ** analysisadaptorCacheInit(aa);
2698 */
2699
2700 return aa;
2701 }
2702
2703
2704
2705
2706 /* @section cache *************************************************************
2707 **
2708 ** Functions for maintaining the Ensembl Analysis Adaptor-internal cache of
2709 ** Ensembl Analysis objects.
2710 **
2711 ** @fdata [EnsPAnalysisadaptor]
2712 **
2713 ** @nam3rule Cache Process an Ensembl Analysis Adaptor-internal cache
2714 ** @nam4rule Clear Clear the Ensembl Analysis Adaptor-internal cache
2715 **
2716 ** @argrule * aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2717 **
2718 ** @valrule * [AjBool] True on success, ajFalse otherwise
2719 **
2720 ** @fcategory use
2721 ******************************************************************************/
2722
2723
2724
2725
2726 /* @funcstatic analysisadaptorCacheInit ***************************************
2727 **
2728 ** Initialise the internal Ensembl Analysis cache of an
2729 ** Ensembl Analysis Adaptor.
2730 **
2731 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2732 **
2733 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2734 **
2735 ** @release 6.3.0
2736 ** @@
2737 ******************************************************************************/
2738
analysisadaptorCacheInit(EnsPAnalysisadaptor aa)2739 static AjBool analysisadaptorCacheInit(
2740 EnsPAnalysisadaptor aa)
2741 {
2742 AjBool result = AJFALSE;
2743
2744 AjPList analyses = NULL;
2745
2746 EnsPAnalysis analysis = NULL;
2747
2748 if (ajDebugTest("analysisadaptorCacheInit"))
2749 ajDebug("analysisadaptorCacheInit\n"
2750 " aa %p\n",
2751 aa);
2752
2753 if (!aa)
2754 return ajFalse;
2755
2756 if (aa->CacheByIdentifier)
2757 return ajFalse;
2758 else
2759 {
2760 aa->CacheByIdentifier = ajTableuintNew(0);
2761
2762 ajTableSetDestroyvalue(
2763 aa->CacheByIdentifier,
2764 (void (*)(void **)) &ensAnalysisDel);
2765 }
2766
2767 if (aa->CacheByName)
2768 return ajFalse;
2769 else
2770 {
2771 aa->CacheByName = ajTablestrNew(0U);
2772
2773 ajTableSetDestroyvalue(
2774 aa->CacheByName,
2775 (void (*)(void **)) &ensAnalysisDel);
2776 }
2777
2778 analyses = ajListNew();
2779
2780 result = ensBaseadaptorFetchAllbyConstraint(
2781 ensAnalysisadaptorGetBaseadaptor(aa),
2782 (const AjPStr) NULL,
2783 (EnsPAssemblymapper) NULL,
2784 (EnsPSlice) NULL,
2785 analyses);
2786
2787 while (ajListPop(analyses, (void **) &analysis))
2788 {
2789 analysisadaptorCacheInsert(aa, &analysis);
2790
2791 /*
2792 ** Both caches hold internal references to the
2793 ** Ensembl Analysis objects.
2794 */
2795
2796 ensAnalysisDel(&analysis);
2797 }
2798
2799 ajListFree(&analyses);
2800
2801 return result;
2802 }
2803
2804
2805
2806
2807 /* @funcstatic analysisadaptorCacheInsert *************************************
2808 **
2809 ** Insert an Ensembl Analysis into the Ensembl Analysis Adaptor-internal cache.
2810 ** If an Ensembl Analysis with the same name member is already present in the
2811 ** Ensembl Analysis Adaptor-internal cache, the Ensembl Analysis is deleted and
2812 ** a pointer to the cached Ensembl Analysis is returned.
2813 **
2814 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2815 ** @param [u] Panalysis [EnsPAnalysis*] Ensembl Analysis address
2816 **
2817 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2818 **
2819 ** @release 6.3.0
2820 ** @@
2821 ******************************************************************************/
2822
analysisadaptorCacheInsert(EnsPAnalysisadaptor aa,EnsPAnalysis * Panalysis)2823 static AjBool analysisadaptorCacheInsert(
2824 EnsPAnalysisadaptor aa,
2825 EnsPAnalysis *Panalysis)
2826 {
2827 ajuint *Pidentifier = NULL;
2828
2829 EnsPAnalysis analysis1 = NULL;
2830 EnsPAnalysis analysis2 = NULL;
2831
2832 if (!aa)
2833 return ajFalse;
2834
2835 if (!aa->CacheByIdentifier)
2836 return ajFalse;
2837
2838 if (!aa->CacheByName)
2839 return ajFalse;
2840
2841 if (!Panalysis)
2842 return ajFalse;
2843
2844 if (!*Panalysis)
2845 return ajFalse;
2846
2847 /* Search the identifer cache. */
2848
2849 analysis1 = (EnsPAnalysis) ajTableFetchmodV(
2850 aa->CacheByIdentifier,
2851 (const void *) &((*Panalysis)->Identifier));
2852
2853 /* Search the name cache. */
2854
2855 analysis2 = (EnsPAnalysis) ajTableFetchmodS(
2856 aa->CacheByName,
2857 (*Panalysis)->Name);
2858
2859 if ((!analysis1) && (!analysis2))
2860 {
2861 /* Insert into the identifier cache. */
2862
2863 AJNEW0(Pidentifier);
2864
2865 *Pidentifier = (*Panalysis)->Identifier;
2866
2867 ajTablePut(aa->CacheByIdentifier,
2868 (void *) Pidentifier,
2869 (void *) ensAnalysisNewRef(*Panalysis));
2870
2871 /* Insert into the name cache. */
2872
2873 ajTablePut(aa->CacheByName,
2874 (void *) ajStrNewS((*Panalysis)->Name),
2875 (void *) ensAnalysisNewRef(*Panalysis));
2876 }
2877
2878 if (analysis1 && analysis2 && (analysis1 == analysis2))
2879 {
2880 ajDebug("analysisadaptorCacheInsert replaced Ensembl Analysis %p "
2881 "with one already cached %p.\n",
2882 *Panalysis, analysis1);
2883
2884 ensAnalysisDel(Panalysis);
2885
2886 ensAnalysisNewRef(analysis1);
2887
2888 Panalysis = &analysis1;
2889 }
2890
2891 if (analysis1 && analysis2 && (analysis1 != analysis2))
2892 ajDebug("analysisadaptorCacheInsert detected Ensembl Analysis objects "
2893 "in the identifier and name cache with identical names "
2894 "('%S' and '%S') but different addresses (%p and %p).\n",
2895 analysis1->Name, analysis2->Name, analysis1, analysis2);
2896
2897 if (analysis1 && (!analysis2))
2898 ajDebug("analysisadaptorCacheInsert detected an Ensembl Analysis "
2899 "in the identifier, but not in the name cache.\n");
2900
2901 if ((!analysis1) && analysis2)
2902 ajDebug("analysisadaptorCacheInsert detected an Ensembl Analysis "
2903 "in the name, but not in the identifier cache.\n");
2904
2905 return ajTrue;
2906 }
2907
2908
2909
2910
2911 #if AJFALSE
2912 /* @funcstatic analysisadaptorCacheRemove *************************************
2913 **
2914 ** Remove an Ensembl Analysis from the Ensembl Analysis Adaptor-internal cache.
2915 **
2916 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2917 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
2918 **
2919 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2920 **
2921 ** @release 6.3.0
2922 ** @@
2923 ******************************************************************************/
2924
analysisadaptorCacheRemove(EnsPAnalysisadaptor aa,EnsPAnalysis analysis)2925 static AjBool analysisadaptorCacheRemove(
2926 EnsPAnalysisadaptor aa,
2927 EnsPAnalysis analysis)
2928 {
2929 EnsPAnalysis analysis1 = NULL;
2930 EnsPAnalysis analysis2 = NULL;
2931
2932 if (!aa)
2933 return ajFalse;
2934
2935 if (!analysis)
2936 return ajFalse;
2937
2938 analysis1 = (EnsPAnalysis) ajTableRemove(
2939 aa->CacheByIdentifier,
2940 (const void *) &analysis->Identifier);
2941
2942 analysis2 = (EnsPAnalysis) ajTableRemove(
2943 aa->CacheByName,
2944 (const void *) analysis->Name);
2945
2946 if (analysis1 && (!analysis2))
2947 ajWarn("analysisadaptorCacheRemove could remove Ensembl Analysis with "
2948 "identifier %u and name '%S' only from the identifier cache.\n",
2949 analysis->Identifier,
2950 analysis->Name);
2951
2952 if ((!analysis1) && analysis2)
2953 ajWarn("analysisadaptorCacheRemove could remove Ensembl Analysis with "
2954 "identifier %u and name '%S' only from the name cache.\n",
2955 analysis->Identifier,
2956 analysis->Name);
2957
2958 ensAnalysisDel(&analysis1);
2959 ensAnalysisDel(&analysis2);
2960
2961 return ajTrue;
2962 }
2963
2964 #endif /* AJFALSE */
2965
2966
2967
2968
2969 /* @func ensAnalysisadaptorCacheClear *****************************************
2970 **
2971 ** Clear the Ensembl Analysis Adaptor-internal cache of
2972 ** Ensembl Analysis objects.
2973 **
2974 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2975 **
2976 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2977 **
2978 ** @release 6.4.0
2979 ** @@
2980 ******************************************************************************/
2981
ensAnalysisadaptorCacheClear(EnsPAnalysisadaptor aa)2982 AjBool ensAnalysisadaptorCacheClear(
2983 EnsPAnalysisadaptor aa)
2984 {
2985 if (!aa)
2986 return ajFalse;
2987
2988 ajTableDel(&aa->CacheByIdentifier);
2989 ajTableDel(&aa->CacheByName);
2990
2991 return ajTrue;
2992 }
2993
2994
2995
2996
2997 /* @section destructors *******************************************************
2998 **
2999 ** Destruction destroys all internal data structures and frees the memory
3000 ** allocated for an Ensembl Analysis Adaptor object.
3001 **
3002 ** @fdata [EnsPAnalysisadaptor]
3003 **
3004 ** @nam3rule Del Destroy (free) an Ensembl Analysis Adaptor
3005 **
3006 ** @argrule * Paa [EnsPAnalysisadaptor*] Ensembl Analysis Adaptor address
3007 **
3008 ** @valrule * [void]
3009 **
3010 ** @fcategory delete
3011 ******************************************************************************/
3012
3013
3014
3015
3016 /* @func ensAnalysisadaptorDel ************************************************
3017 **
3018 ** Default destructor for an Ensembl Analysis Adaptor.
3019 **
3020 ** This function also clears the internal caches.
3021 **
3022 ** Ensembl Object Adaptors are singleton objects that are registered in the
3023 ** Ensembl Registry and weakly referenced by Ensembl Objects that have been
3024 ** instantiated by it. Therefore, Ensembl Object Adaptors should never be
3025 ** destroyed directly. Upon exit, the Ensembl Registry will call this function
3026 ** if required.
3027 **
3028 ** @param [d] Paa [EnsPAnalysisadaptor*] Ensembl Analysis Adaptor address
3029 **
3030 ** @return [void]
3031 **
3032 ** @release 6.2.0
3033 ** @@
3034 ******************************************************************************/
3035
ensAnalysisadaptorDel(EnsPAnalysisadaptor * Paa)3036 void ensAnalysisadaptorDel(
3037 EnsPAnalysisadaptor *Paa)
3038 {
3039 EnsPAnalysisadaptor pthis = NULL;
3040
3041 if (!Paa)
3042 return;
3043
3044 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
3045 if (ajDebugTest("ensAnalysisadaptorDel"))
3046 ajDebug("ensAnalysisadaptorDel\n"
3047 " *Paa %p\n",
3048 *Paa);
3049 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
3050
3051 if (!(pthis = *Paa))
3052 return;
3053
3054 ensAnalysisadaptorCacheClear(pthis);
3055
3056 ensBaseadaptorDel(&pthis->Adaptor);
3057
3058 ajMemFree((void **) Paa);
3059
3060 return;
3061 }
3062
3063
3064
3065
3066 /* @section member retrieval **************************************************
3067 **
3068 ** Functions for returning members of an Ensembl Analysis Adaptor object.
3069 **
3070 ** @fdata [EnsPAnalysisadaptor]
3071 **
3072 ** @nam3rule Get Return Ensembl Analysis Adaptor attribute(s)
3073 ** @nam4rule Baseadaptor Return the Ensembl Base Adaptor
3074 ** @nam4rule Databaseadaptor Return the Ensembl Database Adaptor
3075 **
3076 ** @argrule * aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3077 **
3078 ** @valrule Baseadaptor [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
3079 ** @valrule Databaseadaptor [EnsPDatabaseadaptor] Ensembl Database Adaptor
3080 ** or NULL
3081 **
3082 ** @fcategory use
3083 ******************************************************************************/
3084
3085
3086
3087
3088 /* @func ensAnalysisadaptorGetBaseadaptor *************************************
3089 **
3090 ** Get the Ensembl Base Adaptor member of an Ensembl Analysis Adaptor.
3091 **
3092 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3093 **
3094 ** @return [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
3095 **
3096 ** @release 6.2.0
3097 ** @@
3098 ******************************************************************************/
3099
ensAnalysisadaptorGetBaseadaptor(EnsPAnalysisadaptor aa)3100 EnsPBaseadaptor ensAnalysisadaptorGetBaseadaptor(
3101 EnsPAnalysisadaptor aa)
3102 {
3103 return (aa) ? aa->Adaptor : NULL;
3104 }
3105
3106
3107
3108
3109 /* @func ensAnalysisadaptorGetDatabaseadaptor *********************************
3110 **
3111 ** Get the Ensembl Database Adaptor member of an Ensembl Analysis Adaptor.
3112 **
3113 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3114 **
3115 ** @return [EnsPDatabaseadaptor] Ensembl Database Adaptor or NULL
3116 **
3117 ** @release 6.2.0
3118 ** @@
3119 ******************************************************************************/
3120
ensAnalysisadaptorGetDatabaseadaptor(EnsPAnalysisadaptor aa)3121 EnsPDatabaseadaptor ensAnalysisadaptorGetDatabaseadaptor(
3122 EnsPAnalysisadaptor aa)
3123 {
3124 return ensBaseadaptorGetDatabaseadaptor(
3125 ensAnalysisadaptorGetBaseadaptor(aa));
3126 }
3127
3128
3129
3130
3131 /* @section object retrieval **************************************************
3132 **
3133 ** Functions for fetching Ensembl Analysis objects from an
3134 ** Ensembl SQL database.
3135 **
3136 ** @fdata [EnsPAnalysisadaptor]
3137 **
3138 ** @nam3rule Fetch Fetch Ensembl Analysis object(s)
3139 ** @nam4rule All Fetch all Ensembl Analysis objects
3140 ** @nam4rule Allby Fetch all Ensembl Analysis objects matching a criterion
3141 ** @nam5rule Featureclass Fetch all by Feature class
3142 ** @nam4rule By Fetch one Ensembl Analysis object matching a criterion
3143 ** @nam5rule Identifier Fetch by an SQL database internal identifier
3144 ** @nam5rule Name Fetch by a name
3145 **
3146 ** @argrule * aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3147 ** @argrule All analyses [AjPList] AJAX List of Ensembl Analysis objects
3148 ** @argrule AllbyFeatureclass class [const AjPStr] Ensembl Feature class
3149 ** @argrule AllbyFeatureclass analyses [AjPList]
3150 ** AJAX List of Ensembl Analysis objects
3151 ** @argrule ByIdentifier identifier [ajuint] SQL database-internal identifier
3152 ** @argrule ByIdentifier Panalysis [EnsPAnalysis*] Ensembl Analysis address
3153 ** @argrule ByName name [const AjPStr] Ensembl Analysis name
3154 ** @argrule ByName Panalysis [EnsPAnalysis*] Ensembl Analysis address
3155 **
3156 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
3157 **
3158 ** @fcategory use
3159 ******************************************************************************/
3160
3161
3162
3163
3164 /* @funcstatic analysisadaptorFetchAll ****************************************
3165 **
3166 ** An ajTableMap "apply" function to return all Ensembl Analysis objects from
3167 ** the Ensembl Analysis Adaptor-internal cache.
3168 **
3169 ** @param [u] key [const void*] AJAX unsigned integer key data address
3170 ** @param [u] Pvalue [void**] Ensembl Analysis value data address
3171 ** @param [u] cl [void*]
3172 ** AJAX List of Ensembl Analysis objects, passed in via ajTableMap
3173 ** @see ajTableMap
3174 **
3175 ** @return [void]
3176 **
3177 ** @release 6.3.0
3178 ** @@
3179 ******************************************************************************/
3180
analysisadaptorFetchAll(const void * key,void ** Pvalue,void * cl)3181 static void analysisadaptorFetchAll(const void *key,
3182 void **Pvalue,
3183 void *cl)
3184 {
3185 if (!key)
3186 return;
3187
3188 if (!Pvalue)
3189 return;
3190
3191 if (!*Pvalue)
3192 return;
3193
3194 if (!cl)
3195 return;
3196
3197 ajListPushAppend((AjPList) cl,
3198 (void *) ensAnalysisNewRef(*((EnsPAnalysis *) Pvalue)));
3199
3200 return;
3201 }
3202
3203
3204
3205
3206 /* @func ensAnalysisadaptorFetchAll *******************************************
3207 **
3208 ** Fetch all Ensembl Analysis objects.
3209 **
3210 ** The caller is responsible for deleting the Ensembl Analysis objects before
3211 ** deleting the AJAX List object.
3212 **
3213 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_all
3214 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3215 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
3216 **
3217 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3218 **
3219 ** @release 6.2.0
3220 ** @@
3221 ******************************************************************************/
3222
ensAnalysisadaptorFetchAll(EnsPAnalysisadaptor aa,AjPList analyses)3223 AjBool ensAnalysisadaptorFetchAll(
3224 EnsPAnalysisadaptor aa,
3225 AjPList analyses)
3226 {
3227 if (!aa)
3228 return ajFalse;
3229
3230 if (!analyses)
3231 return ajFalse;
3232
3233 if (!aa->CacheByIdentifier)
3234 analysisadaptorCacheInit(aa);
3235
3236 ajTableMap(aa->CacheByIdentifier,
3237 &analysisadaptorFetchAll,
3238 (void *) analyses);
3239
3240 return ajTrue;
3241 }
3242
3243
3244
3245
3246 /* @func ensAnalysisadaptorFetchAllbyFeatureclass *****************************
3247 **
3248 ** Fetch all Ensembl Analysis objects referenced by an Ensembl Feature class.
3249 **
3250 ** Please see the analysisadaptorFeatureClasses array for a list of valid
3251 ** Feature classes that reference Ensembl Analysis objects.
3252 **
3253 ** The caller is responsible for deleting the Ensembl Analysis objects before
3254 ** deleting the AJAX List.
3255 **
3256 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_all_by_feature_class
3257 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3258 ** @param [r] class [const AjPStr] Ensembl Feature class
3259 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
3260 **
3261 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3262 **
3263 ** @release 6.4.0
3264 ** @@
3265 ******************************************************************************/
3266
ensAnalysisadaptorFetchAllbyFeatureclass(EnsPAnalysisadaptor aa,const AjPStr class,AjPList analyses)3267 AjBool ensAnalysisadaptorFetchAllbyFeatureclass(
3268 EnsPAnalysisadaptor aa,
3269 const AjPStr class,
3270 AjPList analyses)
3271 {
3272 register ajuint i = 0U;
3273 ajuint identifier = 0U;
3274 ajuint match = 0U;
3275
3276 AjPSqlstatement sqls = NULL;
3277 AjISqlrow sqli = NULL;
3278 AjPSqlrow sqlr = NULL;
3279
3280 AjPStr statement = NULL;
3281
3282 EnsPAnalysis analysis = NULL;
3283
3284 EnsPDatabaseadaptor dba = NULL;
3285
3286 if (!aa)
3287 return ajFalse;
3288
3289 if (!(class && ajStrGetLen(class)))
3290 return ajFalse;
3291
3292 if (!analyses)
3293 return ajFalse;
3294
3295 for (i = 0U; analysisadaptorKFeatureClasses[i]; i += 2U)
3296 if (ajStrMatchC(class, analysisadaptorKFeatureClasses[i]))
3297 match = i + 1U;
3298
3299 if (match)
3300 {
3301 dba = ensAnalysisadaptorGetDatabaseadaptor(aa);
3302
3303 statement = ajFmtStr(
3304 "SELECT DISTINCT %s.analysis_id FROM %s",
3305 analysisadaptorKFeatureClasses[match],
3306 analysisadaptorKFeatureClasses[match]);
3307
3308 sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
3309
3310 sqli = ajSqlrowiterNew(sqls);
3311
3312 while (!ajSqlrowiterDone(sqli))
3313 {
3314 identifier = 0;
3315
3316 sqlr = ajSqlrowiterGet(sqli);
3317
3318 ajSqlcolumnToUint(sqlr, &identifier);
3319
3320 ensAnalysisadaptorFetchByIdentifier(aa, identifier, &analysis);
3321
3322 if (analysis)
3323 ajListPushAppend(analyses, (void *) analysis);
3324 else
3325 ajWarn("ensAnalysisadaptorFetchAllbyFeatureclass found "
3326 "Ensembl Analysis identifier %u in the '%s' table, "
3327 "which is not referenced in the 'analysis' table.\n",
3328 identifier,
3329 analysisadaptorKFeatureClasses[match]);
3330 }
3331
3332 ajSqlrowiterDel(&sqli);
3333
3334 ensDatabaseadaptorSqlstatementDel(dba, &sqls);
3335
3336 ajStrDel(&statement);
3337 }
3338 else
3339 {
3340 ajDebug("ensAnalysisadaptorFetchAllbyFeatureclass got invalid "
3341 "Feature class '%S'\n",
3342 class);
3343
3344 return ajFalse;
3345 }
3346
3347 return ajTrue;
3348 }
3349
3350
3351
3352
3353 /* @func ensAnalysisadaptorFetchByIdentifier **********************************
3354 **
3355 ** Fetch an Ensembl Analysis by its SQL database-internal identifier.
3356 ** The caller is responsible for deleting the Ensembl Analysis.
3357 **
3358 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_by_dbID
3359 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3360 ** @param [r] identifier [ajuint] SQL database-internal identifier
3361 ** @param [wP] Panalysis [EnsPAnalysis*] Ensembl Analysis address
3362 **
3363 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3364 **
3365 ** @release 6.2.0
3366 ** @@
3367 ******************************************************************************/
3368
ensAnalysisadaptorFetchByIdentifier(EnsPAnalysisadaptor aa,ajuint identifier,EnsPAnalysis * Panalysis)3369 AjBool ensAnalysisadaptorFetchByIdentifier(
3370 EnsPAnalysisadaptor aa,
3371 ajuint identifier,
3372 EnsPAnalysis *Panalysis)
3373 {
3374 AjBool result = AJFALSE;
3375
3376 if (!aa)
3377 return ajFalse;
3378
3379 if (!identifier)
3380 return ajFalse;
3381
3382 if (!Panalysis)
3383 return ajFalse;
3384
3385 /*
3386 ** Initially, search the identifier cache.
3387 ** For any object returned by the AJAX Table the reference counter needs
3388 ** to be incremented manually.
3389 */
3390
3391 if (!aa->CacheByIdentifier)
3392 analysisadaptorCacheInit(aa);
3393
3394 *Panalysis = (EnsPAnalysis) ajTableFetchmodV(aa->CacheByIdentifier,
3395 (const void *) &identifier);
3396
3397 if (*Panalysis)
3398 {
3399 ensAnalysisNewRef(*Panalysis);
3400
3401 return ajTrue;
3402 }
3403
3404 /* For a cache miss re-query the database. */
3405
3406 result = ensBaseadaptorFetchByIdentifier(
3407 ensAnalysisadaptorGetBaseadaptor(aa),
3408 identifier,
3409 (void **) Panalysis);
3410
3411 analysisadaptorCacheInsert(aa, Panalysis);
3412
3413 return result;
3414 }
3415
3416
3417
3418
3419 /* @func ensAnalysisadaptorFetchByName ****************************************
3420 **
3421 ** Fetch an Ensembl Analysis by its name.
3422 ** The caller is responsible for deleting the Ensembl Analysis.
3423 **
3424 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_by_logic_name
3425 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3426 ** @param [r] name [const AjPStr] Ensembl Analysis name
3427 ** @param [wP] Panalysis [EnsPAnalysis*] Ensembl Analysis address
3428 **
3429 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3430 **
3431 ** @release 6.2.0
3432 ** @@
3433 ******************************************************************************/
3434
ensAnalysisadaptorFetchByName(EnsPAnalysisadaptor aa,const AjPStr name,EnsPAnalysis * Panalysis)3435 AjBool ensAnalysisadaptorFetchByName(
3436 EnsPAnalysisadaptor aa,
3437 const AjPStr name,
3438 EnsPAnalysis *Panalysis)
3439 {
3440 char *txtname = NULL;
3441
3442 AjBool result = AJFALSE;
3443
3444 AjPList analyses = NULL;
3445
3446 AjPStr constraint = NULL;
3447
3448 EnsPAnalysis analysis = NULL;
3449
3450 EnsPBaseadaptor ba = NULL;
3451
3452 if (!aa)
3453 return ajFalse;
3454
3455 if (!(name && ajStrGetLen(name)))
3456 return ajFalse;
3457
3458 if (!Panalysis)
3459 return ajFalse;
3460
3461 /*
3462 ** Initially, search the name cache.
3463 ** For any object returned by the AJAX Table the reference counter needs
3464 ** to be incremented manually.
3465 */
3466
3467 if (!aa->CacheByName)
3468 analysisadaptorCacheInit(aa);
3469
3470 *Panalysis = (EnsPAnalysis) ajTableFetchmodS(aa->CacheByName, name);
3471
3472 if (*Panalysis)
3473 {
3474 ensAnalysisNewRef(*Panalysis);
3475
3476 return ajTrue;
3477 }
3478
3479 /* In case of a cache miss, re-query the database. */
3480
3481 ba = ensAnalysisadaptorGetBaseadaptor(aa);
3482
3483 ensBaseadaptorEscapeC(ba, &txtname, name);
3484
3485 constraint = ajFmtStr("analysis.logic_name = '%s'", txtname);
3486
3487 ajCharDel(&txtname);
3488
3489 analyses = ajListNew();
3490
3491 result = ensBaseadaptorFetchAllbyConstraint(
3492 ba,
3493 constraint,
3494 (EnsPAssemblymapper) NULL,
3495 (EnsPSlice) NULL,
3496 analyses);
3497
3498 if (ajListGetLength(analyses) > 1)
3499 ajWarn("ensAnalysisadaptorFetchByName got more than one "
3500 "Ensembl Analysis for (UNIQUE) name '%S'.\n",
3501 name);
3502
3503 ajListPop(analyses, (void **) Panalysis);
3504
3505 analysisadaptorCacheInsert(aa, Panalysis);
3506
3507 while (ajListPop(analyses, (void **) &analysis))
3508 {
3509 analysisadaptorCacheInsert(aa, &analysis);
3510
3511 ensAnalysisDel(&analysis);
3512 }
3513
3514 ajListFree(&analyses);
3515
3516 ajStrDel(&constraint);
3517
3518 return result;
3519 }
3520