blob: 07a5d4aeadae9dc0f2c2c38d67ccb3b417c141e4 [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/error.hpp>
#include <arrow-glib/expression.hpp>
#include <arrow-glib/reader.hpp>
#include <arrow-glib/table.hpp>
#include <arrow-dataset-glib/dataset.hpp>
#include <arrow-dataset-glib/scanner.hpp>
G_BEGIN_DECLS
/**
* SECTION: scanner
* @section_id: scanner
* @title: Scanner related classes
* @include: arrow-dataset-glib/arrow-dataset-glib.h
*
* #GADatasetScanner is a class for scanning dataset.
*
* #GADatasetScannerBuilder is a class for building a scanner.
*
* Since: 5.0.0
*/
typedef struct GADatasetScannerPrivate_ {
std::shared_ptr<arrow::dataset::Scanner> scanner;
} GADatasetScannerPrivate;
enum {
PROP_SCANNER = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GADatasetScanner,
gadataset_scanner,
G_TYPE_OBJECT)
#define GADATASET_SCANNER_GET_PRIVATE(obj) \
static_cast<GADatasetScannerPrivate *>( \
gadataset_scanner_get_instance_private( \
GADATASET_SCANNER(obj)))
static void
gadataset_scanner_finalize(GObject *object)
{
auto priv = GADATASET_SCANNER_GET_PRIVATE(object);
priv->scanner.~shared_ptr();
G_OBJECT_CLASS(gadataset_scanner_parent_class)->finalize(object);
}
static void
gadataset_scanner_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GADATASET_SCANNER_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SCANNER:
priv->scanner =
*static_cast<std::shared_ptr<arrow::dataset::Scanner> *>(
g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gadataset_scanner_init(GADatasetScanner *object)
{
auto priv = GADATASET_SCANNER_GET_PRIVATE(object);
new(&priv->scanner) std::shared_ptr<arrow::dataset::Scanner>;
}
static void
gadataset_scanner_class_init(GADatasetScannerClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = gadataset_scanner_finalize;
gobject_class->set_property = gadataset_scanner_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("scanner",
"Scanner",
"The raw std::shared<arrow::dataset::Scanner> *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_SCANNER, spec);
}
/**
* gadataset_scanner_to_table:
* @scanner: A #GADatasetScanner.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full) (nullable):
* A newly created #GArrowTable on success, %NULL on error.
*
* Since: 5.0.0
*/
GArrowTable *
gadataset_scanner_to_table(GADatasetScanner *scanner,
GError **error)
{
auto arrow_scanner = gadataset_scanner_get_raw(scanner);
auto arrow_table_result = arrow_scanner->ToTable();
if (garrow::check(error, arrow_table_result, "[scanner][to-table]")) {
auto arrow_table = *arrow_table_result;
return garrow_table_new_raw(&arrow_table);
} else {
return NULL;
}
}
typedef struct GADatasetScannerBuilderPrivate_ {
std::shared_ptr<arrow::dataset::ScannerBuilder> scanner_builder;
} GADatasetScannerBuilderPrivate;
enum {
PROP_SCANNER_BUILDER = 1
};
G_DEFINE_TYPE_WITH_PRIVATE(GADatasetScannerBuilder,
gadataset_scanner_builder,
G_TYPE_OBJECT)
#define GADATASET_SCANNER_BUILDER_GET_PRIVATE(obj) \
static_cast<GADatasetScannerBuilderPrivate *>( \
gadataset_scanner_builder_get_instance_private( \
GADATASET_SCANNER_BUILDER(obj)))
static void
gadataset_scanner_builder_finalize(GObject *object)
{
auto priv = GADATASET_SCANNER_BUILDER_GET_PRIVATE(object);
priv->scanner_builder.~shared_ptr();
G_OBJECT_CLASS(gadataset_scanner_builder_parent_class)->finalize(object);
}
static void
gadataset_scanner_builder_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GADATASET_SCANNER_BUILDER_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SCANNER_BUILDER:
priv->scanner_builder =
*static_cast<std::shared_ptr<arrow::dataset::ScannerBuilder> *>(
g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gadataset_scanner_builder_init(GADatasetScannerBuilder *object)
{
auto priv = GADATASET_SCANNER_BUILDER_GET_PRIVATE(object);
new(&priv->scanner_builder) std::shared_ptr<arrow::dataset::ScannerBuilder>;
}
static void
gadataset_scanner_builder_class_init(GADatasetScannerBuilderClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = gadataset_scanner_builder_finalize;
gobject_class->set_property = gadataset_scanner_builder_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("scanner-builder",
"Scanner builder",
"The raw "
"std::shared<arrow::dataset::ScannerBuilder> *",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_SCANNER_BUILDER, spec);
}
/**
* gadataset_scanner_builder_new:
* @dataset: A #GADatasetDataset to be scanned.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable): A newly created #GADatasetScannerBuilder on success,
* %NULL on error.
*
* Since: 5.0.0
*/
GADatasetScannerBuilder *
gadataset_scanner_builder_new(GADatasetDataset *dataset, GError **error)
{
auto arrow_dataset = gadataset_dataset_get_raw(dataset);
auto arrow_scanner_builder_result = arrow_dataset->NewScan();
if (garrow::check(error,
arrow_scanner_builder_result,
"[scanner-builder][new]")) {
auto arrow_scanner_builder = *arrow_scanner_builder_result;
return gadataset_scanner_builder_new_raw(&arrow_scanner_builder);
} else {
return NULL;
}
}
/**
* gadataset_scanner_builder_new_record_batch_reader:
* @reader: A #GArrowRecordBatchReader that produces record batches.
*
* Returns: (nullable): A newly created #GADatasetScannerBuilder.
*
* Since: 6.0.0
*/
GADatasetScannerBuilder *
gadataset_scanner_builder_new_record_batch_reader(
GArrowRecordBatchReader *reader)
{
auto arrow_reader = garrow_record_batch_reader_get_raw(reader);
auto arrow_scanner_builder =
arrow::dataset::ScannerBuilder::FromRecordBatchReader(arrow_reader);
return gadataset_scanner_builder_new_raw(&arrow_scanner_builder);
}
/**
* gadataset_scanner_builder_set_filter:
* @builder: A #GADatasetScannerBuilder.
* @expression: A #GArrowExpression to filter rows with.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: %TRUE on success, %FALSE on error.
*
* Since: 6.0.0
*/
gboolean
gadataset_scanner_builder_set_filter(GADatasetScannerBuilder *builder,
GArrowExpression *expression,
GError **error)
{
auto arrow_builder = gadataset_scanner_builder_get_raw(builder);
auto arrow_expression = garrow_expression_get_raw(expression);
return garrow::check(error,
arrow_builder->Filter(*arrow_expression),
"[scanner-builder][filter][set]");
}
/**
* gadataset_scanner_builder_finish:
* @builder: A #GADatasetScannerBuilder.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (transfer full) (nullable):
* A newly created #GADatasetScanner on success, %NULL on error.
*
* Since: 5.0.0
*/
GADatasetScanner *
gadataset_scanner_builder_finish(GADatasetScannerBuilder *builder,
GError **error)
{
auto arrow_builder = gadataset_scanner_builder_get_raw(builder);
auto arrow_scanner_result = arrow_builder->Finish();
if (garrow::check(error, arrow_scanner_result, "[scanner-builder][finish]")) {
auto arrow_scanner = *arrow_scanner_result;
return gadataset_scanner_new_raw(&arrow_scanner);
} else {
return NULL;
}
}
G_END_DECLS
GADatasetScanner *
gadataset_scanner_new_raw(
std::shared_ptr<arrow::dataset::Scanner> *arrow_scanner)
{
auto scanner =
GADATASET_SCANNER(g_object_new(GADATASET_TYPE_SCANNER,
"scanner", arrow_scanner,
NULL));
return scanner;
}
std::shared_ptr<arrow::dataset::Scanner>
gadataset_scanner_get_raw(GADatasetScanner *scanner)
{
auto priv = GADATASET_SCANNER_GET_PRIVATE(scanner);
return priv->scanner;
}
GADatasetScannerBuilder *
gadataset_scanner_builder_new_raw(
std::shared_ptr<arrow::dataset::ScannerBuilder> *arrow_scanner_builder)
{
return GADATASET_SCANNER_BUILDER(
g_object_new(GADATASET_TYPE_SCANNER_BUILDER,
"scanner-builder", arrow_scanner_builder,
NULL));
}
std::shared_ptr<arrow::dataset::ScannerBuilder>
gadataset_scanner_builder_get_raw(GADatasetScannerBuilder *scanner_builder)
{
auto priv = GADATASET_SCANNER_BUILDER_GET_PRIVATE(scanner_builder);
return priv->scanner_builder;
}