blob: 688c548bf2ffd65853fbcdcb9ef767618e241ca5 [file] [log] [blame]
/*
* 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/buffer.hpp>
#include <arrow-glib/compute.hpp>
#include <arrow-glib/data-type.hpp>
#include <arrow-glib/error.hpp>
#include <arrow-glib/type.hpp>
G_BEGIN_DECLS
/**
* SECTION: composite-array
* @section_id: composite-array-classes
* @title: Composite array classes
* @include: arrow-glib/arrow-glib.h
*
* #GArrowListArray is a class for list array. It can store zero or
* more list data. If you don't have Arrow format data, you need to
* use #GArrowListArrayBuilder to create a new array.
*
* #GArrowLargeListArray is a class for 64-bit offsets list array.
* It can store zero or more list data. If you don't have Arrow format data,
* you need to use #GArrowLargeListArrayBuilder to create a new array.
*
* #GArrowStructArray is a class for struct array. It can store zero
* or more structs. One struct has one or more fields. If you don't
* have Arrow format data, you need to use #GArrowStructArrayBuilder
* to create a new array.
*
* #GArrowMapArray is a class for map array. It can store
* data with keys and items.
*
* #GArrowUnionArray is a base class for union array. It can store
* zero or more unions. One union has one or more fields but one union
* can store only one field value.
*
* #GArrowDenseUnionArray is a class for dense union array.
*
* #GArrowSparseUnionArray is a class for sparse union array.
*
* #GArrowDictionaryArray is a class for dictionary array. It can
* store data with dictionary and indices. It's space effective than
* normal array when the array has many same values. You can convert a
* normal array to dictionary array by garrow_array_dictionary_encode().
*/
typedef struct GArrowListArrayPrivate_ {
GArrowArray *raw_values;
} GArrowListArrayPrivate;
enum {
PROP_RAW_VALUES = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowListArray,
garrow_list_array,
GARROW_TYPE_ARRAY)
#define GARROW_LIST_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowListArrayPrivate *>( \
garrow_list_array_get_instance_private( \
GARROW_LIST_ARRAY(obj)))
G_END_DECLS
template <typename LIST_ARRAY_CLASS>
GArrowArray *
garrow_base_list_array_new(GArrowDataType *data_type,
gint64 length,
GArrowBuffer *value_offsets,
GArrowArray *values,
GArrowBuffer *null_bitmap,
gint64 n_nulls)
{
const auto arrow_data_type = garrow_data_type_get_raw(data_type);
const auto arrow_value_offsets = garrow_buffer_get_raw(value_offsets);
const auto arrow_values = garrow_array_get_raw(values);
const auto arrow_null_bitmap = garrow_buffer_get_raw(null_bitmap);
auto arrow_list_array =
std::make_shared<LIST_ARRAY_CLASS>(arrow_data_type,
length,
arrow_value_offsets,
arrow_values,
arrow_null_bitmap,
n_nulls);
auto arrow_array =
std::static_pointer_cast<arrow::Array>(arrow_list_array);
return garrow_array_new_raw(&arrow_array,
"array", &arrow_array,
"value-data-type", data_type,
"null-bitmap", null_bitmap,
"buffer1", value_offsets,
"raw-values", values,
NULL);
};
template <typename LIST_ARRAY_CLASS>
GArrowDataType *
garrow_base_list_array_get_value_type(GArrowArray *array)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_list_array =
std::static_pointer_cast<LIST_ARRAY_CLASS>(arrow_array);
auto arrow_value_type = arrow_list_array->value_type();
return garrow_data_type_new_raw(&arrow_value_type);
};
template <typename LIST_ARRAY_CLASS>
GArrowArray *
garrow_base_list_array_get_value(GArrowArray *array,
gint64 i)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_list_array =
std::static_pointer_cast<LIST_ARRAY_CLASS>(arrow_array);
auto arrow_list = arrow_list_array->value_slice(i);
return garrow_array_new_raw(&arrow_list,
"array", &arrow_list,
"parent", array,
NULL);
};
template <typename LIST_ARRAY_CLASS>
GArrowArray *
garrow_base_list_array_get_values(GArrowArray *array)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_list_array =
std::static_pointer_cast<LIST_ARRAY_CLASS>(arrow_array);
auto arrow_values = arrow_list_array->values();
return garrow_array_new_raw(&arrow_values,
"array", &arrow_values,
"parent", array,
NULL);
};
template <typename LIST_ARRAY_CLASS>
typename LIST_ARRAY_CLASS::offset_type
garrow_base_list_array_get_value_offset(GArrowArray *array, gint64 i)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_list_array =
std::static_pointer_cast<LIST_ARRAY_CLASS>(arrow_array);
return arrow_list_array->value_offset(i);
};
template <typename LIST_ARRAY_CLASS>
typename LIST_ARRAY_CLASS::offset_type
garrow_base_list_array_get_value_length(GArrowArray *array, gint64 i)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_list_array =
std::static_pointer_cast<LIST_ARRAY_CLASS>(arrow_array);
return arrow_list_array->value_length(i);
};
template <typename LIST_ARRAY_CLASS>
const typename LIST_ARRAY_CLASS::offset_type *
garrow_base_list_array_get_value_offsets(GArrowArray *array, gint64 *n_offsets)
{
auto arrow_array = garrow_array_get_raw(array);
*n_offsets = arrow_array->length() + 1;
auto arrow_list_array =
std::static_pointer_cast<LIST_ARRAY_CLASS>(arrow_array);
return arrow_list_array->raw_value_offsets();
};
G_BEGIN_DECLS
static void
garrow_list_array_dispose(GObject *object)
{
auto priv = GARROW_LIST_ARRAY_GET_PRIVATE(object);
if (priv->raw_values) {
g_object_unref(priv->raw_values);
priv->raw_values = NULL;
}
G_OBJECT_CLASS(garrow_list_array_parent_class)->dispose(object);
}
static void
garrow_list_array_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_LIST_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_RAW_VALUES:
priv->raw_values = GARROW_ARRAY(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_list_array_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_LIST_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_RAW_VALUES:
g_value_set_object(value, priv->raw_values);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_list_array_init(GArrowListArray *object)
{
}
static void
garrow_list_array_class_init(GArrowListArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_list_array_dispose;
gobject_class->set_property = garrow_list_array_set_property;
gobject_class->get_property = garrow_list_array_get_property;
GParamSpec *spec;
spec = g_param_spec_object("raw-values",
"Raw values",
"The raw values",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_RAW_VALUES, spec);
}
/**
* garrow_list_array_new:
* @data_type: The data type of the list.
* @length: The number of elements.
* @value_offsets: The offsets of @values in Arrow format.
* @values: The values as #GArrowArray.
* @null_bitmap: (nullable): The bitmap that shows null elements. The
* N-th element is null when the N-th bit is 0, not null otherwise.
* If the array has no null elements, the bitmap must be %NULL and
* @n_nulls is 0.
* @n_nulls: The number of null elements. If -1 is specified, the
* number of nulls are computed from @null_bitmap.
*
* Returns: A newly created #GArrowListArray.
*
* Since: 0.4.0
*/
GArrowListArray *
garrow_list_array_new(GArrowDataType *data_type,
gint64 length,
GArrowBuffer *value_offsets,
GArrowArray *values,
GArrowBuffer *null_bitmap,
gint64 n_nulls)
{
auto list_array = garrow_base_list_array_new<arrow::ListArray>(
data_type,
length,
value_offsets,
values,
null_bitmap,
n_nulls);
return GARROW_LIST_ARRAY(list_array);
}
/**
* garrow_list_array_get_value_type:
* @array: A #GArrowListArray.
*
* Returns: (transfer full): The data type of value in each list.
*/
GArrowDataType *
garrow_list_array_get_value_type(GArrowListArray *array)
{
return garrow_base_list_array_get_value_type<arrow::ListArray>(
GARROW_ARRAY(array));
}
/**
* garrow_list_array_get_value:
* @array: A #GArrowListArray.
* @i: The index of the target value.
*
* Returns: (transfer full): The i-th list.
*/
GArrowArray *
garrow_list_array_get_value(GArrowListArray *array,
gint64 i)
{
return garrow_base_list_array_get_value<arrow::ListArray>(
GARROW_ARRAY(array), i);
}
/**
* garrow_list_array_get_values:
* @array: A #GArrowListArray.
*
* Returns: (transfer full): The array containing the list's values.
*
* Since: 2.0.0
*/
GArrowArray *
garrow_list_array_get_values(GArrowListArray *array)
{
return garrow_base_list_array_get_values<arrow::ListArray>(
GARROW_ARRAY(array));
}
/**
* garrow_list_array_get_offset:
* @array: A #GArrowListArray.
* @i: The index of the offset of the target value.
*
* Returns: The target offset in the array containing the list's values.
*
* Since: 2.0.0
*/
gint32
garrow_list_array_get_value_offset(GArrowListArray *array, gint64 i)
{
return garrow_base_list_array_get_value_offset<arrow::ListArray>(
GARROW_ARRAY(array), i);
}
/**
* garrow_list_array_get_value_length:
* @array: A #GArrowListArray.
* @i: The index of the length of the target value.
*
* Returns: The target length in the array containing the list's values.
*
* Since: 2.0.0
*/
gint32
garrow_list_array_get_value_length(GArrowListArray *array, gint64 i)
{
return garrow_base_list_array_get_value_length<arrow::ListArray>(
GARROW_ARRAY(array), i);
}
/**
* garrow_list_array_get_value_offsets:
* @array: A #GArrowListArray.
* @n_offsets: The number of offsets to be returned.
*
* Returns: (array length=n_offsets): The target offsets in the array
* containing the list's values.
*
* Since: 2.0.0
*/
const gint32 *
garrow_list_array_get_value_offsets(GArrowListArray *array, gint64 *n_offsets)
{
return garrow_base_list_array_get_value_offsets<arrow::ListArray>(
GARROW_ARRAY(array), n_offsets);
}
typedef struct GArrowLargeListArrayPrivate_ {
GArrowArray *raw_values;
} GArrowLargeListArrayPrivate;
G_DEFINE_TYPE_WITH_PRIVATE(GArrowLargeListArray,
garrow_large_list_array,
GARROW_TYPE_ARRAY)
#define GARROW_LARGE_LIST_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowLargeListArrayPrivate *>( \
garrow_large_list_array_get_instance_private( \
GARROW_LARGE_LIST_ARRAY(obj)))
static void
garrow_large_list_array_dispose(GObject *object)
{
auto priv = GARROW_LARGE_LIST_ARRAY_GET_PRIVATE(object);
if (priv->raw_values) {
g_object_unref(priv->raw_values);
priv->raw_values = NULL;
}
G_OBJECT_CLASS(garrow_large_list_array_parent_class)->dispose(object);
}
static void
garrow_large_list_array_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_LARGE_LIST_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_RAW_VALUES:
priv->raw_values = GARROW_ARRAY(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_large_list_array_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_LARGE_LIST_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_RAW_VALUES:
g_value_set_object(value, priv->raw_values);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_large_list_array_init(GArrowLargeListArray *object)
{
}
static void
garrow_large_list_array_class_init(GArrowLargeListArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_large_list_array_dispose;
gobject_class->set_property = garrow_large_list_array_set_property;
gobject_class->get_property = garrow_large_list_array_get_property;
GParamSpec *spec;
spec = g_param_spec_object("raw-values",
"Raw values",
"The raw values",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_RAW_VALUES, spec);
}
/**
* garrow_large_list_array_new:
* @data_type: The data type of the list.
* @length: The number of elements.
* @value_offsets: The offsets of @values in Arrow format.
* @values: The values as #GArrowArray.
* @null_bitmap: (nullable): The bitmap that shows null elements. The
* N-th element is null when the N-th bit is 0, not null otherwise.
* If the array has no null elements, the bitmap must be %NULL and
* @n_nulls is 0.
* @n_nulls: The number of null elements. If -1 is specified, the
* number of nulls are computed from @null_bitmap.
*
* Returns: A newly created #GArrowLargeListArray.
*
* Since: 0.16.0
*/
GArrowLargeListArray *
garrow_large_list_array_new(GArrowDataType *data_type,
gint64 length,
GArrowBuffer *value_offsets,
GArrowArray *values,
GArrowBuffer *null_bitmap,
gint64 n_nulls)
{
auto large_list_array = garrow_base_list_array_new<arrow::LargeListArray>(
data_type,
length,
value_offsets,
values,
null_bitmap,
n_nulls);
return GARROW_LARGE_LIST_ARRAY(large_list_array);
}
/**
* garrow_large_list_array_get_value_type:
* @array: A #GArrowLargeListArray.
*
* Returns: (transfer full): The data type of value in each list.
*
* Since: 0.16.0
*/
GArrowDataType *
garrow_large_list_array_get_value_type(GArrowLargeListArray *array)
{
return garrow_base_list_array_get_value_type<arrow::LargeListArray>(
GARROW_ARRAY(array));
}
/**
* garrow_large_list_array_get_value:
* @array: A #GArrowLargeListArray.
* @i: The index of the target value.
*
* Returns: (transfer full): The @i-th list.
*
* Since: 0.16.0
*/
GArrowArray *
garrow_large_list_array_get_value(GArrowLargeListArray *array,
gint64 i)
{
return garrow_base_list_array_get_value<arrow::LargeListArray>(
GARROW_ARRAY(array),
i);
}
/**
* garrow_large_list_array_get_values:
* @array: A #GArrowLargeListArray.
*
* Returns: (transfer full): The array containing the list's values.
*
* Since: 2.0.0
*/
GArrowArray *
garrow_large_list_array_get_values(GArrowLargeListArray *array)
{
return garrow_base_list_array_get_values<arrow::LargeListArray>(
GARROW_ARRAY(array));
}
/**
* garrow_large_list_array_get_value_offset:
* @array: A #GArrowLargeListArray.
* @i: The index of the offset of the target value.
*
* Returns: The target offset in the array containing the list's values.
*
* Since: 2.0.0
*/
gint64
garrow_large_list_array_get_value_offset(GArrowLargeListArray *array, gint64 i)
{
return garrow_base_list_array_get_value_offset<arrow::LargeListArray>(
GARROW_ARRAY(array), i);
}
/**
* garrow_large_list_array_get_length:
* @array: A #GArrowLargeListArray.
* @i: The index of the length of the target value.
*
* Returns: The target length in the array containing the list's values.
*
* Since: 2.0.0
*/
gint64
garrow_large_list_array_get_value_length(GArrowLargeListArray *array, gint64 i)
{
return garrow_base_list_array_get_value_length<arrow::LargeListArray>(
GARROW_ARRAY(array), i);
}
/**
* garrow_large_list_array_get_value_offsets:
* @array: A #GArrowLargeListArray.
* @n_offsets: The number of offsets to be returned.
*
* Returns: (array length=n_offsets): The target offsets in the array
* containing the list's values.
*
* Since: 2.0.0
*/
const gint64 *
garrow_large_list_array_get_value_offsets(GArrowLargeListArray *array,
gint64 *n_offsets)
{
return garrow_base_list_array_get_value_offsets<arrow::LargeListArray>(
GARROW_ARRAY(array), n_offsets);
}
typedef struct GArrowStructArrayPrivate_ {
GPtrArray *fields;
} GArrowStructArrayPrivate;
G_DEFINE_TYPE_WITH_PRIVATE(GArrowStructArray,
garrow_struct_array,
GARROW_TYPE_ARRAY)
#define GARROW_STRUCT_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowStructArrayPrivate *>( \
garrow_struct_array_get_instance_private( \
GARROW_STRUCT_ARRAY(obj)))
static void
garrow_struct_array_dispose(GObject *object)
{
auto priv = GARROW_STRUCT_ARRAY_GET_PRIVATE(object);
if (priv->fields) {
g_ptr_array_free(priv->fields, TRUE);
priv->fields = NULL;
}
G_OBJECT_CLASS(garrow_struct_array_parent_class)->dispose(object);
}
static void
garrow_struct_array_init(GArrowStructArray *object)
{
}
static void
garrow_struct_array_class_init(GArrowStructArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_struct_array_dispose;
}
/**
* garrow_struct_array_new:
* @data_type: The data type of the struct.
* @length: The number of elements.
* @fields: (element-type GArrowArray): The arrays for each field
* as #GList of #GArrowArray.
* @null_bitmap: (nullable): The bitmap that shows null elements. The
* N-th element is null when the N-th bit is 0, not null otherwise.
* If the array has no null elements, the bitmap must be %NULL and
* @n_nulls is 0.
* @n_nulls: The number of null elements. If -1 is specified, the
* number of nulls are computed from @null_bitmap.
*
* Returns: A newly created #GArrowStructArray.
*
* Since: 0.4.0
*/
GArrowStructArray *
garrow_struct_array_new(GArrowDataType *data_type,
gint64 length,
GList *fields,
GArrowBuffer *null_bitmap,
gint64 n_nulls)
{
const auto arrow_data_type = garrow_data_type_get_raw(data_type);
std::vector<std::shared_ptr<arrow::Array>> arrow_fields;
for (auto node = fields; node; node = node->next) {
auto field = GARROW_ARRAY(node->data);
arrow_fields.push_back(garrow_array_get_raw(field));
}
const auto arrow_null_bitmap = garrow_buffer_get_raw(null_bitmap);
auto arrow_struct_array =
std::make_shared<arrow::StructArray>(arrow_data_type,
length,
arrow_fields,
arrow_null_bitmap,
n_nulls);
auto arrow_array =
std::static_pointer_cast<arrow::Array>(arrow_struct_array);
auto struct_array =
garrow_array_new_raw(&arrow_array,
"array", &arrow_array,
"null-bitmap", null_bitmap,
NULL);
auto priv = GARROW_STRUCT_ARRAY_GET_PRIVATE(struct_array);
priv->fields = g_ptr_array_sized_new(arrow_fields.size());
g_ptr_array_set_free_func(priv->fields, g_object_unref);
for (auto node = fields; node; node = node->next) {
auto field = GARROW_ARRAY(node->data);
g_ptr_array_add(priv->fields, g_object_ref(field));
}
return GARROW_STRUCT_ARRAY(struct_array);
}
static GPtrArray *
garrow_struct_array_get_fields_internal(GArrowStructArray *array)
{
auto priv = GARROW_STRUCT_ARRAY_GET_PRIVATE(array);
if (!priv->fields) {
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_struct_array =
std::static_pointer_cast<arrow::StructArray>(arrow_array);
auto arrow_fields = arrow_struct_array->fields();
priv->fields = g_ptr_array_sized_new(arrow_fields.size());
g_ptr_array_set_free_func(priv->fields, g_object_unref);
for (auto &arrow_field : arrow_fields) {
g_ptr_array_add(priv->fields, garrow_array_new_raw(&arrow_field));
}
}
return priv->fields;
}
/**
* garrow_struct_array_get_field
* @array: A #GArrowStructArray.
* @i: The index of the field in the struct.
*
* Returns: (transfer full): The i-th field.
*/
GArrowArray *
garrow_struct_array_get_field(GArrowStructArray *array,
gint i)
{
auto fields = garrow_struct_array_get_fields_internal(array);
if (i < 0) {
i += fields->len;
}
if (i < 0) {
return NULL;
}
if (i >= static_cast<gint>(fields->len)) {
return NULL;
}
auto field = static_cast<GArrowArray *>(g_ptr_array_index(fields, i));
g_object_ref(field);
return field;
}
/**
* garrow_struct_array_get_fields
* @array: A #GArrowStructArray.
*
* Returns: (element-type GArrowArray) (transfer full):
* The fields in the struct.
*/
GList *
garrow_struct_array_get_fields(GArrowStructArray *array)
{
auto fields = garrow_struct_array_get_fields_internal(array);
GList *field_list = NULL;
for (guint i = 0; i < fields->len; ++i) {
auto field = static_cast<GArrowArray *>(g_ptr_array_index(fields, i));
field_list = g_list_prepend(field_list, g_object_ref(field));
}
return g_list_reverse(field_list);
}
/**
* garrow_struct_array_flatten
* @array: A #GArrowStructArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (element-type GArrowArray) (transfer full):
* The fields in the struct.
*
* Since: 0.10.0
*/
GList *
garrow_struct_array_flatten(GArrowStructArray *array, GError **error)
{
const auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_struct_array =
std::static_pointer_cast<arrow::StructArray>(arrow_array);
auto memory_pool = arrow::default_memory_pool();
auto arrow_arrays = arrow_struct_array->Flatten(memory_pool);
if (!garrow::check(error, arrow_arrays, "[struct-array][flatten]")) {
return NULL;
}
GList *arrays = NULL;
for (auto arrow_array : *arrow_arrays) {
auto array = garrow_array_new_raw(&arrow_array);
arrays = g_list_prepend(arrays, array);
}
return g_list_reverse(arrays);
}
typedef struct GArrowMapArrayPrivate_ {
GArrowArray *offsets;
GArrowArray *keys;
GArrowArray *items;
} GArrowMapArrayPrivate;
enum {
PROP_OFFSETS = 1,
PROP_KEYS,
PROP_ITEMS,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowMapArray,
garrow_map_array,
GARROW_TYPE_LIST_ARRAY)
#define GARROW_MAP_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowMapArrayPrivate *>( \
garrow_map_array_get_instance_private( \
GARROW_MAP_ARRAY(obj)))
static void
garrow_map_array_dispose(GObject *object)
{
auto priv = GARROW_MAP_ARRAY_GET_PRIVATE(object);
if (priv->offsets) {
g_object_unref(priv->offsets);
priv->offsets = NULL;
}
if (priv->keys) {
g_object_unref(priv->keys);
priv->keys = NULL;
}
if (priv->items) {
g_object_unref(priv->items);
priv->items = NULL;
}
G_OBJECT_CLASS(garrow_map_array_parent_class)->dispose(object);
}
static void
garrow_map_array_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_MAP_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_OFFSETS:
priv->offsets = GARROW_ARRAY(g_value_dup_object(value));
break;
case PROP_KEYS:
priv->keys = GARROW_ARRAY(g_value_dup_object(value));
break;
case PROP_ITEMS:
priv->items = GARROW_ARRAY(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_map_array_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_MAP_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_OFFSETS:
g_value_set_object(value, priv->offsets);
break;
case PROP_KEYS:
g_value_set_object(value, priv->keys);
break;
case PROP_ITEMS:
g_value_set_object(value, priv->items);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_map_array_init(GArrowMapArray *object)
{
}
static void
garrow_map_array_class_init(GArrowMapArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_map_array_dispose;
gobject_class->set_property = garrow_map_array_set_property;
gobject_class->get_property = garrow_map_array_get_property;
GParamSpec *spec;
spec = g_param_spec_object("offsets",
"Offsets",
"The GArrowArray for offsets",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_OFFSETS, spec);
spec = g_param_spec_object("keys",
"Keys",
"The GArrowArray for keys",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_KEYS, spec);
spec = g_param_spec_object("items",
"Items",
"The GArrowArray for items",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_ITEMS, spec);
}
/**
* garrow_map_array_new:
* @offsets: The offsets Array containing n + 1 offsets encoding length and size.
* @keys: The Array containing key values.
* @items: The items Array containing item values.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowMapArray
* or %NULL on error.
*
* Since: 0.17.0
*/
GArrowMapArray *
garrow_map_array_new(GArrowArray *offsets,
GArrowArray *keys,
GArrowArray *items,
GError **error)
{
const auto arrow_offsets = garrow_array_get_raw(offsets);
const auto arrow_keys = garrow_array_get_raw(keys);
const auto arrow_items = garrow_array_get_raw(items);
auto arrow_memory_pool = arrow::default_memory_pool();
auto arrow_array_result = arrow::MapArray::FromArrays(arrow_offsets,
arrow_keys,
arrow_items,
arrow_memory_pool);
if (garrow::check(error, arrow_array_result, "[map-array][new]")) {
auto arrow_array = *arrow_array_result;
return GARROW_MAP_ARRAY(garrow_array_new_raw(&arrow_array,
"array", &arrow_array,
"offsets", offsets,
"keys", keys,
"items", items,
NULL));
} else {
return NULL;
}
}
/**
* garrow_map_array_get_keys:
* @array: A #GArrowMapArray.
*
* Returns: (transfer full): The Array containing key values.
*
* Since: 0.17.0
*/
GArrowArray *
garrow_map_array_get_keys(GArrowMapArray *array)
{
auto priv = GARROW_MAP_ARRAY_GET_PRIVATE(array);
if (priv->keys) {
g_object_ref(priv->keys);
return priv->keys;
}
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_map_array =
std::static_pointer_cast<arrow::MapArray>(arrow_array);
auto arrow_keys = arrow_map_array->keys();
return garrow_array_new_raw(&arrow_keys);
}
/**
* garrow_map_array_get_items:
* @array: A #GArrowMapArray.
*
* Returns: (transfer full): The items Array containing item values.
*
* Since: 0.17.0
*/
GArrowArray *
garrow_map_array_get_items(GArrowMapArray *array)
{
auto priv = GARROW_MAP_ARRAY_GET_PRIVATE(array);
if (priv->items) {
g_object_ref(priv->items);
return priv->items;
}
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_map_array =
std::static_pointer_cast<arrow::MapArray>(arrow_array);
auto arrow_items = arrow_map_array->items();
return garrow_array_new_raw(&arrow_items);
}
typedef struct GArrowUnionArrayPrivate_ {
GArrowInt8Array *type_ids;
GPtrArray *fields;
} GArrowUnionArrayPrivate;
enum {
PROP_TYPE_IDS = 1,
PROP_FIELDS,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowUnionArray,
garrow_union_array,
GARROW_TYPE_ARRAY)
#define GARROW_UNION_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowUnionArrayPrivate *>( \
garrow_union_array_get_instance_private( \
GARROW_UNION_ARRAY(obj)))
static void
garrow_union_array_dispose(GObject *object)
{
auto priv = GARROW_UNION_ARRAY_GET_PRIVATE(object);
if (priv->type_ids) {
g_object_unref(priv->type_ids);
priv->type_ids = NULL;
}
if (priv->fields) {
g_ptr_array_free(priv->fields, TRUE);
priv->fields = NULL;
}
G_OBJECT_CLASS(garrow_union_array_parent_class)->dispose(object);
}
static void
garrow_union_array_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_UNION_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_TYPE_IDS:
priv->type_ids = GARROW_INT8_ARRAY(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_union_array_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_UNION_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_TYPE_IDS:
g_value_set_object(value, priv->type_ids);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_union_array_init(GArrowUnionArray *object)
{
}
static void
garrow_union_array_class_init(GArrowUnionArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_union_array_dispose;
gobject_class->set_property = garrow_union_array_set_property;
gobject_class->get_property = garrow_union_array_get_property;
GParamSpec *spec;
spec = g_param_spec_object("type-ids",
"Type IDs",
"The GArrowInt8Array for type IDs",
GARROW_TYPE_INT8_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_TYPE_IDS, spec);
}
/**
* garrow_union_array_get_field
* @array: A #GArrowUnionArray.
* @i: The index of the field in the union.
*
* Returns: (nullable) (transfer full): The i-th field values as a
* #GArrowArray or %NULL on out of range.
*/
GArrowArray *
garrow_union_array_get_field(GArrowUnionArray *array,
gint i)
{
auto priv = GARROW_UNION_ARRAY_GET_PRIVATE(array);
if (!priv->fields) {
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_union_array =
std::static_pointer_cast<arrow::UnionArray>(arrow_array);
auto n_fields = arrow_union_array->num_fields();
priv->fields = g_ptr_array_sized_new(n_fields);
g_ptr_array_set_free_func(priv->fields, g_object_unref);
for (int i = 0; i < n_fields; ++i) {
auto arrow_field = arrow_union_array->field(i);
g_ptr_array_add(priv->fields, garrow_array_new_raw(&arrow_field));
}
}
if (i < 0) {
i += priv->fields->len;
}
if (i < 0) {
return NULL;
}
if (i >= static_cast<gint>(priv->fields->len)) {
return NULL;
}
auto field = static_cast<GArrowArray *>(g_ptr_array_index(priv->fields, i));
g_object_ref(field);
return field;
}
G_DEFINE_TYPE(GArrowSparseUnionArray,
garrow_sparse_union_array,
GARROW_TYPE_UNION_ARRAY)
static void
garrow_sparse_union_array_init(GArrowSparseUnionArray *object)
{
}
static void
garrow_sparse_union_array_class_init(GArrowSparseUnionArrayClass *klass)
{
}
static GArrowSparseUnionArray *
garrow_sparse_union_array_new_internal(GArrowSparseUnionDataType *data_type,
GArrowInt8Array *type_ids,
GList *fields,
GError **error,
const char *context)
{
auto arrow_type_ids = garrow_array_get_raw(GARROW_ARRAY(type_ids));
std::vector<std::shared_ptr<arrow::Array>> arrow_fields;
for (auto node = fields; node; node = node->next) {
auto *field = GARROW_ARRAY(node->data);
arrow_fields.push_back(garrow_array_get_raw(field));
}
arrow::Result<std::shared_ptr<arrow::Array>> arrow_sparse_union_array_result;
if (data_type) {
auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type));
auto arrow_union_data_type =
std::static_pointer_cast<arrow::UnionType>(arrow_data_type);
std::vector<std::string> arrow_field_names;
for (const auto &arrow_field : arrow_union_data_type->fields()) {
arrow_field_names.push_back(arrow_field->name());
}
arrow_sparse_union_array_result =
arrow::SparseUnionArray::Make(*arrow_type_ids,
arrow_fields,
arrow_field_names,
arrow_union_data_type->type_codes());
} else {
arrow_sparse_union_array_result =
arrow::SparseUnionArray::Make(*arrow_type_ids, arrow_fields);
}
if (garrow::check(error,
arrow_sparse_union_array_result,
context)) {
auto arrow_sparse_union_array = *arrow_sparse_union_array_result;
auto sparse_union_array =
garrow_array_new_raw(&arrow_sparse_union_array,
"array", &arrow_sparse_union_array,
"value-data-type", data_type,
"type-ids", type_ids,
NULL);
auto priv = GARROW_UNION_ARRAY_GET_PRIVATE(sparse_union_array);
priv->fields = g_ptr_array_sized_new(arrow_fields.size());
g_ptr_array_set_free_func(priv->fields, g_object_unref);
for (auto node = fields; node; node = node->next) {
auto field = GARROW_ARRAY(node->data);
g_ptr_array_add(priv->fields, g_object_ref(field));
}
return GARROW_SPARSE_UNION_ARRAY(sparse_union_array);
} else {
return NULL;
}
}
/**
* garrow_sparse_union_array_new:
* @type_ids: The field type IDs for each value as #GArrowInt8Array.
* @fields: (element-type GArrowArray): The arrays for each field
* as #GList of #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowSparseUnionArray
* or %NULL on error.
*
* Since: 0.12.0
*/
GArrowSparseUnionArray *
garrow_sparse_union_array_new(GArrowInt8Array *type_ids,
GList *fields,
GError **error)
{
return garrow_sparse_union_array_new_internal(NULL,
type_ids,
fields,
error,
"[sparse-union-array][new]");
}
/**
* garrow_sparse_union_array_new_data_type:
* @data_type: The data type for the sparse array.
* @type_ids: The field type IDs for each value as #GArrowInt8Array.
* @fields: (element-type GArrowArray): The arrays for each field
* as #GList of #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowSparseUnionArray
* or %NULL on error.
*
* Since: 0.14.0
*/
GArrowSparseUnionArray *
garrow_sparse_union_array_new_data_type(GArrowSparseUnionDataType *data_type,
GArrowInt8Array *type_ids,
GList *fields,
GError **error)
{
return garrow_sparse_union_array_new_internal(
data_type,
type_ids,
fields,
error,
"[sparse-union-array][new][data-type]");
}
typedef struct GArrowDenseUnionArrayPrivate_ {
GArrowInt32Array *value_offsets;
} GArrowDenseUnionArrayPrivate;
enum {
PROP_VALUE_OFFSETS = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowDenseUnionArray,
garrow_dense_union_array,
GARROW_TYPE_UNION_ARRAY)
#define GARROW_DENSE_UNION_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowDenseUnionArrayPrivate *>( \
garrow_dense_union_array_get_instance_private( \
GARROW_DENSE_UNION_ARRAY(obj)))
static void
garrow_dense_union_array_dispose(GObject *object)
{
auto priv = GARROW_DENSE_UNION_ARRAY_GET_PRIVATE(object);
if (priv->value_offsets) {
g_object_unref(priv->value_offsets);
priv->value_offsets = NULL;
}
G_OBJECT_CLASS(garrow_dense_union_array_parent_class)->dispose(object);
}
static void
garrow_dense_union_array_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_DENSE_UNION_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_VALUE_OFFSETS:
priv->value_offsets = GARROW_INT32_ARRAY(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_dense_union_array_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_DENSE_UNION_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_VALUE_OFFSETS:
g_value_set_object(value, priv->value_offsets);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_dense_union_array_init(GArrowDenseUnionArray *object)
{
}
static void
garrow_dense_union_array_class_init(GArrowDenseUnionArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_dense_union_array_dispose;
gobject_class->set_property = garrow_dense_union_array_set_property;
gobject_class->get_property = garrow_dense_union_array_get_property;
GParamSpec *spec;
spec = g_param_spec_object("value-offsets",
"Value offsets",
"The GArrowInt32Array for value offsets",
GARROW_TYPE_INT32_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_VALUE_OFFSETS, spec);
}
static GArrowDenseUnionArray *
garrow_dense_union_array_new_internal(GArrowDenseUnionDataType *data_type,
GArrowInt8Array *type_ids,
GArrowInt32Array *value_offsets,
GList *fields,
GError **error,
const gchar *context)
{
auto arrow_type_ids = garrow_array_get_raw(GARROW_ARRAY(type_ids));
auto arrow_value_offsets = garrow_array_get_raw(GARROW_ARRAY(value_offsets));
std::vector<std::shared_ptr<arrow::Array>> arrow_fields;
for (auto node = fields; node; node = node->next) {
auto *field = GARROW_ARRAY(node->data);
arrow_fields.push_back(garrow_array_get_raw(field));
}
arrow::Result<std::shared_ptr<arrow::Array>> arrow_dense_union_array_result;
if (data_type) {
auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type));
auto arrow_union_data_type =
std::static_pointer_cast<arrow::UnionType>(arrow_data_type);
std::vector<std::string> arrow_field_names;
for (const auto &arrow_field : arrow_union_data_type->fields()) {
arrow_field_names.push_back(arrow_field->name());
}
arrow_dense_union_array_result =
arrow::DenseUnionArray::Make(*arrow_type_ids,
*arrow_value_offsets,
arrow_fields,
arrow_field_names,
arrow_union_data_type->type_codes());
} else {
arrow_dense_union_array_result =
arrow::DenseUnionArray::Make(*arrow_type_ids,
*arrow_value_offsets,
arrow_fields);
}
if (garrow::check(error,
arrow_dense_union_array_result,
context)) {
auto arrow_dense_union_array = *arrow_dense_union_array_result;
auto dense_union_array =
garrow_array_new_raw(&arrow_dense_union_array,
"array", &arrow_dense_union_array,
"value-data-type", data_type,
"type-ids", type_ids,
"value-offsets", value_offsets,
NULL);
auto priv = GARROW_UNION_ARRAY_GET_PRIVATE(dense_union_array);
priv->fields = g_ptr_array_sized_new(arrow_fields.size());
g_ptr_array_set_free_func(priv->fields, g_object_unref);
for (auto node = fields; node; node = node->next) {
auto field = GARROW_ARRAY(node->data);
g_ptr_array_add(priv->fields, g_object_ref(field));
}
return GARROW_DENSE_UNION_ARRAY(dense_union_array);
} else {
return NULL;
}
}
/**
* garrow_dense_union_array_new:
* @type_ids: The field type IDs for each value as #GArrowInt8Array.
* @value_offsets: The value offsets for each value as #GArrowInt32Array.
* Each offset is counted for each type.
* @fields: (element-type GArrowArray): The arrays for each field
* as #GList of #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowDenseUnionArray
* or %NULL on error.
*
* Since: 0.12.0
*/
GArrowDenseUnionArray *
garrow_dense_union_array_new(GArrowInt8Array *type_ids,
GArrowInt32Array *value_offsets,
GList *fields,
GError **error)
{
return garrow_dense_union_array_new_internal(NULL,
type_ids,
value_offsets,
fields,
error,
"[dense-union-array][new]");
}
/**
* garrow_dense_union_array_new_data_type:
* @data_type: The data type for the dense array.
* @type_ids: The field type IDs for each value as #GArrowInt8Array.
* @value_offsets: The value offsets for each value as #GArrowInt32Array.
* Each offset is counted for each type.
* @fields: (element-type GArrowArray): The arrays for each field
* as #GList of #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowSparseUnionArray
* or %NULL on error.
*
* Since: 0.14.0
*/
GArrowDenseUnionArray *
garrow_dense_union_array_new_data_type(GArrowDenseUnionDataType *data_type,
GArrowInt8Array *type_ids,
GArrowInt32Array *value_offsets,
GList *fields,
GError **error)
{
return garrow_dense_union_array_new_internal(
data_type,
type_ids,
value_offsets,
fields,
error,
"[dense-union-array][new][data-type]");
}
typedef struct GArrowDictionaryArrayPrivate_ {
GArrowArray *indices;
GArrowArray *dictionary;
} GArrowDictionaryArrayPrivate;
enum {
PROP_INDICES = 1,
PROP_DICTIONARY,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowDictionaryArray,
garrow_dictionary_array,
GARROW_TYPE_ARRAY)
#define GARROW_DICTIONARY_ARRAY_GET_PRIVATE(obj) \
static_cast<GArrowDictionaryArrayPrivate *>( \
garrow_dictionary_array_get_instance_private( \
GARROW_DICTIONARY_ARRAY(obj)))
static void
garrow_dictionary_array_dispose(GObject *object)
{
auto priv = GARROW_DICTIONARY_ARRAY_GET_PRIVATE(object);
if (priv->indices) {
g_object_unref(priv->indices);
priv->indices = NULL;
}
if (priv->dictionary) {
g_object_unref(priv->dictionary);
priv->dictionary = NULL;
}
G_OBJECT_CLASS(garrow_dictionary_array_parent_class)->dispose(object);
}
static void
garrow_dictionary_array_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_DICTIONARY_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_INDICES:
priv->indices = GARROW_ARRAY(g_value_dup_object(value));
break;
case PROP_DICTIONARY:
priv->dictionary = GARROW_ARRAY(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_dictionary_array_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_DICTIONARY_ARRAY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_INDICES:
g_value_set_object(value, priv->indices);
break;
case PROP_DICTIONARY:
g_value_set_object(value, priv->dictionary);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_dictionary_array_init(GArrowDictionaryArray *object)
{
}
static void
garrow_dictionary_array_class_init(GArrowDictionaryArrayClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_dictionary_array_dispose;
gobject_class->set_property = garrow_dictionary_array_set_property;
gobject_class->get_property = garrow_dictionary_array_get_property;
GParamSpec *spec;
spec = g_param_spec_object("indices",
"The indices",
"The GArrowArray for indices",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_INDICES, spec);
spec = g_param_spec_object("dictionary",
"The dictionary",
"The GArrowArray for dictionary",
GARROW_TYPE_ARRAY,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_DICTIONARY, spec);
}
/**
* garrow_dictionary_array_new:
* @data_type: The data type of the dictionary array.
* @indices: The indices of values in dictionary.
* @dictionary: The dictionary of the dictionary array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowDictionaryArray
* or %NULL on error.
*
* Since: 0.8.0
*/
GArrowDictionaryArray *
garrow_dictionary_array_new(GArrowDataType *data_type,
GArrowArray *indices,
GArrowArray *dictionary,
GError **error)
{
const auto arrow_data_type = garrow_data_type_get_raw(data_type);
const auto arrow_indices = garrow_array_get_raw(indices);
const auto arrow_dictionary = garrow_array_get_raw(dictionary);
auto arrow_dictionary_array_result =
arrow::DictionaryArray::FromArrays(
arrow_data_type,
arrow_indices,
arrow_dictionary);
if (garrow::check(error,
arrow_dictionary_array_result,
"[dictionary-array][new]")) {
auto arrow_array =
std::static_pointer_cast<arrow::Array>(*arrow_dictionary_array_result);
auto dictionary_array = garrow_array_new_raw(&arrow_array,
"array", &arrow_array,
"value-data-type", data_type,
"indices", indices,
"dictionary", dictionary,
NULL);
return GARROW_DICTIONARY_ARRAY(dictionary_array);
} else {
return NULL;
}
}
/**
* garrow_dictionary_array_get_indices:
* @array: A #GArrowDictionaryArray.
*
* Returns: (transfer full): The indices of values in dictionary.
*
* Since: 0.8.0
*/
GArrowArray *
garrow_dictionary_array_get_indices(GArrowDictionaryArray *array)
{
auto priv = GARROW_DICTIONARY_ARRAY_GET_PRIVATE(array);
if (priv->indices) {
g_object_ref(priv->indices);
return priv->indices;
}
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_dictionary_array =
std::static_pointer_cast<arrow::DictionaryArray>(arrow_array);
auto arrow_indices = arrow_dictionary_array->indices();
return garrow_array_new_raw(&arrow_indices);
}
/**
* garrow_dictionary_array_get_dictionary:
* @array: A #GArrowDictionaryArray.
*
* Returns: (transfer full): The dictionary of this array.
*
* Since: 0.8.0
*/
GArrowArray *
garrow_dictionary_array_get_dictionary(GArrowDictionaryArray *array)
{
auto priv = GARROW_DICTIONARY_ARRAY_GET_PRIVATE(array);
if (priv->dictionary) {
g_object_ref(priv->dictionary);
return priv->dictionary;
}
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_dictionary_array =
std::static_pointer_cast<arrow::DictionaryArray>(arrow_array);
auto arrow_dictionary = arrow_dictionary_array->dictionary();
return garrow_array_new_raw(&arrow_dictionary);
}
/**
* garrow_dictionary_array_get_dictionary_data_type:
* @array: A #GArrowDictionaryArray.
*
* Returns: (transfer full): The dictionary data type of this array.
*
* Since: 0.8.0
*
* Deprecated: 1.0.0: Use garrow_array_get_value_data_type() instead.
*/
GArrowDictionaryDataType *
garrow_dictionary_array_get_dictionary_data_type(GArrowDictionaryArray *array)
{
auto data_type = garrow_array_get_value_data_type(GARROW_ARRAY(array));
return GARROW_DICTIONARY_DATA_TYPE(data_type);
}
G_END_DECLS