in src/nanoarrow/array.c [537:597]
ArrowErrorCode ArrowArrayViewInitFromSchema(struct ArrowArrayView* array_view,
struct ArrowSchema* schema,
struct ArrowError* error) {
struct ArrowSchemaView schema_view;
int result = ArrowSchemaViewInit(&schema_view, schema, error);
if (result != NANOARROW_OK) {
return result;
}
ArrowArrayViewInitFromType(array_view, schema_view.storage_type);
array_view->layout = schema_view.layout;
result = ArrowArrayViewAllocateChildren(array_view, schema->n_children);
if (result != NANOARROW_OK) {
ArrowErrorSet(error, "ArrowArrayViewAllocateChildren() failed");
ArrowArrayViewReset(array_view);
return result;
}
for (int64_t i = 0; i < schema->n_children; i++) {
result =
ArrowArrayViewInitFromSchema(array_view->children[i], schema->children[i], error);
if (result != NANOARROW_OK) {
ArrowArrayViewReset(array_view);
return result;
}
}
if (schema->dictionary != NULL) {
result = ArrowArrayViewAllocateDictionary(array_view);
if (result != NANOARROW_OK) {
ArrowArrayViewReset(array_view);
return result;
}
result =
ArrowArrayViewInitFromSchema(array_view->dictionary, schema->dictionary, error);
if (result != NANOARROW_OK) {
ArrowArrayViewReset(array_view);
return result;
}
}
if (array_view->storage_type == NANOARROW_TYPE_SPARSE_UNION ||
array_view->storage_type == NANOARROW_TYPE_DENSE_UNION) {
array_view->union_type_id_map = (int8_t*)ArrowMalloc(256 * sizeof(int8_t));
if (array_view->union_type_id_map == NULL) {
return ENOMEM;
}
memset(array_view->union_type_id_map, -1, 256);
int8_t n_type_ids = _ArrowParseUnionTypeIds(schema_view.union_type_ids,
array_view->union_type_id_map + 128);
for (int8_t child_index = 0; child_index < n_type_ids; child_index++) {
int8_t type_id = array_view->union_type_id_map[128 + child_index];
array_view->union_type_id_map[type_id] = child_index;
}
}
return NANOARROW_OK;
}