Appending null is slightly tricky since null count is stored inline for builders of Kind::kNull. Append nulls using this helper
| 530 | /// Appending null is slightly tricky since null count is stored inline |
| 531 | /// for builders of Kind::kNull. Append nulls using this helper |
| 532 | Status AppendNull(BuilderPtr parent, int field_index, BuilderPtr builder) { |
| 533 | if (ARROW_PREDICT_FALSE(!builder.nullable)) { |
| 534 | return ParseError("a required field was null"); |
| 535 | } |
| 536 | switch (builder.kind) { |
| 537 | case Kind::kNull: { |
| 538 | DCHECK_EQ(builder, parent.kind == Kind::kArray |
| 539 | ? Cast<Kind::kArray>(parent)->value_builder() |
| 540 | : Cast<Kind::kObject>(parent)->field_builder(field_index)); |
| 541 | |
| 542 | // increment null count stored inline |
| 543 | builder.index += 1; |
| 544 | |
| 545 | // update the parent, since changing builder doesn't affect parent |
| 546 | if (parent.kind == Kind::kArray) { |
| 547 | Cast<Kind::kArray>(parent)->value_builder(builder); |
| 548 | } else { |
| 549 | Cast<Kind::kObject>(parent)->field_builder(field_index, builder); |
| 550 | } |
| 551 | return Status::OK(); |
| 552 | } |
| 553 | case Kind::kBoolean: |
| 554 | return Cast<Kind::kBoolean>(builder)->AppendNull(); |
| 555 | |
| 556 | case Kind::kNumber: |
| 557 | return Cast<Kind::kNumber>(builder)->AppendNull(); |
| 558 | |
| 559 | case Kind::kString: |
| 560 | return Cast<Kind::kString>(builder)->AppendNull(); |
| 561 | |
| 562 | case Kind::kNumberOrString: { |
| 563 | return Cast<Kind::kNumberOrString>(builder)->AppendNull(); |
| 564 | } |
| 565 | |
| 566 | case Kind::kArray: |
| 567 | return Cast<Kind::kArray>(builder)->AppendNull(); |
| 568 | |
| 569 | case Kind::kObject: { |
| 570 | auto struct_builder = Cast<Kind::kObject>(builder); |
| 571 | RETURN_NOT_OK(struct_builder->AppendNull()); |
| 572 | |
| 573 | for (int i = 0; i < struct_builder->num_fields(); ++i) { |
| 574 | auto field_builder = struct_builder->field_builder(i); |
| 575 | RETURN_NOT_OK(AppendNull(builder, i, field_builder)); |
| 576 | } |
| 577 | return Status::OK(); |
| 578 | } |
| 579 | |
| 580 | default: |
| 581 | return Status::NotImplemented("invalid builder Kind"); |
| 582 | } |
| 583 | } |
| 584 | |
| 585 | Status Finish(const std::shared_ptr<Array>& scalar_values, BuilderPtr builder, |
| 586 | std::shared_ptr<Array>* out) { |
nothing calls this directly
no test coverage detected