Skip to content

Commit cc4e2a5

Browse files
okadakkkou
andcommitted
ARROW-15462: [GLib] Add GArrow{Month,DayTime,MonthDayNano}Interval{Scalar,Array,ArrayBuilder}
This adds the followings: * GArrowMonthIntervalScalar * GArrowDayTimeIntervalScalar * GArrowMonthDayNanoIntervalScalar * GArrowMonthIntervalArray * GArrowDayTimeIntervalArray * GArrowMonthDayNanoIntervalArray * GArrowMonthIntervalArrayBuilder * GArrowDayTimeIntervalArrayBuilder * GArrowMonthDayNanoArrayBuilder * GArrowDayMillisecond * GArrowMonthDayNano Closes apache#12269 from okadakk/arrow-glib-add-interval-scalar-array-type Lead-authored-by: okadak <k.suke.jp1990@gmail.com> Co-authored-by: Sutou Kouhei <kou@clear-code.com> Co-authored-by: okadakk <k.suke.jp1990@gmail.com> Signed-off-by: Sutou Kouhei <kou@clear-code.com>
1 parent ff37b7a commit cc4e2a5

23 files changed

Lines changed: 2215 additions & 0 deletions

c_glib/arrow-glib/array-builder.cpp

Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <arrow-glib/data-type.hpp>
2222
#include <arrow-glib/decimal.hpp>
2323
#include <arrow-glib/error.hpp>
24+
#include <arrow-glib/interval.hpp>
2425
#include <arrow-glib/type.hpp>
2526

2627
template <typename BUILDER, typename VALUE>
@@ -437,6 +438,15 @@ G_BEGIN_DECLS
437438
* #GArrowTime64ArrayBuilder is the class to create a new
438439
* #GArrowTime64Array.
439440
*
441+
* #GArrowMonthIntervalArrayBuilder is the class to create a new
442+
* #GArrowMonthIntervalArray.
443+
*
444+
* #GArrowDayTimeIntervalArrayBuilder is the class to create a new
445+
* #GArrowDayTimeIntervalArray.
446+
*
447+
* #GArrowMonthDayNanoArrayBuilder is the class to create a new
448+
* #GArrowMonthDayNanoArray.
449+
*
440450
* #GArrowStringDictionaryArrayBuilder is the class to create a new
441451
* #GArrowDictionaryArray with a dictionary array of #GArrowStringArray.
442452
*
@@ -4484,6 +4494,343 @@ garrow_time64_array_builder_append_nulls(GArrowTime64ArrayBuilder *builder,
44844494
}
44854495

44864496

