Cython API: added a Column subclass to allow direct access to indexes

for columns that store indexes referring to other data
This commit is contained in:
Celine Mercier
2017-07-27 19:29:10 +02:00
parent c91969126b
commit 69c50ff922
6 changed files with 151 additions and 12 deletions

View 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_idx(Column) :
cpdef object get_line_idx(self, index_t line_nb)
cpdef set_line_idx(self, index_t line_nb, object value)
cdef class Column_multi_elts_idx(Column_multi_elts) :
cpdef object get_item_idx(self, index_t line_nb, object elt_id)
cpdef object get_line_idx(self, index_t line_nb)
cpdef set_item_idx(self, index_t line_nb, object elt_id, object value)
cpdef set_line_idx(self, index_t line_nb, object values)

View File

@ -0,0 +1,114 @@
#cython: language_level=3
from obitools3.dms.capi.obierrno cimport obi_errno
from ..view.view cimport View
from obitools3.utils cimport tobytes, \
obi_errno_to_exception
from ..capi.obiview cimport obi_get_index_with_elt_name_and_col_p_in_view, \
obi_get_index_with_elt_idx_and_col_p_in_view, \
obi_set_index_with_elt_name_and_col_p_in_view, \
obi_set_index_with_elt_idx_and_col_p_in_view, \
Obiview_p
from ..capi.obidmscolumn cimport OBIDMS_column_p
from ..capi.obitypes cimport OBI_IDX, OBIIdx_NA, index_t
from cpython.long cimport PyLong_FromLongLong
# TODO overwrite other functions from Column and Column_multi_elts
cdef class Column_idx(Column):
cpdef object get_line_idx(self, index_t line_nb):
global obi_errno
cdef index_t value
cdef object result
value = obi_get_index_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0)
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=None, error_message="Problem getting a value from a column")
if value == OBIIdx_NA :
result = None
else :
result = PyLong_FromLongLong(value)
return result
cpdef set_line_idx(self, index_t line_nb, object value):
global obi_errno
if value is None :
value = OBIIdx_NA
if obi_set_index_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, 0, <index_t> value) < 0:
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=None, error_message="Problem setting a value in a column")
cdef class Column_multi_elts_idx(Column_multi_elts):
cpdef object get_item_idx(self, index_t line_nb, object elt_id) :
global obi_errno
cdef int value
cdef object result
cdef bytes elt_name
if type(elt_id) == int :
value = obi_get_index_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_index_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name)
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=elt_id, error_message="Problem getting a value from a column")
if value == OBIIdx_NA :
result = None
else :
result = PyLong_FromLongLong(value)
return result
cpdef object get_line_idx(self, index_t line_nb) :
global obi_errno
cdef index_t value
cdef int value_in_result
cdef dict result
cdef index_t i
cdef bint all_NA
cdef list elements_names
cdef Obiview_p view_p
cdef OBIDMS_column_p column_p
result = {}
all_NA = True
view_p = self._view.pointer()
column_p = self.pointer()
elements_names = self.elements_names
for i in range(self.nb_elements_per_line) :
value = obi_get_index_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
if value != OBIIdx_NA :
value_in_result = PyLong_FromLongLong(value)
result[elements_names[i]] = value_in_result
if all_NA :
all_NA = False
if all_NA :
result = None
return result
cpdef set_item_idx(self, index_t line_nb, object elt_id, object value) :
global obi_errno
cdef bytes elt_name
if value is None :
value = OBIIdx_NA
if type(elt_id) == int :
if obi_set_index_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_id, <index_t> value) < 0 :
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=elt_id, error_message="Problem setting a value in a column")
else :
elt_name = tobytes(elt_id)
if obi_set_index_with_elt_name_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, elt_name, <index_t> value) < 0 :
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=elt_id, error_message="Problem setting a value in a column")
cpdef set_line_idx(self, index_t line_nb, object values):
if values is None :
for element_name in self.elements_names :
self.set_item_idx(line_nb, element_name, None)
else :
for element_name in values :
self.set_item_idx(line_nb, element_name, values[element_name])

View File

