Skip to content

Commit

Permalink
ARROW-15134: [GLib] Add GArrow{Month,DayTime,MonthDayNano}IntervalDat…
Browse files Browse the repository at this point in the history
…aType

Closes #11975 from okadakk/arrow-glib-add-tinterval-data-type

Lead-authored-by: okadakk <k.suke.jp1990@gmail.com>
Co-authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
  • Loading branch information
okadakk and kou committed Dec 17, 2021
1 parent 8013c1e commit 6e20c6b
Show file tree
Hide file tree
Showing 8 changed files with 386 additions and 17 deletions.
146 changes: 146 additions & 0 deletions c_glib/arrow-glib/basic-data-type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@ G_BEGIN_DECLS
* #GArrowTime64DataType is a class for the number of microseconds or
* nanoseconds since midnight in the 64-bit signed integer data type.
*
* #GArrowIntervalDataType is an abstract class for interval related
* data type such as #GArrowMonthIntervalDataType.
*
* #GArrowMonthIntervalDataType is a class for the month intarval data
* type.
*
* #GArrowDayTimeIntervalDataType is a class for the day time intarval
* data type.
*
* #GArrowMonthDayNanoIntervalDataType is a class for the month day
* nano intarval data type.
*
* #GArrowDecimalDataType is a base class for the decimal data types.
*
* #GArrowDecimal128DataType is a class for the 128-bit decimal data type.
Expand Down Expand Up @@ -1287,6 +1299,140 @@ garrow_time64_data_type_new(GArrowTimeUnit unit, GError **error)
}


G_DEFINE_ABSTRACT_TYPE(GArrowIntervalDataType,
garrow_interval_data_type,
GARROW_TYPE_TEMPORAL_DATA_TYPE)

static void
garrow_interval_data_type_init(GArrowIntervalDataType *object)
{
}

static void
garrow_interval_data_type_class_init(GArrowIntervalDataTypeClass *klass)
{
}

/**
* garrow_interval_data_type_get_interval_type:
* @type: The #GArrowIntervalDataType.
*
* Returns: The interval type of the given @type.
*
* Since: 7.0.0
*/
GArrowIntervalType
garrow_interval_data_type_get_interval_type(GArrowIntervalDataType *type)
{
const auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(type));
const auto arrow_interval_type =
std::static_pointer_cast<arrow::IntervalType>(arrow_data_type);
return garrow_interval_type_from_raw(arrow_interval_type->interval_type());
}


G_DEFINE_TYPE(GArrowMonthIntervalDataType,
garrow_month_interval_data_type,
GARROW_TYPE_INTERVAL_DATA_TYPE)
static void
garrow_month_interval_data_type_init(GArrowMonthIntervalDataType *object)
{
}

static void
garrow_month_interval_data_type_class_init(
GArrowMonthIntervalDataTypeClass *klass)
{
}

/**
* garrow_month_interval_data_type_new:
*
* Returns: The newly created month interval data type.
*
* Since: 7.0.0
*/
GArrowMonthIntervalDataType *
garrow_month_interval_data_type_new(void)
{
auto arrow_data_type = arrow::month_interval();

auto data_type = g_object_new(GARROW_TYPE_MONTH_INTERVAL_DATA_TYPE,
"data-type", &arrow_data_type,
NULL);
return GARROW_MONTH_INTERVAL_DATA_TYPE(data_type);
}


G_DEFINE_TYPE(GArrowDayTimeIntervalDataType,
garrow_day_time_interval_data_type,
GARROW_TYPE_INTERVAL_DATA_TYPE)

static void
garrow_day_time_interval_data_type_init(GArrowDayTimeIntervalDataType *object)
{
}

static void
garrow_day_time_interval_data_type_class_init(
GArrowDayTimeIntervalDataTypeClass *klass)
{
}

/**
* garrow_day_time_interval_data_type_new:
*
* Returns: The newly created day time interval data type.
*
* Since: 7.0.0
*/
GArrowDayTimeIntervalDataType *
garrow_day_time_interval_data_type_new(void)
{
auto arrow_data_type = arrow::day_time_interval();

auto data_type = g_object_new(GARROW_TYPE_DAY_TIME_INTERVAL_DATA_TYPE,
"data-type", &arrow_data_type,
NULL);
return GARROW_DAY_TIME_INTERVAL_DATA_TYPE(data_type);
}


