1 # Licensed to the Apache Software Foundation (ASF) under one
2 # or more contributor license agreements. See the NOTICE file
3 # distributed with this work for additional information
4 # regarding copyright ownership. The ASF licenses this file
5 # to you under the Apache License, Version 2.0 (the
6 # "License"); you may not use this file except in compliance
7 # with the License. You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing,
12 # software distributed under the License is distributed on an
13 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 # KIND, either express or implied. See the License for the
15 # specific language governing permissions and limitations
18 from libcpp.memory cimport shared_ptr
19 from pyarrow.includes.libarrow cimport (CArray, CDataType, CField,
20 CRecordBatch, CSchema,
22 CSparseCOOTensor, CSparseCSRMatrix,
23 CSparseCSCMatrix, CSparseCSFTensor)
25 # You cannot assign something to a dereferenced pointer in Cython thus these
26 # methods don't use Status to indicate a successful operation.
29 cdef api bint pyarrow_is_buffer(object buffer):
30 return isinstance(buffer, Buffer)
33 cdef api shared_ptr[CBuffer] pyarrow_unwrap_buffer(object buffer):
35 if pyarrow_is_buffer(buffer):
36 buf = <Buffer>(buffer)
39 return shared_ptr[CBuffer]()
42 cdef api object pyarrow_wrap_buffer(const shared_ptr[CBuffer]& buf):
43 cdef Buffer result = Buffer.__new__(Buffer)
48 cdef api object pyarrow_wrap_resizable_buffer(
49 const shared_ptr[CResizableBuffer]& buf):
50 cdef ResizableBuffer result = ResizableBuffer.__new__(ResizableBuffer)
55 cdef api bint pyarrow_is_data_type(object type_):
56 return isinstance(type_, DataType)
59 cdef api shared_ptr[CDataType] pyarrow_unwrap_data_type(
62 if pyarrow_is_data_type(data_type):
63 type_ = <DataType>(data_type)
66 return shared_ptr[CDataType]()
69 # Workaround for Cython parsing bug
70 # https://github.com/cython/cython/issues/2143
71 ctypedef const CPyExtensionType* _CPyExtensionTypePtr
74 cdef api object pyarrow_wrap_data_type(
75 const shared_ptr[CDataType]& type):
77 const CExtensionType* ext_type
78 const CPyExtensionType* cpy_ext_type
81 if type.get() == NULL:
84 if type.get().id() == _Type_DICTIONARY:
85 out = DictionaryType.__new__(DictionaryType)
86 elif type.get().id() == _Type_LIST:
87 out = ListType.__new__(ListType)
88 elif type.get().id() == _Type_LARGE_LIST:
89 out = LargeListType.__new__(LargeListType)
90 elif type.get().id() == _Type_MAP:
91 out = MapType.__new__(MapType)
92 elif type.get().id() == _Type_FIXED_SIZE_LIST:
93 out = FixedSizeListType.__new__(FixedSizeListType)
94 elif type.get().id() == _Type_STRUCT:
95 out = StructType.__new__(StructType)
96 elif type.get().id() == _Type_SPARSE_UNION:
97 out = SparseUnionType.__new__(SparseUnionType)
98 elif type.get().id() == _Type_DENSE_UNION:
99 out = DenseUnionType.__new__(DenseUnionType)
100 elif type.get().id() == _Type_TIMESTAMP:
101 out = TimestampType.__new__(TimestampType)
102 elif type.get().id() == _Type_DURATION:
103 out = DurationType.__new__(DurationType)
104 elif type.get().id() == _Type_FIXED_SIZE_BINARY:
105 out = FixedSizeBinaryType.__new__(FixedSizeBinaryType)
106 elif type.get().id() == _Type_DECIMAL128:
107 out = Decimal128Type.__new__(Decimal128Type)
108 elif type.get().id() == _Type_DECIMAL256:
109 out = Decimal256Type.__new__(Decimal256Type)
110 elif type.get().id() == _Type_EXTENSION:
111 ext_type = <const CExtensionType*> type.get()
112 cpy_ext_type = dynamic_cast[_CPyExtensionTypePtr](ext_type)
113 if cpy_ext_type != nullptr:
114 return cpy_ext_type.GetInstance()
116 out = BaseExtensionType.__new__(BaseExtensionType)
118 out = DataType.__new__(DataType)
124 cdef object pyarrow_wrap_metadata(
125 const shared_ptr[const CKeyValueMetadata]& meta):
126 if meta.get() == nullptr:
129 return KeyValueMetadata.wrap(meta)
132 cdef api bint pyarrow_is_metadata(object metadata):
133 return isinstance(metadata, KeyValueMetadata)
136 cdef shared_ptr[const CKeyValueMetadata] pyarrow_unwrap_metadata(object meta):
137 cdef shared_ptr[const CKeyValueMetadata] c_meta
138 if pyarrow_is_metadata(meta):
139 c_meta = (<KeyValueMetadata>meta).unwrap()
143 cdef api bint pyarrow_is_field(object field):
144 return isinstance(field, Field)
147 cdef api shared_ptr[CField] pyarrow_unwrap_field(object field):
149 if pyarrow_is_field(field):
150 field_ = <Field>(field)
151 return field_.sp_field
153 return shared_ptr[CField]()
156 cdef api object pyarrow_wrap_field(const shared_ptr[CField]& field):
157 if field.get() == NULL:
159 cdef Field out = Field.__new__(Field)
164 cdef api bint pyarrow_is_schema(object schema):
165 return isinstance(schema, Schema)
168 cdef api shared_ptr[CSchema] pyarrow_unwrap_schema(object schema):
170 if pyarrow_is_schema(schema):
171 sch = <Schema>(schema)
174 return shared_ptr[CSchema]()
177 cdef api object pyarrow_wrap_schema(const shared_ptr[CSchema]& schema):
178 cdef Schema out = Schema.__new__(Schema)
179 out.init_schema(schema)
183 cdef api bint pyarrow_is_array(object array):
184 return isinstance(array, Array)
187 cdef api shared_ptr[CArray] pyarrow_unwrap_array(object array):
189 if pyarrow_is_array(array):
193 return shared_ptr[CArray]()
196 cdef api object pyarrow_wrap_array(const shared_ptr[CArray]& sp_array):
197 if sp_array.get() == NULL:
198 raise ValueError('Array was NULL')
200 klass = get_array_class_from_type(sp_array.get().type())
202 cdef Array arr = klass.__new__(klass)
207 cdef api bint pyarrow_is_chunked_array(object array):
208 return isinstance(array, ChunkedArray)
211 cdef api shared_ptr[CChunkedArray] pyarrow_unwrap_chunked_array(object array):
212 cdef ChunkedArray arr
213 if pyarrow_is_chunked_array(array):
214 arr = <ChunkedArray>(array)
215 return arr.sp_chunked_array
217 return shared_ptr[CChunkedArray]()
220 cdef api object pyarrow_wrap_chunked_array(
221 const shared_ptr[CChunkedArray]& sp_array):
222 if sp_array.get() == NULL:
223 raise ValueError('ChunkedArray was NULL')
225 cdef CDataType* data_type = sp_array.get().type().get()
227 if data_type == NULL:
228 raise ValueError('ChunkedArray data type was NULL')
230 cdef ChunkedArray arr = ChunkedArray.__new__(ChunkedArray)
235 cdef api bint pyarrow_is_scalar(object value):
236 return isinstance(value, Scalar)
239 cdef api shared_ptr[CScalar] pyarrow_unwrap_scalar(object scalar):
240 if pyarrow_is_scalar(scalar):
241 return (<Scalar> scalar).unwrap()
242 return shared_ptr[CScalar]()
245 cdef api object pyarrow_wrap_scalar(const shared_ptr[CScalar]& sp_scalar):
246 if sp_scalar.get() == NULL:
247 raise ValueError('Scalar was NULL')
249 cdef CDataType* data_type = sp_scalar.get().type.get()
251 if data_type == NULL:
252 raise ValueError('Scalar data type was NULL')
254 if data_type.id() == _Type_NA:
257 if data_type.id() not in _scalar_classes:
258 raise ValueError('Scalar type not supported')
260 klass = _scalar_classes[data_type.id()]
262 cdef Scalar scalar = klass.__new__(klass)
263 scalar.init(sp_scalar)
267 cdef api bint pyarrow_is_tensor(object tensor):
268 return isinstance(tensor, Tensor)
271 cdef api shared_ptr[CTensor] pyarrow_unwrap_tensor(object tensor):
273 if pyarrow_is_tensor(tensor):
274 ten = <Tensor>(tensor)
277 return shared_ptr[CTensor]()
280 cdef api object pyarrow_wrap_tensor(
281 const shared_ptr[CTensor]& sp_tensor):
282 if sp_tensor.get() == NULL:
283 raise ValueError('Tensor was NULL')
285 cdef Tensor tensor = Tensor.__new__(Tensor)
286 tensor.init(sp_tensor)
290 cdef api bint pyarrow_is_sparse_coo_tensor(object sparse_tensor):
291 return isinstance(sparse_tensor, SparseCOOTensor)
293 cdef api shared_ptr[CSparseCOOTensor] pyarrow_unwrap_sparse_coo_tensor(
294 object sparse_tensor):
295 cdef SparseCOOTensor sten
296 if pyarrow_is_sparse_coo_tensor(sparse_tensor):
297 sten = <SparseCOOTensor>(sparse_tensor)
298 return sten.sp_sparse_tensor
300 return shared_ptr[CSparseCOOTensor]()
302 cdef api object pyarrow_wrap_sparse_coo_tensor(
303 const shared_ptr[CSparseCOOTensor]& sp_sparse_tensor):
304 if sp_sparse_tensor.get() == NULL:
305 raise ValueError('SparseCOOTensor was NULL')
307 cdef SparseCOOTensor sparse_tensor = SparseCOOTensor.__new__(
309 sparse_tensor.init(sp_sparse_tensor)
313 cdef api bint pyarrow_is_sparse_csr_matrix(object sparse_tensor):
314 return isinstance(sparse_tensor, SparseCSRMatrix)
316 cdef api shared_ptr[CSparseCSRMatrix] pyarrow_unwrap_sparse_csr_matrix(
317 object sparse_tensor):
318 cdef SparseCSRMatrix sten
319 if pyarrow_is_sparse_csr_matrix(sparse_tensor):
320 sten = <SparseCSRMatrix>(sparse_tensor)
321 return sten.sp_sparse_tensor
323 return shared_ptr[CSparseCSRMatrix]()
325 cdef api object pyarrow_wrap_sparse_csr_matrix(
326 const shared_ptr[CSparseCSRMatrix]& sp_sparse_tensor):
327 if sp_sparse_tensor.get() == NULL:
328 raise ValueError('SparseCSRMatrix was NULL')
330 cdef SparseCSRMatrix sparse_tensor = SparseCSRMatrix.__new__(
332 sparse_tensor.init(sp_sparse_tensor)
336 cdef api bint pyarrow_is_sparse_csc_matrix(object sparse_tensor):
337 return isinstance(sparse_tensor, SparseCSCMatrix)
339 cdef api shared_ptr[CSparseCSCMatrix] pyarrow_unwrap_sparse_csc_matrix(
340 object sparse_tensor):
341 cdef SparseCSCMatrix sten
342 if pyarrow_is_sparse_csc_matrix(sparse_tensor):
343 sten = <SparseCSCMatrix>(sparse_tensor)
344 return sten.sp_sparse_tensor
346 return shared_ptr[CSparseCSCMatrix]()
348 cdef api object pyarrow_wrap_sparse_csc_matrix(
349 const shared_ptr[CSparseCSCMatrix]& sp_sparse_tensor):
350 if sp_sparse_tensor.get() == NULL:
351 raise ValueError('SparseCSCMatrix was NULL')
353 cdef SparseCSCMatrix sparse_tensor = SparseCSCMatrix.__new__(
355 sparse_tensor.init(sp_sparse_tensor)
359 cdef api bint pyarrow_is_sparse_csf_tensor(object sparse_tensor):
360 return isinstance(sparse_tensor, SparseCSFTensor)
362 cdef api shared_ptr[CSparseCSFTensor] pyarrow_unwrap_sparse_csf_tensor(
363 object sparse_tensor):
364 cdef SparseCSFTensor sten
365 if pyarrow_is_sparse_csf_tensor(sparse_tensor):
366 sten = <SparseCSFTensor>(sparse_tensor)
367 return sten.sp_sparse_tensor
369 return shared_ptr[CSparseCSFTensor]()
371 cdef api object pyarrow_wrap_sparse_csf_tensor(
372 const shared_ptr[CSparseCSFTensor]& sp_sparse_tensor):
373 if sp_sparse_tensor.get() == NULL:
374 raise ValueError('SparseCSFTensor was NULL')
376 cdef SparseCSFTensor sparse_tensor = SparseCSFTensor.__new__(
378 sparse_tensor.init(sp_sparse_tensor)
382 cdef api bint pyarrow_is_table(object table):
383 return isinstance(table, Table)
386 cdef api shared_ptr[CTable] pyarrow_unwrap_table(object table):
388 if pyarrow_is_table(table):
392 return shared_ptr[CTable]()
395 cdef api object pyarrow_wrap_table(const shared_ptr[CTable]& ctable):
396 cdef Table table = Table.__new__(Table)
401 cdef api bint pyarrow_is_batch(object batch):
402 return isinstance(batch, RecordBatch)
405 cdef api shared_ptr[CRecordBatch] pyarrow_unwrap_batch(object batch):
407 if pyarrow_is_batch(batch):
408 bat = <RecordBatch>(batch)
411 return shared_ptr[CRecordBatch]()
414 cdef api object pyarrow_wrap_batch(
415 const shared_ptr[CRecordBatch]& cbatch):
416 cdef RecordBatch batch = RecordBatch.__new__(RecordBatch)