First version of automatic ID and COUNT columns, to discuss (for now,
columns created when NUC_SEQ views are closed if the columns don't already exist)
This commit is contained in:
102
src/obiview.c
102
src/obiview.c
@ -1072,6 +1072,26 @@ static int finish_view(Obiview_p view)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add count column if it's a NUC_SEQ_VIEW with no count column // TODO discuss
|
||||||
|
if ((!strcmp((view->infos)->view_type, VIEW_TYPE_NUC_SEQS)) && (!obi_view_column_exists(view, COUNT_COLUMN)))
|
||||||
|
{
|
||||||
|
if (obi_create_auto_count_column(view) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError creating an automatic count column when finishing a view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add id column if it's a NUC_SEQ_VIEW with no id column // TODO discuss
|
||||||
|
if ((!strcmp((view->infos)->view_type, VIEW_TYPE_NUC_SEQS)) && (!obi_view_column_exists(view, ID_COLUMN)))
|
||||||
|
{
|
||||||
|
if (obi_create_auto_id_column(view, NULL) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError creating an automatic id column when finishing a view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check predicates
|
// Check predicates
|
||||||
predicates = view_check_all_predicates(view);
|
predicates = view_check_all_predicates(view);
|
||||||
if (predicates == NULL)
|
if (predicates == NULL)
|
||||||
@ -1824,7 +1844,7 @@ Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const char* view_name, Obiview_p v
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// Adding id column
|
// Adding id column
|
||||||
if (obi_view_add_column(view, ID_COLUMN, -1, ID_COLUMN, OBI_STR, 0, 1, NULL, "", NULL, -1, "Ids", true) < 0)
|
if (obi_view_add_column(view, ID_COLUMN, -1, ID_COLUMN, OBI_STR, 0, 1, NULL, "", NULL, -1, "Sequence identifiers", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "Error adding an obligatory column in a nucleotide sequences view");
|
obidebug(1, "Error adding an obligatory column in a nucleotide sequences view");
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -2391,6 +2411,15 @@ OBIDMS_column_p obi_view_get_column(Obiview_p view, const char* column_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool obi_view_column_exists(Obiview_p view, const char* column_name)
|
||||||
|
{
|
||||||
|
if (obi_view_get_column(view, column_name) == NULL)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
OBIDMS_column_p* obi_view_get_pointer_on_column_in_view(Obiview_p view, const char* column_name)
|
OBIDMS_column_p* obi_view_get_pointer_on_column_in_view(Obiview_p view, const char* column_name)
|
||||||
{
|
{
|
||||||
return (OBIDMS_column_p*)(ht_get(view->column_dict, column_name));
|
return (OBIDMS_column_p*)(ht_get(view->column_dict, column_name));
|
||||||
@ -2459,8 +2488,8 @@ int obi_save_and_close_view(Obiview_p view)
|
|||||||
|
|
||||||
int obi_create_auto_count_column(Obiview_p view)
|
int obi_create_auto_count_column(Obiview_p view)
|
||||||
{
|
{
|
||||||
index_t i;
|
index_t i;
|
||||||
OBIDMS_p column;
|
OBIDMS_column_p column;
|
||||||
|
|
||||||
// Check that the view is not read-only
|
// Check that the view is not read-only
|
||||||
if (view->read_only)
|
if (view->read_only)
|
||||||
@ -2470,7 +2499,7 @@ int obi_create_auto_count_column(Obiview_p view)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (obi_view_add_column(view, COUNT_COLUMN, -1, NULL, OBI_INT, 0, 1, NULL, NULL, NULL, NULL, "Sequence counts", true) < 0)
|
if (obi_view_add_column(view, COUNT_COLUMN, -1, NULL, OBI_INT, 0, 1, NULL, NULL, NULL, -1, "Sequence counts", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "Error adding an automatic count column in a view");
|
obidebug(1, "Error adding an automatic count column in a view");
|
||||||
return -1;
|
return -1;
|
||||||
@ -2486,7 +2515,7 @@ int obi_create_auto_count_column(Obiview_p view)
|
|||||||
// Fill the column with 1s
|
// Fill the column with 1s
|
||||||
for (i=0; i < (view->infos)->line_count; i++)
|
for (i=0; i < (view->infos)->line_count; i++)
|
||||||
{
|
{
|
||||||
if (obi_column_set_obiint_with_elt_idx(column, i, 0, 1) < 0)
|
if (obi_set_int_with_elt_idx_and_col_p_in_view(view, column, i, 0, 1) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "Error adding an automatic count column in a view");
|
obidebug(1, "Error adding an automatic count column in a view");
|
||||||
return -1;
|
return -1;
|
||||||
@ -2497,6 +2526,69 @@ int obi_create_auto_count_column(Obiview_p view)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int obi_create_auto_id_column(Obiview_p view, const char* prefix)
|
||||||
|
{
|
||||||
|
index_t i;
|
||||||
|
OBIDMS_column_p column;
|
||||||
|
char* id;
|
||||||
|
|
||||||
|
// Check that the view is not read-only
|
||||||
|
if (view->read_only)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBIVIEW_ERROR);
|
||||||
|
obidebug(1, "\nError trying to create an automatic count column in a read-only view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete old ID column if it exists
|
||||||
|
if (obi_view_get_column(view, ID_COLUMN) != NULL)
|
||||||
|
{
|
||||||
|
if (obi_view_delete_column(view, ID_COLUMN) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "Error deleting an ID column to replace it in a view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the new ID column
|
||||||
|
if (obi_view_add_column(view, ID_COLUMN, -1, NULL, OBI_STR, 0, 1, NULL, NULL, NULL, -1, "Sequence identifiers", true) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "Error adding an automatic ID column in a view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
column = obi_view_get_column(view, ID_COLUMN);
|
||||||
|
if (column == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "Error adding an automatic ID column in a view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If prefix is NULL, use default prefix
|
||||||
|
if (prefix == NULL)
|
||||||
|
prefix = ID_PREFIX;
|
||||||
|
|
||||||
|
// Fill the column with automatic ids
|
||||||
|
for (i=0; i < (view->infos)->line_count; i++)
|
||||||
|
{
|
||||||
|
id = build_word_with_idx(prefix, i);
|
||||||
|
if (id == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "Error building an id for an automatic ID column");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (obi_set_str_with_elt_idx_and_col_p_in_view(view, column, i, 0, id) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "Error adding an automatic count column in a view");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO Move to another file?
|
// TODO Move to another file?
|
||||||
/*********** FOR BLOB COLUMNS ***********/
|
/*********** FOR BLOB COLUMNS ***********/
|
||||||
|
|
||||||
|
@ -55,6 +55,8 @@
|
|||||||
#define COUNT_COLUMN "COUNT" /**< The name of the column containing the sequence counts
|
#define COUNT_COLUMN "COUNT" /**< The name of the column containing the sequence counts
|
||||||
* in NUC_SEQS_VIEW views.
|
* in NUC_SEQS_VIEW views.
|
||||||
*/
|
*/
|
||||||
|
#define ID_PREFIX "seq" /**< The default prefix of sequence identifiers in automatic ID columns.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -409,6 +411,20 @@ int obi_view_delete_column(Obiview_p view, const char* column_name);
|
|||||||
OBIDMS_column_p obi_view_get_column(Obiview_p view, const char* column_name);
|
OBIDMS_column_p obi_view_get_column(Obiview_p view, const char* column_name);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if a column exists in a view.
|
||||||
|
*
|
||||||
|
* @param view A pointer on the view.
|
||||||
|
* @param column_name The name of the column in the view.
|
||||||
|
*
|
||||||
|
* @returns A boolean indicating whether or not the column exists in the view.
|
||||||
|
*
|
||||||
|
* @since July 2017
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
bool obi_view_column_exists(Obiview_p view, const char* column_name);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the pointer on the pointer on a column from its name in a view.
|
* @brief Gets the pointer on the pointer on a column from its name in a view.
|
||||||
*
|
*
|
||||||
@ -527,6 +543,25 @@ int obi_save_and_close_view(Obiview_p view);
|
|||||||
int obi_create_auto_count_column(Obiview_p view);
|
int obi_create_auto_count_column(Obiview_p view);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates an OBI_STR column with the line count of the view it belongs to, and sets all lines with automatic identifiers
|
||||||
|
* with the form prefix_index.
|
||||||
|
*
|
||||||
|
* @warning The number of lines set corresponds to the line count of the view.
|
||||||
|
*
|
||||||
|
* @param view A pointer on the view.
|
||||||
|
* @param prefix The prefix of automatic ids. The ids have the form prefix_index. If NULL, the default ID_PREFIX is used.
|
||||||
|
*
|
||||||
|
* @returns A value indicating the success of the operation.
|
||||||
|
* @retval 0 if the operation was successfully completed.
|
||||||
|
* @retval -1 if an error occurred.
|
||||||
|
*
|
||||||
|
* @since July 2017
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
int obi_create_auto_id_column(Obiview_p view, const char* prefix);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Recovers an obiblob from an OBIDMS column containing indices referring to obiblobs,
|
* @brief Recovers an obiblob from an OBIDMS column containing indices referring to obiblobs,
|
||||||
* using the index of the element in the line, and the column pointer, in the context of a view.
|
* using the index of the element in the line, and the column pointer, in the context of a view.
|
||||||
|
38
src/utils.c
38
src/utils.c
@ -18,6 +18,7 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "obidebug.h"
|
#include "obidebug.h"
|
||||||
@ -35,6 +36,43 @@
|
|||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
int digit_count(index_t i)
|
||||||
|
{
|
||||||
|
int n_digits;
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
n_digits = 1;
|
||||||
|
else
|
||||||
|
n_digits = floor(log10(llabs(i))) + 1;
|
||||||
|
|
||||||
|
return n_digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* build_word_with_idx(const char* prefix, index_t idx)
|
||||||
|
{
|
||||||
|
char* word;
|
||||||
|
int n_digits;
|
||||||
|
|
||||||
|
n_digits = digit_count(idx);
|
||||||
|
word = (char*) malloc((strlen(prefix) + 1+ n_digits + 1)*sizeof(char));
|
||||||
|
if (word == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError allocating memory for a character string");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (sprintf(word, "%s_%lld", prefix, idx) < 0)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_UTILS_ERROR);
|
||||||
|
obidebug(1, "\nProblem building a word from a prefix and an index");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return word;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int count_dir(char* dir_path)
|
int count_dir(char* dir_path)
|
||||||
{
|
{
|
||||||
struct dirent* dp;
|
struct dirent* dp;
|
||||||
|
30
src/utils.h
30
src/utils.h
@ -17,6 +17,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "obidms.h"
|
#include "obidms.h"
|
||||||
|
#include "obitypes.h"
|
||||||
|
|
||||||
|
|
||||||
#define FORMATTED_TIME_LENGTH (1024) /**< The length allocated for the character string containing a formatted date.
|
#define FORMATTED_TIME_LENGTH (1024) /**< The length allocated for the character string containing a formatted date.
|
||||||
@ -25,6 +26,35 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Counts the number of digits of a number.
|
||||||
|
*
|
||||||
|
* @param i The number.
|
||||||
|
*
|
||||||
|
* @returns The number of digits of the number.
|
||||||
|
*
|
||||||
|
* @since July 2017
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
int digit_count(index_t i);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Builds a word from a prefix and an index, with the form prefix_index.
|
||||||
|
*
|
||||||
|
* @warning The returned pointer has to be freed by the caller.
|
||||||
|
*
|
||||||
|
* @param prefix The prefix for the word.
|
||||||
|
* @param idx The index to use as suffix.
|
||||||
|
*
|
||||||
|
* @returns The built word.
|
||||||
|
*
|
||||||
|
* @since July 2017
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
char* build_word_with_idx(const char* prefix, index_t idx);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Counts the number of files and directories in a directory.
|
* @brief Counts the number of files and directories in a directory.
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user