94 lines
3 KiB
Cython
94 lines
3 KiB
Cython
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
# distutils: language=c++
|
|
# cython: language_level = 3
|
|
|
|
from pyarrow.lib cimport *
|
|
|
|
cdef extern from * namespace "arrow::py" nogil:
|
|
"""
|
|
#include "arrow/status.h"
|
|
#include "arrow/extension_type.h"
|
|
#include "arrow/json/from_string.h"
|
|
|
|
namespace arrow {
|
|
namespace py {
|
|
|
|
class UuidArray : public ExtensionArray {
|
|
public:
|
|
using ExtensionArray::ExtensionArray;
|
|
};
|
|
|
|
class UuidType : public ExtensionType {
|
|
public:
|
|
UuidType() : ExtensionType(fixed_size_binary(16)) {}
|
|
std::string extension_name() const override { return "example-uuid"; }
|
|
|
|
bool ExtensionEquals(const ExtensionType& other) const override {
|
|
return other.extension_name() == this->extension_name();
|
|
}
|
|
|
|
std::shared_ptr<Array> MakeArray(std::shared_ptr<ArrayData> data) const override {
|
|
return std::make_shared<ExtensionArray>(data);
|
|
}
|
|
|
|
Result<std::shared_ptr<DataType>> Deserialize(
|
|
std::shared_ptr<DataType> storage_type,
|
|
const std::string& serialized) const override {
|
|
return std::make_shared<UuidType>();
|
|
}
|
|
|
|
std::string Serialize() const override { return ""; }
|
|
};
|
|
|
|
|
|
std::shared_ptr<DataType> MakeUuidType() {
|
|
return std::make_shared<UuidType>();
|
|
}
|
|
|
|
std::shared_ptr<Array> MakeUuidArray() {
|
|
auto uuid_type = MakeUuidType();
|
|
auto json = "[\\"abcdefghijklmno0\\", \\"0onmlkjihgfedcba\\"]";
|
|
auto result = json::ArrayFromJSONString(fixed_size_binary(16), json);
|
|
return ExtensionType::WrapArray(uuid_type, result.ValueOrDie());
|
|
}
|
|
|
|
std::once_flag uuid_registered;
|
|
|
|
static bool RegisterUuidType() {
|
|
std::call_once(uuid_registered, RegisterExtensionType,
|
|
std::make_shared<UuidType>());
|
|
return true;
|
|
}
|
|
|
|
static auto uuid_type_registered = RegisterUuidType();
|
|
|
|
} // namespace py
|
|
} // namespace arrow
|
|
"""
|
|
|
|
cdef shared_ptr[CDataType] CMakeUuidType" arrow::py::MakeUuidType"()
|
|
cdef shared_ptr[CArray] CMakeUuidArray" arrow::py::MakeUuidArray"()
|
|
|
|
|
|
def _make_uuid_type():
|
|
return pyarrow_wrap_data_type(CMakeUuidType())
|
|
|
|
|
|
def _make_uuid_array():
|
|
return pyarrow_wrap_array(CMakeUuidArray())
|