paleolimbot commented on code in PR #117:
URL: https://github.com/apache/arrow-nanoarrow/pull/117#discussion_r1132715658
##########
python/src/nanoarrow/_lib.pyx:
##########
@@ -84,3 +85,329 @@ def as_numpy_array(arr):
# TODO set base
return result
+
+
+def version():
+ return ArrowNanoarrowVersion().decode("UTF-8")
+
+cdef class CSchemaHolder:
+ cdef ArrowSchema c_schema
+
+ def __init__(self):
+ self.c_schema.release = NULL
+
+ def __del__(self):
+ if self.c_schema.release != NULL:
+ self.c_schema.release(&self.c_schema)
+
+ def _addr(self):
+ return <uintptr_t>&self.c_schema
+
+cdef class CArrayHolder:
+ cdef ArrowArray c_array
+
+ def __init__(self):
+ self.c_array.release = NULL
+
+ def __del__(self):
+ if self.c_array.release != NULL:
+ self.c_array.release(&self.c_array)
+
+ def _addr(self):
+ return <uintptr_t>&self.c_array
+
+cdef class CArrayViewHolder:
+ cdef ArrowArrayView c_array_view
+
+ def __init__(self):
+ ArrowArrayViewInitFromType(&self.c_array_view,
NANOARROW_TYPE_UNINITIALIZED)
+
+ def __del__(self):
+ ArrowArrayViewReset(&self.c_array_view)
+
+ def _addr(self):
+ return <uintptr_t>&self.c_array_view
+
+cdef class CSchema:
+ cdef object _base
+ cdef ArrowSchema* _ptr
+
+ @staticmethod
+ def Empty():
+ base = CSchemaHolder()
+ return CSchema(base, base._addr())
+
+ def __init__(self, object base, uintptr_t addr):
+ self._base = base,
+ self._ptr = <ArrowSchema*>addr
+
+ def _addr(self):
+ return <uintptr_t>self._ptr
+
+ def is_valid(self):
+ return self._ptr.release != NULL
+
+ def _assert_valid(self):
+ if self._ptr.release == NULL:
+ raise RuntimeError("schema is released")
+
+ def __repr__(self):
+ cdef int64_t n_chars = ArrowSchemaToString(self._ptr, NULL, 0, True)
+ cdef char* out = <char*>PyMem_Malloc(n_chars + 1)
+ if not out:
+ raise MemoryError()
+
+ ArrowSchemaToString(self._ptr, out, n_chars + 1, True)
+ out_str = out.decode("UTF-8")
+ PyMem_Free(out)
+
+ return out_str
+
+ @property
+ def format(self):
+ self._assert_valid()
+ if self._ptr.format != NULL:
+ return self._ptr.format.decode("UTF-8")
+
+ @property
+ def name(self):
+ self._assert_valid()
+ if self._ptr.name != NULL:
+ return self._ptr.name.decode("UTF-8")
+ else:
+ return None
+
+ @property
+ def flags(self):
+ return self._ptr.flags
+
+ @property
+ def children(self):
+ self._assert_valid()
+ return CSchemaChildren(self)
+
+ def parse(self):
+ self._assert_valid()
+
+ cdef ArrowError error
+ cdef ArrowSchemaView schema_view
+
+ cdef int result = ArrowSchemaViewInit(&schema_view, self._ptr, &error)
+ if result != NANOARROW_OK:
+ raise ValueError(ArrowErrorMessage(&error))
+
+ out = {
+ 'name': self._ptr.name.decode('UTF-8') if self._ptr.name else None,
+ 'type': ArrowTypeString(schema_view.type).decode('UTF-8'),
+ 'storage_type':
ArrowTypeString(schema_view.storage_type).decode('UTF-8')
+ }
+
+ if schema_view.storage_type in (NANOARROW_TYPE_FIXED_SIZE_LIST,
+ NANOARROW_TYPE_FIXED_SIZE_BINARY):
+ out['fixed_size'] = schema_view.fixed_size
+
+ if schema_view.storage_type in (NANOARROW_TYPE_DECIMAL128,
+ NANOARROW_TYPE_DECIMAL256):
+ out['decimal_bitwidth'] = schema_view.decimal_bitwidth
+ out['decimal_precision'] = schema_view.decimal_precision
+ out['decimal_scale'] = schema_view.decimal_scale
+
+ return out
+
+cdef class CArray:
+ cdef object _base
+ cdef ArrowArray* _ptr
+ cdef CSchema _schema
+
+ @staticmethod
+ def Empty(CSchema schema):
+ base = CArrayHolder()
+ return CArray(base, base._addr(), schema)
+
+ def __init__(self, object base, uintptr_t addr, CSchema schema):
+ self._base = base,
+ self._ptr = <ArrowArray*>addr
+ self._schema = schema
+
+ def _addr(self):
+ return <uintptr_t>self._ptr
+
+ def is_valid(self):
+ return self._ptr.release != NULL
+
+ def _assert_valid(self):
+ if self._ptr.release == NULL:
+ raise RuntimeError("Array is released")
+
+ @property
+ def schema(self):
+ return self._schema
+
+ @property
+ def children(self):
+ return CArrayChildren(self)
+
+ def validate(self):
+ cdef CArrayViewHolder holder = CArrayViewHolder()
+
+ cdef ArrowError error
+ cdef int result = ArrowArrayViewInitFromSchema(&holder.c_array_view,
+ self._schema._ptr,
&error)
+ if result != NANOARROW_OK:
+ raise ValueError(ArrowErrorMessage(&error))
+
+ result = ArrowArrayViewSetArray(&holder.c_array_view, self._ptr,
&error)
+ if result != NANOARROW_OK:
+ raise ValueError(ArrowErrorMessage(&error))
+
+ return CArrayView(holder, holder._addr(), self)
Review Comment:
This was a bit of a rabbit hole but you're totally right. Now you can do
`array.view()` and `schema.view()`, which is a bit more intuitive since you get
a `SchemaView` and `ArrayView` back. I also completed the element accessors on
the array and schema classes.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]