Skip to content

Commit

Permalink
Working read test with new ArrayView struct members
Browse files Browse the repository at this point in the history
  • Loading branch information
WillAyd committed Sep 5, 2024
1 parent bdb25ab commit 9d7e806
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 12 deletions.
51 changes: 43 additions & 8 deletions src/nanoarrow/common/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,10 @@ void ArrowArrayViewReset(struct ArrowArrayView* array_view) {
ArrowFree(array_view->union_type_id_map);
}

if (array_view->variadic_buffer_views != NULL) {
ArrowFree(array_view->variadic_buffer_views);
}

ArrowArrayViewInitFromType(array_view, NANOARROW_TYPE_UNINITIALIZED);
}

Expand Down Expand Up @@ -704,16 +708,13 @@ static int ArrowArrayViewSetArrayInternal(struct ArrowArrayView* array_view,
array_view->offset = array->offset;
array_view->length = array->length;
array_view->null_count = array->null_count;

const bool fixed_nbuffers = (array_view->storage_type == NANOARROW_TYPE_STRING_VIEW ||
array_view->storage_type == NANOARROW_TYPE_BINARY_VIEW)
? 0
: 1;
array_view->variadic_buffer_sizes = NULL;
array_view->variadic_buffer_views = NULL;
array_view->n_variadic_buffers = 0;

int64_t buffers_required = 0;
for (int i = 0; i < NANOARROW_MAX_FIXED_BUFFERS; i++) {
if (array_view->layout.buffer_type[i] == NANOARROW_BUFFER_TYPE_NONE &&
fixed_nbuffers) {
if (array_view->layout.buffer_type[i] == NANOARROW_BUFFER_TYPE_NONE) {
break;
}

Expand All @@ -730,7 +731,41 @@ static int ArrowArrayViewSetArrayInternal(struct ArrowArrayView* array_view,
}
}

if (buffers_required != array->n_buffers && fixed_nbuffers) {
if (array_view->storage_type == NANOARROW_TYPE_STRING_VIEW ||
array_view->storage_type == NANOARROW_TYPE_BINARY_VIEW) {
const int64_t n_buffers = array->n_buffers;
const int64_t n_fixed_buffers = 2;

int64_t n_variadic_buffers = n_buffers - n_fixed_buffers - 1;
// Theoretically if the variadic buffers are not used the above subtraction
// could yield a negative number
n_variadic_buffers = (n_variadic_buffers < 0) ? 0 : n_variadic_buffers;

array_view->n_variadic_buffers = n_variadic_buffers;
// TODO: check malloc failures
array_view->variadic_buffer_views =
ArrowMalloc(sizeof(struct ArrowBufferView) * n_variadic_buffers);

for (int64_t i = 0; i < n_variadic_buffers; ++i) {
++buffers_required;
array_view->variadic_buffer_views[i].data.data =
array->buffers[i + n_fixed_buffers];

// TODO: why do we need this?
// If non-null, set buffer size to unknown.
if (array->buffers[i + n_fixed_buffers] == NULL) {
array_view->variadic_buffer_views[i].size_bytes = 0;
} else {
array_view->variadic_buffer_views[i].size_bytes = -1;
}
}

// final buffer
++buffers_required;
array_view->variadic_buffer_sizes = (int64_t*)array->buffers[n_buffers - 1];
}

if (buffers_required != array->n_buffers) {
ArrowErrorSet(error,
"Expected array with %" PRId64 " buffer(s) but found %" PRId64
" buffer(s)",
Expand Down
9 changes: 5 additions & 4 deletions src/nanoarrow/common/inline_array.h
Original file line number Diff line number Diff line change
Expand Up @@ -1000,8 +1000,9 @@ static inline struct ArrowStringView ArrowArrayViewGetStringUnsafe(
view.data = value_view.as_char + idx +
sizeof(((union ArrowBinaryViewType*)0)->inlined.size);
} else {
const int32_t buf_index = bvt.ref.buffer_index + 2;
view.data = array_view->buffer_views[buf_index].data.as_char + bvt.ref.offset;
const int32_t buf_index = bvt.ref.buffer_index;
view.data =
array_view->variadic_buffer_views[buf_index].data.as_char + bvt.ref.offset;
}
break;
}
Expand Down Expand Up @@ -1051,8 +1052,8 @@ static inline struct ArrowBufferView ArrowArrayViewGetBytesUnsafe(
view.data.as_uint8 = value_view.as_uint8 + idx +
sizeof(((union ArrowBinaryViewType*)0)->inlined.size);
} else {
const int32_t buf_index = bvt.ref.buffer_index + 2;
view.data = array_view->buffer_views[buf_index].data;
const int32_t buf_index = bvt.ref.buffer_index;
view.data = array_view->variadic_buffer_views[buf_index].data;
}
break;
}
Expand Down
9 changes: 9 additions & 0 deletions src/nanoarrow/common/inline_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -815,6 +815,15 @@ struct ArrowArrayView {
/// type_id == union_type_id_map[128 + child_index]. This value may be
/// NULL in the case where child_id == type_id.
int8_t* union_type_id_map;

/// \brief Number of variadic buffers
int64_t n_variadic_buffers;

/// \brief Size of each variadic buffer
int64_t* variadic_buffer_sizes;

/// \brief Variadic buffer contents
struct ArrowBufferView* variadic_buffer_views;
};

// Used as the private data member for ArrowArrays allocated here and accessed
Expand Down
1 change: 1 addition & 0 deletions src/nanoarrow/testing/testing.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1940,6 +1940,7 @@ ArrowErrorCode SetArrayColumnBuffers(const json& value, ArrowArrayView* array_vi
}
break;
}
case NANOARROW_BUFFER_TYPE_DATA_VIEW: // TODO: doesn't seem right?
case NANOARROW_BUFFER_TYPE_NONE:
break;
}
Expand Down

0 comments on commit 9d7e806

Please sign in to comment.