paleolimbot commented on code in PR #82:
URL: https://github.com/apache/arrow-nanoarrow/pull/82#discussion_r1042232318


##########
src/nanoarrow/array_inline.h:
##########
@@ -440,6 +473,51 @@ static inline ArrowErrorCode 
ArrowArrayFinishElement(struct ArrowArray* array) {
   return NANOARROW_OK;
 }
 
+static inline ArrowErrorCode ArrowArrayFinishUnionElement(struct ArrowArray* 
array,
+                                                          int32_t type_id) {
+  struct ArrowArrayPrivateData* private_data =
+      (struct ArrowArrayPrivateData*)array->private_data;
+
+  // Currently this assumes type_ids == child index
+  int64_t child_index = type_id;
+  if (child_index < 0 || child_index >= array->n_children) {
+    return EINVAL;
+  }
+
+  switch (private_data->storage_type) {
+    case NANOARROW_TYPE_DENSE_UNION:
+      // Apppend the target child length to the union offsets buffer
+      _NANOARROW_CHECK_RANGE(array->children[child_index]->length, 0, 
INT32_MAX);
+      NANOARROW_RETURN_NOT_OK(ArrowBufferAppendInt32(
+          ArrowArrayBuffer(array, 1), 
(int32_t)array->children[child_index]->length - 1));
+      break;
+    case NANOARROW_TYPE_SPARSE_UNION:
+      // Append one null any non-target column that isn't already the right 
length
+      // or abort if appending a null will result in a column with invalid 
length
+      for (int64_t i = 0; i < array->n_children; i++) {
+        if (i == child_index || array->children[i]->length == (array->length + 
1)) {
+          continue;
+        }
+
+        if (array->children[i]->length != array->length) {
+          return EINVAL;
+        }
+
+        NANOARROW_RETURN_NOT_OK(ArrowArrayAppendEmpty(array->children[i], 1));

Review Comment:
   Maybe because an empty will result in fewer validity buffers getting 
allocated? The flip side of that is that reinterpreting the dense union as a 
struct is easier if the irrelevant values are already flagged as null. I'm 
happy to defer to whatever you think is best...the SparseUnionBuilder doesn't 
give any hints as to which is better.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to