Skip to content

Commit 166f463

Browse files
committed
Add GArrowListSliceOptions
1 parent 4127ca2 commit 166f463

File tree

4 files changed

+413
-0
lines changed

4 files changed

+413
-0
lines changed

c_glib/arrow-glib/compute.cpp

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,9 @@ G_BEGIN_DECLS
269269
* #GArrowExtractRegexOptions is a class to customize the `extract_regex`
270270
* function.
271271
*
272+
* #GArrowListSliceOptions is a class to customize the `list_slice`
273+
* function.
274+
*
272275
* There are many functions to compute data on an array.
273276
*/
274277

@@ -7091,6 +7094,215 @@ garrow_extract_regex_options_new(void)
70917094
return GARROW_EXTRACT_REGEX_OPTIONS(options);
70927095
}
70937096

7097+
enum {
7098+
PROP_LIST_SLICE_OPTIONS_START = 1,
7099+
PROP_LIST_SLICE_OPTIONS_STOP,
7100+
PROP_LIST_SLICE_OPTIONS_STEP,
7101+
PROP_LIST_SLICE_OPTIONS_RETURN_FIXED_SIZE_LIST,
7102+
};
7103+
7104+
G_DEFINE_TYPE(GArrowListSliceOptions,
7105+
garrow_list_slice_options,
7106+
GARROW_TYPE_FUNCTION_OPTIONS)
7107+
7108+
static void
7109+
garrow_list_slice_options_set_property(GObject *object,
7110+
guint prop_id,
7111+
const GValue *value,
7112+
GParamSpec *pspec)
7113+
{
7114+
auto options = garrow_list_slice_options_get_raw(GARROW_LIST_SLICE_OPTIONS(object));
7115+
7116+
switch (prop_id) {
7117+
case PROP_LIST_SLICE_OPTIONS_START:
7118+
options->start = g_value_get_int64(value);
7119+
break;
7120+
case PROP_LIST_SLICE_OPTIONS_STOP:
7121+
{
7122+
gint64 stop_value = g_value_get_int64(value);
7123+
if (stop_value == -1) {
7124+
options->stop = std::nullopt;
7125+
} else {
7126+
options->stop = stop_value;
7127+
}
7128+
}
7129+
break;
7130+
case PROP_LIST_SLICE_OPTIONS_STEP:
7131+
options->step = g_value_get_int64(value);
7132+
break;
7133+
case PROP_LIST_SLICE_OPTIONS_RETURN_FIXED_SIZE_LIST:
7134+
{
7135+
auto return_fixed_size_list_value =
7136+
static_cast<GArrowListSliceReturnFixedSizeList>(g_value_get_enum(value));
7137+
switch (return_fixed_size_list_value) {
7138+
case GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO:
7139+
options->return_fixed_size_list = std::nullopt;
7140+
break;
7141+
case GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_FALSE:
7142+
options->return_fixed_size_list = false;
7143+
break;
7144+
case GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_TRUE:
7145+
options->return_fixed_size_list = true;
7146+
break;
7147+
default:
7148+
options->return_fixed_size_list = std::nullopt;
7149+
break;
7150+
}
7151+
}
7152+
break;
7153+
default:
7154+
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
7155+
break;
7156+
}
7157+
}
7158+
7159+
static void
7160+
garrow_list_slice_options_get_property(GObject *object,
7161+
guint prop_id,
7162+
GValue *value,
7163+
GParamSpec *pspec)
7164+
{
7165+
auto options = garrow_list_slice_options_get_raw(GARROW_LIST_SLICE_OPTIONS(object));
7166+
7167+
switch (prop_id) {
7168+
case PROP_LIST_SLICE_OPTIONS_START:
7169+
g_value_set_int64(value, options->start);
7170+
break;
7171+
case PROP_LIST_SLICE_OPTIONS_STOP:
7172+
if (options->stop.has_value()) {
7173+
g_value_set_int64(value, options->stop.value());
7174+
} else {
7175+
g_value_set_int64(value, -1); // Sentinel value for "not set"
7176+
}
7177+
break;
7178+
case PROP_LIST_SLICE_OPTIONS_STEP:
7179+
g_value_set_int64(value, options->step);
7180+
break;
7181+
case PROP_LIST_SLICE_OPTIONS_RETURN_FIXED_SIZE_LIST:
7182+
if (options->return_fixed_size_list.has_value()) {
7183+
if (options->return_fixed_size_list.value()) {
7184+
g_value_set_enum(value, GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_TRUE);
7185+
} else {
7186+
g_value_set_enum(value, GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_FALSE);
7187+
}
7188+
} else {
7189+
// When not set (nullopt), return AUTO (default)
7190+
g_value_set_enum(value, GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO);
7191+
}
7192+
break;
7193+
default:
7194+
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
7195+
break;
7196+
}
7197+
}
7198+
7199+
static void
7200+
garrow_list_slice_options_init(GArrowListSliceOptions *object)
7201+
{
7202+
auto priv = GARROW_FUNCTION_OPTIONS_GET_PRIVATE(object);
7203+
priv->options = static_cast<arrow::compute::FunctionOptions *>(
7204+
new arrow::compute::ListSliceOptions());
7205+
}
7206+
7207+
static void
7208+
garrow_list_slice_options_class_init(GArrowListSliceOptionsClass *klass)
7209+
{
7210+
auto gobject_class = G_OBJECT_CLASS(klass);
7211+
7212+
gobject_class->set_property = garrow_list_slice_options_set_property;
7213+
gobject_class->get_property = garrow_list_slice_options_get_property;
7214+
7215+
arrow::compute::ListSliceOptions options;
7216+
7217+
GParamSpec *spec;
7218+
/**
7219+
* GArrowListSliceOptions:start:
7220+
*
7221+
* The start of list slicing.
7222+
*
7223+
* Since: 23.0.0
7224+
*/
7225+
spec = g_param_spec_int64("start",
7226+
"Start",
7227+
"The start of list slicing",
7228+
G_MININT64,
7229+
G_MAXINT64,
7230+
options.start,
7231+
static_cast<GParamFlags>(G_PARAM_READWRITE));
7232+
g_object_class_install_property(gobject_class, PROP_LIST_SLICE_OPTIONS_START, spec);
7233+
7234+
/**
7235+
* GArrowListSliceOptions:stop:
7236+
*
7237+
* Optional stop of list slicing. If not set (value is -1), then slice to end.
7238+
*
7239+
* Since: 23.0.0
7240+
*/
7241+
spec = g_param_spec_int64(
7242+
"stop",
7243+
"Stop",
7244+
"Optional stop of list slicing. If not set (value is -1), then slice to end",
7245+
-1, // Use -1 as sentinel for "not set"
7246+
G_MAXINT64,
7247+
-1, // Default to -1 (not set)
7248+
static_cast<GParamFlags>(G_PARAM_READWRITE));
7249+
g_object_class_install_property(gobject_class, PROP_LIST_SLICE_OPTIONS_STOP, spec);
7250+
7251+
/**
7252+
* GArrowListSliceOptions:step:
7253+
*
7254+
* Slicing step.
7255+
*
7256+
* Since: 23.0.0
7257+
*/
7258+
spec = g_param_spec_int64("step",
7259+
"Step",
7260+
"Slicing step",
7261+
G_MININT64,
7262+
G_MAXINT64,
7263+
options.step,
7264+
static_cast<GParamFlags>(G_PARAM_READWRITE));
7265+
g_object_class_install_property(gobject_class, PROP_LIST_SLICE_OPTIONS_STEP, spec);
7266+
7267+
/**
7268+
* GArrowListSliceOptions:return-fixed-size-list:
7269+
*
7270+
* Whether to return a FixedSizeListArray. If
7271+
* #GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_TRUE and stop is after a list element's
7272+
* length, nulls will be appended to create the requested slice size. If
7273+
* #GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO (default), will return whatever type
7274+
* it got in.
7275+
*
7276+
* Since: 23.0.0
7277+
*/
7278+
spec = g_param_spec_enum(
7279+
"return-fixed-size-list",
7280+
"Return fixed size list",
7281+
"Whether to return a FixedSizeListArray. If TRUE and stop is after a list element's "
7282+
"length, nulls will be appended to create the requested slice size. If AUTO "
7283+
"(default), will return whatever type it got in",
7284+
GARROW_TYPE_LIST_SLICE_RETURN_FIXED_SIZE_LIST,
7285+
GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO,
7286+
static_cast<GParamFlags>(G_PARAM_READWRITE));
7287+
g_object_class_install_property(gobject_class,
7288+
PROP_LIST_SLICE_OPTIONS_RETURN_FIXED_SIZE_LIST,
7289+
spec);
7290+
}
7291+
7292+
/**
7293+
* garrow_list_slice_options_new:
7294+
*
7295+
* Returns: A newly created #GArrowListSliceOptions.
7296+
*
7297+
* Since: 23.0.0
7298+
*/
7299+
GArrowListSliceOptions *
7300+
garrow_list_slice_options_new(void)
7301+
{
7302+
auto options = g_object_new(GARROW_TYPE_LIST_SLICE_OPTIONS, NULL);
7303+
return GARROW_LIST_SLICE_OPTIONS(options);
7304+
}
7305+
70947306
G_END_DECLS
70957307