G_DEFINE_TYPE(GArrowMonthDayNanoIntervalDataType,
garrow_month_day_nano_interval_data_type,
GARROW_TYPE_INTERVAL_DATA_TYPE)

static void
garrow_month_day_nano_interval_data_type_init(
GArrowMonthDayNanoIntervalDataType *object)
{
}

static void
garrow_month_day_nano_interval_data_type_class_init(
GArrowMonthDayNanoIntervalDataTypeClass *klass)
{
}

/**
* garrow_month_day_nano_interval_data_type_new:
*
* Returns: The newly created month day nano interval data type.
*
* Since: 7.0.0
*/
GArrowMonthDayNanoIntervalDataType *
garrow_month_day_nano_interval_data_type_new(void)
{
auto arrow_data_type = arrow::month_day_nano_interval();

auto data_type = g_object_new(GARROW_TYPE_MONTH_DAY_NANO_INTERVAL_DATA_TYPE,
"data-type", &arrow_data_type,
NULL);
return GARROW_MONTH_DAY_NANO_INTERVAL_DATA_TYPE(data_type);
}


G_DEFINE_ABSTRACT_TYPE(GArrowDecimalDataType,
garrow_decimal_data_type,
GARROW_TYPE_FIXED_SIZE_BINARY_DATA_TYPE)
Expand Down
67 changes: 67 additions & 0 deletions c_glib/arrow-glib/basic-data-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,73 @@ GArrowTime64DataType *garrow_time64_data_type_new (GArrowTimeUnit unit,
GError **error);


#define GARROW_TYPE_INTERVAL_DATA_TYPE (garrow_interval_data_type_get_type())
G_DECLARE_DERIVABLE_TYPE(GArrowIntervalDataType,
garrow_interval_data_type,
GARROW,
INTERVAL_DATA_TYPE,
GArrowTimeDataType)
struct _GArrowIntervalDataTypeClass
{
GArrowTimeDataTypeClass parent_class;
};

GARROW_AVAILABLE_IN_7_0
GArrowIntervalType
garrow_interval_data_type_get_interval_type(GArrowIntervalDataType *type);


#define GARROW_TYPE_MONTH_INTERVAL_DATA_TYPE \
(garrow_month_interval_data_type_get_type())
G_DECLARE_DERIVABLE_TYPE(GArrowMonthIntervalDataType,
garrow_month_interval_data_type,
GARROW,
MONTH_INTERVAL_DATA_TYPE,
GArrowIntervalDataType)
struct _GArrowMonthIntervalDataTypeClass
{
GArrowIntervalDataTypeClass parent_class;
};

GARROW_AVAILABLE_IN_7_0
GArrowMonthIntervalDataType *
garrow_month_interval_data_type_new(void);


#define GARROW_TYPE_DAY_TIME_INTERVAL_DATA_TYPE \
(garrow_day_time_interval_data_type_get_type())
G_DECLARE_DERIVABLE_TYPE(GArrowDayTimeIntervalDataType,
garrow_day_time_interval_data_type,
GARROW,
DAY_TIME_INTERVAL_DATA_TYPE,
GArrowIntervalDataType)
struct _GArrowDayTimeIntervalDataTypeClass
{
GArrowIntervalDataTypeClass parent_class;
};

GARROW_AVAILABLE_IN_7_0
GArrowDayTimeIntervalDataType *
garrow_day_time_interval_data_type_new(void);


#define GARROW_TYPE_MONTH_DAY_NANO_INTERVAL_DATA_TYPE \
(garrow_month_day_nano_interval_data_type_get_type())
G_DECLARE_DERIVABLE_TYPE(GArrowMonthDayNanoIntervalDataType,
garrow_month_day_nano_interval_data_type,
GARROW,
MONTH_DAY_NANO_INTERVAL_DATA_TYPE,
GArrowIntervalDataType)
struct _GArrowMonthDayNanoIntervalDataTypeClass
{
GArrowIntervalDataTypeClass parent_class;
};

