blob: c91cde84c5ffe3e81540320e3686515b22861e73 [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 <arrow-glib/basic-array.hpp>
#include <arrow-glib/error.hpp>
#include <arrow-glib/record-batch.hpp>
#include <arrow-glib/schema.hpp>
#include <gandiva-glib/expression.hpp>
#include <gandiva-glib/projector.hpp>
#include <gandiva-glib/selection-vector.hpp>
G_BEGIN_DECLS
/**
* SECTION: projector
* @title: Projector classes
* @include: gandiva-glib/gandiva-glib.h
*
* #GGandivaProjector is a class that evaluates given expressions
* against the given record batches.
*
* #GGandivaSelectableProjector is a class that evaluates given expressions
* against the given selected records in the given record batches.
*
* Since: 0.12.0
*/
typedef struct GGandivaProjectorPrivate_ {
std::shared_ptr<gandiva::Projector> projector;
GArrowSchema *schema;
GList *expressions;
} GGandivaProjectorPrivate;
enum {
PROP_PROJECTOR = 1,
PROP_SCHEMA,
PROP_EXPRESSIONS,
};
G_DEFINE_TYPE_WITH_PRIVATE(GGandivaProjector,
ggandiva_projector,
G_TYPE_OBJECT)
#define GGANDIVA_PROJECTOR_GET_PRIVATE(obj) \
static_cast<GGandivaProjectorPrivate *>( \
ggandiva_projector_get_instance_private( \
GGANDIVA_PROJECTOR(obj)))
static void
ggandiva_projector_dispose(GObject *object)
{
auto priv = GGANDIVA_PROJECTOR_GET_PRIVATE(object);
if (priv->schema) {
g_object_unref(G_OBJECT(priv->schema));
priv->schema = nullptr;
}
g_list_free_full(priv->expressions, g_object_unref);
priv->expressions = nullptr;
G_OBJECT_CLASS(ggandiva_projector_parent_class)->dispose(object);
}
static void
ggandiva_projector_finalize(GObject *object)
{
auto priv = GGANDIVA_PROJECTOR_GET_PRIVATE(object);
priv->projector.~shared_ptr();
G_OBJECT_CLASS(ggandiva_projector_parent_class)->finalize(object);
}
static void
ggandiva_projector_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GGANDIVA_PROJECTOR_GET_PRIVATE(object);
switch (prop_id) {
case PROP_PROJECTOR:
priv->projector =
*static_cast<std::shared_ptr<gandiva::Projector> *>(g_value_get_pointer(value));
break;
case PROP_SCHEMA:
priv->schema = GARROW_SCHEMA(g_value_dup_object(value));
break;
case PROP_EXPRESSIONS:
priv->expressions =
g_list_copy_deep(static_cast<GList *>(g_value_get_pointer(value)),
reinterpret_cast<GCopyFunc>(g_object_ref),
nullptr);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
ggandiva_projector_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GGANDIVA_PROJECTOR_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SCHEMA:
g_value_set_object(value, priv->schema);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
ggandiva_projector_init(GGandivaProjector *object)
{
auto priv = GGANDIVA_PROJECTOR_GET_PRIVATE(object);
new(&priv->projector) std::shared_ptr<gandiva::Projector>;
}
static void
ggandiva_projector_class_init(GGandivaProjectorClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = ggandiva_projector_dispose;
gobject_class->finalize = ggandiva_projector_finalize;
gobject_class->set_property = ggandiva_projector_set_property;
gobject_class->get_property = ggandiva_projector_get_property;
GParamSpec *spec;
spec = g_param_spec_pointer("projector",
"Projector",
"The raw std::shared<gandiva::Projector> *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_PROJECTOR, spec);
spec = g_param_spec_object("schema",
"Schema",
"The schema of the projector",
GARROW_TYPE_SCHEMA,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_SCHEMA, spec);
spec = g_param_spec_pointer("expressions",
"Expressions",
"The expressions for the projector",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_EXPRESSIONS, spec);
}
/**
* ggandiva_projector_new:
* @schema: A #GArrowSchema.
* @expressions: (element-type GGandivaExpression): The built expressions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GGandivaProjector on success,
* %NULL on error.
*
* Since: 0.12.0
*/
GGandivaProjector *
ggandiva_projector_new(GArrowSchema *schema,
GList *expressions,
GError **error)
{
auto arrow_schema = garrow_schema_get_raw(schema);
std::vector<std::shared_ptr<gandiva::Expression>> gandiva_expressions;
for (auto node = expressions; node; node = g_list_next(node)) {
auto expression = GGANDIVA_EXPRESSION(node->data);
auto gandiva_expression = ggandiva_expression_get_raw(expression);
gandiva_expressions.push_back(gandiva_expression);
}
std::shared_ptr<gandiva::Projector> gandiva_projector;
auto status =
gandiva_projector->Make(arrow_schema,
gandiva_expressions,
&gandiva_projector);
if (garrow_error_check(error, status, "[gandiva][projector][new]")) {
return ggandiva_projector_new_raw(&gandiva_projector,
schema,
expressions);
} else {
return NULL;
}
}
/**
* ggandiva_projector_evaluate:
* @projector: A #GGandivaProjector.
* @record_batch: A #GArrowRecordBatch.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (element-type GArrowArray) (nullable) (transfer full):
* The #GArrowArray as the result evaluated on success, %NULL on error.
*
* Since: 0.12.0
*/
GList *
ggandiva_projector_evaluate(GGandivaProjector *projector,
GArrowRecordBatch *record_batch,
GError **error)
{
auto gandiva_projector = ggandiva_projector_get_raw(projector);
auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
auto memory_pool = arrow::default_memory_pool();
arrow::ArrayVector arrow_arrays;
auto status =
gandiva_projector->Evaluate(*arrow_record_batch,
memory_pool,
&arrow_arrays);
if (garrow_error_check(error, status, "[gandiva][projector][evaluate]")) {
GList *arrays = NULL;
for (auto arrow_array : arrow_arrays) {
auto array = garrow_array_new_raw(&arrow_array);
arrays = g_list_prepend(arrays, array);
}
return g_list_reverse(arrays);
} else {
return NULL;
}
}
G_DEFINE_TYPE(GGandivaSelectableProjector,
ggandiva_selectable_projector,
GGANDIVA_TYPE_PROJECTOR)
static void
ggandiva_selectable_projector_init(GGandivaSelectableProjector *object)
{
}
static void
ggandiva_selectable_projector_class_init(GGandivaSelectableProjectorClass *klass)
{
}
/**
* ggandiva_selectable_projector_new:
* @schema: A #GArrowSchema.
* @expressions: (element-type GGandivaExpression): The built expressions.
* @mode: A #GGandivaSelectionVectorMode to be used.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GGandivaProjector on success,
* %NULL on error.
*
* Since: 4.0.0
*/
GGandivaSelectableProjector *
ggandiva_selectable_projector_new(GArrowSchema *schema,
GList *expressions,
GGandivaSelectionVectorMode mode,
GError **error)
{
auto arrow_schema = garrow_schema_get_raw(schema);
std::vector<std::shared_ptr<gandiva::Expression>> gandiva_expressions;
for (auto node = expressions; node; node = g_list_next(node)) {
auto expression = GGANDIVA_EXPRESSION(node->data);
auto gandiva_expression = ggandiva_expression_get_raw(expression);
gandiva_expressions.push_back(gandiva_expression);
}
auto gandiva_mode = static_cast<gandiva::SelectionVector::Mode>(mode);
auto gandiva_configuration =
gandiva::ConfigurationBuilder::DefaultConfiguration();
std::shared_ptr<gandiva::Projector> gandiva_projector;
auto status = gandiva_projector->Make(arrow_schema,
gandiva_expressions,
gandiva_mode,
gandiva_configuration,
&gandiva_projector);
if (garrow_error_check(error,
status,
"[gandiva][selectable-projector][new]")) {
return ggandiva_selectable_projector_new_raw(&gandiva_projector,
schema,
expressions);
} else {
return NULL;
}
}
/**
* ggandiva_selectable_projector_evaluate:
* @projector: A #GGandivaSelectableProjector.
* @record_batch: A #GArrowRecordBatch.
* @selection_vector: A #GGandivaSelectionVector that specifies
* the filtered row positions.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (element-type GArrowArray) (nullable) (transfer full):
* The #GArrowArray as the result evaluated on success, %NULL on error.
*
* Since: 4.0.0
*/
GList *
ggandiva_selectable_projector_evaluate(
GGandivaSelectableProjector *projector,
GArrowRecordBatch *record_batch,
GGandivaSelectionVector *selection_vector,
GError **error)
{
auto gandiva_projector =
ggandiva_projector_get_raw(GGANDIVA_PROJECTOR(projector));
auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
auto gandiva_selection_vector =
ggandiva_selection_vector_get_raw(selection_vector).get();
auto memory_pool = arrow::default_memory_pool();
arrow::ArrayVector arrow_arrays;
auto status =
gandiva_projector->Evaluate(*arrow_record_batch,
gandiva_selection_vector,
memory_pool,
&arrow_arrays);
if (garrow_error_check(error,
status,
"[gandiva][selectable-projector][evaluate]")) {
GList *arrays = NULL;
for (auto arrow_array : arrow_arrays) {
auto array = garrow_array_new_raw(&arrow_array);
arrays = g_list_prepend(arrays, array);
}
return g_list_reverse(arrays);
} else {
return NULL;
}
}
G_END_DECLS
GGandivaProjector *
ggandiva_projector_new_raw(
std::shared_ptr<gandiva::Projector> *gandiva_projector,
GArrowSchema *schema,
GList *expressions)
{
auto projector = g_object_new(GGANDIVA_TYPE_PROJECTOR,
"projector", gandiva_projector,
"schema", schema,
"expressions", expressions,
NULL);
return GGANDIVA_PROJECTOR(projector);
}
GGandivaSelectableProjector *
ggandiva_selectable_projector_new_raw(
std::shared_ptr<gandiva::Projector> *gandiva_projector,
GArrowSchema *schema,
GList *expressions)
{
auto projector = g_object_new(GGANDIVA_TYPE_SELECTABLE_PROJECTOR,
"projector", gandiva_projector,
NULL);
return GGANDIVA_SELECTABLE_PROJECTOR(projector);
}
std::shared_ptr<gandiva::Projector>
ggandiva_projector_get_raw(GGandivaProjector *projector)
{
auto priv = GGANDIVA_PROJECTOR_GET_PRIVATE(projector);
return priv->projector;
}