diff --git a/python/obitools3/dms/_obiview.pxd b/python/obitools3/dms/view.pxd similarity index 55% rename from python/obitools3/dms/_obiview.pxd rename to python/obitools3/dms/view.pxd index 48fc4f5..b7a9d72 100644 --- a/python/obitools3/dms/_obiview.pxd +++ b/python/obitools3/dms/view.pxd @@ -26,71 +26,61 @@ from .capi.obiview cimport Obiview_p, \ DEFINITION_COLUMN, \ QUALITY_COLUMN -from ._obidmscolumn cimport OBIDMS_column_p, \ - OBIDMS_column - -from ._obidms cimport OBIDMS from obitools3.utils cimport tobytes, \ bytes2str, \ tostr + +from .dms cimport DMS -cdef class OBIView: + +cdef class View: - cdef OBIDMS _dms + cdef DMS _dms cdef Obiview_p _pointer cdef dict _columns cdef __init_columns__(self) - cpdef OBIView clone(self, - view_name, - comments=*) + cpdef View clone(self, + object view_name, + object comments=*) @staticmethod - cdef OBIView _new(OBIDMS dms, - bytes view_name, - bytes comments=*) + cdef View _new(DMS dms, + bytes view_name, + bytes comments=*) @staticmethod - cdef OBIView _open(OBIDMS dms, - bytes view_name) + cdef View _open(DMS dms, + bytes view_name) - cpdef delete_column(self, column_name) - 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 close(self) + 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) cpdef OBIView_line_selection new_selection(self, list lines=*) -cdef class OBIView_line_selection(list): +cdef class View_line_selection(list): - cdef OBIView _view - cdef str _view_name + cdef View _view cdef index_t* __build_binary_list__(self) - cpdef OBIView materialize(self, - str view_name, - str comments=*) + + cpdef View materialize(self, + object view_name, + object comments=*) -cdef class OBIView_line : +cdef class View_line : cdef index_t _index - cdef OBIView _view + cdef View _view diff --git a/python/obitools3/dms/_obiview.pyx b/python/obitools3/dms/view.pyx similarity index 77% rename from python/obitools3/dms/_obiview.pyx rename to python/obitools3/dms/view.pyx index 8b8bf92..68edf70 100644 --- a/python/obitools3/dms/_obiview.pyx +++ b/python/obitools3/dms/view.pyx @@ -1,60 +1,52 @@ #cython: language_level=3 -cdef class OBIView : +cdef class View : def __init__(self,dms,int __internalCall__): + if __internalCall__!=987654: raise RuntimeError('OBIView constructor cannot be called directly') + self._dms = dms self._pointer = NULL - self._columns = {} - - cdef __init_columns__(self): - cdef size_t i - 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 = (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""): + + cpdef View clone(self, + object view_name, + object comments=None): - 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, - tobytes(view_name), + view_name_b, self._pointer, NULL, - tobytes(comments)) + comments_b) if view._pointer == NULL : raise RuntimeError("Error : Cannot clone view %s into view %s" % (str(self.name), - tobytes(view_name)) + bytes2str(view_name_b)) ) - - view.__init_columns__() - + return view @staticmethod - cdef OBIView _new(OBIDMS dms, - bytes view_name, - bytes comments=b""): + cdef View _new(DMS dms, + bytes view_name, + bytes comments=b""): - cdef OBIView view = OBIView(dms, - 987654) # @DuplicatedSignature + cdef View view = OBIView(dms, + 987654) # @DuplicatedSignature view._pointer = obi_new_view(dms._pointer, view_name, @@ -64,24 +56,34 @@ cdef class OBIView : if view._pointer == NULL : raise RuntimeError("Error : Cannot create view %s" % view_name) - - view.__init_columns__() - + return view @staticmethod def new(OBIDMS dms, - view_name, - comments=b""): - return OBIView._new(dms,tobytes(view_name),tobytes(comments)) + object view_name, + object comments=None): + + 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 - cdef OBIView _open(OBIDMS dms, - bytes view_name): + cdef View _open(DMS dms, + bytes view_name): - cdef OBIView view = OBIView(dms, - 987654) # @DuplicatedSignature + cdef View view = View(dms, + 987654) # @DuplicatedSignature view._pointer = obi_open_view(dms._pointer, view_name) @@ -89,19 +91,22 @@ cdef class OBIView : if view._pointer == NULL : raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name)) - view.__init_columns__() - return view @staticmethod - def open(OBIDMS dms, # @ReservedAssignment - view_name): - return OBIView._open(dms,tobytes(view_name)) + def open(DMS dms, # @ReservedAssignment + object 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) : raise Exception("Problem closing a view") + def __dealloc__(self): + self.close() def __repr__(self) : cdef str s @@ -400,4 +405,40 @@ cdef class OBIView_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"] = view_infos_p.column_count + view_infos_d["line_count"] = 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"] = (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 +