GARROW_AVAILABLE_IN_7_0
GArrowMonthDayNanoIntervalDataType *
garrow_month_day_nano_interval_data_type_new(void);


#define GARROW_TYPE_DECIMAL_DATA_TYPE (garrow_decimal_data_type_get_type())
G_DECLARE_DERIVABLE_TYPE(GArrowDecimalDataType,
garrow_decimal_data_type,
Expand Down
45 changes: 33 additions & 12 deletions c_glib/arrow-glib/type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,8 @@ garrow_type_from_raw(arrow::Type::type type)
return GARROW_TYPE_DOUBLE;
case arrow::Type::type::STRING:
return GARROW_TYPE_STRING;
case arrow::Type::type::LARGE_STRING:
return GARROW_TYPE_LARGE_STRING;
case arrow::Type::type::BINARY:
return GARROW_TYPE_BINARY;
case arrow::Type::type::LARGE_BINARY:
return GARROW_TYPE_LARGE_BINARY;
case arrow::Type::type::FIXED_SIZE_BINARY:
return GARROW_TYPE_FIXED_SIZE_BINARY;
case arrow::Type::type::DATE32:
Expand All @@ -79,29 +75,39 @@ garrow_type_from_raw(arrow::Type::type type)
case arrow::Type::type::TIME64:
return GARROW_TYPE_TIME64;
case arrow::Type::type::INTERVAL_MONTHS:
return GARROW_TYPE_INTERVAL_MONTHS;
return GARROW_TYPE_MONTH_INTERVAL;
case arrow::Type::type::INTERVAL_DAY_TIME:
return GARROW_TYPE_INTERVAL_DAY_TIME;
return GARROW_TYPE_DAY_TIME_INTERVAL;
case arrow::Type::type::DECIMAL128:
return GARROW_TYPE_DECIMAL128;
case arrow::Type::type::DECIMAL256:
return GARROW_TYPE_DECIMAL256;
case arrow::Type::type::LIST:
return GARROW_TYPE_LIST;
case arrow::Type::type::LARGE_LIST:
return GARROW_TYPE_LARGE_LIST;
case arrow::Type::type::STRUCT:
return GARROW_TYPE_STRUCT;
case arrow::Type::type::MAP:
return GARROW_TYPE_MAP;
case arrow::Type::type::EXTENSION:
return GARROW_TYPE_EXTENSION;
case arrow::Type::type::SPARSE_UNION:
return GARROW_TYPE_SPARSE_UNION;
case arrow::Type::type::DENSE_UNION:
return GARROW_TYPE_DENSE_UNION;
case arrow::Type::type::DICTIONARY:
return GARROW_TYPE_DICTIONARY;
case arrow::Type::type::MAP:
return GARROW_TYPE_MAP;
case arrow::Type::type::EXTENSION:
return GARROW_TYPE_EXTENSION;
case arrow::Type::type::FIXED_SIZE_LIST:
return GARROW_TYPE_FIXED_SIZE_LIST;
case arrow::Type::type::DURATION:
return GARROW_TYPE_DURATION;
case arrow::Type::type::LARGE_STRING:
return GARROW_TYPE_LARGE_STRING;
case arrow::Type::type::LARGE_BINARY:
return GARROW_TYPE_LARGE_BINARY;
case arrow::Type::type::LARGE_LIST:
return GARROW_TYPE_LARGE_LIST;
case arrow::Type::type::INTERVAL_MONTH_DAY_NANO:
return GARROW_TYPE_MONTH_DAY_NANO_INTERVAL;
default:
return GARROW_TYPE_NA;
}
Expand Down Expand Up @@ -140,3 +146,18 @@ garrow_time_unit_to_raw(GArrowTimeUnit unit)
return arrow::TimeUnit::type::SECOND;
}
}