@ -3,17 +3,17 @@
from ...capi.obitypes cimport index_t from ...capi.obitypes cimport index_t
from ..column cimport Column, \ from ..column_idx cimport Column_idx, \
Column_multi_elts Column_multi_elts_idx
cdef class Column_seq(Column) : cdef class Column_seq(Column_idx) :
cpdef object get_line(self, index_t line_nb) cpdef object get_line(self, index_t line_nb)
cpdef set_line(self, index_t line_nb, object value) cpdef set_line(self, index_t line_nb, object value)
cdef class Column_multi_elts_seq(Column_multi_elts) : cdef class Column_multi_elts_seq(Column_multi_elts_idx) :
cpdef object get_item(self, index_t line_nb, object elt_id) cpdef object get_item(self, index_t line_nb, object elt_id)
cpdef object get_line(self, index_t line_nb) cpdef object get_line(self, index_t line_nb)

View File

@ -6,6 +6,8 @@ from ..column cimport register_column_class
from ...view.view cimport View from ...view.view cimport View
from ..column cimport Column
from obitools3.utils cimport tobytes, \ from obitools3.utils cimport tobytes, \
obi_errno_to_exception obi_errno_to_exception
@ -22,7 +24,7 @@ from ...capi.obitypes cimport OBI_SEQ, OBISeq_NA
from libc.stdlib cimport free from libc.stdlib cimport free
cdef class Column_seq(Column): cdef class Column_seq(Column_idx):
@staticmethod @staticmethod
def new(View view, def new(View view,
@ -68,7 +70,7 @@ cdef class Column_seq(Column):
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=None, error_message="Problem setting a value in a column") obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=None, error_message="Problem setting a value in a column")
cdef class Column_multi_elts_seq(Column_multi_elts): cdef class Column_multi_elts_seq(Column_multi_elts_idx):
cpdef object get_item(self, index_t line_nb, object elt_id) : cpdef object get_item(self, index_t line_nb, object elt_id) :
global obi_errno global obi_errno

View File

@ -3,17 +3,17 @@
from ...capi.obitypes cimport index_t from ...capi.obitypes cimport index_t
from ..column cimport Column, \ from ..column_idx cimport Column_idx, \
Column_multi_elts Column_multi_elts_idx
cdef class Column_str(Column) : cdef class Column_str(Column_idx) :
cpdef object get_line(self, index_t line_nb) cpdef object get_line(self, index_t line_nb)
cpdef set_line(self, index_t line_nb, object value) cpdef set_line(self, index_t line_nb, object value)
cdef class Column_multi_elts_str(Column_multi_elts) : cdef class Column_multi_elts_str(Column_multi_elts_idx) :
cpdef object get_item(self, index_t line_nb, object elt_id) cpdef object get_item(self, index_t line_nb, object elt_id)
cpdef object get_line(self, index_t line_nb) cpdef object get_line(self, index_t line_nb)

View File

@ -6,6 +6,8 @@ from ..column cimport register_column_class
from ...view.view cimport View from ...view.view cimport View
from ..column cimport Column
from obitools3.utils cimport tobytes, \ from obitools3.utils cimport tobytes, \
obi_errno_to_exception obi_errno_to_exception
@ -20,7 +22,7 @@ from ...capi.obidmscolumn cimport OBIDMS_column_p
from ...capi.obitypes cimport OBI_STR, OBIStr_NA, const_char_p from ...capi.obitypes cimport OBI_STR, OBIStr_NA, const_char_p
cdef class Column_str(Column): cdef class Column_str(Column_idx):
@staticmethod @staticmethod
def new(View view, def new(View view,
@ -63,7 +65,7 @@ cdef class Column_str(Column):
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=None, error_message="Problem setting a value in a column") obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=None, error_message="Problem setting a value in a column")
cdef class Column_multi_elts_str(Column_multi_elts): cdef class Column_multi_elts_str(Column_multi_elts_idx):
cpdef object get_item(self, index_t line_nb, object elt_id) : cpdef object get_item(self, index_t line_nb, object elt_id) :
global obi_errno global obi_errno