Cython typed columns
This commit is contained in:
@ -1,53 +0,0 @@
|
|||||||
# #cython: language_level=3
|
|
||||||
#
|
|
||||||
# from cpython.bool cimport bool, PyBool_FromLong
|
|
||||||
#
|
|
||||||
# from ..capi.obitypes cimport index_t, \
|
|
||||||
# const_char_p, \
|
|
||||||
# OBIType_t, \
|
|
||||||
# obibool_t, \
|
|
||||||
# OBI_BOOL, \
|
|
||||||
# OBIBool_NA
|
|
||||||
#
|
|
||||||
# from ..capi.obiview cimport obi_get_bool_with_elt_name_and_col_p_in_view, \
|
|
||||||
# obi_get_bool_with_elt_idx_and_col_p_in_view, \
|
|
||||||
# obi_set_bool_with_elt_name_and_col_p_in_view, \
|
|
||||||
# obi_set_bool_with_elt_idx_and_col_p_in_view
|
|
||||||
#
|
|
||||||
# from ..capi.obidmscolumn cimport obi_column_get_obibool_with_elt_name, \
|
|
||||||
# obi_column_get_obibool_with_elt_idx, \
|
|
||||||
# obi_column_set_obibool_with_elt_name, \
|
|
||||||
# obi_column_set_obibool_with_elt_idx, \
|
|
||||||
# OBIDMS_column_p
|
|
||||||
#
|
|
||||||
# from ..capi.obierrno cimport obi_errno
|
|
||||||
#
|
|
||||||
# from .column cimport Column, \
|
|
||||||
# Column_line, \
|
|
||||||
# register_column_class
|
|
||||||
#
|
|
||||||
# from ..view.view cimport View
|
|
||||||
#
|
|
||||||
# from obitools3.utils cimport str2bytes, bytes2str
|
|
||||||
#
|
|
||||||
# cdef class Column_line_bool(Column_line) :
|
|
||||||
#
|
|
||||||
# @staticmethod
|
|
||||||
# cdef bool obibool_t2bool(obibool_t value)
|
|
||||||
#
|
|
||||||
# @staticmethod
|
|
||||||
# cdef bool2obibool_t(bool value)
|
|
||||||
#
|
|
||||||
# cpdef bool get_bool_item_by_name(self,bytes element_name)
|
|
||||||
# cpdef bool get_bool_item_by_idx(self,index_t index)
|
|
||||||
# cpdef set_bool_item_by_name(self,bytes element_name,bool value)
|
|
||||||
# cpdef set_bool_item_by_idx(self,index_t index,bool value)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# # cdef obibool_t [:] _data_view
|
|
||||||
#
|
|
||||||
# cdef class Column_bool(Column):
|
|
||||||
#
|
|
||||||
# cpdef object get_line(self, index_t line_nb)
|
|
||||||
# cpdef set_line(self, index_t line_nb, object value)
|
|
||||||
|
|
3
python/obitools3/dms/column/typed_column/__init__.py
Normal file
3
python/obitools3/dms/column/typed_column/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#from .bool import Column_bool
|
||||||
|
#from .int import Column_int
|
||||||
|
# TODO why is this needed?
|
44
python/obitools3/dms/column/typed_column/bool.pxd
Normal file
44
python/obitools3/dms/column/typed_column/bool.pxd
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_bool(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_bool(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_item(self, index_t line_nb, object elt_id, object value)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# cdef class Column_line_bool(Column_line) :
|
||||||
|
#
|
||||||
|
# @staticmethod
|
||||||
|
# cdef bool obibool_t2bool(obibool_t value)
|
||||||
|
#
|
||||||
|
# @staticmethod
|
||||||
|
# cdef bool2obibool_t(bool value)
|
||||||
|
#
|
||||||
|
# cpdef bool get_bool_item_by_name(self,bytes element_name)
|
||||||
|
# cpdef bool get_bool_item_by_idx(self,index_t index)
|
||||||
|
# cpdef set_bool_item_by_name(self,bytes element_name,bool value)
|
||||||
|
# cpdef set_bool_item_by_idx(self,index_t index,bool value)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# # cdef obibool_t [:] _data_view
|
||||||
|
#
|
@ -1,21 +1,142 @@
|
|||||||
#cython: language_level=3
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_view_add_column, \
|
||||||
|
obi_get_bool_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_bool_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_bool_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_bool_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_BOOL, OBIBool_NA, obibool_t, obitype_t
|
||||||
|
|
||||||
|
from cpython.bool cimport PyBool_FromLong
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_bool(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_BOOL,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef obibool_t value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIBool_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = PyBool_FromLong(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
if value is None :
|
||||||
|
value = OBIBool_NA
|
||||||
|
if obi_set_bool_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, <obibool_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_bool(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id) :
|
||||||
|
cdef obibool_t value
|
||||||
|
cdef object result
|
||||||
|
cdef bytes elt_name
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_bool_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBIBool_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = PyBool_FromLong(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef obibool_t value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIBool_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
value_in_result = PyBool_FromLong(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, object elt_id, object value) :
|
||||||
|
cdef bytes elt_name
|
||||||
|
if value is None :
|
||||||
|
value = OBIBool_NA
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_bool_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, <obibool_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_bool_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, <obibool_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
def register_class() :
|
||||||
|
register_column_class(OBI_BOOL, False, Column_bool, bool)
|
||||||
|
register_column_class(OBI_BOOL, True, Column_multi_elts_bool, bool)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# cdef class Column_line_bool(Column_line) :
|
# cdef class Column_line_bool(Column_line) :
|
||||||
#
|
#
|
||||||
# # cdef update_pointer(self):
|
# cdef update_pointer(self):
|
||||||
# # """
|
# """
|
||||||
# # Checks if the obicolumn address changed since the last call and update
|
# Checks if the obicolumn address changed since the last call and update
|
||||||
# # if need the `_column_p` and `_data_view` data structure fields.
|
# if need the `_column_p` and `_data_view` data structure fields.
|
||||||
# # """
|
# """
|
||||||
# # cdef OBIDMS_column_p* column_pp
|
# cdef OBIDMS_column_p* column_pp
|
||||||
# # column_pp = <OBIDMS_column_p*>self._pointer
|
# column_pp = <OBIDMS_column_p*>self._pointer
|
||||||
# # cdef OBIDMS_column_p column_p = column_pp[0]
|
# cdef OBIDMS_column_p column_p = column_pp[0]
|
||||||
# #
|
#
|
||||||
# # if column_p != self._column_p:
|
# if column_p != self._column_p:
|
||||||
# # self._column_p = column_p
|
# self._column_p = column_p
|
||||||
# # # self._data_view = (<obibool_t*> (column_p.data)) + \
|
# self._data_view = (<obibool_t*> (column_p.data)) + \
|
||||||
# # # self._index * column_p.header.nb_elements_per_line
|
# self._index * column_p.header.nb_elements_per_line
|
||||||
#
|
#
|
||||||
# @staticmethod
|
# @staticmethod
|
||||||
# cdef bool obibool_t2bool(obibool_t value):
|
# cdef bool obibool_t2bool(obibool_t value):
|
||||||
@ -197,109 +318,3 @@
|
|||||||
#
|
#
|
||||||
# def __len__(self):
|
# def __len__(self):
|
||||||
# return self._len
|
# return self._len
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# cdef class Column_bool(Column):
|
|
||||||
#
|
|
||||||
# @staticmethod
|
|
||||||
# def new(View view,
|
|
||||||
# object column_name,
|
|
||||||
# index_t nb_elements_per_line=1,
|
|
||||||
# object elements_names=None,
|
|
||||||
# object comments=b""):
|
|
||||||
#
|
|
||||||
# cdef bytes column_name_b = tobytes(column_name)
|
|
||||||
# cdef bytes comments_b
|
|
||||||
# cdef bytes elements_names_b
|
|
||||||
# cdef char* elements_names_p
|
|
||||||
# cdef Column new_column
|
|
||||||
#
|
|
||||||
# if comments is not None:
|
|
||||||
# comments_b = tobytes(comments)
|
|
||||||
# else:
|
|
||||||
# comments_b = b''
|
|
||||||
#
|
|
||||||
# if elements_names is not None:
|
|
||||||
# elements_names_b = b''.join([tobytes(x) for x in elements_names])
|
|
||||||
# elements_names_p = elements_names_b
|
|
||||||
# else:
|
|
||||||
# elements_names_p = NULL
|
|
||||||
#
|
|
||||||
# if (obi_view_add_column(view = view._pointer,
|
|
||||||
# column_name = column_name_b,
|
|
||||||
# version_number = -1,
|
|
||||||
# alias = NULL,
|
|
||||||
# data_type = OBI_BOOL,
|
|
||||||
# nb_lines = len(view),
|
|
||||||
# nb_elements_per_line = nb_elements_per_line,
|
|
||||||
# elements_names = elements_names_p,
|
|
||||||
# indexer_name = NULL,
|
|
||||||
# associated_column_name = NULL,
|
|
||||||
# associated_column_version = -1,
|
|
||||||
# comments = comments_b,
|
|
||||||
# create = True)<0):
|
|
||||||
# raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name),
|
|
||||||
# bytes2str(view.name)))
|
|
||||||
#
|
|
||||||
# view.__init_columns__()
|
|
||||||
# new_column = self._columns[column_name]
|
|
||||||
#
|
|
||||||
# return new_column
|
|
||||||
#
|
|
||||||
# def add_to_view(self,
|
|
||||||
# View view,
|
|
||||||
# object column_name=None,
|
|
||||||
# object comments=b""):
|
|
||||||
#
|
|
||||||
# cdef OBIDMS_column_p column_p = (<OBIDMS_column_p*>self._pointer)[0]
|
|
||||||
# cdef bytes alias
|
|
||||||
#
|
|
||||||
# if (column_name is None):
|
|
||||||
# alias = self._alias
|
|
||||||
# else:
|
|
||||||
# alias = tobytes(column_name)
|
|
||||||
#
|
|
||||||
# if (obi_view_add_column(view = view._ponter,
|
|
||||||
# column_name = column_p.header.name,
|
|
||||||
# version_number = column_p.header.version,
|
|
||||||
# alias = alias,
|
|
||||||
# data_type = OBI_BOOL,
|
|
||||||
# nb_lines = column_p.header.lines_used,
|
|
||||||
# nb_elements_per_line = column_p.header.nb_elements_per_line,
|
|
||||||
# elements_names = column_p.header.elements_names,
|
|
||||||
# indexer_name = NULL,
|
|
||||||
# associated_column_name = NULL,
|
|
||||||
# associated_column_version = NULL,
|
|
||||||
# comments = tobytes(comments),
|
|
||||||
# create = False) < 0):
|
|
||||||
# raise RuntimeError("Cannot insert column %s (%s@%d) into view %s" %
|
|
||||||
# ( bytes2str(alias),
|
|
||||||
# bytes2str(column_p.header.name),
|
|
||||||
# column_p.header.version,
|
|
||||||
# bytes2str(view.name)
|
|
||||||
# ))
|
|
||||||
#
|
|
||||||
# cpdef object get_line(self, index_t line_nb):
|
|
||||||
# cdef obibool_t value
|
|
||||||
# cdef object result
|
|
||||||
# global obi_errno
|
|
||||||
#
|
|
||||||
# value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0)
|
|
||||||
# if obi_errno > 0 :
|
|
||||||
# raise IndexError(line_nb)
|
|
||||||
# if value == OBIBool_NA :
|
|
||||||
# result = None
|
|
||||||
# else :
|
|
||||||
# result = PyBool_FromLong(value)
|
|
||||||
# return result
|
|
||||||
#
|
|
||||||
# cpdef set_line(self, index_t line_nb, object value):
|
|
||||||
# if value is None :
|
|
||||||
# value = OBIBool_NA
|
|
||||||
# if obi_set_bool_with_elt_idx_and_col_p_in_view(<Obiview_p>self._view._pointer, (self._pointer)[0], line_nb, 0, <obibool_t> value) < 0:
|
|
||||||
# raise Exception("Problem setting a value in a column")
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# register_column_class(OBI_BOOL, Column_bool, bool)
|
|
||||||
|
|
20
python/obitools3/dms/column/typed_column/char.pxd
Normal file
20
python/obitools3/dms/column/typed_column/char.pxd
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_char(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_char(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_item(self, index_t line_nb, object elt_id, object value)
|
115
python/obitools3/dms/column/typed_column/char.pyx
Normal file
115
python/obitools3/dms/column/typed_column/char.pyx
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_get_char_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_char_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_char_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_char_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_CHAR, OBIChar_NA, obichar_t, obitype_t
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_char(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_CHAR,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef obichar_t value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
value = obi_get_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIChar_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = value # TODO return bytes or str?
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
if value is None :
|
||||||
|
value = OBIChar_NA
|
||||||
|
if obi_set_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, <obichar_t> tobytes(value)[0]) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_char(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id) :
|
||||||
|
cdef obichar_t value
|
||||||
|
cdef object result
|
||||||
|
cdef bytes elt_name
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_char_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBIChar_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = value # TODO return bytes or str?
|
||||||
|
return result
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef obichar_t value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIChar_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
value_in_result = value # TODO return bytes or str?
|
||||||
|
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, object elt_id, object value) :
|
||||||
|
cdef bytes elt_name
|
||||||
|
if value is None :
|
||||||
|
value = OBIChar_NA
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, <obichar_t> tobytes(value)[0]) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_char_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, <obichar_t> tobytes(value)[0]) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
def register_class():
|
||||||
|
register_column_class(OBI_CHAR, False, Column_char, bytes) # TODO bytes or str?
|
||||||
|
register_column_class(OBI_CHAR, True, Column_multi_elts_char, bytes) # TODO bytes or str?
|
||||||
|
|
21
python/obitools3/dms/column/typed_column/float.pxd
Normal file
21
python/obitools3/dms/column/typed_column/float.pxd
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_float(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_float(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_item(self, index_t line_nb, object elt_id, object value)
|
||||||
|
|
115
python/obitools3/dms/column/typed_column/float.pyx
Normal file
115
python/obitools3/dms/column/typed_column/float.pyx
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_get_float_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_float_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_float_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_float_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_FLOAT, OBIFloat_NA, obifloat_t, obitype_t
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_float(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_FLOAT,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef obifloat_t value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
value = obi_get_float_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIFloat_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = <double> value
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
if value is None :
|
||||||
|
value = OBIFloat_NA
|
||||||
|
if obi_set_float_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, <obifloat_t> value) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_float(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id) :
|
||||||
|
cdef obifloat_t value
|
||||||
|
cdef object result
|
||||||
|
cdef bytes elt_name
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_float_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_float_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBIFloat_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = <double> value
|
||||||
|
return result
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef obifloat_t value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_float_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIFloat_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
value_in_result = <double> 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, object elt_id, object value) :
|
||||||
|
cdef bytes elt_name
|
||||||
|
if value is None :
|
||||||
|
value = OBIFloat_NA
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_float_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, <obifloat_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_float_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, <obifloat_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
def register_class():
|
||||||
|
register_column_class(OBI_FLOAT, False, Column_float, float) # TODO why not double?
|
||||||
|
register_column_class(OBI_FLOAT, True, Column_multi_elts_float, float) # TODO why not double?
|
||||||
|
|
21
python/obitools3/dms/column/typed_column/int.pxd
Normal file
21
python/obitools3/dms/column/typed_column/int.pxd
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_int(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_int(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_item(self, index_t line_nb, object elt_id, object value)
|
||||||
|
|
116
python/obitools3/dms/column/typed_column/int.pyx
Normal file
116
python/obitools3/dms/column/typed_column/int.pyx
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_get_int_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_int_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_int_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_int_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_INT, OBIInt_NA, obiint_t, obitype_t
|
||||||
|
|
||||||
|
from cpython.int cimport PyInt_FromLong
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_int(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_INT,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef obiint_t value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
value = obi_get_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIInt_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = PyInt_FromLong(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
if value is None :
|
||||||
|
value = OBIInt_NA
|
||||||
|
if obi_set_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, <obiint_t> value) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_int(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id) :
|
||||||
|
cdef obiint_t value
|
||||||
|
cdef object result
|
||||||
|
cdef bytes elt_name
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_int_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBIInt_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = PyInt_FromLong(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef obiint_t value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIInt_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
value_in_result = PyInt_FromLong(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, object elt_id, object value) :
|
||||||
|
cdef bytes elt_name
|
||||||
|
if value is None :
|
||||||
|
value = OBIInt_NA
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, <obiint_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_int_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, <obiint_t> value) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
def register_class():
|
||||||
|
register_column_class(OBI_INT, False, Column_int, int)
|
||||||
|
register_column_class(OBI_INT, True, Column_multi_elts_int, int)
|
||||||
|
|
26
python/obitools3/dms/column/typed_column/qual.pxd
Normal file
26
python/obitools3/dms/column/typed_column/qual.pxd
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_qual(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef object get_str_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
cpdef set_str_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_qual(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_str_item(self, index_t line_nb, object elt_id)
|
||||||
|
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, object elt_id, object value)
|
||||||
|
cpdef set_str_item(self, index_t line_nb, object elt_id, object value)
|
||||||
|
|
258
python/obitools3/dms/column/typed_column/qual.pyx
Normal file
258
python/obitools3/dms/column/typed_column/qual.pyx
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_get_qual_char_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_qual_char_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_qual_char_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_qual_char_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_get_qual_int_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_qual_int_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_qual_int_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_qual_int_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_QUAL, OBIQual_char_NA, OBIQual_int_NA, const_char_p
|
||||||
|
|
||||||
|
from libc.stdlib cimport free
|
||||||
|
from libc.string cimport strcmp
|
||||||
|
from libc.stdint cimport uint8_t
|
||||||
|
from libc.stdlib cimport malloc
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_qual(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_QUAL,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef const uint8_t* value
|
||||||
|
cdef int value_length
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
value = obi_get_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, &value_length)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIQual_int_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = []
|
||||||
|
for i in range(value_length) :
|
||||||
|
result.append(<int>value[i])
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_str_line(self, index_t line_nb):
|
||||||
|
cdef char* value
|
||||||
|
cdef object result
|
||||||
|
cdef int i
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
value = obi_get_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIQual_char_NA :
|
||||||
|
result = None
|
||||||
|
else : # TODO discuss
|
||||||
|
result = bytes2str(value)
|
||||||
|
free(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
cdef uint8_t* value_b
|
||||||
|
cdef int value_length
|
||||||
|
if value is None :
|
||||||
|
if obi_set_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, 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_set_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, value_b, value_length) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
free(value_b)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_str_line(self, index_t line_nb, object value):
|
||||||
|
cdef bytes value_b
|
||||||
|
if value is None :
|
||||||
|
if obi_set_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, OBIQual_char_NA) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
if type(value) == str:
|
||||||
|
value_b = str2bytes(value)
|
||||||
|
else :
|
||||||
|
value_b = value
|
||||||
|
if obi_set_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_qual(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id):
|
||||||
|
cdef const uint8_t* value
|
||||||
|
cdef int value_length
|
||||||
|
cdef object result
|
||||||
|
cdef int i
|
||||||
|
global obi_errno # TODO add everywhere
|
||||||
|
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, &value_length)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_qual_int_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, &value_length)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBIQual_int_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = []
|
||||||
|
for i in range(value_length) :
|
||||||
|
result.append(<int>value[i])
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_str_item(self, index_t line_nb, object elt_id):
|
||||||
|
cdef char* value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_qual_char_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_name)
|
||||||
|
if value == OBIQual_char_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = bytes2str(value) # TODO return bytes?
|
||||||
|
free(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef const uint8_t* value
|
||||||
|
cdef int value_length
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef int j
|
||||||
|
cdef bint all_NA
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i, &value_length)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIQual_int_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
value_in_result = []
|
||||||
|
for j in range(value_length) :
|
||||||
|
value_in_result.append(<int>value[j])
|
||||||
|
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 object get_str_line(self, index_t line_nb) :
|
||||||
|
cdef char* value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
global obi_errno
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), 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, object elt_id, object value):
|
||||||
|
cdef uint8_t* value_b
|
||||||
|
cdef int value_length
|
||||||
|
cdef bytes elt_name
|
||||||
|
|
||||||
|
if value is None :
|
||||||
|
value_b = OBIQual_int_NA
|
||||||
|
value_length = 0
|
||||||
|
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 type(elt_id) == int :
|
||||||
|
if obi_set_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, value_b, value_length) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_qual_int_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, value_b, value_length) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
if value is not None :
|
||||||
|
free(value_b)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_str_item(self, index_t line_nb, object elt_id, object value):
|
||||||
|
cdef bytes value_b
|
||||||
|
cdef bytes elt_name
|
||||||
|
|
||||||
|
if value is None :
|
||||||
|
value_b = OBIQual_char_NA
|
||||||
|
else :
|
||||||
|
value_b = tobytes(value)
|
||||||
|
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, value_b) < 0 :
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_qual_char_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def register_class():
|
||||||
|
register_column_class(OBI_QUAL, False, Column_qual, bytes) # TODO str? int?
|
||||||
|
register_column_class(OBI_QUAL, True, Column_multi_elts_qual, bytes) # TODO str? int?
|
||||||
|
|
21
python/obitools3/dms/column/typed_column/seq.pxd
Normal file
21
python/obitools3/dms/column/typed_column/seq.pxd
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_seq(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_seq(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_item(self, index_t line_nb, object elt_id, object value)
|
||||||
|
|
133
python/obitools3/dms/column/typed_column/seq.pyx
Normal file
133
python/obitools3/dms/column/typed_column/seq.pyx
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_get_seq_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_seq_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_seq_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_seq_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_SEQ, OBISeq_NA
|
||||||
|
|
||||||
|
from libc.stdlib cimport free
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_seq(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_SEQ,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef char* value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
value = obi_get_seq_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBISeq_NA :
|
||||||
|
result = None
|
||||||
|
else : # TODO
|
||||||
|
try:
|
||||||
|
result = <bytes> value
|
||||||
|
finally:
|
||||||
|
free(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
cdef bytes value_b
|
||||||
|
if value is None :
|
||||||
|
value_b = OBISeq_NA
|
||||||
|
else :
|
||||||
|
value_b = tobytes(value)
|
||||||
|
if obi_set_seq_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_seq(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id) :
|
||||||
|
cdef char* value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_seq_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_seq_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBISeq_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
try:
|
||||||
|
result = <bytes> value
|
||||||
|
finally:
|
||||||
|
free(value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef char* value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
global obi_errno
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_seq_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBISeq_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
try:
|
||||||
|
value_in_result = <bytes> value
|
||||||
|
finally:
|
||||||
|
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, object elt_id, object value):
|
||||||
|
cdef bytes value_b
|
||||||
|
cdef bytes elt_name
|
||||||
|
if value is None :
|
||||||
|
value_b = OBISeq_NA
|
||||||
|
else :
|
||||||
|
value_b = tobytes(value)
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_seq_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_seq_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
def register_class():
|
||||||
|
register_column_class(OBI_SEQ, False, Column_seq, bytes) # TODO str?
|
||||||
|
register_column_class(OBI_SEQ, True, Column_multi_elts_seq, bytes) # TODO str?
|
||||||
|
|
21
python/obitools3/dms/column/typed_column/str.pxd
Normal file
21
python/obitools3/dms/column/typed_column/str.pxd
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# #cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ...capi.obitypes cimport index_t
|
||||||
|
|
||||||
|
from ..column cimport Column, \
|
||||||
|
Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_str(Column) :
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_line(self, index_t line_nb, object value)
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_str(Column_multi_elts) :
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id)
|
||||||
|
cpdef object get_line(self, index_t line_nb)
|
||||||
|
cpdef set_item(self, index_t line_nb, object elt_id, object value)
|
||||||
|
|
122
python/obitools3/dms/column/typed_column/str.pyx
Normal file
122
python/obitools3/dms/column/typed_column/str.pyx
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
|
||||||
|
from ..column cimport register_column_class
|
||||||
|
|
||||||
|
from ...view.view cimport View
|
||||||
|
|
||||||
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes
|
||||||
|
|
||||||
|
from ...capi.obiview cimport obi_get_str_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_get_str_with_elt_idx_and_col_p_in_view, \
|
||||||
|
obi_set_str_with_elt_name_and_col_p_in_view, \
|
||||||
|
obi_set_str_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
|
from ...capi.obierrno cimport obi_errno
|
||||||
|
from ...capi.obitypes cimport OBI_STR, OBIStr_NA
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_str(Column):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(View view,
|
||||||
|
object column_name,
|
||||||
|
index_t nb_elements_per_line=1,
|
||||||
|
object elements_names=None,
|
||||||
|
object comments=b""):
|
||||||
|
|
||||||
|
return Column.new_column(view, column_name, OBI_STR,
|
||||||
|
nb_elements_per_line=nb_elements_per_line,
|
||||||
|
elements_names=elements_names,
|
||||||
|
comments=comments)
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb):
|
||||||
|
cdef char* value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
value = obi_get_str_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIStr_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = <bytes> value # NOTE: value is not freed because the pointer points to a mmapped region in an AVL data file.
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef set_line(self, index_t line_nb, object value):
|
||||||
|
cdef bytes value_b
|
||||||
|
if value is None :
|
||||||
|
value_b = OBIStr_NA
|
||||||
|
else :
|
||||||
|
value_b = tobytes(value)
|
||||||
|
if obi_set_str_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
cdef class Column_multi_elts_str(Column_multi_elts):
|
||||||
|
|
||||||
|
cpdef object get_item(self, index_t line_nb, object elt_id) :
|
||||||
|
cdef char* value
|
||||||
|
cdef object result
|
||||||
|
global obi_errno
|
||||||
|
if type(elt_id) == int :
|
||||||
|
value = obi_get_str_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id)
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
value = obi_get_str_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb, elt_id)
|
||||||
|
if value == OBIStr_NA :
|
||||||
|
result = None
|
||||||
|
else :
|
||||||
|
result = <bytes> value # NOTE: value is not freed because the pointer points to a mmapped region in an AVL data file.
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
cpdef object get_line(self, index_t line_nb) :
|
||||||
|
cdef char* value
|
||||||
|
cdef object value_in_result
|
||||||
|
cdef dict result
|
||||||
|
cdef index_t i
|
||||||
|
cdef bint all_NA
|
||||||
|
global obi_errno
|
||||||
|
result = {}
|
||||||
|
all_NA = True
|
||||||
|
for i in range(self.nb_elements_per_line) :
|
||||||
|
value = obi_get_str_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i)
|
||||||
|
if obi_errno > 0 :
|
||||||
|
raise IndexError(line_nb)
|
||||||
|
if value == OBIStr_NA :
|
||||||
|
value_in_result = None
|
||||||
|
else :
|
||||||
|
value_in_result = <bytes> 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, object elt_id, object value):
|
||||||
|
cdef bytes value_b
|
||||||
|
cdef bytes elt_name
|
||||||
|
if value is None :
|
||||||
|
value_b = OBIStr_NA
|
||||||
|
else :
|
||||||
|
value_b = tobytes(value)
|
||||||
|
if type(elt_id) == int :
|
||||||
|
if obi_set_str_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
else :
|
||||||
|
elt_name = tobytes(elt_id)
|
||||||
|
if obi_set_str_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, value_b) < 0:
|
||||||
|
raise Exception("Problem setting a value in a column")
|
||||||
|
|
||||||
|
|
||||||
|
def register_class():
|
||||||
|
register_column_class(OBI_STR, False, Column_str, bytes) # TODO str?
|
||||||
|
register_column_class(OBI_STR, True, Column_multi_elts_str, bytes) # TODO str?
|
||||||
|
|
Reference in New Issue
Block a user