4497+
G_DEFINE_TYPE(GArrowMonthIntervalArrayBuilder,
4498+
garrow_month_interval_array_builder,
4499+
GARROW_TYPE_ARRAY_BUILDER)
4500+
4501+
static void
4502+
garrow_month_interval_array_builder_init(
4503+
GArrowMonthIntervalArrayBuilder *builder)
4504+
{
4505+
}
4506+
4507+
static void
4508+
garrow_month_interval_array_builder_class_init(
4509+
GArrowMonthIntervalArrayBuilderClass *klass)
4510+
{
4511+
}
4512+
4513+
/**
4514+
* garrow_month_interval_array_builder_new:
4515+
*
4516+
* Returns: A newly created #GArrowMonthIntervalArrayBuilder.
4517+
*
4518+
* Since: 8.0.0
4519+
*/
4520+
GArrowMonthIntervalArrayBuilder *
4521+
garrow_month_interval_array_builder_new(void)
4522+
{
4523+
auto builder = garrow_array_builder_new(arrow::month_interval(),
4524+
NULL,
4525+
"[month-interval-array-builder][new]");
4526+
return GARROW_MONTH_INTERVAL_ARRAY_BUILDER(builder);
4527+
}
4528+
4529+
/**
4530+
* garrow_month_interval_array_builder_append_value:
4531+
* @builder: A #GArrowMonthIntervalArrayBuilder.
4532+
* @value: The month.
4533+
* @error: (nullable): Return location for a #GError or %NULL.
4534+
*
4535+
* Returns: %TRUE on success, %FALSE if there was an error.
4536+
*
4537+
* Since: 8.0.0
4538+
*/
4539+
gboolean
4540+
garrow_month_interval_array_builder_append_value(
4541+
GArrowMonthIntervalArrayBuilder *builder,
4542+
gint32 value,
4543+
GError **error)
4544+
{
4545+
return garrow_array_builder_append_value<arrow::MonthIntervalBuilder *>
4546+
(GARROW_ARRAY_BUILDER(builder),
4547+
value,
4548+
error,
4549+
"[month-interval-array-builder][append-value]");
4550+
}
4551+
4552+
/**
4553+
* garrow_month_interval_array_builder_append_values:
4554+
* @builder: A #GArrowMonthIntervalArrayBuilder.
4555+
* @values: (array length=values_length): The array of the month.
4556+
* @values_length: The length of `values`.
4557+
* @is_valids: (nullable) (array length=is_valids_length): The array of
4558+
* boolean that shows whether the Nth value is valid or not. If the
4559+
* Nth `is_valids` is %TRUE, the Nth `values` is valid value. Otherwise
4560+
* the Nth value is null value.
4561+
* @is_valids_length: The length of `is_valids`.
4562+
* @error: (nullable): Return location for a #GError or %NULL.
4563+
*
4564+
* Append multiple values at once. It's more efficient than multiple
4565+
* `append` calls.
4566+
*
4567+
* Returns: %TRUE on success, %FALSE if there was an error.
4568+
*
4569+
* Since: 8.0.0
4570+
*/
4571+
gboolean
4572+
garrow_month_interval_array_builder_append_values(
4573+
GArrowMonthIntervalArrayBuilder *builder,
4574+
const gint32 *values,
4575+
gint64 values_length,
4576+
const gboolean *is_valids,
4577+
gint64 is_valids_length,
4578+
GError **error)
4579+
{
4580+
return garrow_array_builder_append_values<arrow::MonthIntervalBuilder *>
4581+
(GARROW_ARRAY_BUILDER(builder),
4582+
values,
4583+
values_length,
4584+
is_valids,
4585+
is_valids_length,
4586+
error,
4587+
"[month-interval-array-builder][append-values]");
4588+
}
4589+
4590+
4591+
G_DEFINE_TYPE(GArrowDayTimeIntervalArrayBuilder,
4592+
garrow_day_time_interval_array_builder,
4593+
GARROW_TYPE_ARRAY_BUILDER)
4594+
4595+
static void
4596+
garrow_day_time_interval_array_builder_init(
4597+
GArrowDayTimeIntervalArrayBuilder *builder)
4598+
{
4599+
}
4600+
4601+
static void
4602+
garrow_day_time_interval_array_builder_class_init(
4603+
GArrowDayTimeIntervalArrayBuilderClass *klass)
4604+
{
4605+
}
4606+
4607+
/**
4608+
* garrow_day_time_interval_array_builder_new:
4609+
*
4610+
* Returns: A newly created #GArrowDayTimeIntervalArrayBuilder.
4611+
*
4612+
* Since: 8.0.0
4613+
*/
4614+
GArrowDayTimeIntervalArrayBuilder *
4615+
garrow_day_time_interval_array_builder_new(void)
4616+
{
4617+
auto builder = garrow_array_builder_new(arrow::day_time_interval(),
4618+
NULL,
4619+
"[day-time-interval-array-builder][new]");
4620+
return GARROW_DAY_TIME_INTERVAL_ARRAY_BUILDER(builder);
4621+
}
4622+
4623+
/**
4624+
* garrow_day_time_interval_array_builder_append_value:
4625+
* @builder: A #GArrowDayTimeIntervalArrayBuilder.
4626+
* @value: A #GArrowDayMillisecond.
4627+
* @error: (nullable): Return location for a #GError or %NULL.
4628+
*
4629+
* Returns: %TRUE on success, %FALSE if there was an error.
4630+
*
4631+
* Since: 8.0.0
4632+
*/
4633+
gboolean
4634+
garrow_day_time_interval_array_builder_append_value(
4635+
GArrowDayTimeIntervalArrayBuilder *builder,
4636+
GArrowDayMillisecond *value,
4637+
GError **error)
4638+
{
4639+
if (value) {
4640+
auto arrow_day_millisecond = garrow_day_millisecond_get_raw(value);
4641+
return garrow_array_builder_append_value<arrow::DayTimeIntervalBuilder *>
4642+
(GARROW_ARRAY_BUILDER(builder),
4643+
*arrow_day_millisecond,
4644+
error,
4645+
"[day-time-interval-array-builder][append-value]");
4646+
} else {
4647+
return garrow_array_builder_append_null(GARROW_ARRAY_BUILDER(builder),
4648+
error);
4649+
}
4650+
}
4651+
4652+
/**
4653+
* garrow_day_time_interval_array_builder_append_values:
4654+
* @builder: A #GArrowDayTimeIntervalArrayBuilder.
4655+
* @values: (array length=values_length): The array of a #GArrowDayMillisecond.
4656+
* @values_length: The length of `values`.
4657+
* @is_valids: (nullable) (array length=is_valids_length): The array of
4658+
* boolean that shows whether the Nth value is valid or not. If the
4659+
* Nth `is_valids` is %TRUE, the Nth `values` is valid value. Otherwise
4660+
* the Nth value is null value.
4661+
* @is_valids_length: The length of `is_valids`.
4662+
* @error: (nullable): Return location for a #GError or %NULL.
4663+
*
4664+
* Append multiple values at once. It's more efficient than multiple
4665+
* `append` calls.
4666+
*
4667+
* Returns: %TRUE on success, %FALSE if there was an error.
4668+
*
4669+
* Since: 8.0.0
4670+
*/
4671+
gboolean
4672+
garrow_day_time_interval_array_builder_append_values(
4673+
GArrowDayTimeIntervalArrayBuilder *builder,
4674+
const GArrowDayMillisecond **values,
4675+
gint64 values_length,
4676+
const gboolean *is_valids,
4677+
gint64 is_valids_length,
4678+
GError **error)
4679+
{
4680+
auto arrow_builder =
4681+
static_cast<arrow::DayTimeIntervalBuilder *>(
4682+
garrow_array_builder_get_raw(GARROW_ARRAY_BUILDER(builder)));
4683+
4684+
return garrow_array_builder_append_values(
4685+
values,
4686+
values_length,
4687+
is_valids,
4688+
is_valids_length,
4689+
error,
4690+
"[day-time-interval-array-builder][append-values]",
4691+
[&arrow_builder](const GArrowDayMillisecond **values,
4692+
gint64 values_length,
4693+
const uint8_t *valid_bytes) -> arrow::Status {
4694+
for (int i = 0; i < values_length; i++) {
4695+
arrow::Status status;
4696+
if (!valid_bytes || valid_bytes[i]) {
4697+
auto arrow_value = garrow_day_millisecond_get_raw(values[i]);
4698+
status = arrow_builder->Append(*arrow_value);
4699+
} else {
4700+
status = arrow_builder->AppendNull();
4701+
}
4702+
if (!status.ok()) {
4703+
return status;
4704+
}
4705+
};
4706+
4707+
return arrow::Status::OK();
4708+
});
4709+
}
4710+
4711+
4712+
G_DEFINE_TYPE(GArrowMonthDayNanoIntervalArrayBuilder,
4713+
garrow_month_day_nano_interval_array_builder,
4714+
GARROW_TYPE_ARRAY_BUILDER)
4715+
4716+
static void
4717+
garrow_month_day_nano_interval_array_builder_init(
4718+
GArrowMonthDayNanoIntervalArrayBuilder *builder)
4719+
{
4720+
}
4721+
4722+
static void
4723+
garrow_month_day_nano_interval_array_builder_class_init(
4724+
GArrowMonthDayNanoIntervalArrayBuilderClass *klass)
4725+
{
4726+
}
4727+
4728+
/**
4729+
* garrow_month_day_nano_interval_array_builder_new:
4730+
*
4731+
* Returns: A newly created #GArrowMonthDayNanoIntervalArrayBuilder.
4732+
*
4733+
* Since: 8.0.0
4734+
*/
4735+
GArrowMonthDayNanoIntervalArrayBuilder *
4736+
garrow_month_day_nano_interval_array_builder_new(void)
4737+
{
4738+
auto builder =
4739+
garrow_array_builder_new(arrow::month_day_nano_interval(),
4740+
NULL,
4741+
"[month-day-nano-interval-array-builder][new]");
4742+
return GARROW_MONTH_DAY_NANO_INTERVAL_ARRAY_BUILDER(builder);
4743+
}
4744+
4745+
/**
4746+
* garrow_month_day_nano_interval_array_builder_append_value:
4747+
* @builder: A #GArrowMonthDayNanoIntervalArrayBuilder.
4748+
* @value: A #GArrowMonthDayNano.
4749+
* @error: (nullable): Return location for a #GError or %NULL.
4750+
*
4751+
* Returns: %TRUE on success, %FALSE if there was an error.
4752+
*
4753+
* Since: 8.0.0
4754+
*/
4755+
gboolean
4756+
garrow_month_day_nano_interval_array_builder_append_value(
4757+
GArrowMonthDayNanoIntervalArrayBuilder *builder,
4758+
GArrowMonthDayNano *value,
4759+
GError **error)
4760+
{
4761+
if (value) {
4762+
auto arrow_month_day_nano = garrow_month_day_nano_get_raw(value);
4763+
return garrow_array_builder_append_value<arrow::MonthDayNanoIntervalBuilder *>(
4764+
GARROW_ARRAY_BUILDER(builder),
4765+
*arrow_month_day_nano,
4766+
error,
4767+
"[month-day-nano-interval-array-builder][append-value]");
4768+
} else {
4769+
return garrow_array_builder_append_null(GARROW_ARRAY_BUILDER(builder),
4770+
error);
4771+
}
4772+
}
4773+
4774+
/**
4775+
* garrow_month_day_nano_interval_array_builder_append_values:
4776+
* @builder: A #GArrowMonthDayNanoIntervalArrayBuilder.
4777+
* @values: (array length=values_length): The array of a #GArrowMonthDayNano.
4778+
* @values_length: The length of `values`.
4779+
* @is_valids: (nullable) (array length=is_valids_length): The array of
4780+
* boolean that shows whether the Nth value is valid or not. If the
4781+
* Nth `is_valids` is %TRUE, the Nth `values` is valid value. Otherwise
4782+
* the Nth value is null value.
4783+
* @is_valids_length: The length of `is_valids`.
4784+
* @error: (nullable): Return location for a #GError or %NULL.
4785+
*
4786+
* Append multiple values at once. It's more efficient than multiple
4787+
* `append` calls.
4788+
*
4789+
* Returns: %TRUE on success, %FALSE if there was an error.
4790+
*
4791+
* Since: 8.0.0
4792+
*/
4793+
gboolean
4794+
garrow_month_day_nano_interval_array_builder_append_values(
4795+
GArrowMonthDayNanoIntervalArrayBuilder *builder,
4796+
const GArrowMonthDayNano **values,
4797+
gint64 values_length,
4798+
const gboolean *is_valids,
4799+
gint64 is_valids_length,
4800+
GError **error)
4801+
{
4802+
auto arrow_builder =
4803+
static_cast<arrow::MonthDayNanoIntervalBuilder *>(
4804+
garrow_array_builder_get_raw(GARROW_ARRAY_BUILDER(builder)));
4805+
4806+
return garrow_array_builder_append_values(
4807+
values,
4808+
values_length,
4809+
is_valids,
4810+
is_valids_length,
4811+
error,
4812+
"[month-day-nano-interval-array-builder][append-values]",
4813+
[&arrow_builder](const GArrowMonthDayNano **values,
4814+
gint64 values_length,
4815+
const uint8_t *valid_bytes) -> arrow::Status {
4816+
for (int i = 0; i < values_length; i++) {
4817+
arrow::Status status;
4818+
if (!valid_bytes || valid_bytes[i]) {
4819+
auto arrow_value = garrow_month_day_nano_get_raw(values[i]);
4820+
status = arrow_builder->Append(*arrow_value);
4821+
} else {
4822+
status = arrow_builder->AppendNull();
4823+
}
4824+
if (!status.ok()) {
4825+
return status;
4826+
}
4827+
};
4828+
4829+
return arrow::Status::OK();
4830+
});
4831+
}
4832+
4833+
44874834
G_DEFINE_TYPE(GArrowBinaryDictionaryArrayBuilder,
44884835
garrow_binary_dictionary_array_builder,
44894836
GARROW_TYPE_ARRAY_BUILDER)
@@ -6136,6 +6483,15 @@ garrow_array_builder_new_raw(arrow::ArrayBuilder *arrow_builder,
61366483
case arrow::Type::type::TIME64:
61376484
type = GARROW_TYPE_TIME64_ARRAY_BUILDER;
61386485
break;
6486+
case arrow::Type::type::INTERVAL_MONTHS:
6487+
type = GARROW_TYPE_MONTH_INTERVAL_ARRAY_BUILDER;
6488+
break;
6489+
case arrow::Type::type::INTERVAL_DAY_TIME:
6490+
type = GARROW_TYPE_DAY_TIME_INTERVAL_ARRAY_BUILDER;
6491+
break;
6492+
case arrow::Type::type::INTERVAL_MONTH_DAY_NANO:
6493+
type = GARROW_TYPE_MONTH_DAY_NANO_INTERVAL_ARRAY_BUILDER;
6494+
break;
61396495
case arrow::Type::type::LIST:
61406496
type = GARROW_TYPE_LIST_ARRAY_BUILDER;
61416497
break;

0 commit comments

Comments
 (0)