Big refactoring 3

This commit is contained in:
2016-12-26 14:18:01 +01:00
parent e6db2086d5
commit 5156f6bb9e
2 changed files with 119 additions and 88 deletions

View File

@ -26,71 +26,61 @@ from .capi.obiview cimport Obiview_p, \
DEFINITION_COLUMN, \ DEFINITION_COLUMN, \
QUALITY_COLUMN QUALITY_COLUMN
from ._obidmscolumn cimport OBIDMS_column_p, \
OBIDMS_column
from ._obidms cimport OBIDMS
from obitools3.utils cimport tobytes, \ from obitools3.utils cimport tobytes, \
bytes2str, \ bytes2str, \
tostr tostr
from .dms cimport DMS
cdef class OBIView:
cdef class View:
cdef OBIDMS _dms cdef DMS _dms
cdef Obiview_p _pointer cdef Obiview_p _pointer
cdef dict _columns cdef dict _columns
cdef __init_columns__(self) cdef __init_columns__(self)
cpdef OBIView clone(self, cpdef View clone(self,
view_name, object view_name,
comments=*) object comments=*)
@staticmethod @staticmethod
cdef OBIView _new(OBIDMS dms, cdef View _new(DMS dms,
bytes view_name, bytes view_name,
bytes comments=*) bytes comments=*)
@staticmethod @staticmethod
cdef OBIView _open(OBIDMS dms, cdef View _open(DMS dms,
bytes view_name) bytes view_name)
cpdef delete_column(self, column_name) cpdef close(self)
cpdef add_column(self,
str column_name,
obiversion_t version_number=*,
object alias=*,
object type=*,
index_t nb_lines=*,
index_t nb_elements_per_line=*,
list elements_names=*,
object indexer_name=*,
object associated_column_name=*,
obiversion_t associated_column_version=*,
object comments=*,
bint create=*
)
cpdef delete_column(self,
object column_name)
cpdef rename_column(self,
object current_name,
object new_name)
cpdef change_column_alias(self, bytes current_alias, bytes new_alias)
cdef update_column_pointers(self) cdef update_column_pointers(self)
cpdef OBIView_line_selection new_selection(self, cpdef OBIView_line_selection new_selection(self,
list lines=*) list lines=*)
cdef class OBIView_line_selection(list): cdef class View_line_selection(list):
cdef OBIView _view cdef View _view
cdef str _view_name
cdef index_t* __build_binary_list__(self) cdef index_t* __build_binary_list__(self)
cpdef OBIView materialize(self,
str view_name, cpdef View materialize(self,
str comments=*) object view_name,
object comments=*)
cdef class OBIView_line : cdef class View_line :
cdef index_t _index cdef index_t _index
cdef OBIView _view cdef View _view

View File

