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,24 +80,33 @@ 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()
if alias_b == b"" :
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
if (obi_view_add_column(view = view.pointer(),
column_name = column_name_b,
version_number = -1,
@ -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])
######################################################################################################
@ -395,7 +406,11 @@ cdef class Column_line :
elements_names = self._column.elements_names
for element_name in elements_names :
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
@ -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: