OBIQUAL columns can now handle multiple elements per line

This commit is contained in:
Celine Mercier
2016-06-09 15:54:36 +02:00
parent 2a1ea3ba3f
commit f438c3d913
3 changed files with 117 additions and 78 deletions

View File

@ -44,7 +44,8 @@ from ._obidmscolumn_bool cimport OBIDMS_column_bool, \
from ._obidmscolumn_char cimport OBIDMS_column_char, \ from ._obidmscolumn_char cimport OBIDMS_column_char, \
OBIDMS_column_multi_elts_char OBIDMS_column_multi_elts_char
from ._obidmscolumn_qual cimport OBIDMS_column_qual from ._obidmscolumn_qual cimport OBIDMS_column_qual, \
OBIDMS_column_multi_elts_qual
from ._obidmscolumn_str cimport OBIDMS_column_str, \ from ._obidmscolumn_str cimport OBIDMS_column_str, \
OBIDMS_column_multi_elts_str OBIDMS_column_multi_elts_str
@ -194,8 +195,8 @@ cdef class OBIDMS_column :
elif col_type == OBI_QUAL : elif col_type == OBI_QUAL :
if col_one_element_per_line : if col_one_element_per_line :
subclass = OBIDMS_column_qual subclass = OBIDMS_column_qual
# else : # TODO else :
# subclass = OBIDMS_column_multi_elts_qual subclass = OBIDMS_column_multi_elts_qual
elif col_type == OBI_STR : elif col_type == OBI_STR :
if col_one_element_per_line : if col_one_element_per_line :
subclass = OBIDMS_column_str subclass = OBIDMS_column_str

View File

@ -1,7 +1,7 @@
#cython: language_level=3 #cython: language_level=3
from .capi.obitypes cimport index_t from .capi.obitypes cimport index_t
from ._obidms cimport OBIDMS_column #, OBIDMS_column_multi_elts from ._obidms cimport OBIDMS_column , OBIDMS_column_multi_elts
cdef class OBIDMS_column_qual(OBIDMS_column): cdef class OBIDMS_column_qual(OBIDMS_column):
@ -11,7 +11,10 @@ cdef class OBIDMS_column_qual(OBIDMS_column):
cpdef set_str_line(self, index_t line_nb, object value) cpdef set_str_line(self, index_t line_nb, object value)
# cdef class OBIDMS_column_multi_elts_qual(OBIDMS_column_multi_elts): cdef class OBIDMS_column_multi_elts_qual(OBIDMS_column_multi_elts):
# cpdef object get_item(self, index_t line_nb, str element_name) cpdef object get_item(self, index_t line_nb, str element_name)
# cpdef object get_line(self, index_t line_nb) cpdef object get_str_item(self, index_t line_nb, str element_name)
# cpdef set_item(self, index_t line_nb, str element_name, object value) cpdef object get_line(self, index_t line_nb)
cpdef object get_str_line(self, index_t line_nb)
cpdef set_item(self, index_t line_nb, str element_name, object value)
cpdef set_str_item(self, index_t line_nb, str element_name, object value)

View File

@ -71,79 +71,114 @@ cdef class OBIDMS_column_qual(OBIDMS_column):
cpdef set_str_line(self, index_t line_nb, object value): cpdef set_str_line(self, index_t line_nb, object value):
if value is None : if value is None :
if obi_column_set_obiqual_int_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, 0, OBIQual_int_NA, 0) < 0: if obi_column_set_obiqual_char_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, 0, OBIQual_char_NA) < 0:
raise Exception("Problem setting a value in a column") raise Exception("Problem setting a value in a column")
else : else :
if obi_column_set_obiqual_char_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, 0, str2bytes(value)) < 0: if obi_column_set_obiqual_char_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, 0, str2bytes(value)) < 0:
raise Exception("Problem setting a value in a column") raise Exception("Problem setting a value in a column")
# TODO cdef class OBIDMS_column_multi_elts_qual(OBIDMS_column_multi_elts):
# cdef class OBIDMS_column_multi_elts_qual(OBIDMS_column_multi_elts):
# cpdef object get_item(self, index_t line_nb, str element_name):
# cdef const uint8_t* value
# cpdef object get_item(self, index_t line_nb, str element_name): cdef int value_length
# cdef const uint8_t* value cdef object result
# cdef int value_length cdef int i
# cdef object result value = obi_column_get_obiqual_int_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), &value_length)
# cdef int i if obi_errno > 0 :
# value = obi_column_get_obiqual_int_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), &value_length) raise IndexError(line_nb, element_name)
# if obi_errno > 0 : if value == OBIQual_int_NA :
# raise IndexError(line_nb, element_name) result = None
# if value == NULL: # TODO else :
# result = None result = []
# else : for i in range(value_length) :
# result = [] result.append(<int>value[i])
# for i in range(value_length) : return result
# result.append(<int>value[i])
# return result cpdef object get_str_item(self, index_t line_nb, str element_name):
# cdef char* value
# # cpdef object get_str_item(self, index_t line_nb, str element_name): cdef object result
# # pass value = obi_column_get_obiqual_char_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name))
# # cdef char* value if obi_errno > 0 :
# # cdef object result raise IndexError(line_nb, element_name)
# # value = obi_column_get_obiseq_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name)) if value == OBIQual_char_NA :
# # if obi_errno > 0 : result = None
# # raise IndexError(line_nb, element_name) else :
# # if strcmp(value, OBISeq_NA) == 0 : result = bytes2str(value)
# # result = None free(value)
# # else : return result
# # result = bytes2str(value)
# # free(value) cpdef object get_line(self, index_t line_nb) :
# # return result cdef const uint8_t* value
# cdef int value_length
# cpdef object get_line(self, index_t line_nb) : cdef object value_in_result
# pass cdef dict result
# # cdef char* value cdef index_t i
# # cdef object value_in_result cdef int j
# # cdef dict result cdef bint all_NA
# # cdef index_t i result = {}
# # cdef bint all_NA all_NA = True
# # result = {} for i in range(self.nb_elements_per_line) :
# # all_NA = True value = obi_column_get_obiqual_int_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, i, &value_length)
# # for i in range(self.nb_elements_per_line) : if obi_errno > 0 :
# # value = obi_column_get_obiseq_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, i) raise IndexError(line_nb)
# # if obi_errno > 0 : if value == OBIQual_int_NA :
# # raise IndexError(line_nb) value_in_result = None
# # if strcmp(value, OBISeq_NA) == 0 : else :
# # value_in_result = None value_in_result = []
# # else : for j in range(value_length) :
# # value_in_result = bytes2str(value) value_in_result.append(<int>value[j])
# # free(value) result[self.elements_names[i]] = value_in_result
# # result[self.elements_names[i]] = value_in_result if all_NA and (value_in_result is not None) :
# # if all_NA and (value_in_result is not None) : all_NA = False
# # all_NA = False if all_NA :
# # if all_NA : result = None
# # result = None return result
# # return result
# cpdef object get_str_line(self, index_t line_nb) :
# cpdef set_item(self, index_t line_nb, str element_name, object value): cdef char* value
# pass cdef object value_in_result
# # cdef bytes value_b cdef dict result
# # if value is None : cdef index_t i
# # value_b = OBISeq_NA cdef bint all_NA
# # else : result = {}
# # value_b = str2bytes(value) all_NA = True
# # if obi_column_set_obiseq_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), value_b) < 0: for i in range(self.nb_elements_per_line) :
# # raise Exception("Problem setting a value in a column") value = obi_column_get_obiqual_char_with_elt_idx_in_view(self.view.pointer, (self.pointer)[0], line_nb, i)
# # if obi_errno > 0 :
raise IndexError(line_nb)
if value == OBIQual_char_NA :
value_in_result = None
else :
value_in_result = bytes2str(value)
free(value)
result[self.elements_names[i]] = value_in_result
if all_NA and (value_in_result is not None) :
all_NA = False
if all_NA :
result = None
return result
cpdef set_item(self, index_t line_nb, str element_name, object value):
cdef uint8_t* value_b
cdef int value_length
if value is None :
if obi_column_set_obiqual_int_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), OBIQual_int_NA, 0) < 0:
raise Exception("Problem setting a value in a column")
else :
value_length = len(value)
value_b = <uint8_t*> malloc(value_length * sizeof(uint8_t))
for i in range(value_length) :
value_b[i] = <uint8_t>value[i]
if obi_column_set_obiqual_int_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), value_b, value_length) < 0:
raise Exception("Problem setting a value in a column")
free(value_b)
cpdef set_str_item(self, index_t line_nb, str element_name, object value):
if value is None :
if obi_column_set_obiqual_char_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), OBIQual_char_NA) < 0:
raise Exception("Problem setting a value in a column")
else :
if obi_column_set_obiqual_char_with_elt_name_in_view(self.view.pointer, (self.pointer)[0], line_nb, str2bytes(element_name), str2bytes(value)) < 0:
raise Exception("Problem setting a value in a column")