in python/subprojects/arrow-nanoarrow/src/nanoarrow/ipc/encoder.c [132:338]
static ArrowErrorCode ArrowIpcEncodeFieldType(flatcc_builder_t* builder,
const struct ArrowSchemaView* schema_view,
struct ArrowError* error) {
switch (schema_view->type) {
case NANOARROW_TYPE_NA:
FLATCC_RETURN_UNLESS_0(Field_type_Null_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_BOOL:
FLATCC_RETURN_UNLESS_0(Field_type_Bool_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_UINT8:
case NANOARROW_TYPE_INT8:
FLATCC_RETURN_UNLESS_0(
Field_type_Int_create(builder, 8, schema_view->type == NANOARROW_TYPE_INT8),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_UINT16:
case NANOARROW_TYPE_INT16:
FLATCC_RETURN_UNLESS_0(
Field_type_Int_create(builder, 16, schema_view->type == NANOARROW_TYPE_INT16),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_UINT32:
case NANOARROW_TYPE_INT32:
FLATCC_RETURN_UNLESS_0(
Field_type_Int_create(builder, 32, schema_view->type == NANOARROW_TYPE_INT32),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_UINT64:
case NANOARROW_TYPE_INT64:
FLATCC_RETURN_UNLESS_0(
Field_type_Int_create(builder, 64, schema_view->type == NANOARROW_TYPE_INT64),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_HALF_FLOAT:
FLATCC_RETURN_UNLESS_0(Field_type_FloatingPoint_create(builder, ns(Precision_HALF)),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_FLOAT:
FLATCC_RETURN_UNLESS_0(
Field_type_FloatingPoint_create(builder, ns(Precision_SINGLE)), error);
return NANOARROW_OK;
case NANOARROW_TYPE_DOUBLE:
FLATCC_RETURN_UNLESS_0(
Field_type_FloatingPoint_create(builder, ns(Precision_DOUBLE)), error);
return NANOARROW_OK;
case NANOARROW_TYPE_DECIMAL32:
case NANOARROW_TYPE_DECIMAL64:
case NANOARROW_TYPE_DECIMAL128:
case NANOARROW_TYPE_DECIMAL256:
FLATCC_RETURN_UNLESS_0(
Field_type_Decimal_create(builder, schema_view->decimal_precision,
schema_view->decimal_scale,
schema_view->decimal_bitwidth),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_STRING:
FLATCC_RETURN_UNLESS_0(Field_type_Utf8_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_LARGE_STRING:
FLATCC_RETURN_UNLESS_0(Field_type_LargeUtf8_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_BINARY:
FLATCC_RETURN_UNLESS_0(Field_type_Binary_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_LARGE_BINARY:
FLATCC_RETURN_UNLESS_0(Field_type_LargeBinary_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_DATE32:
FLATCC_RETURN_UNLESS_0(Field_type_Date_create(builder, ns(DateUnit_DAY)), error);
return NANOARROW_OK;
case NANOARROW_TYPE_DATE64:
FLATCC_RETURN_UNLESS_0(Field_type_Date_create(builder, ns(DateUnit_MILLISECOND)),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_INTERVAL_MONTHS:
FLATCC_RETURN_UNLESS_0(
Field_type_Interval_create(builder, ns(IntervalUnit_YEAR_MONTH)), error);
return NANOARROW_OK;
case NANOARROW_TYPE_INTERVAL_DAY_TIME:
FLATCC_RETURN_UNLESS_0(
Field_type_Interval_create(builder, ns(IntervalUnit_DAY_TIME)), error);
return NANOARROW_OK;
case NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO:
FLATCC_RETURN_UNLESS_0(
Field_type_Interval_create(builder, ns(IntervalUnit_MONTH_DAY_NANO)), error);
return NANOARROW_OK;
case NANOARROW_TYPE_TIMESTAMP:
FLATCC_RETURN_UNLESS_0(Field_type_Timestamp_start(builder), error);
FLATCC_RETURN_UNLESS_0(
Timestamp_unit_add(builder, (ns(TimeUnit_enum_t))schema_view->time_unit),
error);
if (schema_view->timezone && schema_view->timezone[0] != 0) {
FLATCC_RETURN_UNLESS_0(
Timestamp_timezone_create_str(builder, schema_view->timezone), error);
}
FLATCC_RETURN_UNLESS_0(Field_type_Timestamp_end(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_TIME32:
FLATCC_RETURN_UNLESS_0(
Field_type_Time_create(builder, (ns(TimeUnit_enum_t))schema_view->time_unit,
32),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_TIME64:
FLATCC_RETURN_UNLESS_0(
Field_type_Time_create(builder, (ns(TimeUnit_enum_t))schema_view->time_unit,
64),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_DURATION:
FLATCC_RETURN_UNLESS_0(Field_type_Duration_create(
builder, (ns(TimeUnit_enum_t))schema_view->time_unit),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_FIXED_SIZE_BINARY:
FLATCC_RETURN_UNLESS_0(
Field_type_FixedSizeBinary_create(builder, schema_view->fixed_size), error);
return NANOARROW_OK;
case NANOARROW_TYPE_LIST:
FLATCC_RETURN_UNLESS_0(Field_type_List_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_LARGE_LIST:
FLATCC_RETURN_UNLESS_0(Field_type_LargeList_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_FIXED_SIZE_LIST:
FLATCC_RETURN_UNLESS_0(
Field_type_FixedSizeList_create(builder, schema_view->fixed_size), error);
return NANOARROW_OK;
case NANOARROW_TYPE_RUN_END_ENCODED:
FLATCC_RETURN_UNLESS_0(Field_type_RunEndEncoded_create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_STRUCT:
FLATCC_RETURN_UNLESS_0(Field_type_Struct__create(builder), error);
return NANOARROW_OK;
case NANOARROW_TYPE_SPARSE_UNION:
case NANOARROW_TYPE_DENSE_UNION: {
FLATCC_RETURN_UNLESS_0(Field_type_Union_start(builder), error);
FLATCC_RETURN_UNLESS_0(
Union_mode_add(builder, schema_view->type == NANOARROW_TYPE_DENSE_UNION),
error);
if (schema_view->union_type_ids) {
int8_t type_ids[128];
int n = _ArrowParseUnionTypeIds(schema_view->union_type_ids, type_ids);
if (n != 0) {
FLATCC_RETURN_UNLESS_0(Union_typeIds_start(builder), error);
int32_t* type_ids_32 = (int32_t*)ns(Union_typeIds_extend(builder, n));
FLATCC_RETURN_IF_NULL(type_ids_32, error);
for (int i = 0; i < n; i++) {
type_ids_32[i] = type_ids[i];
}
FLATCC_RETURN_UNLESS_0(Union_typeIds_end(builder), error);
}
}
FLATCC_RETURN_UNLESS_0(Field_type_Union_end(builder), error);
return NANOARROW_OK;
}
case NANOARROW_TYPE_MAP:
FLATCC_RETURN_UNLESS_0(
Field_type_Map_create(builder,
schema_view->schema->flags & ARROW_FLAG_MAP_KEYS_SORTED),
error);
return NANOARROW_OK;
case NANOARROW_TYPE_DICTIONARY:
ArrowErrorSet(error, "IPC encoding of dictionary types unsupported");
return ENOTSUP;
default:
ArrowErrorSet(error, "Expected a valid enum ArrowType value but found %d",
schema_view->type);
return EINVAL;
}
}