| /* |
| * 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. |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| # include <config.h> |
| #endif |
| |
| #include <arrow-glib/array.hpp> |
| #include <arrow-glib/chunked-array.hpp> |
| #include <arrow-glib/data-type.hpp> |
| #include <arrow-glib/enums.h> |
| #include <arrow-glib/error.hpp> |
| #include <arrow-glib/field.hpp> |
| #include <arrow-glib/type.hpp> |
| |
| G_BEGIN_DECLS |
| |
| /** |
| * SECTION: basic-data-type |
| * @section_id: basic-data-type-classes |
| * @title: Basic data type classes |
| * @include: arrow-glib/arrow-glib.h |
| * |
| * #GArrowDataType is a base class for all data type classes such as |
| * #GArrowBooleanDataType. |
| * |
| * #GArrowNullDataType is a class for the null data type. |
| * |
| * #GArrowBooleanDataType is a class for the boolean data type. |
| * |
| * #GArrowInt8DataType is a class for the 8-bit integer data type. |
| * |
| * #GArrowUInt8DataType is a class for the 8-bit unsigned integer data type. |
| * |
| * #GArrowInt16DataType is a class for the 16-bit integer data type. |
| * |
| * #GArrowUInt16DataType is a class for the 16-bit unsigned integer data type. |
| * |
| * #GArrowInt32DataType is a class for the 32-bit integer data type. |
| * |
| * #GArrowUInt32DataType is a class for the 32-bit unsigned integer data type. |
| * |
| * #GArrowInt64DataType is a class for the 64-bit integer data type. |
| * |
| * #GArrowUInt64DataType is a class for the 64-bit unsigned integer data type. |
| * |
| * #GArrowFloatDataType is a class for the 32-bit floating point data |
| * type. |
| * |
| * #GArrowDoubleDataType is a class for the 64-bit floating point data |
| * type. |
| * |
| * #GArrowBinaryDataType is a class for the binary data type. |
| * |
| * #GArrowLargeBinaryDataType is a class for the 64-bit offsets binary |
| * data type. |
| * |
| * #GArrowFixedSizeBinaryDataType is a class for the fixed-size binary |
| * data type. |
| * |
| * #GArrowStringDataType is a class for the UTF-8 encoded string data |
| * type. |
| * |
| * #GArrowLargeStringDataType is a class for the 64-bit offsets UTF-8 |
| * encoded string data type. |
| * |
| * #GArrowDate32DataType is a class for the number of days since UNIX |
| * epoch in the 32-bit signed integer data type. |
| * |
| * #GArrowDate64DataType is a class for the number of milliseconds |
| * since UNIX epoch in the 64-bit signed integer data type. |
| * |
| * #GArrowTimestampDataType is a class for the number of |
| * seconds/milliseconds/microseconds/nanoseconds since UNIX epoch in |
| * the 64-bit signed integer data type. |
| * |
| * #GArrowTime32DataType is a class for the number of seconds or |
| * milliseconds since midnight in the 32-bit signed integer data type. |
| * |
| * #GArrowTime64DataType is a class for the number of microseconds or |
| * nanoseconds since midnight in the 64-bit signed integer data type. |
| * |
| * #GArrowDecimalDataType is a base class for the decimal data types. |
| * |
| * #GArrowDecimal128DataType is a class for the 128-bit decimal data type. |
| * |
| * #GArrowDecimal256DataType is a class for the 256-bit decimal data type. |
| * |
| * #GArrowExtensionDataType is a base class for user-defined extension |
| * data types. |
| * |
| * #GArrowExtensionDataTypeRegistry is a class to manage extension |
| * data types. |
| */ |
| |
| typedef struct GArrowDataTypePrivate_ { |
| std::shared_ptr<arrow::DataType> data_type; |
| } GArrowDataTypePrivate; |
| |
| enum { |
| PROP_DATA_TYPE = 1 |
| }; |
| |
| G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(GArrowDataType, |
| garrow_data_type, |
| G_TYPE_OBJECT) |
| |
| #define GARROW_DATA_TYPE_GET_PRIVATE(obj) \ |
| static_cast<GArrowDataTypePrivate *>( \ |
| garrow_data_type_get_instance_private( \ |
| GARROW_DATA_TYPE(obj))) |
| |
| static void |
| garrow_data_type_finalize(GObject *object) |
| { |
| auto priv = GARROW_DATA_TYPE_GET_PRIVATE(object); |
| |
| priv->data_type.~shared_ptr(); |
| |
| G_OBJECT_CLASS(garrow_data_type_parent_class)->finalize(object); |
| } |
| |
| static void |
| garrow_data_type_set_property(GObject *object, |
| guint prop_id, |
| const GValue *value, |
| GParamSpec *pspec) |
| { |
| auto priv = GARROW_DATA_TYPE_GET_PRIVATE(object); |
| |
| switch (prop_id) { |
| case PROP_DATA_TYPE: |
| { |
| auto data_type = g_value_get_pointer(value); |
| if (data_type) { |
| priv->data_type = |
| *static_cast<std::shared_ptr<arrow::DataType> *>(data_type); |
| } |
| } |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void |
| garrow_data_type_get_property(GObject *object, |
| guint prop_id, |
| GValue *value, |
| GParamSpec *pspec) |
| { |
| switch (prop_id) { |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void |
| garrow_data_type_init(GArrowDataType *object) |
| { |
| auto priv = GARROW_DATA_TYPE_GET_PRIVATE(object); |
| new(&priv->data_type) std::shared_ptr<arrow::DataType>; |
| } |
| |
| static void |
| garrow_data_type_class_init(GArrowDataTypeClass *klass) |
| { |
| GObjectClass *gobject_class; |
| GParamSpec *spec; |
| |
| gobject_class = G_OBJECT_CLASS(klass); |
| |
| gobject_class->finalize = garrow_data_type_finalize; |
| gobject_class->set_property = garrow_data_type_set_property; |
| gobject_class->get_property = garrow_data_type_get_property; |
| |
| spec = g_param_spec_pointer("data-type", |
| "Data type", |
| "The raw std::shared<arrow::DataType> *", |
| static_cast<GParamFlags>(G_PARAM_WRITABLE | |
| G_PARAM_CONSTRUCT_ONLY)); |
| g_object_class_install_property(gobject_class, PROP_DATA_TYPE, spec); |
| } |
| |
| /** |
| * garrow_data_type_equal: |
| * @data_type: A #GArrowDataType. |
| * @other_data_type: A #GArrowDataType to be compared. |
| * |
| * Returns: %TRUE if both of them have the same data, %FALSE |
| * otherwise. |
| */ |
| gboolean |
| garrow_data_type_equal(GArrowDataType *data_type, |
| GArrowDataType *other_data_type) |
| { |
| const auto arrow_data_type = garrow_data_type_get_raw(data_type); |
| const auto arrow_other_data_type = garrow_data_type_get_raw(other_data_type); |
| return arrow_data_type->Equals(arrow_other_data_type); |
| } |
| |
| /** |
| * garrow_data_type_to_string: |
| * @data_type: A #GArrowDataType. |
| * |
| * Returns: The string representation of the data type. |
| * |
| * It should be freed with g_free() when no longer needed. |
| */ |
| gchar * |
| garrow_data_type_to_string(GArrowDataType *data_type) |
| { |
| const auto arrow_data_type = garrow_data_type_get_raw(data_type); |
| return g_strdup(arrow_data_type->ToString().c_str()); |
| } |
| |
| /** |
| * garrow_data_type_get_id: |
| * @data_type: A #GArrowDataType. |
| * |
| * Returns: The #GArrowType of the data type. |
| */ |
| GArrowType |
| garrow_data_type_get_id(GArrowDataType *data_type) |
| { |
| const auto arrow_data_type = garrow_data_type_get_raw(data_type); |
| return garrow_type_from_raw(arrow_data_type->id()); |
| } |
| |
| /** |
| * garrow_data_type_get_name: |
| * @data_type: A #GArrowDataType. |
| * |
| * Returns: The name of the data type. |
| * |
| * It should be freed with g_free() when no longer needed. |
| * |
| * Since: 3.0.0 |
| */ |
| gchar * |
| garrow_data_type_get_name(GArrowDataType *data_type) |
| { |
| const auto arrow_data_type = garrow_data_type_get_raw(data_type); |
| return g_strdup(arrow_data_type->name().c_str()); |
| } |
| |
| |
| G_DEFINE_ABSTRACT_TYPE(GArrowFixedWidthDataType, |
| garrow_fixed_width_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_fixed_width_data_type_init(GArrowFixedWidthDataType *object) |
| { |
| } |
| |
| static void |
| garrow_fixed_width_data_type_class_init(GArrowFixedWidthDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_fixed_width_data_type_get_bit_width: |
| * @data_type: A #GArrowFixedWidthDataType. |
| * |
| * Returns: The number of bits for one data. |
| */ |
| gint |
| garrow_fixed_width_data_type_get_bit_width(GArrowFixedWidthDataType *data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type)); |
| const auto arrow_fixed_width_type = |
| std::static_pointer_cast<arrow::FixedWidthType>(arrow_data_type); |
| return arrow_fixed_width_type->bit_width(); |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowNullDataType, |
| garrow_null_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_null_data_type_init(GArrowNullDataType *object) |
| { |
| } |
| |
| static void |
| garrow_null_data_type_class_init(GArrowNullDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_null_data_type_new: |
| * |
| * Returns: The newly created null data type. |
| */ |
| GArrowNullDataType * |
| garrow_null_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::null(); |
| |
| GArrowNullDataType *data_type = |
| GARROW_NULL_DATA_TYPE(g_object_new(GARROW_TYPE_NULL_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowBooleanDataType, |
| garrow_boolean_data_type, |
| GARROW_TYPE_FIXED_WIDTH_DATA_TYPE) |
| |
| static void |
| garrow_boolean_data_type_init(GArrowBooleanDataType *object) |
| { |
| } |
| |
| static void |
| garrow_boolean_data_type_class_init(GArrowBooleanDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_boolean_data_type_new: |
| * |
| * Returns: The newly created boolean data type. |
| */ |
| GArrowBooleanDataType * |
| garrow_boolean_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::boolean(); |
| |
| GArrowBooleanDataType *data_type = |
| GARROW_BOOLEAN_DATA_TYPE(g_object_new(GARROW_TYPE_BOOLEAN_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_ABSTRACT_TYPE(GArrowNumericDataType, |
| garrow_numeric_data_type, |
| GARROW_TYPE_FIXED_WIDTH_DATA_TYPE) |
| |
| static void |
| garrow_numeric_data_type_init(GArrowNumericDataType *object) |
| { |
| } |
| |
| static void |
| garrow_numeric_data_type_class_init(GArrowNumericDataTypeClass *klass) |
| { |
| } |
| |
| |
| G_DEFINE_ABSTRACT_TYPE(GArrowIntegerDataType, |
| garrow_integer_data_type, |
| GARROW_TYPE_NUMERIC_DATA_TYPE) |
| |
| static void |
| garrow_integer_data_type_init(GArrowIntegerDataType *object) |
| { |
| } |
| |
| static void |
| garrow_integer_data_type_class_init(GArrowIntegerDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_integer_data_type_is_signed: |
| * @data_type: A #GArrowIntegerDataType. |
| * |
| * Returns: %TRUE if the data type is signed, %FALSE otherwise. |
| * |
| * Since: 0.16.0 |
| */ |
| gboolean |
| garrow_integer_data_type_is_signed(GArrowIntegerDataType *data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type)); |
| const auto arrow_integer_type = |
| std::static_pointer_cast<arrow::IntegerType>(arrow_data_type); |
| return arrow_integer_type->is_signed(); |
| } |
| |
| G_DEFINE_TYPE(GArrowInt8DataType, |
| garrow_int8_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_int8_data_type_init(GArrowInt8DataType *object) |
| { |
| } |
| |
| static void |
| garrow_int8_data_type_class_init(GArrowInt8DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_int8_data_type_new: |
| * |
| * Returns: The newly created 8-bit integer data type. |
| */ |
| GArrowInt8DataType * |
| garrow_int8_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::int8(); |
| |
| GArrowInt8DataType *data_type = |
| GARROW_INT8_DATA_TYPE(g_object_new(GARROW_TYPE_INT8_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowUInt8DataType, |
| garrow_uint8_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_uint8_data_type_init(GArrowUInt8DataType *object) |
| { |
| } |
| |
| static void |
| garrow_uint8_data_type_class_init(GArrowUInt8DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_uint8_data_type_new: |
| * |
| * Returns: The newly created 8-bit unsigned integer data type. |
| */ |
| GArrowUInt8DataType * |
| garrow_uint8_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::uint8(); |
| |
| GArrowUInt8DataType *data_type = |
| GARROW_UINT8_DATA_TYPE(g_object_new(GARROW_TYPE_UINT8_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowInt16DataType, |
| garrow_int16_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_int16_data_type_init(GArrowInt16DataType *object) |
| { |
| } |
| |
| static void |
| garrow_int16_data_type_class_init(GArrowInt16DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_int16_data_type_new: |
| * |
| * Returns: The newly created 16-bit integer data type. |
| */ |
| GArrowInt16DataType * |
| garrow_int16_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::int16(); |
| |
| GArrowInt16DataType *data_type = |
| GARROW_INT16_DATA_TYPE(g_object_new(GARROW_TYPE_INT16_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowUInt16DataType, |
| garrow_uint16_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_uint16_data_type_init(GArrowUInt16DataType *object) |
| { |
| } |
| |
| static void |
| garrow_uint16_data_type_class_init(GArrowUInt16DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_uint16_data_type_new: |
| * |
| * Returns: The newly created 16-bit unsigned integer data type. |
| */ |
| GArrowUInt16DataType * |
| garrow_uint16_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::uint16(); |
| |
| GArrowUInt16DataType *data_type = |
| GARROW_UINT16_DATA_TYPE(g_object_new(GARROW_TYPE_UINT16_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowInt32DataType, |
| garrow_int32_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_int32_data_type_init(GArrowInt32DataType *object) |
| { |
| } |
| |
| static void |
| garrow_int32_data_type_class_init(GArrowInt32DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_int32_data_type_new: |
| * |
| * Returns: The newly created 32-bit integer data type. |
| */ |
| GArrowInt32DataType * |
| garrow_int32_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::int32(); |
| |
| GArrowInt32DataType *data_type = |
| GARROW_INT32_DATA_TYPE(g_object_new(GARROW_TYPE_INT32_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowUInt32DataType, |
| garrow_uint32_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_uint32_data_type_init(GArrowUInt32DataType *object) |
| { |
| } |
| |
| static void |
| garrow_uint32_data_type_class_init(GArrowUInt32DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_uint32_data_type_new: |
| * |
| * Returns: The newly created 32-bit unsigned integer data type. |
| */ |
| GArrowUInt32DataType * |
| garrow_uint32_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::uint32(); |
| |
| GArrowUInt32DataType *data_type = |
| GARROW_UINT32_DATA_TYPE(g_object_new(GARROW_TYPE_UINT32_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowInt64DataType, |
| garrow_int64_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_int64_data_type_init(GArrowInt64DataType *object) |
| { |
| } |
| |
| static void |
| garrow_int64_data_type_class_init(GArrowInt64DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_int64_data_type_new: |
| * |
| * Returns: The newly created 64-bit integer data type. |
| */ |
| GArrowInt64DataType * |
| garrow_int64_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::int64(); |
| |
| GArrowInt64DataType *data_type = |
| GARROW_INT64_DATA_TYPE(g_object_new(GARROW_TYPE_INT64_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowUInt64DataType, |
| garrow_uint64_data_type, |
| GARROW_TYPE_INTEGER_DATA_TYPE) |
| |
| static void |
| garrow_uint64_data_type_init(GArrowUInt64DataType *object) |
| { |
| } |
| |
| static void |
| garrow_uint64_data_type_class_init(GArrowUInt64DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_uint64_data_type_new: |
| * |
| * Returns: The newly created 64-bit unsigned integer data type. |
| */ |
| GArrowUInt64DataType * |
| garrow_uint64_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::uint64(); |
| |
| GArrowUInt64DataType *data_type = |
| GARROW_UINT64_DATA_TYPE(g_object_new(GARROW_TYPE_UINT64_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_ABSTRACT_TYPE(GArrowFloatingPointDataType, |
| garrow_floating_point_data_type, |
| GARROW_TYPE_NUMERIC_DATA_TYPE) |
| |
| static void |
| garrow_floating_point_data_type_init(GArrowFloatingPointDataType *object) |
| { |
| } |
| |
| static void |
| garrow_floating_point_data_type_class_init(GArrowFloatingPointDataTypeClass *klass) |
| { |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowFloatDataType, |
| garrow_float_data_type, |
| GARROW_TYPE_FLOATING_POINT_DATA_TYPE) |
| |
| static void |
| garrow_float_data_type_init(GArrowFloatDataType *object) |
| { |
| } |
| |
| static void |
| garrow_float_data_type_class_init(GArrowFloatDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_float_data_type_new: |
| * |
| * Returns: The newly created float data type. |
| */ |
| GArrowFloatDataType * |
| garrow_float_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::float32(); |
| |
| GArrowFloatDataType *data_type = |
| GARROW_FLOAT_DATA_TYPE(g_object_new(GARROW_TYPE_FLOAT_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowDoubleDataType, |
| garrow_double_data_type, |
| GARROW_TYPE_FLOATING_POINT_DATA_TYPE) |
| |
| static void |
| garrow_double_data_type_init(GArrowDoubleDataType *object) |
| { |
| } |
| |
| static void |
| garrow_double_data_type_class_init(GArrowDoubleDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_double_data_type_new: |
| * |
| * Returns: The newly created 64-bit floating point data type. |
| */ |
| GArrowDoubleDataType * |
| garrow_double_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::float64(); |
| |
| GArrowDoubleDataType *data_type = |
| GARROW_DOUBLE_DATA_TYPE(g_object_new(GARROW_TYPE_DOUBLE_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowBinaryDataType, |
| garrow_binary_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_binary_data_type_init(GArrowBinaryDataType *object) |
| { |
| } |
| |
| static void |
| garrow_binary_data_type_class_init(GArrowBinaryDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_binary_data_type_new: |
| * |
| * Returns: The newly created binary data type. |
| */ |
| GArrowBinaryDataType * |
| garrow_binary_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::binary(); |
| |
| GArrowBinaryDataType *data_type = |
| GARROW_BINARY_DATA_TYPE(g_object_new(GARROW_TYPE_BINARY_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowFixedSizeBinaryDataType, |
| garrow_fixed_size_binary_data_type, |
| GARROW_TYPE_FIXED_WIDTH_DATA_TYPE) |
| |
| static void |
| garrow_fixed_size_binary_data_type_init(GArrowFixedSizeBinaryDataType *object) |
| { |
| } |
| |
| static void |
| garrow_fixed_size_binary_data_type_class_init(GArrowFixedSizeBinaryDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_fixed_size_binary_data_type: |
| * @byte_width: The byte width. |
| * |
| * Returns: The newly created fixed-size binary data type. |
| * |
| * Since: 0.12.0 |
| */ |
| GArrowFixedSizeBinaryDataType * |
| garrow_fixed_size_binary_data_type_new(gint32 byte_width) |
| { |
| auto arrow_fixed_size_binary_data_type = arrow::fixed_size_binary(byte_width); |
| |
| auto fixed_size_binary_data_type = |
| GARROW_FIXED_SIZE_BINARY_DATA_TYPE(g_object_new(GARROW_TYPE_FIXED_SIZE_BINARY_DATA_TYPE, |
| "data-type", &arrow_fixed_size_binary_data_type, |
| NULL)); |
| return fixed_size_binary_data_type; |
| } |
| |
| /** |
| * garrow_fixed_size_binary_data_type_get_byte_width: |
| * @data_type: A #GArrowFixedSizeBinaryDataType. |
| * |
| * Returns: The number of bytes for one data. |
| * |
| * Since: 0.12.0 |
| */ |
| gint32 |
| garrow_fixed_size_binary_data_type_get_byte_width(GArrowFixedSizeBinaryDataType *data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type)); |
| const auto arrow_fixed_size_binary_type = |
| std::static_pointer_cast<arrow::FixedSizeBinaryType>(arrow_data_type); |
| return arrow_fixed_size_binary_type->byte_width(); |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowLargeBinaryDataType, |
| garrow_large_binary_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_large_binary_data_type_init(GArrowLargeBinaryDataType *object) |
| { |
| } |
| |
| static void |
| garrow_large_binary_data_type_class_init(GArrowLargeBinaryDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_large_binary_data_type_new: |
| * |
| * Returns: The newly created #GArrowLargeBinaryDataType. |
| * |
| * Since: 0.17.0 |
| */ |
| GArrowLargeBinaryDataType * |
| garrow_large_binary_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::large_binary(); |
| |
| GArrowLargeBinaryDataType *data_type = |
| GARROW_LARGE_BINARY_DATA_TYPE(g_object_new(GARROW_TYPE_LARGE_BINARY_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowStringDataType, |
| garrow_string_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_string_data_type_init(GArrowStringDataType *object) |
| { |
| } |
| |
| static void |
| garrow_string_data_type_class_init(GArrowStringDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_string_data_type_new: |
| * |
| * Returns: The newly created UTF-8 encoded string data type. |
| */ |
| GArrowStringDataType * |
| garrow_string_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::utf8(); |
| |
| GArrowStringDataType *data_type = |
| GARROW_STRING_DATA_TYPE(g_object_new(GARROW_TYPE_STRING_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowLargeStringDataType, |
| garrow_large_string_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_large_string_data_type_init(GArrowLargeStringDataType *object) |
| { |
| } |
| |
| static void |
| garrow_large_string_data_type_class_init(GArrowLargeStringDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_large_string_data_type_new: |
| * |
| * Returns: The newly created #GArrowLargeStringDataType. |
| * |
| * Since: 0.17.0 |
| */ |
| GArrowLargeStringDataType * |
| garrow_large_string_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::large_utf8(); |
| |
| GArrowLargeStringDataType *data_type = |
| GARROW_LARGE_STRING_DATA_TYPE(g_object_new(GARROW_TYPE_LARGE_STRING_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowDate32DataType, |
| garrow_date32_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_date32_data_type_init(GArrowDate32DataType *object) |
| { |
| } |
| |
| static void |
| garrow_date32_data_type_class_init(GArrowDate32DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_date32_data_type_new: |
| * |
| * Returns: A newly created the number of milliseconds |
| * since UNIX epoch in 32-bit signed integer data type. |
| * |
| * Since: 0.7.0 |
| */ |
| GArrowDate32DataType * |
| garrow_date32_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::date32(); |
| |
| GArrowDate32DataType *data_type = |
| GARROW_DATE32_DATA_TYPE(g_object_new(GARROW_TYPE_DATE32_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowDate64DataType, |
| garrow_date64_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_date64_data_type_init(GArrowDate64DataType *object) |
| { |
| } |
| |
| static void |
| garrow_date64_data_type_class_init(GArrowDate64DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_date64_data_type_new: |
| * |
| * Returns: A newly created the number of milliseconds |
| * since UNIX epoch in 64-bit signed integer data type. |
| * |
| * Since: 0.7.0 |
| */ |
| GArrowDate64DataType * |
| garrow_date64_data_type_new(void) |
| { |
| auto arrow_data_type = arrow::date64(); |
| |
| GArrowDate64DataType *data_type = |
| GARROW_DATE64_DATA_TYPE(g_object_new(GARROW_TYPE_DATE64_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowTimestampDataType, |
| garrow_timestamp_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_timestamp_data_type_init(GArrowTimestampDataType *object) |
| { |
| } |
| |
| static void |
| garrow_timestamp_data_type_class_init(GArrowTimestampDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_timestamp_data_type_new: |
| * @unit: The unit of the timestamp data. |
| * |
| * Returns: A newly created the number of |
| * seconds/milliseconds/microseconds/nanoseconds since UNIX epoch in |
| * 64-bit signed integer data type. |
| * |
| * Since: 0.7.0 |
| */ |
| GArrowTimestampDataType * |
| garrow_timestamp_data_type_new(GArrowTimeUnit unit) |
| { |
| auto arrow_unit = garrow_time_unit_to_raw(unit); |
| auto arrow_data_type = arrow::timestamp(arrow_unit); |
| auto data_type = |
| GARROW_TIMESTAMP_DATA_TYPE(g_object_new(GARROW_TYPE_TIMESTAMP_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| /** |
| * garrow_timestamp_data_type_get_unit: |
| * @timestamp_data_type: The #GArrowTimestampDataType. |
| * |
| * Returns: The unit of the timestamp data type. |
| * |
| * Since: 0.8.0 |
| */ |
| GArrowTimeUnit |
| garrow_timestamp_data_type_get_unit(GArrowTimestampDataType *timestamp_data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(timestamp_data_type)); |
| const auto arrow_timestamp_data_type = |
| std::static_pointer_cast<arrow::TimestampType>(arrow_data_type); |
| return garrow_time_unit_from_raw(arrow_timestamp_data_type->unit()); |
| } |
| |
| |
| G_DEFINE_ABSTRACT_TYPE(GArrowTimeDataType, |
| garrow_time_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| static void |
| garrow_time_data_type_init(GArrowTimeDataType *object) |
| { |
| } |
| |
| static void |
| garrow_time_data_type_class_init(GArrowTimeDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_time_data_type_get_unit: |
| * @time_data_type: The #GArrowTimeDataType. |
| * |
| * Returns: The unit of the time data type. |
| * |
| * Since: 0.7.0 |
| */ |
| GArrowTimeUnit |
| garrow_time_data_type_get_unit(GArrowTimeDataType *time_data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(time_data_type)); |
| const auto arrow_time_data_type = |
| std::static_pointer_cast<arrow::TimeType>(arrow_data_type); |
| return garrow_time_unit_from_raw(arrow_time_data_type->unit()); |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowTime32DataType, |
| garrow_time32_data_type, |
| GARROW_TYPE_TIME_DATA_TYPE) |
| |
| static void |
| garrow_time32_data_type_init(GArrowTime32DataType *object) |
| { |
| } |
| |
| static void |
| garrow_time32_data_type_class_init(GArrowTime32DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_time32_data_type_new: |
| * @unit: %GARROW_TIME_UNIT_SECOND or %GARROW_TIME_UNIT_MILLI. |
| * @error: (nullable): Return location for a #GError or %NULL. |
| * |
| * Returns: (nullable): |
| * A newly created the number of seconds or milliseconds since |
| * midnight in 32-bit signed integer data type. |
| * |
| * Since: 0.7.0 |
| */ |
| GArrowTime32DataType * |
| garrow_time32_data_type_new(GArrowTimeUnit unit, GError **error) |
| { |
| switch (unit) { |
| case GARROW_TIME_UNIT_SECOND: |
| case GARROW_TIME_UNIT_MILLI: |
| break; |
| default: |
| { |
| auto enum_class = G_ENUM_CLASS(g_type_class_ref(GARROW_TYPE_TIME_UNIT)); |
| GEnumValue *value = g_enum_get_value(enum_class, unit); |
| if (value) { |
| g_set_error(error, |
| GARROW_ERROR, |
| GARROW_ERROR_INVALID, |
| "[time32-data-type][new] time unit must be second or milli: " |
| "<%s>", |
| value->value_nick); |
| } else { |
| g_set_error(error, |
| GARROW_ERROR, |
| GARROW_ERROR_INVALID, |
| "[time32-data-type][new] " |
| "time unit must be second(%d) or milli(%d): <%d>", |
| GARROW_TIME_UNIT_SECOND, |
| GARROW_TIME_UNIT_MILLI, |
| unit); |
| } |
| g_type_class_unref(enum_class); |
| } |
| return NULL; |
| } |
| |
| auto arrow_unit = garrow_time_unit_to_raw(unit); |
| auto arrow_data_type = arrow::time32(arrow_unit); |
| auto data_type = |
| GARROW_TIME32_DATA_TYPE(g_object_new(GARROW_TYPE_TIME32_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowTime64DataType, |
| garrow_time64_data_type, |
| GARROW_TYPE_TIME_DATA_TYPE) |
| |
| static void |
| garrow_time64_data_type_init(GArrowTime64DataType *object) |
| { |
| } |
| |
| static void |
| garrow_time64_data_type_class_init(GArrowTime64DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_time64_data_type_new: |
| * @unit: %GARROW_TIME_UNIT_SECOND or %GARROW_TIME_UNIT_MILLI. |
| * @error: (nullable): Return location for a #GError or %NULL. |
| * |
| * Returns: (nullable): |
| * A newly created the number of seconds or milliseconds since |
| * midnight in 64-bit signed integer data type. |
| * |
| * Since: 0.7.0 |
| */ |
| GArrowTime64DataType * |
| garrow_time64_data_type_new(GArrowTimeUnit unit, GError **error) |
| { |
| switch (unit) { |
| case GARROW_TIME_UNIT_MICRO: |
| case GARROW_TIME_UNIT_NANO: |
| break; |
| default: |
| { |
| auto enum_class = G_ENUM_CLASS(g_type_class_ref(GARROW_TYPE_TIME_UNIT)); |
| auto value = g_enum_get_value(enum_class, unit); |
| if (value) { |
| g_set_error(error, |
| GARROW_ERROR, |
| GARROW_ERROR_INVALID, |
| "[time64-data-type][new] time unit must be micro or nano: " |
| "<%s>", |
| value->value_nick); |
| } else { |
| g_set_error(error, |
| GARROW_ERROR, |
| GARROW_ERROR_INVALID, |
| "[time64-data-type][new] " |
| "time unit must be micro(%d) or nano(%d): <%d>", |
| GARROW_TIME_UNIT_MICRO, |
| GARROW_TIME_UNIT_NANO, |
| unit); |
| } |
| g_type_class_unref(enum_class); |
| } |
| return NULL; |
| } |
| |
| auto arrow_unit = garrow_time_unit_to_raw(unit); |
| auto arrow_data_type = arrow::time64(arrow_unit); |
| auto data_type = |
| GARROW_TIME64_DATA_TYPE(g_object_new(GARROW_TYPE_TIME64_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_ABSTRACT_TYPE(GArrowDecimalDataType, |
| garrow_decimal_data_type, |
| GARROW_TYPE_FIXED_SIZE_BINARY_DATA_TYPE) |
| |
| static void |
| garrow_decimal_data_type_init(GArrowDecimalDataType *object) |
| { |
| } |
| |
| static void |
| garrow_decimal_data_type_class_init(GArrowDecimalDataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_decimal_data_type_new: |
| * @precision: The precision of decimal data. |
| * @scale: The scale of decimal data. |
| * |
| * Returns: The newly created decimal data type. |
| * |
| * Since: 0.10.0 |
| * |
| * Deprecated: 0.12.0: |
| * Use garrow_decimal128_data_type_new() instead. |
| */ |
| GArrowDecimalDataType * |
| garrow_decimal_data_type_new(gint32 precision, |
| gint32 scale) |
| { |
| auto decimal128_data_type = garrow_decimal128_data_type_new(precision, scale); |
| return GARROW_DECIMAL_DATA_TYPE(decimal128_data_type); |
| } |
| |
| /** |
| * garrow_decimal_data_type_get_precision: |
| * @decimal_data_type: The #GArrowDecimalDataType. |
| * |
| * Returns: The precision of the decimal data type. |
| * |
| * Since: 0.10.0 |
| */ |
| gint32 |
| garrow_decimal_data_type_get_precision(GArrowDecimalDataType *decimal_data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(decimal_data_type)); |
| const auto arrow_decimal_type = |
| std::static_pointer_cast<arrow::DecimalType>(arrow_data_type); |
| return arrow_decimal_type->precision(); |
| } |
| |
| /** |
| * garrow_decimal_data_type_get_scale: |
| * @decimal_data_type: The #GArrowDecimalDataType. |
| * |
| * Returns: The scale of the decimal data type. |
| * |
| * Since: 0.10.0 |
| */ |
| gint32 |
| garrow_decimal_data_type_get_scale(GArrowDecimalDataType *decimal_data_type) |
| { |
| const auto arrow_data_type = |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(decimal_data_type)); |
| const auto arrow_decimal_type = |
| std::static_pointer_cast<arrow::DecimalType>(arrow_data_type); |
| return arrow_decimal_type->scale(); |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowDecimal128DataType, |
| garrow_decimal128_data_type, |
| GARROW_TYPE_DECIMAL_DATA_TYPE) |
| |
| static void |
| garrow_decimal128_data_type_init(GArrowDecimal128DataType *object) |
| { |
| } |
| |
| static void |
| garrow_decimal128_data_type_class_init(GArrowDecimal128DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_decimal128_data_type_max_precision: |
| * |
| * Returns: The max precision of 128-bit decimal data type. |
| * |
| * Since: 3.0.0 |
| */ |
| gint32 |
| garrow_decimal128_data_type_max_precision() |
| { |
| return arrow::Decimal128Type::kMaxPrecision; |
| } |
| |
| /** |
| * garrow_decimal128_data_type_new: |
| * @precision: The precision of decimal data. |
| * @scale: The scale of decimal data. |
| * |
| * Returns: The newly created 128-bit decimal data type. |
| * |
| * Since: 0.12.0 |
| */ |
| GArrowDecimal128DataType * |
| garrow_decimal128_data_type_new(gint32 precision, |
| gint32 scale) |
| { |
| auto arrow_data_type = arrow::decimal128(precision, scale); |
| |
| auto data_type = |
| GARROW_DECIMAL128_DATA_TYPE(g_object_new(GARROW_TYPE_DECIMAL128_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| G_DEFINE_TYPE(GArrowDecimal256DataType, |
| garrow_decimal256_data_type, |
| GARROW_TYPE_DECIMAL_DATA_TYPE) |
| |
| static void |
| garrow_decimal256_data_type_init(GArrowDecimal256DataType *object) |
| { |
| } |
| |
| static void |
| garrow_decimal256_data_type_class_init(GArrowDecimal256DataTypeClass *klass) |
| { |
| } |
| |
| /** |
| * garrow_decimal256_data_type_max_precision: |
| * |
| * Returns: The max precision of 256-bit decimal data type. |
| * |
| * Since: 3.0.0 |
| */ |
| gint32 |
| garrow_decimal256_data_type_max_precision() |
| { |
| return arrow::Decimal256Type::kMaxPrecision; |
| } |
| |
| /** |
| * garrow_decimal256_data_type_new: |
| * @precision: The precision of decimal data. |
| * @scale: The scale of decimal data. |
| * |
| * Returns: The newly created 256-bit decimal data type. |
| * |
| * Since: 3.0.0 |
| */ |
| GArrowDecimal256DataType * |
| garrow_decimal256_data_type_new(gint32 precision, |
| gint32 scale) |
| { |
| auto arrow_data_type = arrow::decimal256(precision, scale); |
| |
| auto data_type = |
| GARROW_DECIMAL256_DATA_TYPE(g_object_new(GARROW_TYPE_DECIMAL256_DATA_TYPE, |
| "data-type", &arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| |
| typedef struct GArrowExtensionDataTypePrivate_ { |
| GArrowDataType *storage_data_type; |
| } GArrowExtensionDataTypePrivate; |
| |
| enum { |
| PROP_STORAGE_DATA_TYPE = 1 |
| }; |
| |
| G_DEFINE_TYPE_WITH_PRIVATE(GArrowExtensionDataType, |
| garrow_extension_data_type, |
| GARROW_TYPE_DATA_TYPE) |
| |
| #define GARROW_EXTENSION_DATA_TYPE_GET_PRIVATE(obj) \ |
| static_cast<GArrowExtensionDataTypePrivate *>( \ |
| garrow_extension_data_type_get_instance_private( \ |
| GARROW_EXTENSION_DATA_TYPE(obj))) |
| |
| static void |
| garrow_extension_data_type_dispose(GObject *object) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_GET_PRIVATE(object); |
| |
| if (priv->storage_data_type) { |
| g_object_unref(priv->storage_data_type); |
| priv->storage_data_type = NULL; |
| } |
| |
| G_OBJECT_CLASS(garrow_extension_data_type_parent_class)->dispose(object); |
| } |
| |
| static void |
| garrow_extension_data_type_set_property(GObject *object, |
| guint prop_id, |
| const GValue *value, |
| GParamSpec *pspec) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_GET_PRIVATE(object); |
| |
| switch (prop_id) { |
| case PROP_STORAGE_DATA_TYPE: |
| priv->storage_data_type = GARROW_DATA_TYPE(g_value_dup_object(value)); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void |
| garrow_extension_data_type_get_property(GObject *object, |
| guint prop_id, |
| GValue *value, |
| GParamSpec *pspec) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_GET_PRIVATE(object); |
| |
| switch (prop_id) { |
| case PROP_STORAGE_DATA_TYPE: |
| g_value_set_object(value, priv->storage_data_type); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void |
| garrow_extension_data_type_init(GArrowExtensionDataType *object) |
| { |
| } |
| |
| static void |
| garrow_extension_data_type_class_init(GArrowExtensionDataTypeClass *klass) |
| { |
| auto gobject_class = G_OBJECT_CLASS(klass); |
| gobject_class->dispose = garrow_extension_data_type_dispose; |
| gobject_class->set_property = garrow_extension_data_type_set_property; |
| gobject_class->get_property = garrow_extension_data_type_get_property; |
| |
| GParamSpec *spec; |
| spec = g_param_spec_object("storage-data-type", |
| "Storage data type", |
| "The underlying GArrowDataType", |
| GARROW_TYPE_DATA_TYPE, |
| static_cast<GParamFlags>(G_PARAM_READWRITE | |
| G_PARAM_CONSTRUCT_ONLY)); |
| g_object_class_install_property(gobject_class, PROP_STORAGE_DATA_TYPE, spec); |
| } |
| |
| /** |
| * garrow_extension_data_type_get_extension_name: |
| * @data_type: A #GArrowExtensionDataType. |
| * |
| * Returns: The extension name of the type. |
| * |
| * It should be freed with g_free() when no longer needed. |
| * |
| * Since: 3.0.0 |
| */ |
| gchar * |
| garrow_extension_data_type_get_extension_name(GArrowExtensionDataType *data_type) |
| { |
| auto arrow_data_type = |
| std::static_pointer_cast<arrow::ExtensionType>( |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type))); |
| return g_strdup(arrow_data_type->extension_name().c_str()); |
| } |
| |
| /** |
| * garrow_extension_data_type_wrap_array: |
| * @data_type: A #GArrowExtensionDataType. |
| * @storage: A #GArrowArray. |
| * |
| * Returns: (transfer full): The array that wraps underlying storage array. |
| * |
| * Since: 3.0.0 |
| */ |
| GArrowExtensionArray * |
| garrow_extension_data_type_wrap_array(GArrowExtensionDataType *data_type, |
| GArrowArray *storage) |
| { |
| auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type)); |
| auto arrow_storage = garrow_array_get_raw(storage); |
| auto arrow_extension_array = arrow::ExtensionType::WrapArray(arrow_data_type, |
| arrow_storage); |
| auto array = garrow_extension_array_new_raw(&arrow_extension_array, storage); |
| return GARROW_EXTENSION_ARRAY(array); |
| } |
| |
| /** |
| * garrow_extension_data_type_wrap_chunked_array: |
| * @data_type: A #GArrowExtensionDataType. |
| * @storage: A #GArrowChunkedArray. |
| * |
| * Returns: (transfer full): The chunked array that wraps underlying |
| * storage chunked array. |
| * |
| * Since: 3.0.0 |
| */ |
| GArrowChunkedArray * |
| garrow_extension_data_type_wrap_chunked_array(GArrowExtensionDataType *data_type, |
| GArrowChunkedArray *storage) |
| { |
| auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type)); |
| auto arrow_storage = garrow_chunked_array_get_raw(storage); |
| auto arrow_extension_chunked_array = |
| arrow::ExtensionType::WrapArray(arrow_data_type, |
| arrow_storage); |
| return garrow_chunked_array_new_raw(&arrow_extension_chunked_array); |
| } |
| |
| |
| static std::shared_ptr<arrow::DataType> |
| garrow_extension_data_type_get_storage_data_type_raw( |
| GArrowExtensionDataType *data_type) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_GET_PRIVATE(data_type); |
| return garrow_data_type_get_raw(priv->storage_data_type); |
| } |
| |
| G_END_DECLS |
| |
| namespace garrow { |
| GExtensionType::GExtensionType(GArrowExtensionDataType *garrow_data_type) : |
| arrow::ExtensionType( |
| garrow_extension_data_type_get_storage_data_type_raw(garrow_data_type)), |
| garrow_data_type_(garrow_data_type) { |
| g_object_ref(garrow_data_type_); |
| } |
| |
| GExtensionType::~GExtensionType() { |
| g_object_unref(garrow_data_type_); |
| } |
| |
| GArrowExtensionDataType *GExtensionType::garrow_data_type() const { |
| return garrow_data_type_; |
| } |
| |
| std::string GExtensionType::extension_name() const { |
| auto klass = GARROW_EXTENSION_DATA_TYPE_GET_CLASS(garrow_data_type_); |
| auto c_name = klass->get_extension_name(garrow_data_type_); |
| std::string name(c_name); |
| g_free(c_name); |
| return name; |
| } |
| |
| bool GExtensionType::ExtensionEquals(const arrow::ExtensionType& other) const { |
| if (extension_name() != other.extension_name()) { |
| return false; |
| } |
| auto klass = GARROW_EXTENSION_DATA_TYPE_GET_CLASS(garrow_data_type_); |
| auto garrow_other_data_type = |
| static_cast<const GExtensionType&>(other).garrow_data_type_; |
| return klass->equal(garrow_data_type_, |
| garrow_other_data_type); |
| } |
| |
| std::shared_ptr<arrow::Array> |
| GExtensionType::MakeArray(std::shared_ptr<arrow::ArrayData> data) const { |
| return std::make_shared<arrow::ExtensionArray>(data); |
| } |
| |
| arrow::Result<std::shared_ptr<arrow::DataType>> |
| GExtensionType::Deserialize(std::shared_ptr<arrow::DataType> storage_data_type, |
| const std::string& serialized_data) const { |
| auto klass = GARROW_EXTENSION_DATA_TYPE_GET_CLASS(garrow_data_type_); |
| auto garrow_storage_data_type = garrow_data_type_new_raw(&storage_data_type); |
| GBytes *g_serialized_data = g_bytes_new_static(serialized_data.data(), |
| serialized_data.size()); |
| GError *error = NULL; |
| auto garrow_deserialized_data_type = |
| klass->deserialize(garrow_data_type_, |
| garrow_storage_data_type, |
| g_serialized_data, |
| &error); |
| g_bytes_unref(g_serialized_data); |
| g_object_unref(garrow_storage_data_type); |
| if (error) { |
| return garrow_error_to_status(error, |
| arrow::StatusCode::SerializationError, |
| "[extension-type][deserialize]"); |
| } |
| |
| auto deserialized_data_type = |
| garrow_data_type_get_raw(garrow_deserialized_data_type); |
| g_object_unref(garrow_deserialized_data_type); |
| return deserialized_data_type; |
| } |
| |
| std::string |
| GExtensionType::Serialize() const { |
| auto klass = GARROW_EXTENSION_DATA_TYPE_GET_CLASS(garrow_data_type_); |
| auto g_bytes = klass->serialize(garrow_data_type_); |
| gsize raw_data_size = 0; |
| auto raw_data = g_bytes_get_data(g_bytes, &raw_data_size); |
| std::string data(static_cast<const char *>(raw_data), |
| raw_data_size); |
| g_bytes_unref(g_bytes); |
| return data; |
| } |
| |
| GType GExtensionType::array_gtype() const { |
| auto klass = GARROW_EXTENSION_DATA_TYPE_GET_CLASS(garrow_data_type_); |
| return klass->get_array_gtype(garrow_data_type_); |
| } |
| } |
| |
| G_BEGIN_DECLS |
| |
| |
| typedef struct GArrowExtensionDataTypeRegistryPrivate_ { |
| std::shared_ptr<arrow::ExtensionTypeRegistry> registry; |
| } GArrowExtensionDataTypeRegistryPrivate; |
| |
| enum { |
| PROP_REGISTRY = 1 |
| }; |
| |
| G_DEFINE_TYPE_WITH_PRIVATE(GArrowExtensionDataTypeRegistry, |
| garrow_extension_data_type_registry, |
| G_TYPE_OBJECT) |
| |
| #define GARROW_EXTENSION_DATA_TYPE_REGISTRY_GET_PRIVATE(obj) \ |
| static_cast<GArrowExtensionDataTypeRegistryPrivate *>( \ |
| garrow_extension_data_type_registry_get_instance_private( \ |
| GARROW_EXTENSION_DATA_TYPE_REGISTRY(obj))) |
| |
| static void |
| garrow_extension_data_type_registry_finalize(GObject *object) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_REGISTRY_GET_PRIVATE(object); |
| |
| priv->registry.~shared_ptr(); |
| |
| G_OBJECT_CLASS(garrow_extension_data_type_registry_parent_class)->finalize(object); |
| } |
| |
| static void |
| garrow_extension_data_type_registry_set_property(GObject *object, |
| guint prop_id, |
| const GValue *value, |
| GParamSpec *pspec) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_REGISTRY_GET_PRIVATE(object); |
| |
| switch (prop_id) { |
| case PROP_REGISTRY: |
| priv->registry = |
| *static_cast<std::shared_ptr<arrow::ExtensionTypeRegistry> *>(g_value_get_pointer(value)); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void |
| garrow_extension_data_type_registry_init(GArrowExtensionDataTypeRegistry *object) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_REGISTRY_GET_PRIVATE(object); |
| new(&priv->registry) std::shared_ptr<arrow::ExtensionTypeRegistry>; |
| } |
| |
| static void |
| garrow_extension_data_type_registry_class_init(GArrowExtensionDataTypeRegistryClass *klass) |
| { |
| auto gobject_class = G_OBJECT_CLASS(klass); |
| |
| gobject_class->finalize = garrow_extension_data_type_registry_finalize; |
| gobject_class->set_property = garrow_extension_data_type_registry_set_property; |
| |
| GParamSpec *spec; |
| spec = g_param_spec_pointer("registry", |
| "Registry", |
| "The raw std::shared<arrow::ExtensionTypeRegistry> *", |
| static_cast<GParamFlags>(G_PARAM_WRITABLE | |
| G_PARAM_CONSTRUCT_ONLY)); |
| g_object_class_install_property(gobject_class, PROP_REGISTRY, spec); |
| } |
| |
| /** |
| * garrow_extension_data_type_registry_default: |
| * |
| * Returns: (transfer full): The default global extension data type registry. |
| * |
| * Since: 3.0.0 |
| */ |
| GArrowExtensionDataTypeRegistry * |
| garrow_extension_data_type_registry_default(void) |
| { |
| auto arrow_registry = arrow::ExtensionTypeRegistry::GetGlobalRegistry(); |
| return garrow_extension_data_type_registry_new_raw(&arrow_registry); |
| } |
| |
| /** |
| * garrow_extension_data_type_registry_register: |
| * @registry: A #GArrowExtensionDataTypeRegistry. |
| * @data_type: A #GArrowExtensionDataType to be registered. |
| * @error: (nullable): Return location for a #GError or %NULL. |
| * |
| * Register the given @data_type to the @registry. |
| * |
| * Returns: %TRUE on success, %FALSE on error. |
| * |
| * Since: 3.0.0 |
| */ |
| gboolean |
| garrow_extension_data_type_registry_register( |
| GArrowExtensionDataTypeRegistry *registry, |
| GArrowExtensionDataType *data_type, |
| GError **error) |
| { |
| const gchar *context = "[extension-data-type-registry][register]"; |
| auto klass = GARROW_EXTENSION_DATA_TYPE_GET_CLASS(data_type); |
| auto set_error = [&](const gchar *name) -> void { |
| auto klass_name = G_OBJECT_CLASS_NAME(klass); |
| g_set_error(error, |
| GARROW_ERROR, |
| GARROW_ERROR_NOT_IMPLEMENTED, |
| "%s %s::%s() isn't implemented", |
| context, |
| klass_name, |
| name); |
| }; |
| if (!klass->get_extension_name) { |
| set_error("get_extension_name"); |
| return FALSE; |
| } |
| if (!klass->equal) { |
| set_error("equal"); |
| return FALSE; |
| } |
| if (!klass->deserialize) { |
| set_error("deserialize"); |
| return FALSE; |
| } |
| if (!klass->serialize) { |
| set_error("serialize"); |
| return FALSE; |
| } |
| if (!klass->get_array_gtype) { |
| set_error("get_array_gtype"); |
| return FALSE; |
| } |
| |
| auto arrow_registry = garrow_extension_data_type_registry_get_raw(registry); |
| auto arrow_data_type = |
| std::static_pointer_cast<arrow::ExtensionType>( |
| garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type))); |
| auto status = arrow_registry->RegisterType(arrow_data_type); |
| return garrow::check(error, status, context); |
| } |
| |
| /** |
| * garrow_extension_data_type_registry_unregister: |
| * @registry: A #GArrowExtensionDataTypeRegistry. |
| * @name: An extension data type name to be unregistered. |
| * @error: (nullable): Return location for a #GError or %NULL. |
| * |
| * Unregister an extension data type that has the given @name from the |
| * @registry. |
| * |
| * Returns: %TRUE on success, %FALSE on error. |
| * |
| * Since: 3.0.0 |
| */ |
| gboolean |
| garrow_extension_data_type_registry_unregister( |
| GArrowExtensionDataTypeRegistry *registry, |
| const gchar *name, |
| GError **error) |
| { |
| auto arrow_registry = garrow_extension_data_type_registry_get_raw(registry); |
| auto status = arrow_registry->UnregisterType(name); |
| return garrow::check(error, |
| status, |
| "[extension-data-type-registry][unregister]"); |
| } |
| |
| /** |
| * garrow_extension_data_type_registry_lookup: |
| * @registry: A #GArrowExtensionDataTypeRegistry. |
| * @name: An extension data type name to be looked up. |
| * |
| * Returns: (transfer full): A found #GArrowExtensionDataType on |
| * found, %NULL on not found. |
| * |
| * Since: 3.0.0 |
| */ |
| GArrowExtensionDataType * |
| garrow_extension_data_type_registry_lookup( |
| GArrowExtensionDataTypeRegistry *registry, |
| const gchar *name) |
| { |
| auto arrow_registry = garrow_extension_data_type_registry_get_raw(registry); |
| auto arrow_extension_data_type = arrow_registry->GetType(name); |
| if (!arrow_extension_data_type) { |
| return NULL; |
| } |
| auto arrow_data_type = |
| std::static_pointer_cast<arrow::DataType>(arrow_extension_data_type); |
| auto data_type = garrow_data_type_new_raw(&arrow_data_type); |
| return GARROW_EXTENSION_DATA_TYPE(data_type); |
| } |
| |
| |
| G_END_DECLS |
| |
| GArrowDataType * |
| garrow_data_type_new_raw(std::shared_ptr<arrow::DataType> *arrow_data_type) |
| { |
| GType type; |
| GArrowDataType *data_type; |
| |
| switch ((*arrow_data_type)->id()) { |
| case arrow::Type::type::NA: |
| type = GARROW_TYPE_NULL_DATA_TYPE; |
| break; |
| case arrow::Type::type::BOOL: |
| type = GARROW_TYPE_BOOLEAN_DATA_TYPE; |
| break; |
| case arrow::Type::type::UINT8: |
| type = GARROW_TYPE_UINT8_DATA_TYPE; |
| break; |
| case arrow::Type::type::INT8: |
| type = GARROW_TYPE_INT8_DATA_TYPE; |
| break; |
| case arrow::Type::type::UINT16: |
| type = GARROW_TYPE_UINT16_DATA_TYPE; |
| break; |
| case arrow::Type::type::INT16: |
| type = GARROW_TYPE_INT16_DATA_TYPE; |
| break; |
| case arrow::Type::type::UINT32: |
| type = GARROW_TYPE_UINT32_DATA_TYPE; |
| break; |
| case arrow::Type::type::INT32: |
| type = GARROW_TYPE_INT32_DATA_TYPE; |
| break; |
| case arrow::Type::type::UINT64: |
| type = GARROW_TYPE_UINT64_DATA_TYPE; |
| break; |
| case arrow::Type::type::INT64: |
| type = GARROW_TYPE_INT64_DATA_TYPE; |
| break; |
| case arrow::Type::type::FLOAT: |
| type = GARROW_TYPE_FLOAT_DATA_TYPE; |
| break; |
| case arrow::Type::type::DOUBLE: |
| type = GARROW_TYPE_DOUBLE_DATA_TYPE; |
| break; |
| case arrow::Type::type::BINARY: |
| type = GARROW_TYPE_BINARY_DATA_TYPE; |
| break; |
| case arrow::Type::type::LARGE_BINARY: |
| type = GARROW_TYPE_LARGE_BINARY_DATA_TYPE; |
| break; |
| case arrow::Type::type::FIXED_SIZE_BINARY: |
| type = GARROW_TYPE_FIXED_SIZE_BINARY_DATA_TYPE; |
| break; |
| case arrow::Type::type::STRING: |
| type = GARROW_TYPE_STRING_DATA_TYPE; |
| break; |
| case arrow::Type::type::LARGE_STRING: |
| type = GARROW_TYPE_LARGE_STRING_DATA_TYPE; |
| break; |
| case arrow::Type::type::DATE32: |
| type = GARROW_TYPE_DATE32_DATA_TYPE; |
| break; |
| case arrow::Type::type::DATE64: |
| type = GARROW_TYPE_DATE64_DATA_TYPE; |
| break; |
| case arrow::Type::type::TIMESTAMP: |
| type = GARROW_TYPE_TIMESTAMP_DATA_TYPE; |
| break; |
| case arrow::Type::type::TIME32: |
| type = GARROW_TYPE_TIME32_DATA_TYPE; |
| break; |
| case arrow::Type::type::TIME64: |
| type = GARROW_TYPE_TIME64_DATA_TYPE; |
| break; |
| case arrow::Type::type::LIST: |
| type = GARROW_TYPE_LIST_DATA_TYPE; |
| break; |
| case arrow::Type::type::LARGE_LIST: |
| type = GARROW_TYPE_LARGE_LIST_DATA_TYPE; |
| break; |
| case arrow::Type::type::STRUCT: |
| type = GARROW_TYPE_STRUCT_DATA_TYPE; |
| break; |
| case arrow::Type::type::SPARSE_UNION: |
| type = GARROW_TYPE_SPARSE_UNION_DATA_TYPE; |
| break; |
| case arrow::Type::type::DENSE_UNION: |
| type = GARROW_TYPE_DENSE_UNION_DATA_TYPE; |
| break; |
| case arrow::Type::type::DICTIONARY: |
| type = GARROW_TYPE_DICTIONARY_DATA_TYPE; |
| break; |
| case arrow::Type::type::DECIMAL128: |
| type = GARROW_TYPE_DECIMAL128_DATA_TYPE; |
| break; |
| case arrow::Type::type::DECIMAL256: |
| type = GARROW_TYPE_DECIMAL256_DATA_TYPE; |
| break; |
| case arrow::Type::type::EXTENSION: |
| { |
| auto g_extension_data_type = |
| std::static_pointer_cast<garrow::GExtensionType>(*arrow_data_type); |
| if (g_extension_data_type) { |
| auto garrow_data_type = g_extension_data_type->garrow_data_type(); |
| g_object_ref(garrow_data_type); |
| return GARROW_DATA_TYPE(garrow_data_type); |
| } |
| } |
| type = GARROW_TYPE_EXTENSION_DATA_TYPE; |
| break; |
| default: |
| type = GARROW_TYPE_DATA_TYPE; |
| break; |
| } |
| data_type = GARROW_DATA_TYPE(g_object_new(type, |
| "data-type", arrow_data_type, |
| NULL)); |
| return data_type; |
| } |
| |
| std::shared_ptr<arrow::DataType> |
| garrow_data_type_get_raw(GArrowDataType *data_type) |
| { |
| auto priv = GARROW_DATA_TYPE_GET_PRIVATE(data_type); |
| if (!priv->data_type && |
| g_type_is_a(G_OBJECT_TYPE(data_type), GARROW_TYPE_EXTENSION_DATA_TYPE)) { |
| priv->data_type = std::make_shared<garrow::GExtensionType>( |
| GARROW_EXTENSION_DATA_TYPE(data_type)); |
| } |
| return priv->data_type; |
| } |
| |
| GArrowExtensionDataTypeRegistry * |
| garrow_extension_data_type_registry_new_raw( |
| std::shared_ptr<arrow::ExtensionTypeRegistry> *arrow_registry) |
| { |
| auto registry = g_object_new(GARROW_TYPE_EXTENSION_DATA_TYPE_REGISTRY, |
| "registry", arrow_registry, |
| NULL); |
| return GARROW_EXTENSION_DATA_TYPE_REGISTRY(registry); |
| } |
| |
| std::shared_ptr<arrow::ExtensionTypeRegistry> |
| garrow_extension_data_type_registry_get_raw( |
| GArrowExtensionDataTypeRegistry *registry) |
| { |
| auto priv = GARROW_EXTENSION_DATA_TYPE_REGISTRY_GET_PRIVATE(registry); |
| return priv->registry; |
| } |