Skip to content

Commit 8eb77e0

Browse files
committed
fix for nested data frame
1 parent 2d383bf commit 8eb77e0

File tree

3 files changed

+32
-18
lines changed

3 files changed

+32
-18
lines changed

r/src/convert.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -414,11 +414,7 @@ int nanoarrow_converter_finalize(SEXP converter_xptr) {
414414
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
415415
SEXP current_result = VECTOR_ELT(converter_shelter, 4);
416416

417-
// Materialize never called (e.g., empty stream)
418-
if (current_result == R_NilValue) {
419-
NANOARROW_RETURN_NOT_OK(nanoarrow_converter_reserve(converter_xptr, 0));
420-
current_result = VECTOR_ELT(converter_shelter, 4);
421-
}
417+
NANOARROW_RETURN_NOT_OK(nanoarrow_materialize_finalize_result(converter_xptr));
422418

423419
// Check result size. A future implementation could also shrink the length
424420
// or reallocate a shorter vector.
@@ -443,19 +439,15 @@ SEXP nanoarrow_converter_release_result(SEXP converter_xptr) {
443439
SEXP result = PROTECT(VECTOR_ELT(converter_shelter, 4));
444440
SET_VECTOR_ELT(converter_shelter, 4, R_NilValue);
445441

446-
// Perform any finalization on the vector before it is returned to R
447-
SEXP final_result =
448-
PROTECT(nanoarrow_materialize_finalize_result(converter_xptr, result));
449-
450442
// Reset the converter state
451443
converter->dst.vec_sexp = R_NilValue;
452444
converter->dst.offset = 0;
453445
converter->dst.length = 0;
454446
converter->size = 0;
455447
converter->capacity = 0;
456448

457-
UNPROTECT(2);
458-
return final_result;
449+
UNPROTECT(1);
450+
return result;
459451
}
460452

461453
void nanoarrow_converter_stop(SEXP converter_xptr) {

r/src/materialize.c

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -299,12 +299,21 @@ static void copy_vec_into(SEXP x, SEXP dst, R_xlen_t offset, R_xlen_t len) {
299299
}
300300
}
301301

302-
SEXP nanoarrow_materialize_finalize_result(SEXP converter_xptr, SEXP result) {
303-
if (Rf_inherits(result, "nanoarrow_vctr")) {
302+
int nanoarrow_materialize_finalize_result(SEXP converter_xptr) {
303+
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
304+
SEXP result = VECTOR_ELT(converter_shelter, 4);
305+
306+
// Materialize never called (e.g., empty stream)
307+
if (result == R_NilValue) {
308+
NANOARROW_RETURN_NOT_OK(nanoarrow_converter_reserve(converter_xptr, 0));
309+
result = VECTOR_ELT(converter_shelter, 4);
310+
}
311+
312+
if (nanoarrow_ptype_is_nanoarrow_vctr(result)) {
304313
// Get the schema for this converter. Technically this will overwrite
305314
// a schema that was provided explicitly; however, we currently do not
306315
// handle that case.
307-
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
316+
308317
SEXP schema_xptr = VECTOR_ELT(converter_shelter, 1);
309318

310319
// We no longer need to keep track of chunks_tail
@@ -333,11 +342,24 @@ SEXP nanoarrow_materialize_finalize_result(SEXP converter_xptr, SEXP result) {
333342
Rf_lang4(new_nanoarrow_vctr_sym, chunks_list, schema_xptr, subclass_sexp));
334343
SEXP final_result = PROTECT(Rf_eval(new_nanoarrow_vctr_call, nanoarrow_ns_pkg));
335344

345+
SET_VECTOR_ELT(converter_shelter, 4, final_result);
336346
UNPROTECT(6);
337-
return final_result;
338-
} else {
339-
return result;
347+
} else if (nanoarrow_ptype_is_data_frame(result)) {
348+
// For each child, finalize the result and then reassign it
349+
SEXP child_converter_xptrs = VECTOR_ELT(converter_shelter, 3);
350+
for (R_xlen_t i = 0; i < Rf_xlength(child_converter_xptrs); i++) {
351+
SEXP child_converter_xptr = VECTOR_ELT(child_converter_xptrs, i);
352+
NANOARROW_RETURN_NOT_OK(
353+
nanoarrow_materialize_finalize_result(child_converter_xptr));
354+
355+
SEXP child_result =
356+
PROTECT(nanoarrow_converter_release_result(child_converter_xptr));
357+
SET_VECTOR_ELT(result, i, child_result);
358+
UNPROTECT(1);
359+
}
340360
}
361+
362+
return NANOARROW_OK;
341363
}
342364

343365
static int nanoarrow_materialize_nanoarrow_vctr(struct RConverter* converter,

r/src/materialize.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ SEXP nanoarrow_materialize_realloc(SEXP ptype, R_xlen_t len);
4444

4545
// Finalize an object before returning to R. Currently only used for
4646
// nanoarrow_vctr conversion.
47-
SEXP nanoarrow_materialize_finalize_result(SEXP converter_xptr, SEXP result);
47+
int nanoarrow_materialize_finalize_result(SEXP converter_xptr);
4848

4949
#endif

0 commit comments

Comments
 (0)