blob: b607b04b919b25ba4c9da6e5d99f70fe65bddd54 [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.
*/
#include <sstream>
#include <arrow-glib/array.hpp>
#include <arrow-glib/compute.hpp>
#include <arrow-glib/chunked-array.hpp>
#include <arrow-glib/data-type.hpp>
#include <arrow-glib/datum.hpp>
#include <arrow-glib/enums.h>
#include <arrow-glib/error.hpp>
#include <arrow-glib/reader.hpp>
#include <arrow-glib/record-batch.hpp>
#include <arrow-glib/scalar.hpp>
#include <arrow-glib/schema.hpp>
#include <arrow-glib/table.hpp>
#include <arrow/compute/exec/exec_plan.h>
#include <arrow/compute/exec/options.h>
template <typename ArrowType, typename GArrowArrayType>
typename ArrowType::c_type
garrow_numeric_array_sum(GArrowArrayType array,
GError **error,
const gchar *tag,
typename ArrowType::c_type default_value)
{
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_sum_datum = arrow::compute::Sum(arrow_array);
if (garrow::check(error, arrow_sum_datum, tag)) {
using ScalarType = typename arrow::TypeTraits<ArrowType>::ScalarType;
auto arrow_numeric_scalar =
std::dynamic_pointer_cast<ScalarType>((*arrow_sum_datum).scalar());
if (arrow_numeric_scalar->is_valid) {
return arrow_numeric_scalar->value;
} else {
return default_value;
}
} else {
return default_value;
}
}
template <typename GArrowTypeNewRaw>
auto
garrow_take(arrow::Datum arrow_values,
arrow::Datum arrow_indices,
GArrowTakeOptions *options,
GArrowTypeNewRaw garrow_type_new_raw,
GError **error,
const gchar *tag) -> decltype(garrow_type_new_raw(arrow::Datum()))
{
arrow::Result<arrow::Datum> arrow_taken_datum;
if (options) {
auto arrow_options = garrow_take_options_get_raw(options);
arrow_taken_datum = arrow::compute::Take(arrow_values,
arrow_indices,
*arrow_options);
} else {
arrow_taken_datum = arrow::compute::Take(arrow_values,
arrow_indices);
}
if (garrow::check(error, arrow_taken_datum, tag)) {
return garrow_type_new_raw(*arrow_taken_datum);
} else {
return NULL;
}
}
namespace {
gboolean
garrow_field_refs_add(std::vector<arrow::FieldRef> &arrow_field_refs,
const gchar *string,
GError **error,
const gchar *tag)
{
if (string[0] == '.' || string[0] == '[') {
auto arrow_field_ref_result = arrow::FieldRef::FromDotPath(string);
if (!garrow::check(error, arrow_field_ref_result, tag)) {
return false;
}
arrow_field_refs.push_back(std::move(*arrow_field_ref_result));
} else {
arrow_field_refs.emplace_back(string);
}
return true;
}
bool
garrow_sort_key_equal_raw(const arrow::compute::SortKey &sort_key,
const arrow::compute::SortKey &other_sort_key) {
return
(sort_key.target == other_sort_key.target) &&
(sort_key.order == other_sort_key.order);
}
}
G_BEGIN_DECLS
/**
* SECTION: compute
* @section_id: compute
* @title: Computation on data
* @include: arrow-glib/arrow-glib.h
*
* #GArrowExecuteContext is a class to customize how to execute a
* function.
*
* #GArrowFunctionOptions is a base class for all function options
* classes such as #GArrowCastOptions.
*
* #GArrowFunctionDoc is a class for function document.
*
* #GArrowFunction is a class to process data.
*
* #GArrowExecuteNodeOptions is a base class for all execute node
* options classes such as #GArrowSourceNodeOptions.
*
* #GArrowSourceNodeOptions is a class to customize a source node.
*
* #GArrowAggregation is a class to specify how to aggregate.
*
* #GArrowAggregateNodeOptions is a class to customize an aggregate node.
*
* #GArrowSinkNodeOptions is a class to customize a sink node.
*
* #GArrowHashJoinNodeOptions is a class to customize a hash join node.
*
* #GArrowExecuteNode is a class to execute an operation.
*
* #GArrowExecutePlan is a class to execute operations.
*
* #GArrowCastOptions is a class to customize the `cast` function and
* garrow_array_cast().
*
* #GArrowScalarAggregateOptions is a class to customize the scalar
* aggregate functions such as `count` function and convenient
* functions of them such as garrow_array_count().
*
* #GArrowCountOptions is a class to customize the `count` function and
* garrow_array_count() family.
*
* #GArrowFilterOptions is a class to customize the `filter` function and
* garrow_array_filter() family.
*
* #GArrowTakeOptions is a class to customize the `take` function and
* garrow_array_take() family.
*
* #GArrowArraySortOptions is a class to customize the
* `array_sort_indices` function.
*
* #GArrowSortOptions is a class to customize the `sort_indices`
* function.
*
* #GArrowSetLookupOptions is a class to customize the `is_in` function
* and `index_in` function.
*
* #GArrowVarianceOptions is a class to customize the `stddev` function
* and `variance` function.
*
* #GArrowRoundOptions is a class to customize the `round` function.
*
* #GArrowRoundToMultipleOptions is a class to customize the
* `round_to_multiple` function.
*
* #GArrowUTF8NormalizeOptions is a class to customize the
* `utf8_normalize` function.
*
* There are many functions to compute data on an array.
*/
typedef struct GArrowExecuteContextPrivate_ {
arrow::compute::ExecContext context;
} GArrowExecuteContextPrivate;
G_DEFINE_TYPE_WITH_PRIVATE(GArrowExecuteContext,
garrow_execute_context,
G_TYPE_OBJECT)
#define GARROW_EXECUTE_CONTEXT_GET_PRIVATE(object) \
static_cast<GArrowExecuteContextPrivate *>( \
garrow_execute_context_get_instance_private( \
GARROW_EXECUTE_CONTEXT(object)))
static void
garrow_execute_context_finalize(GObject *object)
{
auto priv = GARROW_EXECUTE_CONTEXT_GET_PRIVATE(object);
priv->context.~ExecContext();
G_OBJECT_CLASS(garrow_execute_context_parent_class)->finalize(object);
}
static void
garrow_execute_context_init(GArrowExecuteContext *object)
{
auto priv = GARROW_EXECUTE_CONTEXT_GET_PRIVATE(object);
new(&priv->context) arrow::compute::ExecContext(arrow::default_memory_pool(),
nullptr);
}
static void
garrow_execute_context_class_init(GArrowExecuteContextClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = garrow_execute_context_finalize;
}
/**
* garrow_execute_context_new:
*
* Returns: A newly created #GArrowExecuteContext.
*
* Since: 1.0.0
*/
GArrowExecuteContext *
garrow_execute_context_new(void)
{
auto execute_context = g_object_new(GARROW_TYPE_EXECUTE_CONTEXT, NULL);
return GARROW_EXECUTE_CONTEXT(execute_context);
}
typedef struct GArrowFunctionOptionsPrivate_ {
arrow::compute::FunctionOptions *options;
} GArrowFunctionOptionsPrivate;
G_DEFINE_TYPE_WITH_PRIVATE(GArrowFunctionOptions,
garrow_function_options,
G_TYPE_OBJECT)
#define GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowFunctionOptionsPrivate *>( \
garrow_function_options_get_instance_private( \
GARROW_FUNCTION_OPTIONS(object)))
static void
garrow_function_options_finalize(GObject *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
delete priv->options;
G_OBJECT_CLASS(garrow_function_options_parent_class)->finalize(object);
}
static void
garrow_function_options_init(GArrowFunctionOptions *object)
{
}
static void
garrow_function_options_class_init(GArrowFunctionOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = garrow_function_options_finalize;
}
/**
* garrow_function_options_equal:
* @options: A #GArrowFunctionOptions.
* @other_options: (nullable): A #GArrowFunctionOptions to be compared.
*
* Returns: %TRUE if both of them have the same values, %FALSE
* otherwise.
*
* Since: 7.0.0
*/
gboolean
garrow_function_options_equal(GArrowFunctionOptions *options,
GArrowFunctionOptions *other_options)
{
if (!other_options) {
return FALSE;
}
auto arrow_options = garrow_function_options_get_raw(options);
auto arrow_other_options = garrow_function_options_get_raw(other_options);
return arrow_options->Equals(*arrow_other_options);
}
/**
* garrow_function_options_to_string:
* @options: A #GArrowFunctionOptions.
*
* Returns: The formatted options.
*
* It should be freed with g_free() when no longer needed.
*
* Since: 7.0.0
*/
gchar *
garrow_function_options_to_string(GArrowFunctionOptions *options)
{
auto arrow_options = garrow_function_options_get_raw(options);
auto string = arrow_options->ToString();
return g_strndup(string.data(), string.size());
}
typedef struct GArrowFunctionDocPrivate_ {
arrow::compute::FunctionDoc *doc;
} GArrowFunctionDocPrivate;
enum {
PROP_DOC = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowFunctionDoc,
garrow_function_doc,
G_TYPE_OBJECT)
#define GARROW_FUNCTION_DOC_GET_PRIVATE(object) \
static_cast<GArrowFunctionDocPrivate *>( \
garrow_function_doc_get_instance_private( \
GARROW_FUNCTION_DOC(object)))
static void
garrow_function_doc_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_FUNCTION_DOC_GET_PRIVATE(object);
switch (prop_id) {
case PROP_DOC:
priv->doc =
static_cast<arrow::compute::FunctionDoc *>(g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_function_doc_init(GArrowFunctionDoc *object)
{
}
static void
garrow_function_doc_class_init(GArrowFunctionDocClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_function_doc_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("doc",
"Doc",
"The raw arrow::compute::FunctionDoc *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_DOC, spec);
}
/**
* garrow_function_doc_get_summary:
* @doc: A #GArrowFunctionDoc.
*
* Returns: A one-line summary of the function, using a verb.
*
* It should be freed with g_free() when no longer needed.
*
* Since: 6.0.0
*/
gchar *
garrow_function_doc_get_summary(GArrowFunctionDoc *doc)
{
auto arrow_doc = garrow_function_doc_get_raw(doc);
return g_strndup(arrow_doc->summary.data(),
arrow_doc->summary.size());
}
/**
* garrow_function_doc_get_description:
* @doc: A #GArrowFunctionDoc.
*
* Returns: A detailed description of the function, meant to follow
* the summary.
*
* It should be freed with g_free() when no longer needed.
*
* Since: 6.0.0
*/
gchar *
garrow_function_doc_get_description(GArrowFunctionDoc *doc)
{
auto arrow_doc = garrow_function_doc_get_raw(doc);
return g_strndup(arrow_doc->description.data(),
arrow_doc->description.size());
}
/**
* garrow_function_doc_get_arg_names:
* @doc: A #GArrowFunctionDoc.
*
* Returns: (array zero-terminated=1) (element-type utf8) (transfer full):
* Symbolic names (identifiers) for the function arguments.
*
* It's a %NULL-terminated string array. It must be freed with
* g_strfreev() when no longer needed.
*
* Since: 6.0.0
*/
gchar **
garrow_function_doc_get_arg_names(GArrowFunctionDoc *doc)
{
auto arrow_doc = garrow_function_doc_get_raw(doc);
const auto &arrow_arg_names = arrow_doc->arg_names;
auto n = arrow_arg_names.size();
auto arg_names = g_new(gchar *, n + 1);
for (size_t i = 0; i < n; ++i) {
arg_names[i] = g_strndup(arrow_arg_names[i].data(),
arrow_arg_names[i].size());
}
arg_names[n] = NULL;
return arg_names;
}
/**
* garrow_function_doc_get_options_class_name:
* @doc: A #GArrowFunctionDoc.
*
* Returns: Name of the options class, if any.
*
* It should be freed with g_free() when no longer needed.
*
* Since: 6.0.0
*/
gchar *
garrow_function_doc_get_options_class_name(GArrowFunctionDoc *doc)
{
auto arrow_doc = garrow_function_doc_get_raw(doc);
return g_strndup(arrow_doc->options_class.data(),
arrow_doc->options_class.size());
}
typedef struct GArrowFunctionPrivate_ {
std::shared_ptr<arrow::compute::Function> function;
gchar *name;
} GArrowFunctionPrivate;
enum {
PROP_FUNCTION = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowFunction,
garrow_function,
G_TYPE_OBJECT)
#define GARROW_FUNCTION_GET_PRIVATE(object) \
static_cast<GArrowFunctionPrivate *>( \
garrow_function_get_instance_private( \
GARROW_FUNCTION(object)))
static void
garrow_function_finalize(GObject *object)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(object);
priv->function.~shared_ptr();
if (priv->name) {
g_free(priv->name);
}
G_OBJECT_CLASS(garrow_function_parent_class)->finalize(object);
}
static void
garrow_function_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(object);
switch (prop_id) {
case PROP_FUNCTION:
priv->function =
*static_cast<std::shared_ptr<arrow::compute::Function> *>(
g_value_get_pointer(value));
{
const auto &arrow_name = priv->function->name();
priv->name = g_strndup(arrow_name.data(), arrow_name.length());
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_function_init(GArrowFunction *object)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(object);
new(&priv->function) std::shared_ptr<arrow::compute::Function>;
}
static void
garrow_function_class_init(GArrowFunctionClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = garrow_function_finalize;
gobject_class->set_property = garrow_function_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("function",
"Function",
"The raw std::shared<arrow::compute::Function> *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_FUNCTION, spec);
}
/**
* garrow_function_find:
* @name: A function name to be found.
*
* Returns: (transfer full):
* The found #GArrowFunction or %NULL on not found.
*
* Since: 1.0.0
*/
GArrowFunction *
garrow_function_find(const gchar *name)
{
auto arrow_function_registry = arrow::compute::GetFunctionRegistry();
auto arrow_function_result = arrow_function_registry->GetFunction(name);
if (!arrow_function_result.ok()) {
return NULL;
}
auto arrow_function = *arrow_function_result;
return garrow_function_new_raw(&arrow_function);
}
/**
* garrow_function_all:
*
* Returns: (element-type GArrowFunction) (transfer full):
* The all available functions.
*
* It should be freed with g_list_free_full() and g_object_unref()
* when no longer needed.
*
* Since: 7.0.0
*/
GList *
garrow_function_all(void)
{
auto arrow_function_registry = arrow::compute::GetFunctionRegistry();
GList *functions = NULL;
for (const auto &arrow_name : arrow_function_registry->GetFunctionNames()) {
auto arrow_function_result = arrow_function_registry->GetFunction(arrow_name);
if (!arrow_function_result.ok()) {
continue;
}
auto arrow_function = *arrow_function_result;
functions = g_list_prepend(functions,
garrow_function_new_raw(&arrow_function));
}
return g_list_reverse(functions);
}
/**
* garrow_function_execute:
* @function: A #GArrowFunction.
* @args: (element-type GArrowDatum): A list of #GArrowDatum.
* @options: (nullable): Options for the execution as an object that
* implements #GArrowFunctionOptions.
* @context: (nullable): A #GArrowExecuteContext for the execution.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full):
* A return value of the execution as #GArrowDatum on success, %NULL on error.
*
* Since: 1.0.0
*/
GArrowDatum *
garrow_function_execute(GArrowFunction *function,
GList *args,
GArrowFunctionOptions *options,
GArrowExecuteContext *context,
GError **error)
{
auto arrow_function = garrow_function_get_raw(function);
std::vector<arrow::Datum> arrow_args;
for (GList *node = args; node; node = node->next) {
GArrowDatum *datum = GARROW_DATUM(node->data);
arrow_args.push_back(garrow_datum_get_raw(datum));
}
const arrow::compute::FunctionOptions *arrow_options;
if (options) {
arrow_options = garrow_function_options_get_raw(options);
} else {
arrow_options = arrow_function->default_options();
}
arrow::Result<arrow::Datum> arrow_result_result;
if (context) {
auto arrow_context = garrow_execute_context_get_raw(context);
arrow_result_result = arrow_function->Execute(arrow_args,
arrow_options,
arrow_context);
} else {
arrow::compute::ExecContext arrow_context;
arrow_result_result = arrow_function->Execute(arrow_args,
arrow_options,
&arrow_context);
}
if (garrow::check(error, arrow_result_result, "[function][execute]")) {
auto arrow_result = *arrow_result_result;
return garrow_datum_new_raw(&arrow_result);
} else {
return NULL;
}
}
/**
* garrow_function_get_name:
* @function: A #GArrowFunction.
*
* Returns: The function name.
*
* Since: 7.0.0
*/
const gchar *
garrow_function_get_name(GArrowFunction *function)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(function);
return priv->name;
}
/**
* garrow_function_get_doc:
* @function: A #GArrowFunction.
*
* Returns: (transfer full): The function documentation.
*
* Since: 6.0.0
*/
GArrowFunctionDoc *
garrow_function_get_doc(GArrowFunction *function)
{
auto arrow_function = garrow_function_get_raw(function);
const auto &arrow_doc = arrow_function->doc();
return garrow_function_doc_new_raw(&arrow_doc);
}
/**
* garrow_function_get_default_options:
* @function: A #GArrowFunction.
*
* Returns: (transfer full) (nullable): The default options of this
* function if exists, %NULL otherwise.
*
* Since: 7.0.0
*/
GArrowFunctionOptions *
garrow_function_get_default_options(GArrowFunction *function)
{
auto arrow_function = garrow_function_get_raw(function);
auto arrow_function_options = arrow_function->default_options();
if (!arrow_function_options) {
return NULL;
}
return garrow_function_options_new_raw(arrow_function_options);
}
/**
* garrow_function_get_options_type:
* @function: A #GArrowFunction.
*
* Returns: %G_TYPE_NONE if this function doesn't have options, the
* #GType of options of this function if it exists and Apache Arrow
* GLib bindings of it also exist, %G_TYPE_INVALID if options of this
* function exists but Apache Arrow GLib bindings of it don't exist.
*
* Since: 7.0.0
*/
GType
garrow_function_get_options_type(GArrowFunction *function)
{
auto arrow_function = garrow_function_get_raw(function);
const auto &arrow_doc = arrow_function->doc();
if (arrow_doc.options_class.empty()) {
return G_TYPE_NONE;
}
auto options_type_name = std::string("GArrow") + arrow_doc.options_class;
return g_type_from_name(options_type_name.c_str());
}
/**
* garrow_function_equal:
* @function: A #GArrowFunction.
* @other_function: A #GArrowFunction to be compared.
*
* Returns: %TRUE if both of them have the same name, %FALSE
* otherwise.
*
* Since: 7.0.0
*/
gboolean
garrow_function_equal(GArrowFunction *function,
GArrowFunction *other_function)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(function);
auto other_priv = GARROW_FUNCTION_GET_PRIVATE(other_function);
return g_strcmp0(priv->name, other_priv->name) == 0;
}
/**
* garrow_function_to_string:
* @function: A #GArrowFunction.
*
* Returns: The formatted function.
*
* It should be freed with g_free() when no longer needed.
*
* Since: 7.0.0
*/
gchar *
garrow_function_to_string(GArrowFunction *function)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(function);
auto arrow_function = garrow_function_get_raw(function);
const auto &arrow_doc = arrow_function->doc();
const auto arrow_default_options = arrow_function->default_options();
auto string = g_string_new(NULL);
g_string_append_printf(string, "%s(", priv->name);
int i = 0;
for (const auto &arrow_arg_name : arrow_doc.arg_names) {
if (i > 0) {
g_string_append(string, ", ");
}
g_string_append(string, arrow_arg_name.c_str());
++i;
}
if (arrow_default_options) {
if (i > 0) {
g_string_append(string, ", ");
}
g_string_append(string, arrow_default_options->ToString().c_str());
}
g_string_append_printf(string, "): %s", arrow_doc.summary.c_str());
return g_string_free(string, FALSE);
}
typedef struct GArrowExecuteNodeOptionsPrivate_ {
arrow::compute::ExecNodeOptions *options;
} GArrowExecuteNodeOptionsPrivate;
enum {
PROP_EXECUTE_NODE_OPTIONS = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowExecuteNodeOptions,
garrow_execute_node_options,
G_TYPE_OBJECT)
#define GARROW_EXECUTE_NODE_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowExecuteNodeOptionsPrivate *>( \
garrow_execute_node_options_get_instance_private( \
GARROW_EXECUTE_NODE_OPTIONS(object)))
static void
garrow_execute_node_options_finalize(GObject *object)
{
auto priv = GARROW_EXECUTE_NODE_OPTIONS_GET_PRIVATE(object);
delete priv->options;
G_OBJECT_CLASS(garrow_execute_node_options_parent_class)->finalize(object);
}
static void
garrow_execute_node_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_EXECUTE_NODE_OPTIONS_GET_PRIVATE(object);
switch (prop_id) {
case PROP_FUNCTION:
priv->options =
static_cast<arrow::compute::ExecNodeOptions *>(g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_execute_node_options_init(GArrowExecuteNodeOptions *object)
{
auto priv = GARROW_EXECUTE_NODE_OPTIONS_GET_PRIVATE(object);
priv->options = nullptr;
}
static void
garrow_execute_node_options_class_init(GArrowExecuteNodeOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = garrow_execute_node_options_finalize;
gobject_class->set_property = garrow_execute_node_options_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("options",
"Options",
"The raw arrow::compute::ExecNodeOptions *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class,
PROP_EXECUTE_NODE_OPTIONS,
spec);
}
typedef struct GArrowSourceNodeOptionsPrivate_ {
GArrowRecordBatchReader *reader;
GArrowRecordBatch *record_batch;
} GArrowSourceNodeOptionsPrivate;
enum {
PROP_READER = 1,
PROP_RECORD_BATCH,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowSourceNodeOptions,
garrow_source_node_options,
GARROW_TYPE_EXECUTE_NODE_OPTIONS)
#define GARROW_SOURCE_NODE_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowSourceNodeOptionsPrivate *>( \
garrow_source_node_options_get_instance_private( \
GARROW_SOURCE_NODE_OPTIONS(object)))
static void
garrow_source_node_options_dispose(GObject *object)
{
auto priv = GARROW_SOURCE_NODE_OPTIONS_GET_PRIVATE(object);
if (priv->reader) {
g_object_unref(priv->reader);
priv->reader = nullptr;
}
if (priv->record_batch) {
g_object_unref(priv->record_batch);
priv->record_batch = nullptr;
}
G_OBJECT_CLASS(garrow_source_node_options_parent_class)->dispose(object);
}
static void
garrow_source_node_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_SOURCE_NODE_OPTIONS_GET_PRIVATE(object);
switch (prop_id) {
case PROP_READER:
priv->reader = GARROW_RECORD_BATCH_READER(g_value_dup_object(value));
break;
case PROP_RECORD_BATCH:
priv->record_batch = GARROW_RECORD_BATCH(g_value_dup_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_source_node_options_init(GArrowSourceNodeOptions *object)
{
}
static void
garrow_source_node_options_class_init(GArrowSourceNodeOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_source_node_options_dispose;
gobject_class->set_property = garrow_source_node_options_set_property;
GParamSpec *spec;
spec = g_param_spec_object("reader",
"Reader",
"The GArrowRecordBatchReader that produces "
"record batches",
GARROW_TYPE_RECORD_BATCH_READER,
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_READER, spec);
spec = g_param_spec_object("record-batch",
"Record batch",
"The GArrowRecordBatch to be produced",
GARROW_TYPE_RECORD_BATCH,
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_RECORD_BATCH, spec);
}
/**
* garrow_source_node_options_new_record_batch_reader:
* @reader: A #GArrowRecordBatchReader.
*
* Returns: A newly created #GArrowSourceNodeOptions.
*
* Since: 6.0.0
*/
GArrowSourceNodeOptions *
garrow_source_node_options_new_record_batch_reader(
GArrowRecordBatchReader *reader)
{
auto arrow_reader = garrow_record_batch_reader_get_raw(reader);
auto arrow_options = new arrow::compute::SourceNodeOptions(
arrow_reader->schema(),
[arrow_reader]() {
using ExecBatch = arrow::compute::ExecBatch;
using ExecBatchOptional = arrow::util::optional<ExecBatch>;
auto arrow_record_batch_result = arrow_reader->Next();
if (!arrow_record_batch_result.ok()) {
return arrow::AsyncGeneratorEnd<ExecBatchOptional>();
}
auto arrow_record_batch = std::move(*arrow_record_batch_result);
if (!arrow_record_batch) {
return arrow::AsyncGeneratorEnd<ExecBatchOptional>();
}
return arrow::Future<ExecBatchOptional>::MakeFinished(
ExecBatch(*arrow_record_batch));
});
auto options = g_object_new(GARROW_TYPE_SOURCE_NODE_OPTIONS,
"options", arrow_options,
"reader", reader,
NULL);
return GARROW_SOURCE_NODE_OPTIONS(options);
}
/**
* garrow_source_node_options_new_record_batch:
* @record_batch: A #GArrowRecordBatch.
*
* Returns: A newly created #GArrowSourceNodeOptions.
*
* Since: 6.0.0
*/
GArrowSourceNodeOptions *
garrow_source_node_options_new_record_batch(GArrowRecordBatch *record_batch)
{
struct State {
std::shared_ptr<arrow::RecordBatch> record_batch;
bool generated;
};
auto state = std::make_shared<State>();
state->record_batch = garrow_record_batch_get_raw(record_batch);
state->generated = false;
auto arrow_options = new arrow::compute::SourceNodeOptions(
state->record_batch->schema(),
[state]() {
using ExecBatch = arrow::compute::ExecBatch;
using ExecBatchOptional = arrow::util::optional<ExecBatch>;
if (!state->generated) {
state->generated = true;
return arrow::Future<ExecBatchOptional>::MakeFinished(
ExecBatch(*(state->record_batch)));
} else {
return arrow::AsyncGeneratorEnd<ExecBatchOptional>();
}
});
auto options = g_object_new(GARROW_TYPE_SOURCE_NODE_OPTIONS,
"options", arrow_options,
"record-batch", record_batch,
NULL);
return GARROW_SOURCE_NODE_OPTIONS(options);
}
/**
* garrow_source_node_options_new_table:
* @table: A #GArrowTable.
*
* Returns: A newly created #GArrowSourceNodeOptions.
*
* Since: 6.0.0
*/
GArrowSourceNodeOptions *
garrow_source_node_options_new_table(GArrowTable *table)
{
auto reader = garrow_table_batch_reader_new(table);
auto options = garrow_source_node_options_new_record_batch_reader(
GARROW_RECORD_BATCH_READER(reader));
g_object_unref(reader);
return options;
}
typedef struct GArrowAggregationPrivate_ {
gchar *function;
GArrowFunctionOptions *options;
gchar *input;
gchar *output;
} GArrowAggregationPrivate;
enum {
PROP_AGGREGATION_FUNCTION = 1,
PROP_AGGREGATION_OPTIONS,
PROP_AGGREGATION_INPUT,
PROP_AGGREGATION_OUTPUT,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowAggregation,
garrow_aggregation,
G_TYPE_OBJECT)
#define GARROW_AGGREGATION_GET_PRIVATE(object) \
static_cast<GArrowAggregationPrivate *>( \
garrow_aggregation_get_instance_private( \
GARROW_AGGREGATION(object)))
static void
garrow_aggregation_dispose(GObject *object)
{
auto priv = GARROW_AGGREGATION_GET_PRIVATE(object);
if (priv->options) {
g_object_unref(priv->options);
priv->options = nullptr;
}
G_OBJECT_CLASS(garrow_aggregation_parent_class)->dispose(object);
}
static void
garrow_aggregation_finalize(GObject *object)
{
auto priv = GARROW_AGGREGATION_GET_PRIVATE(object);
g_free(priv->function);
g_free(priv->input);
g_free(priv->output);
G_OBJECT_CLASS(garrow_aggregation_parent_class)->finalize(object);
}
static void
garrow_aggregation_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_AGGREGATION_GET_PRIVATE(object);
switch (prop_id) {
case PROP_AGGREGATION_FUNCTION:
priv->function = g_value_dup_string(value);
break;
case PROP_AGGREGATION_OPTIONS:
priv->options = GARROW_FUNCTION_OPTIONS(g_value_dup_object(value));
break;
case PROP_AGGREGATION_INPUT:
priv->input = g_value_dup_string(value);
break;
case PROP_AGGREGATION_OUTPUT:
priv->output = g_value_dup_string(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_aggregation_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_AGGREGATION_GET_PRIVATE(object);
switch (prop_id) {
case PROP_AGGREGATION_FUNCTION:
g_value_set_string(value, priv->function);
break;
case PROP_AGGREGATION_OPTIONS:
g_value_set_object(value, priv->options);
break;
case PROP_AGGREGATION_INPUT:
g_value_set_string(value, priv->input);
break;
case PROP_AGGREGATION_OUTPUT:
g_value_set_string(value, priv->output);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_aggregation_init(GArrowAggregation *object)
{
}
static void
garrow_aggregation_class_init(GArrowAggregationClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_aggregation_dispose;
gobject_class->finalize = garrow_aggregation_finalize;
gobject_class->set_property = garrow_aggregation_set_property;
gobject_class->get_property = garrow_aggregation_get_property;
GParamSpec *spec;
/**
* GArrowAggregation:function:
*
* The function name to aggregate.
*
* Since: 6.0.0
*/
spec = g_param_spec_string("function",
"Function",
"The function name to aggregate",
NULL,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class,
PROP_AGGREGATION_FUNCTION,
spec);
/**
* GArrowAggregation:options:
*
* The options of aggregate function.
*
* Since: 6.0.0
*/
spec = g_param_spec_object("options",
"Options",
"The options of aggregate function",
GARROW_TYPE_FUNCTION_OPTIONS,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class,
PROP_AGGREGATION_OPTIONS,
spec);
/**
* GArrowAggregation:input:
*
* The input field name of aggregate function.
*
* Since: 6.0.0
*/
spec = g_param_spec_string("input",
"Input",
"The input field name of aggregate function",
NULL,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class,
PROP_AGGREGATION_INPUT,
spec);
/**
* GArrowAggregation:output:
*
* The output field name of aggregate function.
*
* Since: 6.0.0
*/
spec = g_param_spec_string("output",
"Output",
"The output field name of aggregate function",
NULL,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class,
PROP_AGGREGATION_OUTPUT,
spec);
}
/**
* garrow_aggregation_new:
* @function: A name of aggregate function.
* @options: (nullable): A #GArrowFunctionOptions of aggregate function.
* @input: An input field name of aggregate function.
* @output: An output field name of aggregate function.
*
* Returns: A newly created #GArrowAggregation.
*
* Since: 6.0.0
*/
GArrowAggregation *
garrow_aggregation_new(const gchar *function,
GArrowFunctionOptions *options,
const gchar *input,
const gchar *output)
{
return GARROW_AGGREGATION(g_object_new(GARROW_TYPE_AGGREGATION,
"function", function,
"options", options,
"input", input,
"output", output,
NULL));
}
G_DEFINE_TYPE(GArrowAggregateNodeOptions,
garrow_aggregate_node_options,
GARROW_TYPE_EXECUTE_NODE_OPTIONS)
static void
garrow_aggregate_node_options_init(GArrowAggregateNodeOptions *object)
{
}
static void
garrow_aggregate_node_options_class_init(GArrowAggregateNodeOptionsClass *klass)
{
}
/**
* garrow_aggregate_node_options_new:
* @aggregations: (element-type GArrowAggregation): A list of #GArrowAggregation.
* @keys: (nullable) (array length=n_keys): Group keys.
* @n_keys: The number of @keys.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowAggregateNodeOptions on success,
* %NULL otherwise.
*
* Since: 6.0.0
*/
GArrowAggregateNodeOptions *
garrow_aggregate_node_options_new(GList *aggregations,
const gchar **keys,
gsize n_keys,
GError **error)
{
std::vector<arrow::compute::internal::Aggregate> arrow_aggregates;
std::vector<arrow::FieldRef> arrow_targets;
std::vector<std::string> arrow_names;
std::vector<arrow::FieldRef> arrow_keys;
for (auto node = aggregations; node; node = node->next) {
auto aggregation_priv = GARROW_AGGREGATION_GET_PRIVATE(node->data);
arrow::compute::FunctionOptions *function_options = nullptr;
if (aggregation_priv->options) {
function_options =
garrow_function_options_get_raw(aggregation_priv->options);
};
arrow_aggregates.push_back({aggregation_priv->function, function_options});
if (!garrow_field_refs_add(arrow_targets,
aggregation_priv->input,
error,
"[aggregate-node-options][new][input]")) {
return NULL;
}
arrow_names.emplace_back(aggregation_priv->output);
}
for (gsize i = 0; i < n_keys; ++i) {
if (!garrow_field_refs_add(arrow_keys,
keys[i],
error,
"[aggregate-node-options][new][key]")) {
return NULL;
}
}
auto arrow_options =
new arrow::compute::AggregateNodeOptions(std::move(arrow_aggregates),
std::move(arrow_targets),
std::move(arrow_names),
std::move(arrow_keys));
auto options = g_object_new(GARROW_TYPE_AGGREGATE_NODE_OPTIONS,
"options", arrow_options,
NULL);
return GARROW_AGGREGATE_NODE_OPTIONS(options);
}
typedef struct GArrowSinkNodeOptionsPrivate_ {
arrow::AsyncGenerator<arrow::util::optional<arrow::compute::ExecBatch>> generator;
GArrowRecordBatchReader *reader;
} GArrowSinkNodeOptionsPrivate;
G_DEFINE_TYPE_WITH_PRIVATE(GArrowSinkNodeOptions,
garrow_sink_node_options,
GARROW_TYPE_EXECUTE_NODE_OPTIONS)
#define GARROW_SINK_NODE_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowSinkNodeOptionsPrivate *>( \
garrow_sink_node_options_get_instance_private( \
GARROW_SINK_NODE_OPTIONS(object)))
static void
garrow_sink_node_options_dispose(GObject *object)
{
auto priv = GARROW_SINK_NODE_OPTIONS_GET_PRIVATE(object);
if (priv->reader) {
g_object_unref(priv->reader);
priv->reader = nullptr;
}
G_OBJECT_CLASS(garrow_sink_node_options_parent_class)->dispose(object);
}
static void
garrow_sink_node_options_finalize(GObject *object)
{
auto priv = GARROW_SINK_NODE_OPTIONS_GET_PRIVATE(object);
priv->generator.~function();
G_OBJECT_CLASS(garrow_sink_node_options_parent_class)->finalize(object);
}
static void
garrow_sink_node_options_init(GArrowSinkNodeOptions *object)
{
auto priv = GARROW_SINK_NODE_OPTIONS_GET_PRIVATE(object);
new(&(priv->generator))
arrow::AsyncGenerator<arrow::util::optional<arrow::compute::ExecBatch>>();
}
static void
garrow_sink_node_options_class_init(GArrowSinkNodeOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_sink_node_options_dispose;
gobject_class->finalize = garrow_sink_node_options_finalize;
}
/**
* garrow_sink_node_options_new:
*
* Returns: A newly created #GArrowSinkNodeOptions.
*
* Since: 6.0.0
*/
GArrowSinkNodeOptions *
garrow_sink_node_options_new(void)
{
auto options = g_object_new(GARROW_TYPE_SINK_NODE_OPTIONS, NULL);
auto priv = GARROW_SINK_NODE_OPTIONS_GET_PRIVATE(options);
auto arrow_options = new arrow::compute::SinkNodeOptions(&(priv->generator));
auto execute_node_options_priv = GARROW_EXECUTE_NODE_OPTIONS_GET_PRIVATE(options);
execute_node_options_priv->options = arrow_options;
return GARROW_SINK_NODE_OPTIONS(options);
}
/**
* garrow_sink_node_options_get_reader:
* @options: A #GArrowSinkNodeOptions.
* @schema: A #GArrowSchema.
*
* Returns: (transfer full): A #GArrowRecordBatchReader to read generated record batches.
*
* Since: 6.0.0
*/
GArrowRecordBatchReader *
garrow_sink_node_options_get_reader(GArrowSinkNodeOptions *options,
GArrowSchema *schema)
{
auto arrow_schema = garrow_schema_get_raw(schema);
auto priv = GARROW_SINK_NODE_OPTIONS_GET_PRIVATE(options);
if (!priv->reader) {
auto arrow_reader =
arrow::compute::MakeGeneratorReader(arrow_schema,
std::move(priv->generator),
arrow::default_memory_pool());
priv->reader = garrow_record_batch_reader_new_raw(&arrow_reader);
}
g_object_ref(priv->reader);
return priv->reader;
}
G_DEFINE_TYPE(GArrowHashJoinNodeOptions,
garrow_hash_join_node_options,
GARROW_TYPE_EXECUTE_NODE_OPTIONS)
static void
garrow_hash_join_node_options_init(GArrowHashJoinNodeOptions *object)
{
}
static void
garrow_hash_join_node_options_class_init(GArrowHashJoinNodeOptionsClass *klass)
{
/* TODO: Add left_output_prefix and right_output_prefix properties */
}
/**
* garrow_hash_join_node_options_new:
* @type: A #GArrowJoinType to be used.
* @left_keys: (array length=n_left_keys): Left join keys.
* @n_left_keys: The number of @left_keys.
* @right_keys: (array length=n_right_keys): Right join keys.
* @n_right_keys: The number of @right_keys.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowHashJoinNodeOptions on success,
* %NULL otherwise.
*
* Since: 7.0.0
*/
GArrowHashJoinNodeOptions *
garrow_hash_join_node_options_new(GArrowJoinType type,
const gchar **left_keys,
gsize n_left_keys,
const gchar **right_keys,
gsize n_right_keys,
GError **error)
{
auto arrow_type = static_cast<arrow::compute::JoinType>(type);
std::vector<arrow::FieldRef> arrow_left_keys;
for (gsize i = 0; i < n_left_keys; ++i) {
if (!garrow_field_refs_add(arrow_left_keys,
left_keys[i],
error,
"[hash-join-node-options][new][left-key]")) {
return NULL;
}
}
std::vector<arrow::FieldRef> arrow_right_keys;
for (gsize i = 0; i < n_right_keys; ++i) {
if (!garrow_field_refs_add(arrow_right_keys,
right_keys[i],
error,
"[hash-join-node-options][new][right-key]")) {
return NULL;
}
}
auto arrow_options =
new arrow::compute::HashJoinNodeOptions(arrow_type,
std::move(arrow_left_keys),
std::move(arrow_right_keys));
auto options = g_object_new(GARROW_TYPE_HASH_JOIN_NODE_OPTIONS,
"options", arrow_options,
NULL);
return GARROW_HASH_JOIN_NODE_OPTIONS(options);
}
/**
* garrow_hash_join_node_options_set_left_outputs:
* @options: A #GArrowHashJoinNodeOptions.
* @outputs: (array length=n_outputs): Output fields.
* @n_outputs: The number of @outputs.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: %TRUE on success, %FALSE on error.
*
* Since: 7.0.0
*/
gboolean
garrow_hash_join_node_options_set_left_outputs(
GArrowHashJoinNodeOptions *options,
const gchar **outputs,
gsize n_outputs,
GError **error)
{
auto arrow_options =
static_cast<arrow::compute::HashJoinNodeOptions *>(
garrow_execute_node_options_get_raw(
GARROW_EXECUTE_NODE_OPTIONS(options)));
arrow_options->output_all = false;
arrow_options->left_output.clear();
for (gsize i = 0; i < n_outputs; ++i) {
if (!garrow_field_refs_add(arrow_options->left_output,
outputs[i],
error,
"[hash-join-node-options][set-left-outputs]")) {
return FALSE;
}
}
return TRUE;
}
/**
* garrow_hash_join_node_options_set_right_outputs:
* @options: A #GArrowHashJoinNodeOptions.
* @outputs: (array length=n_outputs): Output fields.
* @n_outputs: The number of @outputs.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: %TRUE on success, %FALSE on error.
*
* Since: 7.0.0
*/
gboolean
garrow_hash_join_node_options_set_right_outputs(
GArrowHashJoinNodeOptions *options,
const gchar **outputs,
gsize n_outputs,
GError **error)
{
auto arrow_options =
static_cast<arrow::compute::HashJoinNodeOptions *>(
garrow_execute_node_options_get_raw(
GARROW_EXECUTE_NODE_OPTIONS(options)));
arrow_options->output_all = false;
arrow_options->right_output.clear();
for (gsize i = 0; i < n_outputs; ++i) {
if (!garrow_field_refs_add(arrow_options->right_output,
outputs[i],
error,
"[hash-join-node-options][set-right-outputs]")) {
return FALSE;
}
}
return TRUE;
}
typedef struct GArrowExecuteNodePrivate_ {
arrow::compute::ExecNode *node;
} GArrowExecuteNodePrivate;
enum {
PROP_NODE = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowExecuteNode,
garrow_execute_node,
G_TYPE_OBJECT)
#define GARROW_EXECUTE_NODE_GET_PRIVATE(object) \
static_cast<GArrowExecuteNodePrivate *>( \
garrow_execute_node_get_instance_private( \
GARROW_EXECUTE_NODE(object)))
static void
garrow_execute_node_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_EXECUTE_NODE_GET_PRIVATE(object);
switch (prop_id) {
case PROP_NODE:
priv->node =
static_cast<arrow::compute::ExecNode *>(g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_execute_node_init(GArrowExecuteNode *object)
{
}
static void
garrow_execute_node_class_init(GArrowExecuteNodeClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_execute_node_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("node",
"Node",
"The raw arrow::compute::ExecNode *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_NODE, spec);
}
/**
* garrow_execute_node_get_kind_name:
* @node: A #GArrowExecuteNode.
*
* Returns: The kind name of the node.
*
* Since: 6.0.0
*/
const gchar *
garrow_execute_node_get_kind_name(GArrowExecuteNode *node)
{
auto arrow_node = garrow_execute_node_get_raw(node);
return arrow_node->kind_name();
}
/**
* garrow_execute_node_get_output_schema:
* @node: A #GArrowExecuteNode.
*
* Returns: (transfer full): The output schema of the node.
*
* Since: 6.0.0
*/
GArrowSchema *
garrow_execute_node_get_output_schema(GArrowExecuteNode *node)
{
auto arrow_node = garrow_execute_node_get_raw(node);
std::shared_ptr<arrow::Schema> arrow_schema = arrow_node->output_schema();
return garrow_schema_new_raw(&arrow_schema);
}
typedef struct GArrowExecutePlanPrivate_ {
std::shared_ptr<arrow::compute::ExecPlan> plan;
} GArrowExecutePlanPrivate;
enum {
PROP_PLAN = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowExecutePlan,
garrow_execute_plan,
G_TYPE_OBJECT)
#define GARROW_EXECUTE_PLAN_GET_PRIVATE(object) \
static_cast<GArrowExecutePlanPrivate *>( \
garrow_execute_plan_get_instance_private( \
GARROW_EXECUTE_PLAN(object)))
static void
garrow_execute_plan_finalize(GObject *object)
{
auto priv = GARROW_EXECUTE_PLAN_GET_PRIVATE(object);
priv->plan.~shared_ptr();
G_OBJECT_CLASS(garrow_execute_plan_parent_class)->finalize(object);
}
static void
garrow_execute_plan_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_EXECUTE_PLAN_GET_PRIVATE(object);
switch (prop_id) {
case PROP_PLAN:
priv->plan =
*static_cast<std::shared_ptr<arrow::compute::ExecPlan> *>(
g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_execute_plan_init(GArrowExecutePlan *object)
{
auto priv = GARROW_EXECUTE_PLAN_GET_PRIVATE(object);
new(&(priv->plan)) std::shared_ptr<arrow::compute::ExecPlan>;
}
static void
garrow_execute_plan_class_init(GArrowExecutePlanClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = garrow_execute_plan_finalize;
gobject_class->set_property = garrow_execute_plan_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("plan",
"Plan",
"The raw std::shared_ptr<arrow::compute::ExecPlan>",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_PLAN, spec);
}
/**
* garrow_execute_plan_new:
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GArrowExecutePlan on success,
* %NULL on error.
*
* Since: 6.0.0
*/
GArrowExecutePlan *
garrow_execute_plan_new(GError **error)
{
auto arrow_plan_result = arrow::compute::ExecPlan::Make();
if (garrow::check(error, arrow_plan_result, "[execute-plan][new]")) {
return GARROW_EXECUTE_PLAN(g_object_new(GARROW_TYPE_EXECUTE_PLAN,
"plan", &(*arrow_plan_result),
NULL));
} else {
return NULL;
}
}
/**
* garrow_execute_plan_build_node:
* @plan: A #GArrowExecutePlan.
* @factory_name: A factory name to build a #GArrowExecuteNode.
* @inputs: (element-type GArrowExecuteNode): An inputs to execute new node.
* @options: A #GArrowExecuteNodeOptions for new node.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full): A newly built and added #GArrowExecuteNode
* on success, %NULL on error.
*
* Since: 6.0.0
*/
GArrowExecuteNode *
garrow_execute_plan_build_node(GArrowExecutePlan *plan,
const gchar *factory_name,
GList *inputs,
GArrowExecuteNodeOptions *options,
GError **error)
{
auto arrow_plan = garrow_execute_plan_get_raw(plan);
std::vector<arrow::compute::ExecNode *> arrow_inputs;
for (auto node = inputs; node; node = node->next) {
auto arrow_node =
garrow_execute_node_get_raw(GARROW_EXECUTE_NODE(node->data));
arrow_inputs.push_back(arrow_node);
}
auto arrow_options = garrow_execute_node_options_get_raw(options);
auto arrow_node_result = arrow::compute::MakeExecNode(factory_name,
arrow_plan.get(),
arrow_inputs,
*arrow_options);
if (garrow::check(error, arrow_node_result, "[execute-plan][build-node]")) {
auto arrow_node = *arrow_node_result;
arrow_node->SetLabel(factory_name);
return garrow_execute_node_new_raw(arrow_node);
} else {
return NULL;
}
}
/**
* garrow_execute_plan_build_source_node:
* @plan: A #GArrowExecutePlan.
* @options: A #GArrowSourceNodeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* This is a shortcut of garrow_execute_plan_build_node() for source
* node.
*
* Returns: (transfer full): A newly built and added #GArrowExecuteNode
* for source on success, %NULL on error.
*
* Since: 6.0.0
*/
GArrowExecuteNode *
garrow_execute_plan_build_source_node(GArrowExecutePlan *plan,
GArrowSourceNodeOptions *options,
GError **error)
{
return garrow_execute_plan_build_node(plan,
"source",
NULL,
GARROW_EXECUTE_NODE_OPTIONS(options),
error);
}
/**
* garrow_execute_plan_build_aggregate_node:
* @plan: A #GArrowExecutePlan.
* @input: A #GArrowExecuteNode.
* @options: A #GArrowAggregateNodeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* This is a shortcut of garrow_execute_plan_build_node() for aggregate
* node.
*
* Returns: (transfer full): A newly built and added #GArrowExecuteNode
* for aggregation on success, %NULL on error.
*
* Since: 6.0.0
*/
GArrowExecuteNode *
garrow_execute_plan_build_aggregate_node(GArrowExecutePlan *plan,
GArrowExecuteNode *input,
GArrowAggregateNodeOptions *options,
GError **error)
{
GList *inputs = NULL;
inputs = g_list_prepend(inputs, input);
auto node =
garrow_execute_plan_build_node(plan,
"aggregate",
inputs,
GARROW_EXECUTE_NODE_OPTIONS(options),
error);
g_list_free(inputs);
return node;
}
/**
* garrow_execute_plan_build_sink_node:
* @plan: A #GArrowExecutePlan.
* @input: A #GArrowExecuteNode.
* @options: A #GArrowSinkNodeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* This is a shortcut of garrow_execute_plan_build_node() for sink
* node.
*
* Returns: (transfer full): A newly built and added #GArrowExecuteNode
* for sink on success, %NULL on error.
*
* Since: 6.0.0
*/
GArrowExecuteNode *
garrow_execute_plan_build_sink_node(GArrowExecutePlan *plan,
GArrowExecuteNode *input,
GArrowSinkNodeOptions *options,
GError **error)
{
GList *inputs = NULL;
inputs = g_list_prepend(inputs, input);
auto node =
garrow_execute_plan_build_node(plan,
"sink",
inputs,
GARROW_EXECUTE_NODE_OPTIONS(options),
error);
g_list_free(inputs);
return node;
}
/**
* garrow_execute_plan_build_hash_join_node:
* @plan: A #GArrowExecutePlan.
* @left: A left #GArrowExecuteNode.
* @right: A right #GArrowExecuteNode.
* @options: A #GArrowHashJoinNodeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* This is a shortcut of garrow_execute_plan_build_node() for hash
* join node.
*
* Returns: (transfer full): A newly built and added #GArrowExecuteNode
* for hash join on success, %NULL on error.
*
* Since: 7.0.0
*/
GArrowExecuteNode *
garrow_execute_plan_build_hash_join_node(GArrowExecutePlan *plan,
GArrowExecuteNode *left,
GArrowExecuteNode *right,
GArrowHashJoinNodeOptions *options,
GError **error)
{
GList *inputs = NULL;
inputs = g_list_append(inputs, left);
inputs = g_list_append(inputs, right);
auto node =
garrow_execute_plan_build_node(plan,
"hashjoin",
inputs,
GARROW_EXECUTE_NODE_OPTIONS(options),
error);
g_list_free(inputs);
return node;
}
/**
* garrow_execute_plan_validate:
* @plan: A #GArrowExecutePlan.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: %TRUE on success, %FALSE on error.
*
* Since: 6.0.0
*/
gboolean
garrow_execute_plan_validate(GArrowExecutePlan *plan,
GError **error)
{
auto arrow_plan = garrow_execute_plan_get_raw(plan);
return garrow::check(error,
arrow_plan->Validate(),
"[execute-plan][validate]");
}
/**
* garrow_execute_plan_start:
* @plan: A #GArrowExecutePlan.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Starts this plan.
*
* Returns: %TRUE on success, %FALSE on error.
*
* Since: 6.0.0
*/
gboolean
garrow_execute_plan_start(GArrowExecutePlan *plan,
GError **error)
{
auto arrow_plan = garrow_execute_plan_get_raw(plan);
return garrow::check(error,
arrow_plan->StartProducing(),
"[execute-plan][start]");
}
/**
* garrow_execute_plan_stop:
* @plan: A #GArrowExecutePlan.
*
* Stops this plan.
*
* Since: 6.0.0
*/
void
garrow_execute_plan_stop(GArrowExecutePlan *plan)
{
auto arrow_plan = garrow_execute_plan_get_raw(plan);
arrow_plan->StopProducing();
}
/**
* garrow_execute_plan_wait:
* @plan: A #GArrowExecutePlan.
*
* Waits for finishing this plan.
*
* Since: 6.0.0
*/
void
garrow_execute_plan_wait(GArrowExecutePlan *plan)
{
auto arrow_plan = garrow_execute_plan_get_raw(plan);
arrow_plan->finished().Wait();
}
typedef struct GArrowCastOptionsPrivate_ {
GArrowDataType *to_data_type;
} GArrowCastOptionsPrivate;
enum {
PROP_TO_DATA_TYPE = 1,
PROP_ALLOW_INT_OVERFLOW,
PROP_ALLOW_TIME_TRUNCATE,
PROP_ALLOW_TIME_OVERFLOW,
PROP_ALLOW_DECIMAL_TRUNCATE,
PROP_ALLOW_FLOAT_TRUNCATE,
PROP_ALLOW_INVALID_UTF8,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowCastOptions,
garrow_cast_options,
GARROW_TYPE_FUNCTION_OPTIONS)
#define GARROW_CAST_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowCastOptionsPrivate *>( \
garrow_cast_options_get_instance_private( \
GARROW_CAST_OPTIONS(object)))
static void
garrow_cast_options_dispose(GObject *object)
{
auto priv = GARROW_CAST_OPTIONS_GET_PRIVATE(object);
if (priv->to_data_type) {
g_object_unref(priv->to_data_type);
priv->to_data_type = NULL;
}
G_OBJECT_CLASS(garrow_cast_options_parent_class)->dispose(object);
}
static void
garrow_cast_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_CAST_OPTIONS_GET_PRIVATE(object);
auto options = garrow_cast_options_get_raw(GARROW_CAST_OPTIONS(object));
switch (prop_id) {
case PROP_TO_DATA_TYPE:
{
auto to_data_type = g_value_dup_object(value);
if (priv->to_data_type) {
g_object_unref(priv->to_data_type);
}
if (to_data_type) {
priv->to_data_type = GARROW_DATA_TYPE(to_data_type);
options->to_type = garrow_data_type_get_raw(priv->to_data_type);
} else {
priv->to_data_type = NULL;
options->to_type = nullptr;
}
break;
}
case PROP_ALLOW_INT_OVERFLOW:
options->allow_int_overflow = g_value_get_boolean(value);
break;
case PROP_ALLOW_TIME_TRUNCATE:
options->allow_time_truncate = g_value_get_boolean(value);
break;
case PROP_ALLOW_TIME_OVERFLOW:
options->allow_time_overflow = g_value_get_boolean(value);
break;
case PROP_ALLOW_DECIMAL_TRUNCATE:
options->allow_decimal_truncate = g_value_get_boolean(value);
break;
case PROP_ALLOW_FLOAT_TRUNCATE:
options->allow_float_truncate = g_value_get_boolean(value);
break;
case PROP_ALLOW_INVALID_UTF8:
options->allow_invalid_utf8 = g_value_get_boolean(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_cast_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_CAST_OPTIONS_GET_PRIVATE(object);
auto options = garrow_cast_options_get_raw(GARROW_CAST_OPTIONS(object));
switch (prop_id) {
case PROP_TO_DATA_TYPE:
g_value_set_object(value, priv->to_data_type);
break;
case PROP_ALLOW_INT_OVERFLOW:
g_value_set_boolean(value, options->allow_int_overflow);
break;
case PROP_ALLOW_TIME_TRUNCATE:
g_value_set_boolean(value, options->allow_time_truncate);
break;
case PROP_ALLOW_TIME_OVERFLOW:
g_value_set_boolean(value, options->allow_time_overflow);
break;
case PROP_ALLOW_DECIMAL_TRUNCATE:
g_value_set_boolean(value, options->allow_decimal_truncate);
break;
case PROP_ALLOW_FLOAT_TRUNCATE:
g_value_set_boolean(value, options->allow_float_truncate);
break;
case PROP_ALLOW_INVALID_UTF8:
g_value_set_boolean(value, options->allow_invalid_utf8);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_cast_options_init(GArrowCastOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::CastOptions());
}
static void
garrow_cast_options_class_init(GArrowCastOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_cast_options_dispose;
gobject_class->set_property = garrow_cast_options_set_property;
gobject_class->get_property = garrow_cast_options_get_property;
GParamSpec *spec;
/**
* GArrowCastOptions:to-data-type:
*
* The #GArrowDataType being casted to.
*
* Since: 1.0.0
*/
spec = g_param_spec_object("to-data-type",
"To data type",
"The GArrowDataType being casted to",
GARROW_TYPE_DATA_TYPE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_TO_DATA_TYPE, spec);
/**
* GArrowCastOptions:allow-int-overflow:
*
* Whether integer overflow is allowed or not.
*
* Since: 0.7.0
*/
spec = g_param_spec_boolean("allow-int-overflow",
"Allow int overflow",
"Whether integer overflow is allowed or not",
FALSE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_ALLOW_INT_OVERFLOW, spec);
/**
* GArrowCastOptions:allow-time-truncate:
*
* Whether truncating time value is allowed or not.
*
* Since: 0.8.0
*/
spec = g_param_spec_boolean("allow-time-truncate",
"Allow time truncate",
"Whether truncating time value is allowed or not",
FALSE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_ALLOW_TIME_TRUNCATE, spec);
/**
* GArrowCastOptions:allow-time-overflow:
*
* Whether time overflow is allowed or not.
*
* Since: 1.0.0
*/
spec = g_param_spec_boolean("allow-time-overflow",
"Allow time overflow",
"Whether time overflow is allowed or not",
FALSE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_ALLOW_TIME_OVERFLOW, spec);
/**
* GArrowCastOptions:allow-decimal-truncate:
*
* Whether truncating decimal value is allowed or not.
*
* Since: 1.0.0
*/
spec = g_param_spec_boolean("allow-decimal-truncate",
"Allow decimal truncate",
"Whether truncating decimal value is allowed or not",
FALSE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_ALLOW_DECIMAL_TRUNCATE, spec);
/**
* GArrowCastOptions:allow-float-truncate:
*
* Whether truncating float value is allowed or not.
*
* Since: 0.12.0
*/
spec = g_param_spec_boolean("allow-float-truncate",
"Allow float truncate",
"Whether truncating float value is allowed or not",
FALSE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_ALLOW_FLOAT_TRUNCATE, spec);
/**
* GArrowCastOptions:allow-invalid-utf8:
*
* Whether invalid UTF-8 string value is allowed or not.
*
* Since: 0.13.0
*/
spec = g_param_spec_boolean("allow-invalid-utf8",
"Allow invalid UTF-8",
"Whether invalid UTF-8 string value is allowed or not",
FALSE,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_ALLOW_INVALID_UTF8, spec);
}
/**
* garrow_cast_options_new:
*
* Returns: A newly created #GArrowCastOptions.
*
* Since: 0.7.0
*/
GArrowCastOptions *
garrow_cast_options_new(void)
{
auto cast_options = g_object_new(GARROW_TYPE_CAST_OPTIONS, NULL);
return GARROW_CAST_OPTIONS(cast_options);
}
enum {
PROP_SKIP_NULLS = 1,
PROP_MIN_COUNT,
};
G_DEFINE_TYPE(GArrowScalarAggregateOptions,
garrow_scalar_aggregate_options,
GARROW_TYPE_FUNCTION_OPTIONS)
static void
garrow_scalar_aggregate_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options =
garrow_scalar_aggregate_options_get_raw(
GARROW_SCALAR_AGGREGATE_OPTIONS(object));
switch (prop_id) {
case PROP_SKIP_NULLS:
options->skip_nulls = g_value_get_boolean(value);
break;
case PROP_MIN_COUNT:
options->min_count = g_value_get_uint(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_scalar_aggregate_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options =
garrow_scalar_aggregate_options_get_raw(
GARROW_SCALAR_AGGREGATE_OPTIONS(object));
switch (prop_id) {
case PROP_SKIP_NULLS:
g_value_set_boolean(value, options->skip_nulls);
break;
case PROP_MIN_COUNT:
g_value_set_uint(value, options->min_count);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_scalar_aggregate_options_init(GArrowScalarAggregateOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::ScalarAggregateOptions());
}
static void
garrow_scalar_aggregate_options_class_init(
GArrowScalarAggregateOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_scalar_aggregate_options_set_property;
gobject_class->get_property = garrow_scalar_aggregate_options_get_property;
auto options = arrow::compute::ScalarAggregateOptions::Defaults();
GParamSpec *spec;
/**
* GArrowScalarAggregateOptions:skip-nulls:
*
* Whether NULLs are skipped or not.
*
* Since: 5.0.0
*/
spec = g_param_spec_boolean("skip-nulls",
"Skip NULLs",
"Whether NULLs are skipped or not",
options.skip_nulls,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_SKIP_NULLS, spec);
/**
* GArrowScalarAggregateOptions:min-count:
*
* The minimum required number of values.
*
* Since: 5.0.0
*/
spec = g_param_spec_uint("min-count",
"Min count",
"The minimum required number of values",
0,
G_MAXUINT,
options.min_count,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_MIN_COUNT, spec);
}
/**
* garrow_scalar_aggregate_options_new:
*
* Returns: A newly created #GArrowScalarAggregateOptions.
*
* Since: 5.0.0
*/
GArrowScalarAggregateOptions *
garrow_scalar_aggregate_options_new(void)
{
auto scalar_aggregate_options =
g_object_new(GARROW_TYPE_SCALAR_AGGREGATE_OPTIONS, NULL);
return GARROW_SCALAR_AGGREGATE_OPTIONS(scalar_aggregate_options);
}
enum {
PROP_MODE = 1,
};
G_DEFINE_TYPE(GArrowCountOptions,
garrow_count_options,
GARROW_TYPE_FUNCTION_OPTIONS)
static void
garrow_count_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options = garrow_count_options_get_raw(GARROW_COUNT_OPTIONS(object));
switch (prop_id) {
case PROP_MODE:
options->mode =
static_cast<arrow::compute::CountOptions::CountMode>(
g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_count_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options = garrow_count_options_get_raw(GARROW_COUNT_OPTIONS(object));
switch (prop_id) {
case PROP_MODE:
g_value_set_enum(value, options->mode);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_count_options_init(GArrowCountOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::CountOptions());
}
static void
garrow_count_options_class_init(GArrowCountOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_count_options_set_property;
gobject_class->get_property = garrow_count_options_get_property;
auto options = arrow::compute::CountOptions::Defaults();
GParamSpec *spec;
/**
* GArrowCountOptions:null-selection-behavior:
*
* How to handle counted values.
*
* Since: 0.17.0
*/
spec = g_param_spec_enum("mode",
"Count mode",
"Which values to count",
GARROW_TYPE_COUNT_MODE,
static_cast<GArrowCountMode>(options.mode),
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class, PROP_MODE, spec);
}
/**
* garrow_count_options_new:
*
* Returns: A newly created #GArrowCountOptions.
*
* Since: 6.0.0
*/
GArrowCountOptions *
garrow_count_options_new(void)
{
auto count_options = g_object_new(GARROW_TYPE_COUNT_OPTIONS, NULL);
return GARROW_COUNT_OPTIONS(count_options);
}
enum {
PROP_NULL_SELECTION_BEHAVIOR = 1,
};
G_DEFINE_TYPE(GArrowFilterOptions,
garrow_filter_options,
GARROW_TYPE_FUNCTION_OPTIONS)
static void
garrow_filter_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options = garrow_filter_options_get_raw(GARROW_FILTER_OPTIONS(object));
switch (prop_id) {
case PROP_NULL_SELECTION_BEHAVIOR:
options->null_selection_behavior =
static_cast<arrow::compute::FilterOptions::NullSelectionBehavior>(
g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_filter_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options = garrow_filter_options_get_raw(GARROW_FILTER_OPTIONS(object));
switch (prop_id) {
case PROP_NULL_SELECTION_BEHAVIOR:
g_value_set_enum(value, options->null_selection_behavior);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_filter_options_init(GArrowFilterOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::FilterOptions());
}
static void
garrow_filter_options_class_init(GArrowFilterOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_filter_options_set_property;
gobject_class->get_property = garrow_filter_options_get_property;
auto options = arrow::compute::FilterOptions::Defaults();
GParamSpec *spec;
/**
* GArrowFilterOptions:null-selection-behavior:
*
* How to handle filtered values.
*
* Since: 0.17.0
*/
spec = g_param_spec_enum("null-selection-behavior",
"NULL selection behavior",
"How to handle filtered values",
GARROW_TYPE_FILTER_NULL_SELECTION_BEHAVIOR,
static_cast<GArrowFilterNullSelectionBehavior>(
options.null_selection_behavior),
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_NULL_SELECTION_BEHAVIOR,
spec);
}
/**
* garrow_filter_options_new:
*
* Returns: A newly created #GArrowFilterOptions.
*
* Since: 0.17.0
*/
GArrowFilterOptions *
garrow_filter_options_new(void)
{
auto filter_options = g_object_new(GARROW_TYPE_FILTER_OPTIONS, NULL);
return GARROW_FILTER_OPTIONS(filter_options);
}
G_DEFINE_TYPE(GArrowTakeOptions,
garrow_take_options,
GARROW_TYPE_FUNCTION_OPTIONS)
static void
garrow_take_options_init(GArrowTakeOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::TakeOptions());
}
static void
garrow_take_options_class_init(GArrowTakeOptionsClass *klass)
{
}
/**
* garrow_take_options_new:
*
* Returns: A newly created #GArrowTakeOptions.
*
* Since: 0.14.0
*/
GArrowTakeOptions *
garrow_take_options_new(void)
{
auto take_options = g_object_new(GARROW_TYPE_TAKE_OPTIONS, NULL);
return GARROW_TAKE_OPTIONS(take_options);
}
enum {
PROP_ARRAY_SORT_OPTIONS_ORDER = 1,
};
G_DEFINE_TYPE(GArrowArraySortOptions,
garrow_array_sort_options,
GARROW_TYPE_FUNCTION_OPTIONS)
static void
garrow_array_sort_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options =
garrow_array_sort_options_get_raw(GARROW_ARRAY_SORT_OPTIONS(object));
switch (prop_id) {
case PROP_ARRAY_SORT_OPTIONS_ORDER:
options->order =
static_cast<arrow::compute::SortOrder>(g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_array_sort_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options =
garrow_array_sort_options_get_raw(GARROW_ARRAY_SORT_OPTIONS(object));
switch (prop_id) {
case PROP_ARRAY_SORT_OPTIONS_ORDER:
g_value_set_enum(value, static_cast<GArrowSortOrder>(options->order));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_array_sort_options_init(GArrowArraySortOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::ArraySortOptions());
}
static void
garrow_array_sort_options_class_init(GArrowArraySortOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_array_sort_options_set_property;
gobject_class->get_property = garrow_array_sort_options_get_property;
auto options = arrow::compute::ArraySortOptions::Defaults();
GParamSpec *spec;
/**
* GArrowArraySortOptions:order:
*
* How to order values.
*
* Since: 3.0.0
*/
spec = g_param_spec_enum("order",
"Order",
"How to order values",
GARROW_TYPE_SORT_ORDER,
static_cast<GArrowSortOrder>(options.order),
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_ARRAY_SORT_OPTIONS_ORDER,
spec);
}
/**
* garrow_array_sort_options_new:
* @order: How to order by values.
*
* Returns: A newly created #GArrowArraySortOptions.
*
* Since: 3.0.0
*/
GArrowArraySortOptions *
garrow_array_sort_options_new(GArrowSortOrder order)
{
auto array_sort_options =
g_object_new(GARROW_TYPE_ARRAY_SORT_OPTIONS,
"order", order,
NULL);
return GARROW_ARRAY_SORT_OPTIONS(array_sort_options);
}
/**
* garrow_array_sort_options_equal:
* @options: A #GArrowArraySortOptions.
* @other_options: A #GArrowArraySortOptions to be compared.
*
* Returns: %TRUE if both of them have the same order, %FALSE
* otherwise.
*
* Since: 3.0.0
*/
gboolean
garrow_array_sort_options_equal(GArrowArraySortOptions *options,
GArrowArraySortOptions *other_options)
{
auto arrow_options = garrow_array_sort_options_get_raw(options);
auto arrow_other_options = garrow_array_sort_options_get_raw(other_options);
return arrow_options->order == arrow_other_options->order;
}
typedef struct GArrowSortKeyPrivate_ {
arrow::compute::SortKey sort_key;
} GArrowSortKeyPrivate;
enum {
PROP_SORT_KEY_TARGET = 1,
PROP_SORT_KEY_ORDER,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowSortKey,
garrow_sort_key,
G_TYPE_OBJECT)
#define GARROW_SORT_KEY_GET_PRIVATE(object) \
static_cast<GArrowSortKeyPrivate *>( \
garrow_sort_key_get_instance_private( \
GARROW_SORT_KEY(object)))
static void
garrow_sort_key_finalize(GObject *object)
{
auto priv = GARROW_SORT_KEY_GET_PRIVATE(object);
priv->sort_key.~SortKey();
G_OBJECT_CLASS(garrow_sort_key_parent_class)->finalize(object);
}
static void
garrow_sort_key_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_SORT_KEY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SORT_KEY_ORDER:
priv->sort_key.order =
static_cast<arrow::compute::SortOrder>(g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_sort_key_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_SORT_KEY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SORT_KEY_TARGET:
{
auto name = priv->sort_key.target.name();
if (name) {
g_value_set_string(value, name->c_str());
} else {
g_value_set_string(value, priv->sort_key.target.ToDotPath().c_str());
}
}
break;
case PROP_SORT_KEY_ORDER:
g_value_set_enum(value, static_cast<GArrowSortOrder>(priv->sort_key.order));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_sort_key_init(GArrowSortKey *object)
{
auto priv = GARROW_SORT_KEY_GET_PRIVATE(object);
new(&priv->sort_key) arrow::compute::SortKey("");
}
static void
garrow_sort_key_class_init(GArrowSortKeyClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = garrow_sort_key_finalize;
gobject_class->set_property = garrow_sort_key_set_property;
gobject_class->get_property = garrow_sort_key_get_property;
GParamSpec *spec;
/**
* GArrowSortKey:target:
*
* A name or dot path for the sort target.
*
* dot_path = '.' name
* | '[' digit+ ']'
* | dot_path+
*
* Since: 7.0.0
*/
spec = g_param_spec_string("target",
"Target",
"The sort target",
NULL,
static_cast<GParamFlags>(G_PARAM_READABLE));
g_object_class_install_property(gobject_class, PROP_SORT_KEY_TARGET, spec);
/**
* GArrowSortKey:order:
*
* How to order values.
*
* Since: 3.0.0
*/
spec = g_param_spec_enum("order",
"Order",
"How to order values",
GARROW_TYPE_SORT_ORDER,
0,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_SORT_KEY_ORDER, spec);
}
/**
* garrow_sort_key_new:
* @target: A name or dot path for sort target.
* @order: How to order by this sort key.
*
* Returns: A newly created #GArrowSortKey.
*
* Since: 3.0.0
*/
GArrowSortKey *
garrow_sort_key_new(const gchar *target,
GArrowSortOrder order,
GError **error)
{
auto arrow_reference_result = garrow_field_reference_resolve_raw(target);
if (!garrow::check(error,
arrow_reference_result,
"[sort-key][new]")) {
return NULL;
}
auto sort_key = g_object_new(GARROW_TYPE_SORT_KEY,
"order", order,
NULL);
auto priv = GARROW_SORT_KEY_GET_PRIVATE(sort_key);
priv->sort_key.target = *arrow_reference_result;
return GARROW_SORT_KEY(sort_key);
}
/**
* garrow_sort_key_equal:
* @sort_key: A #GArrowSortKey.
* @other_sort_key: A #GArrowSortKey to be compared.
*
* Returns: %TRUE if both of them have the same name and order, %FALSE
* otherwise.
*
* Since: 3.0.0
*/
gboolean
garrow_sort_key_equal(GArrowSortKey *sort_key,
GArrowSortKey *other_sort_key)
{
auto arrow_sort_key = garrow_sort_key_get_raw(sort_key);
auto arrow_other_sort_key = garrow_sort_key_get_raw(other_sort_key);
return garrow_sort_key_equal_raw(*arrow_sort_key,
*arrow_other_sort_key);
}
G_DEFINE_TYPE(GArrowSortOptions,
garrow_sort_options,
GARROW_TYPE_FUNCTION_OPTIONS)
static void
garrow_sort_options_init(GArrowSortOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::SortOptions());
}
static void
garrow_sort_options_class_init(GArrowSortOptionsClass *klass)
{
}
/**
* garrow_sort_options_new:
* @sort_keys: (nullable) (element-type GArrowSortKey): The sort keys to be used.
*
* Returns: A newly created #GArrowSortOptions.
*
* Since: 3.0.0
*/
GArrowSortOptions *
garrow_sort_options_new(GList *sort_keys)
{
auto sort_options =
GARROW_SORT_OPTIONS(g_object_new(GARROW_TYPE_SORT_OPTIONS, NULL));
if (sort_keys) {
garrow_sort_options_set_sort_keys(sort_options, sort_keys);
}
return sort_options;
}
/**
* garrow_sort_options_equal:
* @options: A #GArrowSortOptions.
* @other_options: A #GArrowSortOptions to be compared.
*
* Returns: %TRUE if both of them have the same sort keys, %FALSE
* otherwise.
*
* Since: 3.0.0
*/
gboolean
garrow_sort_options_equal(GArrowSortOptions *options,
GArrowSortOptions *other_options)
{
auto arrow_options = garrow_sort_options_get_raw(options);
auto arrow_other_options = garrow_sort_options_get_raw(other_options);
if (arrow_options->sort_keys.size() !=
arrow_other_options->sort_keys.size()) {
return FALSE;
}
const auto n_sort_keys = arrow_options->sort_keys.size();
for (size_t i = 0; i < n_sort_keys; ++i) {
if (!garrow_sort_key_equal_raw(arrow_options->sort_keys[i],
arrow_other_options->sort_keys[i])) {
return FALSE;
}
}
return TRUE;
}
/**
* garrow_sort_options_get_sort_keys:
* @options: A #GArrowSortOptions.
*
* Returns: (transfer full) (element-type GArrowSortKey):
* The sort keys to be used.
*
* Since: 3.0.0
*/
GList *
garrow_sort_options_get_sort_keys(GArrowSortOptions *options)
{
auto arrow_options = garrow_sort_options_get_raw(options);
GList *sort_keys = NULL;
for (const auto &arrow_sort_key : arrow_options->sort_keys) {
auto sort_key = garrow_sort_key_new_raw(arrow_sort_key);
sort_keys = g_list_prepend(sort_keys, sort_key);
}
return g_list_reverse(sort_keys);
}
/**
* garrow_sort_options_add_sort_key:
* @options: A #GArrowSortOptions.
* @sort_key: The sort key to be added.
*
* Add a sort key to be used.
*
* Since: 3.0.0
*/
void
garrow_sort_options_add_sort_key(GArrowSortOptions *options,
GArrowSortKey *sort_key)
{
auto arrow_options = garrow_sort_options_get_raw(options);
auto arrow_sort_key = garrow_sort_key_get_raw(sort_key);
arrow_options->sort_keys.push_back(*arrow_sort_key);
}
/**
* garrow_sort_options_set_sort_keys:
* @options: A #GArrowSortOptions.
* @sort_keys: (element-type GArrowSortKey): The sort keys to be used.
*
* Set sort keys to be used.
*
* Since: 3.0.0
*/
void
garrow_sort_options_set_sort_keys(GArrowSortOptions *options,
GList *sort_keys)
{
auto arrow_options = garrow_sort_options_get_raw(options);
arrow_options->sort_keys.clear();
for (auto node = sort_keys; node; node = node->next) {
auto sort_key = GARROW_SORT_KEY(node->data);
auto arrow_sort_key = garrow_sort_key_get_raw(sort_key);
arrow_options->sort_keys.push_back(*arrow_sort_key);
}
}
typedef struct GArrowSetLookupOptionsPrivate_ {
GArrowDatum *value_set;
} GArrowSetLookupOptionsPrivate;
enum {
PROP_SET_LOOKUP_OPTIONS_VALUE_SET = 1,
PROP_SET_LOOKUP_OPTIONS_SKIP_NULLS,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowSetLookupOptions,
garrow_set_lookup_options,
GARROW_TYPE_FUNCTION_OPTIONS)
#define GARROW_SET_LOOKUP_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowSetLookupOptionsPrivate *>( \
garrow_set_lookup_options_get_instance_private( \
GARROW_SET_LOOKUP_OPTIONS(object)))
static void
garrow_set_lookup_options_dispose(GObject *object)
{
auto priv = GARROW_SET_LOOKUP_OPTIONS_GET_PRIVATE(object);
if (priv->value_set) {
g_object_unref(priv->value_set);
priv->value_set = NULL;
}
G_OBJECT_CLASS(garrow_set_lookup_options_parent_class)->dispose(object);
}
static void
garrow_set_lookup_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_SET_LOOKUP_OPTIONS_GET_PRIVATE(object);
auto options =
garrow_set_lookup_options_get_raw(GARROW_SET_LOOKUP_OPTIONS(object));
switch (prop_id) {
case PROP_SET_LOOKUP_OPTIONS_VALUE_SET:
{
auto value_set = g_value_get_object(value);
if (priv->value_set != value_set) {
if (priv->value_set) {
g_object_unref(priv->value_set);
}
priv->value_set = GARROW_DATUM(value_set);
g_object_ref(priv->value_set);
if (priv->value_set) {
options->value_set = garrow_datum_get_raw(priv->value_set);
} else {
options->value_set = {};
}
}
}
break;
case PROP_SET_LOOKUP_OPTIONS_SKIP_NULLS:
options->skip_nulls = g_value_get_boolean(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_set_lookup_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_SET_LOOKUP_OPTIONS_GET_PRIVATE(object);
auto options =
garrow_set_lookup_options_get_raw(GARROW_SET_LOOKUP_OPTIONS(object));
switch (prop_id) {
case PROP_SET_LOOKUP_OPTIONS_VALUE_SET:
g_value_set_object(value, priv->value_set);
break;
case PROP_SET_LOOKUP_OPTIONS_SKIP_NULLS:
g_value_set_boolean(value, options->skip_nulls);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_set_lookup_options_init(GArrowSetLookupOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::SetLookupOptions());
}
static void
garrow_set_lookup_options_class_init(GArrowSetLookupOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_set_lookup_options_dispose;
gobject_class->set_property = garrow_set_lookup_options_set_property;
gobject_class->get_property = garrow_set_lookup_options_get_property;
arrow::compute::SetLookupOptions options;
GParamSpec *spec;
/**
* GArrowSetLookupOptions:value-set:
*
* The set of values to look up input values into.
*
* Since: 6.0.0
*/
spec = g_param_spec_object("value-set",
"Value set",
"The set of values to look up input values into",
GARROW_TYPE_DATUM,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_SET_LOOKUP_OPTIONS_VALUE_SET,
spec);
/**
* GArrowSetLookupOptions:skip-nulls:
*
* Whether NULLs are skipped or not.
*
* Since: 6.0.0
*/
spec = g_param_spec_boolean("skip-nulls",
"Skip NULLs",
"Whether NULLs are skipped or not",
options.skip_nulls,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_SET_LOOKUP_OPTIONS_SKIP_NULLS,
spec);
}
/**
* garrow_set_lookup_options_new:
* @value_set: (nullable): A #GArrowArrayDatum or
* #GArrowChunkedArrayDatum to be looked up.
*
* Returns: A newly created #GArrowSetLookupOptions.
*
* Since: 6.0.0
*/
GArrowSetLookupOptions *
garrow_set_lookup_options_new(GArrowDatum *value_set)
{
return GARROW_SET_LOOKUP_OPTIONS(
g_object_new(GARROW_TYPE_SET_LOOKUP_OPTIONS,
"value-set", value_set,
NULL));
}
enum {
PROP_VARIANCE_OPTIONS_DDOF = 1,
PROP_VARIANCE_OPTIONS_SKIP_NULLS,
PROP_VARIANCE_OPTIONS_MIN_COUNT,
};
G_DEFINE_TYPE(GArrowVarianceOptions,
garrow_variance_options,
GARROW_TYPE_FUNCTION_OPTIONS)
#define GARROW_VARIANCE_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowVarianceOptionsPrivate *>( \
garrow_variance_options_get_instance_private( \
GARROW_VARIANCE_OPTIONS(object)))
static void
garrow_variance_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options =
garrow_variance_options_get_raw(GARROW_VARIANCE_OPTIONS(object));
switch (prop_id) {
case PROP_VARIANCE_OPTIONS_DDOF:
options->ddof = g_value_get_int(value);
break;
case PROP_VARIANCE_OPTIONS_SKIP_NULLS:
options->skip_nulls = g_value_get_boolean(value);
break;
case PROP_VARIANCE_OPTIONS_MIN_COUNT:
options->min_count = g_value_get_uint(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_variance_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options =
garrow_variance_options_get_raw(GARROW_VARIANCE_OPTIONS(object));
switch (prop_id) {
case PROP_VARIANCE_OPTIONS_DDOF:
g_value_set_int(value, options->ddof);
break;
case PROP_VARIANCE_OPTIONS_SKIP_NULLS:
g_value_set_boolean(value, options->skip_nulls);
break;
case PROP_VARIANCE_OPTIONS_MIN_COUNT:
g_value_set_uint(value, options->min_count);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_variance_options_init(GArrowVarianceOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::VarianceOptions());
}
static void
garrow_variance_options_class_init(GArrowVarianceOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_variance_options_set_property;
gobject_class->get_property = garrow_variance_options_get_property;
arrow::compute::VarianceOptions options;
GParamSpec *spec;
/**
* GArrowVarianceOptions:ddof:
*
* The Delta Degrees of Freedom (ddof) to be used.
*
* Since: 6.0.0
*/
spec = g_param_spec_int("ddof",
"Delta Degrees of Freedom",
"The Delta Degrees of Freedom (ddof) to be used",
G_MININT,
G_MAXINT,
options.ddof,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_VARIANCE_OPTIONS_DDOF,
spec);
/**
* GArrowVarianceOptions:skip-nulls:
*
* Whether NULLs are skipped or not.
*
* Since: 6.0.0
*/
spec = g_param_spec_boolean("skip-nulls",
"Skip NULLs",
"Whether NULLs are skipped or not",
options.skip_nulls,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_VARIANCE_OPTIONS_SKIP_NULLS,
spec);
/**
* GArrowVarianceOptions:min-count:
*
* If less than this many non-null values are observed, emit null.
*
* Since: 6.0.0
*/
spec = g_param_spec_uint("min-count",
"Min count",
"If less than this many non-null values "
"are observed, emit null",
0,
G_MAXUINT,
options.min_count,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_VARIANCE_OPTIONS_MIN_COUNT,
spec);
}
/**
* garrow_variance_options_new:
*
* Returns: A newly created #GArrowVarianceOptions.
*
* Since: 6.0.0
*/
GArrowVarianceOptions *
garrow_variance_options_new(void)
{
return GARROW_VARIANCE_OPTIONS(
g_object_new(GARROW_TYPE_VARIANCE_OPTIONS, NULL));
}
enum {
PROP_ROUND_OPTIONS_N_DIGITS = 1,
PROP_ROUND_OPTIONS_MODE,
};
G_DEFINE_TYPE(GArrowRoundOptions,
garrow_round_options,
GARROW_TYPE_FUNCTION_OPTIONS)
#define GARROW_ROUND_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowRoundOptionsPrivate *>( \
garrow_round_options_get_instance_private( \
GARROW_ROUND_OPTIONS(object)))
static void
garrow_round_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options = garrow_round_options_get_raw(GARROW_ROUND_OPTIONS(object));
switch (prop_id) {
case PROP_ROUND_OPTIONS_N_DIGITS:
options->ndigits = g_value_get_int64(value);
break;
case PROP_ROUND_OPTIONS_MODE:
options->round_mode =
static_cast<arrow::compute::RoundMode>(g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_round_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options = garrow_round_options_get_raw(GARROW_ROUND_OPTIONS(object));
switch (prop_id) {
case PROP_ROUND_OPTIONS_N_DIGITS:
g_value_set_int64(value, options->ndigits);
break;
case PROP_ROUND_OPTIONS_MODE:
g_value_set_enum(value, static_cast<GArrowRoundMode>(options->round_mode));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_round_options_init(GArrowRoundOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::RoundOptions());
}
static void
garrow_round_options_class_init(GArrowRoundOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_round_options_set_property;
gobject_class->get_property = garrow_round_options_get_property;
arrow::compute::RoundOptions options;
GParamSpec *spec;
/**
* GArrowRoundOptions:n-digits:
*
* The rounding precision (number of digits to round to).
*
* Since: 7.0.0
*/
spec = g_param_spec_int64("n-digits",
"Number of digits to round to",
"The round precision",
G_MININT64,
G_MAXINT64,
options.ndigits,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_ROUND_OPTIONS_N_DIGITS,
spec);
/**
* GArrowRoundOptions:mode:
*
* The rounding and tie-breaking mode.
*
* Since: 7.0.0
*/
spec = g_param_spec_enum("mode",
"Mode",
"The rounding and tie-breaking mode",
GARROW_TYPE_ROUND_MODE,
static_cast<GArrowRoundMode>(options.round_mode),
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_ROUND_OPTIONS_MODE,
spec);
}
/**
* garrow_round_options_new:
*
* Returns: A newly created #GArrowRoundOptions.
*
* Since: 7.0.0
*/
GArrowRoundOptions *
garrow_round_options_new(void)
{
return GARROW_ROUND_OPTIONS(g_object_new(GARROW_TYPE_ROUND_OPTIONS, NULL));
}
typedef struct GArrowRoundToMultipleOptionsPrivate_ {
GArrowScalar *multiple;
} GArrowRoundToMultipleOptionsPrivate;
enum {
PROP_ROUND_TO_MULTIPLE_OPTIONS_MULTIPLE = 1,
PROP_ROUND_TO_MULTIPLE_OPTIONS_MODE,
};
G_DEFINE_TYPE_WITH_PRIVATE(GArrowRoundToMultipleOptions,
garrow_round_to_multiple_options,
GARROW_TYPE_FUNCTION_OPTIONS)
#define GARROW_ROUND_TO_MULTIPLE_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowRoundToMultipleOptionsPrivate *>( \
garrow_round_to_multiple_options_get_instance_private( \
GARROW_ROUND_TO_MULTIPLE_OPTIONS(object)))
static void
garrow_round_to_multiple_options_dispose(GObject *object)
{
auto priv = GARROW_ROUND_TO_MULTIPLE_OPTIONS_GET_PRIVATE(object);
if (priv->multiple) {
g_object_unref(priv->multiple);
priv->multiple = NULL;
}
G_OBJECT_CLASS(garrow_round_to_multiple_options_parent_class)->dispose(object);
}
static void
garrow_round_to_multiple_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_ROUND_TO_MULTIPLE_OPTIONS_GET_PRIVATE(object);
auto options =
garrow_round_to_multiple_options_get_raw(
GARROW_ROUND_TO_MULTIPLE_OPTIONS(object));
switch (prop_id) {
case PROP_ROUND_TO_MULTIPLE_OPTIONS_MULTIPLE:
{
auto multiple = g_value_get_object(value);
if (priv->multiple != multiple) {
if (priv->multiple) {
g_object_unref(priv->multiple);
}
if (multiple) {
priv->multiple = GARROW_SCALAR(multiple);
g_object_ref(priv->multiple);
options->multiple = garrow_scalar_get_raw(priv->multiple);
} else {
priv->multiple = NULL;
options->multiple = std::make_shared<arrow::NullScalar>();
}
}
}
break;
case PROP_ROUND_TO_MULTIPLE_OPTIONS_MODE:
options->round_mode =
static_cast<arrow::compute::RoundMode>(g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_round_to_multiple_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GARROW_ROUND_TO_MULTIPLE_OPTIONS_GET_PRIVATE(object);
auto options =
garrow_round_to_multiple_options_get_raw(
GARROW_ROUND_TO_MULTIPLE_OPTIONS(object));
switch (prop_id) {
case PROP_ROUND_TO_MULTIPLE_OPTIONS_MULTIPLE:
g_value_set_object(value, priv->multiple);
break;
case PROP_ROUND_TO_MULTIPLE_OPTIONS_MODE:
g_value_set_enum(value, static_cast<GArrowRoundMode>(options->round_mode));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_round_to_multiple_options_init(GArrowRoundToMultipleOptions *object)
{
auto function_options_priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
auto options = new arrow::compute::RoundToMultipleOptions();
function_options_priv->options =
static_cast<arrow::compute::FunctionOptions *>(options);
auto priv = GARROW_ROUND_TO_MULTIPLE_OPTIONS_GET_PRIVATE(object);
priv->multiple = garrow_scalar_new_raw(&(options->multiple));
}
static void
garrow_round_to_multiple_options_class_init(
GArrowRoundToMultipleOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = garrow_round_to_multiple_options_dispose;
gobject_class->set_property = garrow_round_to_multiple_options_set_property;
gobject_class->get_property = garrow_round_to_multiple_options_get_property;
arrow::compute::RoundToMultipleOptions options;
GParamSpec *spec;
/**
* GArrowRoundToMultipleOptions:multiple:
*
* The rounding scale (multiple to round to).
*
* Should be a scalar of a type compatible with the argument to be rounded.
* For example, rounding a decimal value means a decimal multiple is
* required. Rounding a floating point or integer value means a floating
* point scalar is required.
*
* Since: 7.0.0
*/
spec = g_param_spec_object("multiple",
"Multiple to round to",
"The round scale",
GARROW_TYPE_SCALAR,
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_ROUND_TO_MULTIPLE_OPTIONS_MULTIPLE,
spec);
/**
* GArrowRoundToMultipleOptions:mode:
*
* The rounding and tie-breaking mode.
*
* Since: 7.0.0
*/
spec = g_param_spec_enum("mode",
"Mode",
"The rounding and tie-breaking mode",
GARROW_TYPE_ROUND_MODE,
static_cast<GArrowRoundMode>(options.round_mode),
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_ROUND_TO_MULTIPLE_OPTIONS_MODE,
spec);
}
/**
* garrow_round_to_multiple_options_new:
*
* Returns: A newly created #GArrowRoundToMultipleOptions.
*
* Since: 7.0.0
*/
GArrowRoundToMultipleOptions *
garrow_round_to_multiple_options_new(void)
{
return GARROW_ROUND_TO_MULTIPLE_OPTIONS(
g_object_new(GARROW_TYPE_ROUND_TO_MULTIPLE_OPTIONS, NULL));
}
enum {
PROP_UTF8_NORMALIZE_OPTIONS_FORM = 1,
};
G_DEFINE_TYPE(GArrowUTF8NormalizeOptions,
garrow_utf8_normalize_options,
GARROW_TYPE_FUNCTION_OPTIONS)
#define GARROW_UTF8_NORMARIZE_OPTIONS_GET_PRIVATE(object) \
static_cast<GArrowUTF8NormalizeOptionsPrivate *>( \
garrow_utf8_normalize_options_get_instance_private( \
GARROW_UTF8_NORMALIZE_OPTIONS(object)))
static void
garrow_utf8_normalize_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto options = garrow_utf8_normalize_options_get_raw(
GARROW_UTF8_NORMALIZE_OPTIONS(object));
switch (prop_id) {
case PROP_UTF8_NORMALIZE_OPTIONS_FORM:
options->form =
static_cast<arrow::compute::Utf8NormalizeOptions::Form>(
g_value_get_enum(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_utf8_normalize_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto options = garrow_utf8_normalize_options_get_raw(
GARROW_UTF8_NORMALIZE_OPTIONS(object));
switch (prop_id) {
case PROP_UTF8_NORMALIZE_OPTIONS_FORM:
g_value_set_enum(value, static_cast<GArrowUTF8NormalizeForm>(options->form));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
garrow_utf8_normalize_options_init(GArrowUTF8NormalizeOptions *object)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
priv->options = static_cast<arrow::compute::FunctionOptions *>(
new arrow::compute::Utf8NormalizeOptions());
}
static void
garrow_utf8_normalize_options_class_init(GArrowUTF8NormalizeOptionsClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = garrow_utf8_normalize_options_set_property;
gobject_class->get_property = garrow_utf8_normalize_options_get_property;
arrow::compute::Utf8NormalizeOptions options;
GParamSpec *spec;
/**
* GArrowUTF8NormalizeOptions:form:
*
* The Unicode normalization form to apply.
*
* Since: 8.0.0
*/
spec = g_param_spec_enum("form",
"Form",
"The Unicode normalization form to apply",
GARROW_TYPE_UTF8_NORMALIZE_FORM,
static_cast<GArrowUTF8NormalizeForm>(options.form),
static_cast<GParamFlags>(G_PARAM_READWRITE));
g_object_class_install_property(gobject_class,
PROP_UTF8_NORMALIZE_OPTIONS_FORM,
spec);
}
/**
* garrow_utf8_normalize_options_new:
*
* Returns: A newly created #GArrowUTF8NormalizeOptions.
*
* Since: 8.0.0
*/
GArrowUTF8NormalizeOptions *
garrow_utf8_normalize_options_new(void)
{
return GARROW_UTF8_NORMALIZE_OPTIONS(
g_object_new(GARROW_TYPE_UTF8_NORMALIZE_OPTIONS, NULL));
}
/**
* garrow_array_cast:
* @array: A #GArrowArray.
* @target_data_type: A #GArrowDataType of cast target data.
* @options: (nullable): A #GArrowCastOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full):
* A newly created casted array on success, %NULL on error.
*
* Since: 0.7.0
*/
GArrowArray *
garrow_array_cast(GArrowArray *array,
GArrowDataType *target_data_type,
GArrowCastOptions *options,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_array_raw = arrow_array.get();
auto arrow_target_data_type = garrow_data_type_get_raw(target_data_type);
arrow::Result<std::shared_ptr<arrow::Array>> arrow_casted_array;
if (options) {
auto arrow_options = garrow_cast_options_get_raw(options);
arrow_casted_array = arrow::compute::Cast(*arrow_array_raw,
arrow_target_data_type,
*arrow_options);
} else {
arrow_casted_array = arrow::compute::Cast(*arrow_array_raw,
arrow_target_data_type);
}
if (garrow::check(error,
arrow_casted_array,
[&]() {
std::stringstream message;
message << "[array][cast] <";
message << arrow_array->type()->ToString();
message << "> -> <";
message << arrow_target_data_type->ToString();
message << ">";
return message.str();
})) {
return garrow_array_new_raw(&(*arrow_casted_array));
} else {
return NULL;
}
}
/**
* garrow_array_unique:
* @array: A #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full):
* A newly created unique elements array on success, %NULL on error.
*
* Since: 0.8.0
*/
GArrowArray *
garrow_array_unique(GArrowArray *array,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_unique_array = arrow::compute::Unique(arrow_array);
if (garrow::check(error,
arrow_unique_array,
[&]() {
std::stringstream message;
message << "[array][unique] <";
message << arrow_array->type()->ToString();
message << ">";
return message.str();
})) {
return garrow_array_new_raw(&(*arrow_unique_array));
} else {
return NULL;
}
}
/**
* garrow_array_dictionary_encode:
* @array: A #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full):
* A newly created #GArrowDictionaryArray for the @array on success,
* %NULL on error.
*
* Since: 0.8.0
*/
GArrowDictionaryArray *
garrow_array_dictionary_encode(GArrowArray *array,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_dictionary_encoded_datum =
arrow::compute::DictionaryEncode(arrow_array);
if (garrow::check(error,
arrow_dictionary_encoded_datum,
[&]() {
std::stringstream message;
message << "[array][dictionary-encode] <";
message << arrow_array->type()->ToString();
message << ">";
return message.str();
})) {
auto arrow_dictionary_encoded_array =
(*arrow_dictionary_encoded_datum).make_array();
auto dictionary_encoded_array =
garrow_array_new_raw(&arrow_dictionary_encoded_array);
return GARROW_DICTIONARY_ARRAY(dictionary_encoded_array);
} else {
return NULL;
}
}
/**
* garrow_array_count:
* @array: A #GArrowArray.
* @options: (nullable): A #GArrowCountOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The number of target values on success. If an error is occurred,
* the returned value is untrustful value.
*
* Since: 0.13.0
*/
gint64
garrow_array_count(GArrowArray *array,
GArrowCountOptions *options,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_array_raw = arrow_array.get();
arrow::Result<arrow::Datum> arrow_counted_datum;
if (options) {
auto arrow_options = garrow_count_options_get_raw(options);
arrow_counted_datum =
arrow::compute::Count(*arrow_array_raw, *arrow_options);
} else {
arrow_counted_datum = arrow::compute::Count(*arrow_array_raw);
}
if (garrow::check(error, arrow_counted_datum, "[array][count]")) {
using ScalarType = typename arrow::TypeTraits<arrow::Int64Type>::ScalarType;
auto arrow_counted_scalar =
std::dynamic_pointer_cast<ScalarType>((*arrow_counted_datum).scalar());
return arrow_counted_scalar->value;
} else {
return 0;
}
}
/**
* garrow_array_count_values:
* @array: A #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full):
* A #GArrowStructArray of `{input type "values", int64_t "counts"}`
* on success, %NULL on error.
*
* Since: 0.13.0
*/
GArrowStructArray *
garrow_array_count_values(GArrowArray *array,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_counted_values = arrow::compute::ValueCounts(arrow_array);
if (garrow::check(error, arrow_counted_values, "[array][count-values]")) {
std::shared_ptr<arrow::Array> arrow_counted_values_array = *arrow_counted_values;
return GARROW_STRUCT_ARRAY(garrow_array_new_raw(&arrow_counted_values_array));
} else {
return NULL;
}
}
/**
* garrow_boolean_array_invert:
* @array: A #GArrowBooleanArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full): The element-wise inverted boolean array.
*
* It should be freed with g_object_unref() when no longer needed.
*
* Since: 0.13.0
*/
GArrowBooleanArray *
garrow_boolean_array_invert(GArrowBooleanArray *array,
GError **error)
{
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_inverted_datum = arrow::compute::Invert(arrow_array);
if (garrow::check(error, arrow_inverted_datum, "[boolean-array][invert]")) {
auto arrow_inverted_array = (*arrow_inverted_datum).make_array();
return GARROW_BOOLEAN_ARRAY(garrow_array_new_raw(&arrow_inverted_array));
} else {
return NULL;
}
}
/**
* garrow_boolean_array_and:
* @left: A left hand side #GArrowBooleanArray.
* @right: A right hand side #GArrowBooleanArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full): The element-wise AND operated boolean array.
*
* It should be freed with g_object_unref() when no longer needed.
*
* Since: 0.13.0
*/
GArrowBooleanArray *
garrow_boolean_array_and(GArrowBooleanArray *left,
GArrowBooleanArray *right,
GError **error)
{
auto arrow_left = garrow_array_get_raw(GARROW_ARRAY(left));
auto arrow_right = garrow_array_get_raw(GARROW_ARRAY(right));
auto arrow_operated_datum = arrow::compute::And(arrow_left, arrow_right);
if (garrow::check(error, arrow_operated_datum, "[boolean-array][and]")) {
auto arrow_operated_array = (*arrow_operated_datum).make_array();
return GARROW_BOOLEAN_ARRAY(garrow_array_new_raw(&arrow_operated_array));
} else {
return NULL;
}
}
/**
* garrow_boolean_array_or:
* @left: A left hand side #GArrowBooleanArray.
* @right: A right hand side #GArrowBooleanArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full): The element-wise OR operated boolean array.
*
* It should be freed with g_object_unref() when no longer needed.
*
* Since: 0.13.0
*/
GArrowBooleanArray *
garrow_boolean_array_or(GArrowBooleanArray *left,
GArrowBooleanArray *right,
GError **error)
{
auto arrow_left = garrow_array_get_raw(GARROW_ARRAY(left));
auto arrow_right = garrow_array_get_raw(GARROW_ARRAY(right));
auto arrow_operated_datum = arrow::compute::Or(arrow_left, arrow_right);
if (garrow::check(error, arrow_operated_datum, "[boolean-array][or]")) {
auto arrow_operated_array = (*arrow_operated_datum).make_array();
return GARROW_BOOLEAN_ARRAY(garrow_array_new_raw(&arrow_operated_array));
} else {
return NULL;
}
}
/**
* garrow_boolean_array_xor:
* @left: A left hand side #GArrowBooleanArray.
* @right: A right hand side #GArrowBooleanArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full): The element-wise XOR operated boolean array.
*
* It should be freed with g_object_unref() when no longer needed.
*
* Since: 0.13.0
*/
GArrowBooleanArray *
garrow_boolean_array_xor(GArrowBooleanArray *left,
GArrowBooleanArray *right,
GError **error)
{
auto arrow_left = garrow_array_get_raw(GARROW_ARRAY(left));
auto arrow_right = garrow_array_get_raw(GARROW_ARRAY(right));
auto arrow_operated_datum = arrow::compute::Xor(arrow_left, arrow_right);
if (garrow::check(error, arrow_operated_datum, "[boolean-array][xor]")) {
auto arrow_operated_array = (*arrow_operated_datum).make_array();
return GARROW_BOOLEAN_ARRAY(garrow_array_new_raw(&arrow_operated_array));
} else {
return NULL;
}
}
/**
* garrow_numeric_array_mean:
* @array: A #GArrowNumericArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed mean.
*
* Since: 0.13.0
*/
gdouble
garrow_numeric_array_mean(GArrowNumericArray *array,
GError **error)
{
auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
auto arrow_mean_datum = arrow::compute::Mean(arrow_array);
if (garrow::check(error, arrow_mean_datum, "[numeric-array][mean]")) {
using ScalarType = typename arrow::TypeTraits<arrow::DoubleType>::ScalarType;
auto arrow_numeric_scalar =
std::dynamic_pointer_cast<ScalarType>((*arrow_mean_datum).scalar());
if (arrow_numeric_scalar->is_valid) {
return arrow_numeric_scalar->value;
} else {
return 0.0;
}
} else {
return 0.0;
}
}
/**
* garrow_int8_array_sum:
* @array: A #GArrowInt8Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
gint64
garrow_int8_array_sum(GArrowInt8Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::Int64Type>(array,
error,
"[int8-array][sum]",
0);
}
/**
* garrow_uint8_array_sum:
* @array: A #GArrowUInt8Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
guint64
garrow_uint8_array_sum(GArrowUInt8Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::UInt64Type>(array,
error,
"[uint8-array][sum]",
0);
}
/**
* garrow_int16_array_sum:
* @array: A #GArrowInt16Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
gint64
garrow_int16_array_sum(GArrowInt16Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::Int64Type>(array,
error,
"[int16-array][sum]",
0);
}
/**
* garrow_uint16_array_sum:
* @array: A #GArrowUInt16Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
guint64
garrow_uint16_array_sum(GArrowUInt16Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::UInt64Type>(array,
error,
"[uint16-array][sum]",
0);
}
/**
* garrow_int32_array_sum:
* @array: A #GArrowInt32Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
gint64
garrow_int32_array_sum(GArrowInt32Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::Int64Type>(array,
error,
"[int32-array][sum]",
0);
}
/**
* garrow_uint32_array_sum:
* @array: A #GArrowUInt32Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
guint64
garrow_uint32_array_sum(GArrowUInt32Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::UInt64Type>(array,
error,
"[uint32-array][sum]",
0);
}
/**
* garrow_int64_array_sum:
* @array: A #GArrowInt64Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
gint64
garrow_int64_array_sum(GArrowInt64Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::Int64Type>(array,
error,
"[int64-array][sum]",
0);
}
/**
* garrow_uint64_array_sum:
* @array: A #GArrowUInt64Array.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
guint64
garrow_uint64_array_sum(GArrowUInt64Array *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::UInt64Type>(array,
error,
"[uint64-array][sum]",
0);
}
/**
* garrow_float_array_sum:
* @array: A #GArrowFloatArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
gdouble
garrow_float_array_sum(GArrowFloatArray *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::DoubleType>(array,
error,
"[float-array][sum]",
0);
}
/**
* garrow_double_array_sum:
* @array: A #GArrowDoubleArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The value of the computed sum on success,
* If an error is occurred, the returned value is untrustful value.
*
* Since: 0.13.0
*/
gdouble
garrow_double_array_sum(GArrowDoubleArray *array,
GError **error)
{
return garrow_numeric_array_sum<arrow::DoubleType>(array,
error,
"[double-array][sum]",
0);
}
/**
* garrow_array_take:
* @array: A #GArrowArray.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowArray taken from
* an array of values at indices in input array or %NULL on error.
*
* Since: 0.14.0
*/
GArrowArray *
garrow_array_take(GArrowArray *array,
GArrowArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_indices = garrow_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_array),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_array = arrow_datum.make_array();
return garrow_array_new_raw(&arrow_taken_array);
},
error,
"[array][take][array]");
}
/**
* garrow_array_take_chunked_array:
* @array: A #GArrowArray.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowChunkedArray taken from
* an array of values at indices in chunked array or %NULL on error.
*
* Since: 0.16.0
*/
GArrowChunkedArray *
garrow_array_take_chunked_array(GArrowArray *array,
GArrowChunkedArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_indices = garrow_chunked_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_array),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_chunked_array = arrow_datum.chunked_array();
return garrow_chunked_array_new_raw(&arrow_taken_chunked_array);
},
error,
"[array][take][chunked-array]");
}
/**
* garrow_table_take:
* @table: A #GArrowTable.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowTable taken from
* an array of values at indices in input array or %NULL on error.
*
* Since: 0.16.0
*/
GArrowTable *
garrow_table_take(GArrowTable *table,
GArrowArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_table = garrow_table_get_raw(table);
auto arrow_indices = garrow_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_table),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_table = arrow_datum.table();
return garrow_table_new_raw(&arrow_taken_table);
},
error,
"[table][take]");
}
/**
* garrow_table_take_chunked_array:
* @table: A #GArrowTable.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowTable taken from
* an array of values at indices in chunked array or %NULL on error.
*
* Since: 0.16.0
*/
GArrowTable *
garrow_table_take_chunked_array(GArrowTable *table,
GArrowChunkedArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_table = garrow_table_get_raw(table);
auto arrow_indices = garrow_chunked_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_table),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_table = arrow_datum.table();
return garrow_table_new_raw(&arrow_taken_table);
},
error,
"[table][take][chunked-array]");
}
/**
* garrow_chunked_array_take:
* @chunked_array: A #GArrowChunkedArray.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowChunkedArray taken from
* an array of values at indices in input array or %NULL on error.
*
* Since: 0.16.0
*/
GArrowChunkedArray *
garrow_chunked_array_take(GArrowChunkedArray *chunked_array,
GArrowArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_chunked_array = garrow_chunked_array_get_raw(chunked_array);
auto arrow_indices = garrow_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_chunked_array),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_chunked_array = arrow_datum.chunked_array();
return garrow_chunked_array_new_raw(&arrow_taken_chunked_array);
},
error,
"[chunked-array][take]");
}
/**
* garrow_chunked_array_take_chunked_array:
* @chunked_array: A #GArrowChunkedArray.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowChunkedArray taken from
* an array of values at indices in chunked array or %NULL on error.
*
* Since: 0.16.0
*/
GArrowChunkedArray *
garrow_chunked_array_take_chunked_array(GArrowChunkedArray *chunked_array,
GArrowChunkedArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_chunked_array = garrow_chunked_array_get_raw(chunked_array);
auto arrow_indices = garrow_chunked_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_chunked_array),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_chunked_array = arrow_datum.chunked_array();
return garrow_chunked_array_new_raw(&arrow_taken_chunked_array);
},
error,
"[chunked-array][take][chunked-array]");
}
/**
* garrow_record_batch_take:
* @record_batch: A #GArrowRecordBatch.
* @indices: The indices of values to take.
* @options: (nullable): A #GArrowTakeOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowChunkedArray taken from
* an array of values at indices in input array or %NULL on error.
*
* Since: 0.16.0
*/
GArrowRecordBatch *
garrow_record_batch_take(GArrowRecordBatch *record_batch,
GArrowArray *indices,
GArrowTakeOptions *options,
GError **error)
{
auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
auto arrow_indices = garrow_array_get_raw(indices);
return garrow_take(
arrow::Datum(arrow_record_batch),
arrow::Datum(arrow_indices),
options,
[](arrow::Datum arrow_datum) {
auto arrow_taken_record_batch = arrow_datum.record_batch();
return garrow_record_batch_new_raw(&arrow_taken_record_batch);
},
error,
"[record-batch][take]");
}
/**
* garrow_array_filter:
* @array: A #GArrowArray.
* @filter: The values indicates which values should be filtered out.
* @options: (nullable): A #GArrowFilterOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowArray filterd
* with a boolean selection filter. Nulls in the filter will
* result in nulls in the output.
*
* Since: 0.15.0
*/
GArrowArray *
garrow_array_filter(GArrowArray *array,
GArrowBooleanArray *filter,
GArrowFilterOptions *options,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_filter = garrow_array_get_raw(GARROW_ARRAY(filter));
arrow::Result<arrow::Datum> arrow_filtered_datum;
if (options) {
auto arrow_options = garrow_filter_options_get_raw(options);
arrow_filtered_datum = arrow::compute::Filter(arrow_array,
arrow_filter,
*arrow_options);
} else {
arrow_filtered_datum = arrow::compute::Filter(arrow_array,
arrow_filter);
}
if (garrow::check(error, arrow_filtered_datum, "[array][filter]")) {
auto arrow_filtered_array = (*arrow_filtered_datum).make_array();
return garrow_array_new_raw(&arrow_filtered_array);
} else {
return NULL;
}
}
/**
* garrow_array_is_in:
* @left: A left hand side #GArrowArray.
* @right: A right hand side #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowBooleanArray
* showing whether each element in the left array is contained
* in right array.
*
* Since: 0.15.0
*/
GArrowBooleanArray *
garrow_array_is_in(GArrowArray *left,
GArrowArray *right,
GError **error)
{
auto arrow_left = garrow_array_get_raw(left);
auto arrow_right = garrow_array_get_raw(right);
auto arrow_is_in_datum = arrow::compute::IsIn(arrow_left, arrow_right);
if (garrow::check(error, arrow_is_in_datum, "[array][is-in]")) {
auto arrow_is_in_array = (*arrow_is_in_datum).make_array();
return GARROW_BOOLEAN_ARRAY(garrow_array_new_raw(&arrow_is_in_array));
} else {
return NULL;
}
}
/**
* garrow_array_is_in_chunked_array:
* @left: A left hand side #GArrowArray.
* @right: A right hand side #GArrowChunkedArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowBooleanArray
* showing whether each element in the left array is contained
* in right chunked array.
*
* Since: 0.15.0
*/
GArrowBooleanArray *
garrow_array_is_in_chunked_array(GArrowArray *left,
GArrowChunkedArray *right,
GError **error)
{
auto arrow_left = garrow_array_get_raw(left);
auto arrow_right = garrow_chunked_array_get_raw(right);
auto arrow_is_in_datum = arrow::compute::IsIn(arrow_left, arrow_right);
if (garrow::check(error,
arrow_is_in_datum,
"[array][is-in][chunked-array]")) {
auto arrow_is_in_array = (*arrow_is_in_datum).make_array();
return GARROW_BOOLEAN_ARRAY(garrow_array_new_raw(&arrow_is_in_array));
} else {
return NULL;
}
}
/**
* garrow_array_sort_indices:
* @array: A #GArrowArray.
* @order: The order for sort.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The indices that would sort
* an array in the specified order on success, %NULL on error.
*
* Since: 3.0.0
*/
GArrowUInt64Array *
garrow_array_sort_indices(GArrowArray *array,
GArrowSortOrder order,
GError **error)
{
auto arrow_array = garrow_array_get_raw(array);
auto arrow_array_raw = arrow_array.get();
auto arrow_order = static_cast<arrow::compute::SortOrder>(order);
auto arrow_indices_array =
arrow::compute::SortIndices(*arrow_array_raw, arrow_order);
if (garrow::check(error, arrow_indices_array, "[array][sort-indices]")) {
return GARROW_UINT64_ARRAY(garrow_array_new_raw(&(*arrow_indices_array)));
} else {
return NULL;
}
}
/**
* garrow_array_sort_to_indices:
* @array: A #GArrowArray.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The indices that would sort
* an array in ascending order on success, %NULL on error.
*
* Since: 0.15.0
*
* Deprecated: 3.0.0: Use garrow_array_sort_indices() instead.
*/
GArrowUInt64Array *
garrow_array_sort_to_indices(GArrowArray *array,
GError **error)
{
return garrow_array_sort_indices(array, GARROW_SORT_ORDER_ASCENDING, error);
}
/**
* garrow_chunked_array_sort_indices:
* @chunked_array: A #GArrowChunkedArray.
* @order: The order for sort.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The indices that would sort
* a chunked array in the specified order on success, %NULL on error.
*
* Since: 3.0.0
*/
GArrowUInt64Array *
garrow_chunked_array_sort_indices(GArrowChunkedArray *chunked_array,
GArrowSortOrder order,
GError **error)
{
auto arrow_chunked_array = garrow_chunked_array_get_raw(chunked_array);
auto arrow_chunked_array_raw = arrow_chunked_array.get();
auto arrow_order = static_cast<arrow::compute::SortOrder>(order);
auto arrow_indices_array =
arrow::compute::SortIndices(*arrow_chunked_array_raw, arrow_order);
if (garrow::check(error,
arrow_indices_array,
"[chunked-array][sort-indices]")) {
return GARROW_UINT64_ARRAY(garrow_array_new_raw(&(*arrow_indices_array)));
} else {
return NULL;
}
}
/**
* garrow_record_batch_sort_indices:
* @record_batch: A #GArrowRecordBatch.
* @options: The options to be used.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The indices that would sort
* a record batch with the specified options on success, %NULL on error.
*
* Since: 3.0.0
*/
GArrowUInt64Array *
garrow_record_batch_sort_indices(GArrowRecordBatch *record_batch,
GArrowSortOptions *options,
GError **error)
{
auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
auto arrow_record_batch_raw = arrow_record_batch.get();
auto arrow_options = garrow_sort_options_get_raw(options);
auto arrow_indices_array =
arrow::compute::SortIndices(::arrow::Datum(*arrow_record_batch_raw),
*arrow_options);
if (garrow::check(error,
arrow_indices_array,
"[record-batch][sort-indices]")) {
return GARROW_UINT64_ARRAY(garrow_array_new_raw(&(*arrow_indices_array)));
} else {
return NULL;
}
}
/**
* garrow_table_sort_indices:
* @table: A #GArrowTable.
* @options: The options to be used.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The indices that would sort
* a table with the specified options on success, %NULL on error.
*
* Since: 3.0.0
*/
GArrowUInt64Array *
garrow_table_sort_indices(GArrowTable *table,
GArrowSortOptions *options,
GError **error)
{
auto arrow_table = garrow_table_get_raw(table);
auto arrow_table_raw = arrow_table.get();
auto arrow_options = garrow_sort_options_get_raw(options);
auto arrow_indices_array =
arrow::compute::SortIndices(::arrow::Datum(*arrow_table_raw),
*arrow_options);
if (garrow::check(error,
arrow_indices_array,
"[table][sort-indices]")) {
return GARROW_UINT64_ARRAY(garrow_array_new_raw(&(*arrow_indices_array)));
} else {
return NULL;
}
}
/**
* garrow_table_filter:
* @table: A #GArrowTable.
* @filter: The values indicates which values should be filtered out.
* @options: (nullable): A #GArrowFilterOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowTable filterd
* with a boolean selection filter. Nulls in the filter will
* result in nulls in the output.
*
* Since: 0.15.0
*/
GArrowTable *
garrow_table_filter(GArrowTable *table,
GArrowBooleanArray *filter,
GArrowFilterOptions *options,
GError **error)
{
auto arrow_table = garrow_table_get_raw(table);
auto arrow_filter = garrow_array_get_raw(GARROW_ARRAY(filter));
arrow::Result<arrow::Datum> arrow_filtered_datum;
if (options) {
auto arrow_options = garrow_filter_options_get_raw(options);
arrow_filtered_datum = arrow::compute::Filter(arrow_table,
arrow_filter,
*arrow_options);
} else {
arrow_filtered_datum = arrow::compute::Filter(arrow_table,
arrow_filter);
}
if (garrow::check(error, arrow_filtered_datum, "[table][filter]")) {
auto arrow_filtered_table = (*arrow_filtered_datum).table();
return garrow_table_new_raw(&arrow_filtered_table);
} else {
return NULL;
}
}
/**
* garrow_table_filter_chunked_array:
* @table: A #GArrowTable.
* @filter: The values indicates which values should be filtered out.
* @options: (nullable): A #GArrowFilterOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowTable filterd
* with a chunked array filter. Nulls in the filter will
* result in nulls in the output.
*
* Since: 0.15.0
*/
GArrowTable *
garrow_table_filter_chunked_array(GArrowTable *table,
GArrowChunkedArray *filter,
GArrowFilterOptions *options,
GError **error)
{
auto arrow_table = garrow_table_get_raw(table);
auto arrow_filter = garrow_chunked_array_get_raw(filter);
arrow::Result<arrow::Datum> arrow_filtered_datum;
if (options) {
auto arrow_options = garrow_filter_options_get_raw(options);
arrow_filtered_datum = arrow::compute::Filter(arrow_table,
arrow_filter,
*arrow_options);
} else {
arrow_filtered_datum = arrow::compute::Filter(arrow_table,
arrow_filter);
}
if (garrow::check(error,
arrow_filtered_datum,
"[table][filter][chunked-array]")) {
auto arrow_filtered_table = (*arrow_filtered_datum).table();
return garrow_table_new_raw(&arrow_filtered_table);
} else {
return NULL;
}
}
/**
* garrow_chunked_array_filter:
* @chunked_array: A #GArrowChunkedArray.
* @filter: The values indicates which values should be filtered out.
* @options: (nullable): A #GArrowFilterOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowChunkedArray filterd
* with a boolean selection filter. Nulls in the filter will
* result in nulls in the output.
*
* Since: 0.15.0
*/
GArrowChunkedArray *
garrow_chunked_array_filter(GArrowChunkedArray *chunked_array,
GArrowBooleanArray *filter,
GArrowFilterOptions *options,
GError **error)
{
auto arrow_chunked_array = garrow_chunked_array_get_raw(chunked_array);
auto arrow_filter = garrow_array_get_raw(GARROW_ARRAY(filter));
arrow::Result<arrow::Datum> arrow_filtered_datum;
if (options) {
auto arrow_options = garrow_filter_options_get_raw(options);
arrow_filtered_datum = arrow::compute::Filter(arrow_chunked_array,
arrow_filter,
*arrow_options);
} else {
arrow_filtered_datum = arrow::compute::Filter(arrow_chunked_array,
arrow_filter);
}
if (garrow::check(error, arrow_filtered_datum, "[chunked-array][filter]")) {
auto arrow_filtered_chunked_array = (*arrow_filtered_datum).chunked_array();
return garrow_chunked_array_new_raw(&arrow_filtered_chunked_array);
} else {
return NULL;
}
}
/**
* garrow_chunked_array_filter_chunked_array:
* @chunked_array: A #GArrowChunkedArray.
* @filter: The values indicates which values should be filtered out.
* @options: (nullable): A #GArrowFilterOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowChunkedArray filterd
* with a chunked array filter. Nulls in the filter will
* result in nulls in the output.
*
* Since: 0.15.0
*/
GArrowChunkedArray *
garrow_chunked_array_filter_chunked_array(GArrowChunkedArray *chunked_array,
GArrowChunkedArray *filter,
GArrowFilterOptions *options,
GError **error)
{
auto arrow_chunked_array = garrow_chunked_array_get_raw(chunked_array);
auto arrow_filter = garrow_chunked_array_get_raw(filter);
arrow::Result<arrow::Datum> arrow_filtered_datum;
if (options) {
auto arrow_options = garrow_filter_options_get_raw(options);
arrow_filtered_datum = arrow::compute::Filter(arrow_chunked_array,
arrow_filter,
*arrow_options);
} else {
arrow_filtered_datum = arrow::compute::Filter(arrow_chunked_array,
arrow_filter);
}
if (garrow::check(error,
arrow_filtered_datum,
"[chunked-array][filter][chunked-array]")) {
auto arrow_filtered_chunked_array = (*arrow_filtered_datum).chunked_array();
return garrow_chunked_array_new_raw(&arrow_filtered_chunked_array);
} else {
return NULL;
}
}
/**
* garrow_record_batch_filter:
* @record_batch: A #GArrowRecordBatch.
* @filter: The values indicates which values should be filtered out.
* @options: (nullable): A #GArrowFilterOptions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): The #GArrowRecordBatch filterd
* with a boolean selection filter. Nulls in the filter will
* result in nulls in the output.
*
* Since: 0.15.0
*/
GArrowRecordBatch *
garrow_record_batch_filter(GArrowRecordBatch *record_batch,
GArrowBooleanArray *filter,
GArrowFilterOptions *options,
GError **error)
{
auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
auto arrow_filter = garrow_array_get_raw(GARROW_ARRAY(filter));
arrow::Result<arrow::Datum> arrow_filtered_datum;
if (options) {
auto arrow_options = garrow_filter_options_get_raw(options);
arrow_filtered_datum = arrow::compute::Filter(arrow_record_batch,
arrow_filter,
*arrow_options);
} else {
arrow_filtered_datum = arrow::compute::Filter(arrow_record_batch,
arrow_filter);
}
if (garrow::check(error, arrow_filtered_datum, "[record-batch][filter]")) {
auto arrow_filtered_record_batch = (*arrow_filtered_datum).record_batch();
return garrow_record_batch_new_raw(&arrow_filtered_record_batch);
} else {
return NULL;
}
}
G_END_DECLS
arrow::Result<arrow::FieldRef>
garrow_field_reference_resolve_raw(const gchar *reference)
{
if (reference && reference[0] == '.') {
return arrow::FieldRef::FromDotPath(reference);
} else {
arrow::FieldRef arrow_reference(reference);
return arrow_reference;
}
}
arrow::compute::ExecContext *
garrow_execute_context_get_raw(GArrowExecuteContext *context)
{
auto priv = GARROW_EXECUTE_CONTEXT_GET_PRIVATE(context);
return &priv->context;
}
GArrowFunctionOptions *
garrow_function_options_new_raw(
const arrow::compute::FunctionOptions *arrow_options)
{
arrow::util::string_view arrow_type_name(arrow_options->type_name());
if (arrow_type_name == "CastOptions") {
auto arrow_cast_options =
static_cast<const arrow::compute::CastOptions *>(arrow_options);
auto options = garrow_cast_options_new_raw(arrow_cast_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "ScalarAggregateOptions") {
const auto arrow_scalar_aggregate_options =
static_cast<const arrow::compute::ScalarAggregateOptions *>(arrow_options);
auto options =
garrow_scalar_aggregate_options_new_raw(arrow_scalar_aggregate_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "CountOptions") {
const auto arrow_count_options =
static_cast<const arrow::compute::CountOptions *>(arrow_options);
auto options = garrow_count_options_new_raw(arrow_count_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "FilterOptions") {
const auto arrow_filter_options =
static_cast<const arrow::compute::FilterOptions *>(arrow_options);
auto options = garrow_filter_options_new_raw(arrow_filter_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "TakeOptions") {
const auto arrow_take_options =
static_cast<const arrow::compute::TakeOptions *>(arrow_options);
auto options = garrow_take_options_new_raw(arrow_take_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "ArraySortOptions") {
const auto arrow_array_sort_options =
static_cast<const arrow::compute::ArraySortOptions *>(arrow_options);
auto options = garrow_array_sort_options_new_raw(arrow_array_sort_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "SortOptions") {
const auto arrow_sort_options =
static_cast<const arrow::compute::SortOptions *>(arrow_options);
auto options = garrow_sort_options_new_raw(arrow_sort_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "SetLookupOptions") {
const auto arrow_set_lookup_options =
static_cast<const arrow::compute::SetLookupOptions *>(arrow_options);
auto options = garrow_set_lookup_options_new_raw(arrow_set_lookup_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "VarianceOptions") {
const auto arrow_variance_options =
static_cast<const arrow::compute::VarianceOptions *>(arrow_options);
auto options = garrow_variance_options_new_raw(arrow_variance_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "RoundOptions") {
const auto arrow_round_options =
static_cast<const arrow::compute::RoundOptions *>(arrow_options);
auto options = garrow_round_options_new_raw(arrow_round_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "RoundToMultipleOptions") {
const auto arrow_round_to_multiple_options =
static_cast<const arrow::compute::RoundToMultipleOptions *>(arrow_options);
auto options =
garrow_round_to_multiple_options_new_raw(arrow_round_to_multiple_options);
return GARROW_FUNCTION_OPTIONS(options);
} else if (arrow_type_name == "UTF8NormalizedOptions") {
const auto arrow_utf8_normalize_options =
static_cast<const arrow::compute::Utf8NormalizeOptions *>(arrow_options);
auto options = garrow_utf8_normalize_options_new_raw(
arrow_utf8_normalize_options);
return GARROW_FUNCTION_OPTIONS(options);
} else {
auto options = g_object_new(GARROW_TYPE_FUNCTION_OPTIONS,
NULL);
return GARROW_FUNCTION_OPTIONS(options);
}
}
arrow::compute::FunctionOptions *
garrow_function_options_get_raw(GArrowFunctionOptions *options)
{
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(options);
return priv->options;
}
GArrowFunctionDoc *
garrow_function_doc_new_raw(const arrow::compute::FunctionDoc *arrow_doc)
{
return GARROW_FUNCTION_DOC(g_object_new(GARROW_TYPE_FUNCTION_DOC,
"doc", arrow_doc,
NULL));
}
arrow::compute::FunctionDoc *
garrow_function_doc_get_raw(GArrowFunctionDoc *doc)
{
auto priv = GARROW_FUNCTION_DOC_GET_PRIVATE(doc);
return priv->doc;
}
GArrowFunction *
garrow_function_new_raw(
std::shared_ptr<arrow::compute::Function> *arrow_function)
{
return GARROW_FUNCTION(g_object_new(GARROW_TYPE_FUNCTION,
"function", arrow_function,
NULL));
}
std::shared_ptr<arrow::compute::Function>
garrow_function_get_raw(GArrowFunction *function)
{
auto priv = GARROW_FUNCTION_GET_PRIVATE(function);
return priv->function;
}
GArrowExecuteNodeOptions *
garrow_execute_node_options_new_raw(
arrow::compute::ExecNodeOptions *arrow_options)
{
return GARROW_EXECUTE_NODE_OPTIONS(
g_object_new(GARROW_TYPE_EXECUTE_NODE_OPTIONS,
"options", arrow_options,
NULL));
}
arrow::compute::ExecNodeOptions *
garrow_execute_node_options_get_raw(GArrowExecuteNodeOptions *options)
{
auto priv = GARROW_EXECUTE_NODE_OPTIONS_GET_PRIVATE(options);
return priv->options;
}
GArrowExecuteNode *
garrow_execute_node_new_raw(arrow::compute::ExecNode *arrow_node)
{
return GARROW_EXECUTE_NODE(g_object_new(GARROW_TYPE_EXECUTE_NODE,
"node", arrow_node,
NULL));
}
arrow::compute::ExecNode *
garrow_execute_node_get_raw(GArrowExecuteNode *node)
{
auto priv = GARROW_EXECUTE_NODE_GET_PRIVATE(node);
return priv->node;
}
std::shared_ptr<arrow::compute::ExecPlan>
garrow_execute_plan_get_raw(GArrowExecutePlan *plan)
{
auto priv = GARROW_EXECUTE_PLAN_GET_PRIVATE(plan);
return priv->plan;
}
GArrowCastOptions *
garrow_cast_options_new_raw(const arrow::compute::CastOptions *arrow_options)
{
GArrowDataType *to_data_type = NULL;
if (arrow_options->to_type) {
auto arrow_copied_options = arrow_options->Copy();
auto arrow_copied_cast_options =
static_cast<arrow::compute::CastOptions *>(arrow_copied_options.get());
to_data_type =
garrow_data_type_new_raw(&(arrow_copied_cast_options->to_type));
}
auto options =
g_object_new(GARROW_TYPE_CAST_OPTIONS,
"to-data-type", to_data_type,
"allow-int-overflow", arrow_options->allow_int_overflow,
"allow-time-truncate", arrow_options->allow_time_truncate,
"allow-time-overflow", arrow_options->allow_time_overflow,
"allow-decimal-truncate", arrow_options->allow_decimal_truncate,
"allow-float-truncate", arrow_options->allow_float_truncate,
"allow-invalid-utf8", arrow_options->allow_invalid_utf8,
NULL);
return GARROW_CAST_OPTIONS(options);
}
arrow::compute::CastOptions *
garrow_cast_options_get_raw(GArrowCastOptions *options)
{
return static_cast<arrow::compute::CastOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowScalarAggregateOptions *
garrow_scalar_aggregate_options_new_raw(
const arrow::compute::ScalarAggregateOptions *arrow_options)
{
auto options =
g_object_new(GARROW_TYPE_SCALAR_AGGREGATE_OPTIONS,
"skip-nulls", arrow_options->skip_nulls,
"min-count", arrow_options->min_count,
NULL);
return GARROW_SCALAR_AGGREGATE_OPTIONS(options);
}
arrow::compute::ScalarAggregateOptions *
garrow_scalar_aggregate_options_get_raw(GArrowScalarAggregateOptions *options)
{
return static_cast<arrow::compute::ScalarAggregateOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowCountOptions *
garrow_count_options_new_raw(
const arrow::compute::CountOptions *arrow_options)
{
auto options = g_object_new(GARROW_TYPE_COUNT_OPTIONS,
"mode", arrow_options->mode,
NULL);
return GARROW_COUNT_OPTIONS(options);
}
arrow::compute::CountOptions *
garrow_count_options_get_raw(GArrowCountOptions *options)
{
return static_cast<arrow::compute::CountOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowFilterOptions *
garrow_filter_options_new_raw(
const arrow::compute::FilterOptions *arrow_options)
{
auto options =
g_object_new(GARROW_TYPE_FILTER_OPTIONS,
"null-selection-behavior",
arrow_options->null_selection_behavior,
NULL);
return GARROW_FILTER_OPTIONS(options);
}
arrow::compute::FilterOptions *
garrow_filter_options_get_raw(GArrowFilterOptions *options)
{
return static_cast<arrow::compute::FilterOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowTakeOptions *
garrow_take_options_new_raw(
const arrow::compute::TakeOptions *arrow_options)
{
auto options =
GARROW_TAKE_OPTIONS(g_object_new(GARROW_TYPE_TAKE_OPTIONS, NULL));
/* TODO: Use property when we add support for boundscheck. */
auto arrow_new_options = garrow_take_options_get_raw(options);
arrow_new_options->boundscheck = arrow_options->boundscheck;
return options;
}
arrow::compute::TakeOptions *
garrow_take_options_get_raw(GArrowTakeOptions *options)
{
return static_cast<arrow::compute::TakeOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowArraySortOptions *
garrow_array_sort_options_new_raw(
const arrow::compute::ArraySortOptions *arrow_options)
{
auto options = g_object_new(GARROW_TYPE_ARRAY_SORT_OPTIONS,
"order", arrow_options->order,
NULL);
return GARROW_ARRAY_SORT_OPTIONS(options);
}
arrow::compute::ArraySortOptions *
garrow_array_sort_options_get_raw(GArrowArraySortOptions *options)
{
return static_cast<arrow::compute::ArraySortOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowSortKey *
garrow_sort_key_new_raw(const arrow::compute::SortKey &arrow_sort_key)
{
auto sort_key = g_object_new(GARROW_TYPE_SORT_KEY, NULL);
auto priv = GARROW_SORT_KEY_GET_PRIVATE(sort_key);
priv->sort_key = arrow_sort_key;
return GARROW_SORT_KEY(sort_key);
}
arrow::compute::SortKey *
garrow_sort_key_get_raw(GArrowSortKey *sort_key)
{
auto priv = GARROW_SORT_KEY_GET_PRIVATE(sort_key);
return &(priv->sort_key);
}
GArrowSortOptions *
garrow_sort_options_new_raw(
const arrow::compute::SortOptions *arrow_options)
{
auto options =
GARROW_SORT_OPTIONS(g_object_new(GARROW_TYPE_SORT_OPTIONS,
NULL));
auto arrow_new_options = garrow_sort_options_get_raw(options);
arrow_new_options->sort_keys = arrow_options->sort_keys;
/* TODO: Use property when we add support for null_placement. */
arrow_new_options->null_placement = arrow_options->null_placement;
return options;
}
arrow::compute::SortOptions *
garrow_sort_options_get_raw(GArrowSortOptions *options)
{
return static_cast<arrow::compute::SortOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowSetLookupOptions *
garrow_set_lookup_options_new_raw(
const arrow::compute::SetLookupOptions *arrow_options)
{
auto arrow_copied_options = arrow_options->Copy();
auto arrow_copied_set_lookup_options =
static_cast<arrow::compute::SetLookupOptions *>(
arrow_copied_options.get());
auto value_set =
garrow_datum_new_raw(&(arrow_copied_set_lookup_options->value_set));
auto options = g_object_new(GARROW_TYPE_SET_LOOKUP_OPTIONS,
"value-set", value_set,
"skip-nulls", arrow_options->skip_nulls,
NULL);
return GARROW_SET_LOOKUP_OPTIONS(options);
}
arrow::compute::SetLookupOptions *
garrow_set_lookup_options_get_raw(GArrowSetLookupOptions *options)
{
return static_cast<arrow::compute::SetLookupOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowVarianceOptions *
garrow_variance_options_new_raw(
const arrow::compute::VarianceOptions *arrow_options)
{
auto options = g_object_new(GARROW_TYPE_VARIANCE_OPTIONS,
"ddof", arrow_options->ddof,
"skip-nulls", arrow_options->skip_nulls,
"min-count", arrow_options->min_count,
NULL);
return GARROW_VARIANCE_OPTIONS(options);
}
arrow::compute::VarianceOptions *
garrow_variance_options_get_raw(GArrowVarianceOptions *options)
{
return static_cast<arrow::compute::VarianceOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowRoundOptions *
garrow_round_options_new_raw(
const arrow::compute::RoundOptions *arrow_options)
{
auto options = g_object_new(GARROW_TYPE_ROUND_OPTIONS,
"n-digits", arrow_options->ndigits,
"mode", arrow_options->round_mode,
NULL);
return GARROW_ROUND_OPTIONS(options);
}
arrow::compute::RoundOptions *
garrow_round_options_get_raw(GArrowRoundOptions *options)
{
return static_cast<arrow::compute::RoundOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowRoundToMultipleOptions *
garrow_round_to_multiple_options_new_raw(
const arrow::compute::RoundToMultipleOptions *arrow_options)
{
auto arrow_copied_options = arrow_options->Copy();
auto arrow_copied_round_to_multiple_options =
static_cast<arrow::compute::RoundToMultipleOptions *>(
arrow_copied_options.get());
auto multiple =
garrow_scalar_new_raw(&(arrow_copied_round_to_multiple_options->multiple));
auto options = g_object_new(GARROW_TYPE_ROUND_TO_MULTIPLE_OPTIONS,
"multiple", multiple,
"mode", arrow_options->round_mode,
NULL);
g_object_unref(multiple);
return GARROW_ROUND_TO_MULTIPLE_OPTIONS(options);
}
arrow::compute::RoundToMultipleOptions *
garrow_round_to_multiple_options_get_raw(GArrowRoundToMultipleOptions *options)
{
return static_cast<arrow::compute::RoundToMultipleOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}
GArrowUTF8NormalizeOptions *
garrow_utf8_normalize_options_new_raw(
const arrow::compute::Utf8NormalizeOptions *arrow_options)
{
auto options = g_object_new(GARROW_TYPE_UTF8_NORMALIZE_FORM,
"form", arrow_options->form,
NULL);
return GARROW_UTF8_NORMALIZE_OPTIONS(options);
}
arrow::compute::Utf8NormalizeOptions *
garrow_utf8_normalize_options_get_raw(GArrowUTF8NormalizeOptions *options)
{
return static_cast<arrow::compute::Utf8NormalizeOptions *>(
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
}