@ -1,60 +1,52 @@
#cython: language_level=3 #cython: language_level=3
cdef class OBIView : cdef class View :
def __init__(self,dms,int __internalCall__): def __init__(self,dms,int __internalCall__):
if __internalCall__!=987654: if __internalCall__!=987654:
raise RuntimeError('OBIView constructor cannot be called directly') raise RuntimeError('OBIView constructor cannot be called directly')
self._dms = dms self._dms = dms
self._pointer = NULL self._pointer = NULL
self._columns = {}
cpdef View clone(self,
cdef __init_columns__(self): object view_name,
cdef size_t i object comments=None):
cdef bytes col_alias
cdef OBIDMS_column_p column_p
cdef Obiview_p pointer = self._pointer
self._columns = {}
for i in range(pointer.infos.column_count) :
col_alias = pointer.infos.column_references[i].alias
column_p = <OBIDMS_column_p> (pointer.columns)[i]
subclass = OBIDMS_column.get_subclass_type(column_p)
self._columns[col_alias] = subclass(self, col_alias)
cpdef OBIView clone(self,
view_name,
comments=b""):
cdef OBIView view = OBIView(self._dms,
987654) cdef bytes view_name_b = tobytes(view_name)
cdef bytes comments_b
cdef View view = View(self._dms,
987654)
if comments is not None:
comments_b = tobytes(comments)
else:
comments_b = b''
view._pointer = obi_new_view(self._pointer.dms, view._pointer = obi_new_view(self._pointer.dms,
tobytes(view_name), view_name_b,
self._pointer, self._pointer,
NULL, NULL,
tobytes(comments)) comments_b)
if view._pointer == NULL : if view._pointer == NULL :
raise RuntimeError("Error : Cannot clone view %s into view %s" raise RuntimeError("Error : Cannot clone view %s into view %s"
% (str(self.name), % (str(self.name),
tobytes(view_name)) bytes2str(view_name_b))
) )
view.__init_columns__()
return view return view
@staticmethod @staticmethod
cdef OBIView _new(OBIDMS dms, cdef View _new(DMS dms,
bytes view_name, bytes view_name,
bytes comments=b""): bytes comments=b""):
cdef OBIView view = OBIView(dms, cdef View view = OBIView(dms,
987654) # @DuplicatedSignature 987654) # @DuplicatedSignature
view._pointer = obi_new_view(dms._pointer, view._pointer = obi_new_view(dms._pointer,
view_name, view_name,
@ -64,24 +56,34 @@ cdef class OBIView :
if view._pointer == NULL : if view._pointer == NULL :
raise RuntimeError("Error : Cannot create view %s" % view_name) raise RuntimeError("Error : Cannot create view %s" % view_name)
view.__init_columns__()
return view return view
@staticmethod @staticmethod
def new(OBIDMS dms, def new(OBIDMS dms,
view_name, object view_name,
comments=b""): object comments=None):
return OBIView._new(dms,tobytes(view_name),tobytes(comments))
cdef bytes view_name_b = tobytes(view_name)
cdef bytes comments_b
if comments is not None:
comments_b = tobytes(comments)
else:
comments_b = b''
return View._new(dms,
view_name_b,
comments_b)
@staticmethod @staticmethod
cdef OBIView _open(OBIDMS dms, cdef View _open(DMS dms,
bytes view_name): bytes view_name):
cdef OBIView view = OBIView(dms, cdef View view = View(dms,
987654) # @DuplicatedSignature 987654) # @DuplicatedSignature
view._pointer = obi_open_view(dms._pointer, view._pointer = obi_open_view(dms._pointer,
view_name) view_name)
@ -89,19 +91,22 @@ cdef class OBIView :
if view._pointer == NULL : if view._pointer == NULL :
raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name)) raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name))
view.__init_columns__()
return view return view
@staticmethod @staticmethod
def open(OBIDMS dms, # @ReservedAssignment def open(DMS dms, # @ReservedAssignment
view_name): object view_name):
return OBIView._open(dms,tobytes(view_name))
def __dealloc__(self): cdef bytes view_name_b = tobytes(view_name)
return View._open(dms,view_name_b)
cpdef close(self):
if (obi_save_and_close_view(self._pointer) < 0) : if (obi_save_and_close_view(self._pointer) < 0) :
raise Exception("Problem closing a view") raise Exception("Problem closing a view")
def __dealloc__(self):
self.close()
def __repr__(self) : def __repr__(self) :
cdef str s cdef str s
@ -400,4 +405,40 @@ cdef class OBIView_line :
return str(line) return str(line)
cpdef dict get_view_infos(self, str view_name) :
cdef Obiview_infos_p view_infos_p
cdef dict view_infos_d
cdef Alias_column_pair_p column_refs
cdef int i, j
cdef str column_name
view_infos_p = obi_view_map_file(self._pointer,
tobytes(view_name))
view_infos_d = {}
view_infos_d["name"] = bytes2str(view_infos_p.name)
view_infos_d["comments"] = bytes2str(view_infos_p.comments)
view_infos_d["view_type"] = bytes2str(view_infos_p.view_type)
view_infos_d["column_count"] = <int> view_infos_p.column_count
view_infos_d["line_count"] = <int> view_infos_p.line_count
view_infos_d["created_from"] = bytes2str(view_infos_p.created_from)
view_infos_d["creation_date"] = bytes2str(obi_format_date(view_infos_p.creation_date))
if (view_infos_p.all_lines) :
view_infos_d["line_selection"] = None
else :
view_infos_d["line_selection"] = {}
view_infos_d["line_selection"]["column_name"] = bytes2str((view_infos_p.line_selection).column_name)
view_infos_d["line_selection"]["version"] = <int> (view_infos_p.line_selection).version
view_infos_d["column_references"] = {}
column_references = view_infos_p.column_references
for j in range(view_infos_d["column_count"]) :
column_name = bytes2str((column_references[j]).alias)
view_infos_d["column_references"][column_name] = {}
view_infos_d["column_references"][column_name]["original_name"] = bytes2str((column_references[j]).column_refs.column_name)
view_infos_d["column_references"][column_name]["version"] = (column_references[j]).column_refs.version
obi_view_unmap_file(self._pointer, view_infos_p)
return view_infos_d