70967308
arrow::Result<arrow::FieldRef>
@@ -7893,3 +8105,38 @@ garrow_extract_regex_options_get_raw(GArrowExtractRegexOptions *options)
78938105
return static_cast<arrow::compute::ExtractRegexOptions *>(
78948106
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
78958107
}
8108+
8109+
GArrowListSliceOptions *
8110+
garrow_list_slice_options_new_raw(const arrow::compute::ListSliceOptions *arrow_options)
8111+
{
8112+
gint64 stop_value = -1;
8113+
if (arrow_options->stop.has_value()) {
8114+
stop_value = arrow_options->stop.value();
8115+
}
8116+
GArrowListSliceReturnFixedSizeList return_fixed_size_list_value =
8117+
GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO;
8118+
if (arrow_options->return_fixed_size_list.has_value()) {
8119+
if (arrow_options->return_fixed_size_list.value()) {
8120+
return_fixed_size_list_value = GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_TRUE;
8121+
} else {
8122+
return_fixed_size_list_value = GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_FALSE;
8123+
}
8124+
}
8125+
return GARROW_LIST_SLICE_OPTIONS(g_object_new(GARROW_TYPE_LIST_SLICE_OPTIONS,
8126+
"start",
8127+
arrow_options->start,
8128+
"stop",
8129+
stop_value,
8130+
"step",
8131+
arrow_options->step,
8132+
"return-fixed-size-list",
8133+
return_fixed_size_list_value,
8134+
NULL));
8135+
}
8136+
8137+
arrow::compute::ListSliceOptions *
8138+
garrow_list_slice_options_get_raw(GArrowListSliceOptions *options)
8139+
{
8140+
return static_cast<arrow::compute::ListSliceOptions *>(
8141+
garrow_function_options_get_raw(GARROW_FUNCTION_OPTIONS(options)));
8142+
}

