Column API: improvements to be more flexible when referring to elements

in columns with several elements per line.
This commit is contained in:
Celine Mercier
2017-10-04 15:59:23 +02:00
parent 535692b020
commit 09a5f89849
2 changed files with 31 additions and 16 deletions

View File

@ -39,7 +39,7 @@ cdef class Column_line:
cdef Column _column
cdef index_t _index
cpdef update(self, data)
cpdef update(self, object data)
cdef register_column_class(obitype_t obitype,

View File

@ -80,11 +80,14 @@ cdef class Column(OBIWrapper) :
object alias=b""):
# TODO indexer_name?
cdef bytes column_name_b = tobytes(column_name)
cdef bytes alias_b = tobytes(alias)
cdef bytes comments_b = tobytes(comments)
cdef bytes elements_names_b
cdef char* elements_names_p
cdef bytes column_name_b = tobytes(column_name)
cdef bytes alias_b = tobytes(alias)
cdef bytes comments_b = tobytes(comments)
cdef list elements_names_s
cdef bytes elements_names_b
cdef char* elements_names_p
cdef object elt_name
cdef str elt_name_s
if not view.active() :
raise OBIDeactivatedInstanceError()
@ -93,7 +96,13 @@ cdef class Column(OBIWrapper) :
alias_b = column_name_b
if elements_names is not None:
elements_names_b = b';'.join([tobytes(x) for x in elements_names])
elements_names_s = []
for elt_name in elements_names :
if type(elt_name) != bytes and type(elt_name) != str :
elements_names_s.append(str(elt_name))
else :
elements_names_s.append(elt_name)
elements_names_b = b';'.join([tobytes(x) for x in elements_names_s])
elements_names_p = elements_names_b
else:
elements_names_p = NULL
@ -342,15 +351,17 @@ cdef class Column_multi_elts(Column) :
return Column_line(self, line_nb)
cpdef set_line(self, index_t line_nb, object values):
cdef object element_name
cdef object value_ref
cdef object values_iter
if not self.active() :
raise OBIDeactivatedInstanceError()
if values is None :
if values is None or len(values) == 0 :
for element_name in self.elements_names :
self.set_item(line_nb, element_name, None)
else :
for element_name in values :
self.set_item(line_nb, element_name, values[element_name])
values_iter = xrange(len(values)) if isinstance(values, list) else values
for value_ref in values_iter :
self.set_item(line_nb, value_ref, values[value_ref])
######################################################################################################
@ -397,6 +408,10 @@ cdef class Column_line :
yield element_name
def keys(self): # TODO Discuss if keys with None values should be returned too
return self._column.elements_names
# column property getter
@property
def column(self):
@ -408,7 +423,7 @@ cdef class Column_line :
return self._index
cpdef update(self, data): # TODO ?????
cpdef update(self, object data):
if isinstance(data, dict):
data=data.items()
for key,value in data: