Better handling of elements names in Cython
This commit is contained in:
@ -18,9 +18,10 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
cdef View _view
|
cdef View _view
|
||||||
cdef bytes _alias
|
cdef bytes _alias
|
||||||
cdef list elements_names
|
cdef list _elements_names
|
||||||
|
|
||||||
cdef inline OBIDMS_column_p pointer(self)
|
cdef inline OBIDMS_column_p pointer(self)
|
||||||
|
cdef read_elements_names(self)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
cdef type get_column_class(obitype_t obitype, bint multi_elts, bint tuples)
|
cdef type get_column_class(obitype_t obitype, bint multi_elts, bint tuples)
|
||||||
|
@ -160,7 +160,7 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
column._view = view
|
column._view = view
|
||||||
column._alias = column_name_b
|
column._alias = column_name_b
|
||||||
column.elements_names = column._elements_names
|
column._elements_names = column.read_elements_names()
|
||||||
view.register(column)
|
view.register(column)
|
||||||
|
|
||||||
return column
|
return column
|
||||||
@ -274,6 +274,19 @@ cdef class Column(OBIWrapper) :
|
|||||||
# raise Exception("Problem closing column %s" % bytes2str(self.name))
|
# raise Exception("Problem closing column %s" % bytes2str(self.name))
|
||||||
|
|
||||||
|
|
||||||
|
cdef read_elements_names(self):
|
||||||
|
cdef char* elts_names_b
|
||||||
|
cdef list elts_names_list
|
||||||
|
if not self.active() :
|
||||||
|
raise OBIDeactivatedInstanceError()
|
||||||
|
elts_names_b = obi_get_elements_names(self.pointer())
|
||||||
|
if elts_names_b == NULL:
|
||||||
|
raise Exception("Error reading the elements names of a column")
|
||||||
|
elts_names_list = elts_names_b.split(b';')
|
||||||
|
free(elts_names_b)
|
||||||
|
return elts_names_list
|
||||||
|
|
||||||
|
|
||||||
# Column alias property getter and setter
|
# Column alias property getter and setter
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
@ -288,17 +301,8 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
# elements_names property getter
|
# elements_names property getter
|
||||||
@property
|
@property
|
||||||
def _elements_names(self):
|
def elements_names(self):
|
||||||
cdef char* elts_names_b
|
return self._elements_names
|
||||||
cdef list elts_names_list
|
|
||||||
if not self.active() :
|
|
||||||
raise OBIDeactivatedInstanceError()
|
|
||||||
elts_names_b = obi_get_elements_names(self.pointer())
|
|
||||||
if elts_names_b == NULL:
|
|
||||||
raise Exception("Error reading the elements names of a column")
|
|
||||||
elts_names_list = elts_names_b.split(b';')
|
|
||||||
free(elts_names_b)
|
|
||||||
return elts_names_list
|
|
||||||
|
|
||||||
# nb_elements_per_line property getter
|
# nb_elements_per_line property getter
|
||||||
@property
|
@property
|
||||||
@ -386,7 +390,7 @@ cdef class Column_multi_elts(Column) :
|
|||||||
if not self.active() :
|
if not self.active() :
|
||||||
raise OBIDeactivatedInstanceError()
|
raise OBIDeactivatedInstanceError()
|
||||||
if values is None or len(values) == 0 :
|
if values is None or len(values) == 0 :
|
||||||
for element_name in self.elements_names :
|
for element_name in self._elements_names :
|
||||||
self.set_item(line_nb, element_name, None)
|
self.set_item(line_nb, element_name, None)
|
||||||
else :
|
else :
|
||||||
values_iter = xrange(len(values)) if isinstance(values, list) else values
|
values_iter = xrange(len(values)) if isinstance(values, list) else values
|
||||||
@ -427,7 +431,7 @@ cdef class Column_line :
|
|||||||
if type(elt_id) == int:
|
if type(elt_id) == int:
|
||||||
return elt_id < self._column.nb_elements_per_line
|
return elt_id < self._column.nb_elements_per_line
|
||||||
else:
|
else:
|
||||||
return (tobytes(elt_id) in self._column.elements_names)
|
return (tobytes(elt_id) in self._column._elements_names)
|
||||||
|
|
||||||
|
|
||||||
def __repr__(self) :
|
def __repr__(self) :
|
||||||
@ -437,13 +441,13 @@ cdef class Column_line :
|
|||||||
def __iter__(self) :
|
def __iter__(self) :
|
||||||
cdef list elements_names
|
cdef list elements_names
|
||||||
cdef bytes element_name
|
cdef bytes element_name
|
||||||
elements_names = self._column.elements_names
|
elements_names = self._column._elements_names
|
||||||
for element_name in elements_names :
|
for element_name in elements_names :
|
||||||
yield element_name
|
yield element_name
|
||||||
|
|
||||||
|
|
||||||
def keys(self): # TODO Discuss if keys with None values should be returned too
|
def keys(self): # TODO Discuss if keys with None values should be returned too
|
||||||
return self._column.elements_names
|
return self._column._elements_names
|
||||||
|
|
||||||
|
|
||||||
# column property getter
|
# column property getter
|
||||||
|
@ -78,7 +78,7 @@ cdef class Column_multi_elts_idx(Column_multi_elts):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
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)
|
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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
@ -106,7 +106,7 @@ cdef class Column_multi_elts_idx(Column_multi_elts):
|
|||||||
|
|
||||||
cpdef set_line_idx(self, index_t line_nb, object values):
|
cpdef set_line_idx(self, index_t line_nb, object values):
|
||||||
if values is None :
|
if values is None :
|
||||||
for element_name in self.elements_names :
|
for element_name in self._elements_names :
|
||||||
self.set_item_idx(line_nb, element_name, None)
|
self.set_item_idx(line_nb, element_name, None)
|
||||||
else :
|
else :
|
||||||
for element_name in values :
|
for element_name in values :
|
||||||
|
@ -99,7 +99,7 @@ cdef class Column_multi_elts_bool(Column_multi_elts):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
for i in range(self.nb_elements_per_line) :
|
||||||
value = obi_get_bool_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
|
value = obi_get_bool_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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -101,7 +101,7 @@ cdef class Column_multi_elts_char(Column_multi_elts):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
for i in range(self.nb_elements_per_line) :
|
||||||
value = obi_get_char_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
|
value = obi_get_char_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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -98,7 +98,7 @@ cdef class Column_multi_elts_float(Column_multi_elts):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
for i in range(self.nb_elements_per_line) :
|
||||||
value = obi_get_float_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
|
value = obi_get_float_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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -102,7 +102,7 @@ cdef class Column_multi_elts_int(Column_multi_elts):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
for i in range(self.nb_elements_per_line) :
|
||||||
value = obi_get_int_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
|
value = obi_get_int_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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -164,7 +164,7 @@ cdef class Column_multi_elts_qual(Column_multi_elts_idx):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
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)
|
value = obi_get_qual_int_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i, &value_length)
|
||||||
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
@ -194,7 +194,7 @@ cdef class Column_multi_elts_qual(Column_multi_elts_idx):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
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, offset)
|
value = obi_get_qual_char_with_elt_idx_and_col_p_in_view(self._view.pointer(), self.pointer(), line_nb, i, offset)
|
||||||
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -116,7 +116,7 @@ cdef class Column_multi_elts_seq(Column_multi_elts_idx):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
for i in range(self.nb_elements_per_line) :
|
||||||
value = obi_get_seq_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
|
value = obi_get_seq_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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -112,7 +112,7 @@ cdef class Column_multi_elts_str(Column_multi_elts_idx):
|
|||||||
all_NA = True
|
all_NA = True
|
||||||
view_p = self._view.pointer()
|
view_p = self._view.pointer()
|
||||||
column_p = self.pointer()
|
column_p = self.pointer()
|
||||||
elements_names = self.elements_names
|
elements_names = self._elements_names
|
||||||
for i in range(self.nb_elements_per_line) :
|
for i in range(self.nb_elements_per_line) :
|
||||||
value = obi_get_str_with_elt_idx_and_col_p_in_view(view_p, column_p, line_nb, i)
|
value = obi_get_str_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")
|
obi_errno_to_exception(obi_errno, line_nb=line_nb, elt_id=i, error_message="Problem getting a value from a column")
|
||||||
|
@ -279,7 +279,7 @@ cdef class View(OBIWrapper) :
|
|||||||
new_nb_elements_per_line = old_column.nb_elements_per_line
|
new_nb_elements_per_line = old_column.nb_elements_per_line
|
||||||
|
|
||||||
if new_elements_names is None :
|
if new_elements_names is None :
|
||||||
new_elements_names = old_column.elements_names
|
new_elements_names = old_column._elements_names
|
||||||
|
|
||||||
new_column = Column.new_column(self, old_column.pointer().header.name, new_data_type,
|
new_column = Column.new_column(self, old_column.pointer().header.name, new_data_type,
|
||||||
nb_elements_per_line=new_nb_elements_per_line, elements_names=new_elements_names,
|
nb_elements_per_line=new_nb_elements_per_line, elements_names=new_elements_names,
|
||||||
@ -337,7 +337,7 @@ cdef class View(OBIWrapper) :
|
|||||||
col.original_name,
|
col.original_name,
|
||||||
col.data_type_int,
|
col.data_type_int,
|
||||||
nb_elements_per_line = col.nb_elements_per_line,
|
nb_elements_per_line = col.nb_elements_per_line,
|
||||||
elements_names = col.elements_names,
|
elements_names = col._elements_names,
|
||||||
tuples = col.tuples,
|
tuples = col.tuples,
|
||||||
to_eval = col.to_eval,
|
to_eval = col.to_eval,
|
||||||
comments = col.comments,
|
comments = col.comments,
|
||||||
|
Reference in New Issue
Block a user