GArrowIntervalType
garrow_interval_type_from_raw(arrow::IntervalType::type type)
{
switch (type) {
case arrow::IntervalType::type::MONTHS:
return GARROW_INTERVAL_TYPE_MONTH;
case arrow::IntervalType::type::DAY_TIME:
return GARROW_INTERVAL_TYPE_DAY_TIME;
case arrow::IntervalType::type::MONTH_DAY_NANO:
return GARROW_INTERVAL_TYPE_MONTH_DAY_NANO;
default:
return GARROW_INTERVAL_TYPE_MONTH;
}
}
30 changes: 25 additions & 5 deletions c_glib/arrow-glib/type.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ G_BEGIN_DECLS
* Default unit millisecond.
* @GARROW_TYPE_TIME32: Exact time encoded with int32, supporting seconds or milliseconds
* @GARROW_TYPE_TIME64: Exact time encoded with int64, supporting micro- or nanoseconds
* @GARROW_TYPE_INTERVAL_MONTHS: YEAR_MONTH interval in SQL style.
* @GARROW_TYPE_INTERVAL_DAY_TIME: DAY_TIME interval in SQL style.
* @GARROW_TYPE_MONTH_INTERVAL: YEAR_MONTH interval in SQL style.
* @GARROW_TYPE_DAY_TIME_INTERVAL: DAY_TIME interval in SQL style.
* @GARROW_TYPE_DECIMAL128: Precision- and scale-based decimal
* type with 128-bit. Storage type depends on the parameters.
* @GARROW_TYPE_DECIMAL256: Precision- and scale-based decimal
Expand All @@ -67,6 +67,7 @@ G_BEGIN_DECLS
* @GARROW_TYPE_LARGE_STRING: 64bit offsets UTF-8 variable-length string.
* @GARROW_TYPE_LARGE_BINARY: 64bit offsets Variable-length bytes (no guarantee of UTF-8-ness).
* @GARROW_TYPE_LARGE_LIST: A list of some logical data type with 64-bit offsets.
* @GARROW_TYPE_MONTH_DAY_NANO_INTERVAL: MONTH_DAY_NANO interval in SQL style.
*
* They are corresponding to `arrow::Type::type` values.
*/
Expand All @@ -92,8 +93,8 @@ typedef enum {
GARROW_TYPE_TIMESTAMP,
GARROW_TYPE_TIME32,
GARROW_TYPE_TIME64,
GARROW_TYPE_INTERVAL_MONTHS,
GARROW_TYPE_INTERVAL_DAY_TIME,
GARROW_TYPE_MONTH_INTERVAL,
GARROW_TYPE_DAY_TIME_INTERVAL,
GARROW_TYPE_DECIMAL128,
GARROW_TYPE_DECIMAL256,
GARROW_TYPE_LIST,
Expand All @@ -107,7 +108,8 @@ typedef enum {
GARROW_TYPE_DURATION,
GARROW_TYPE_LARGE_STRING,
GARROW_TYPE_LARGE_BINARY,
GARROW_TYPE_LARGE_LIST
GARROW_TYPE_LARGE_LIST,
GARROW_TYPE_MONTH_DAY_NANO_INTERVAL,
} GArrowType;

/**
Expand All @@ -126,4 +128,22 @@ typedef enum {
GARROW_TIME_UNIT_NANO
} GArrowTimeUnit;

/**
* GArrowIntervalType:
* @GARROW_INTERVAL_TYPE_MONTH: A number of months.
* @GARROW_INTERVAL_TYPE_DAY_TIME: A number of days and
* milliseconds (fraction of day).
* @GARROW_INTERVAL_TYPE_MONTH_DAY_NANO: A number of months, days and
* nanoseconds between two dates.
*
* They are corresponding to `arrow::IntervalType::type` values.
*
* Since 7.0.0
*/
typedef enum {
GARROW_INTERVAL_TYPE_MONTH,
GARROW_INTERVAL_TYPE_DAY_TIME,
GARROW_INTERVAL_TYPE_MONTH_DAY_NANO,
} GArrowIntervalType;

G_END_DECLS
1 change: 1 addition & 0 deletions c_glib/arrow-glib/type.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@
GArrowType garrow_type_from_raw(arrow::Type::type type);
GArrowTimeUnit garrow_time_unit_from_raw(arrow::TimeUnit::type unit);
arrow::TimeUnit::type garrow_time_unit_to_raw(GArrowTimeUnit unit);
GArrowIntervalType garrow_interval_type_from_raw(arrow::IntervalType::type type);

0 comments on commit 6e20c6b

Please sign in to comment.