c_glib/arrow-glib/compute.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,4 +1272,41 @@ GARROW_AVAILABLE_IN_23_0
12721272
GArrowExtractRegexOptions *
12731273
garrow_extract_regex_options_new(void);
12741274

1275+
/**
1276+
* GArrowListSliceReturnFixedSizeList:
1277+
* @GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO: Return the same type which was passed
1278+
* in (default).
1279+
* @GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_FALSE: Explicitly return the same type which
1280+
* was passed in.
1281+
* @GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_TRUE: Return a FixedSizeListArray. If stop is
1282+
* after a list element's length, nulls will be appended to create the requested slice
1283+
* size.
1284+
*
1285+
* They correspond to the values of
1286+
* `std::optional<bool>` for `arrow::compute::ListSliceOptions::return_fixed_size_list`.
1287+
*
1288+
* Since: 23.0.0
1289+
*/
1290+
typedef enum {
1291+
GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_AUTO,
1292+
GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_FALSE,
1293+
GARROW_LIST_SLICE_RETURN_FIXED_SIZE_LIST_TRUE,
1294+
} GArrowListSliceReturnFixedSizeList;
1295+
1296+
#define GARROW_TYPE_LIST_SLICE_OPTIONS (garrow_list_slice_options_get_type())
1297+
GARROW_AVAILABLE_IN_23_0
1298+
G_DECLARE_DERIVABLE_TYPE(GArrowListSliceOptions,
1299+
garrow_list_slice_options,
1300+
GARROW,
1301+
LIST_SLICE_OPTIONS,
1302+
GArrowFunctionOptions)
1303+
struct _GArrowListSliceOptionsClass
1304+
{
1305+
GArrowFunctionOptionsClass parent_class;
1306+
};
1307+
1308+
GARROW_AVAILABLE_IN_23_0
1309+
GArrowListSliceOptions *
1310+
garrow_list_slice_options_new(void);
1311+
12751312
G_END_DECLS

c_glib/arrow-glib/compute.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,8 @@ garrow_extract_regex_options_new_raw(
209209
const arrow::compute::ExtractRegexOptions *arrow_options);
210210
arrow::compute::ExtractRegexOptions *
211211
garrow_extract_regex_options_get_raw(GArrowExtractRegexOptions *options);
212+
213+
GArrowListSliceOptions *
214+
garrow_list_slice_options_new_raw(const arrow::compute::ListSliceOptions *arrow_options);
215+
arrow::compute::ListSliceOptions *
216+
garrow_list_slice_options_get_raw(GArrowListSliceOptions *options);

0 commit comments

Comments
 (0)