| 417 | } |
| 418 | |
| 419 | shared_ptr<Attribute> attribute_from_capnp( |
| 420 | const capnp::Attribute::Reader& attribute_reader) { |
| 421 | // Get datatype |
| 422 | Datatype datatype = datatype_enum(attribute_reader.getType()); |
| 423 | |
| 424 | // Set nullable |
| 425 | const bool nullable = attribute_reader.getNullable(); |
| 426 | |
| 427 | // Get data order |
| 428 | auto data_order = attribute_reader.hasOrder() ? |
| 429 | data_order_from_str(attribute_reader.getOrder()) : |
| 430 | DataOrder::UNORDERED_DATA; |
| 431 | |
| 432 | // Filter pipelines |
| 433 | shared_ptr<FilterPipeline> filters{}; |
| 434 | if (attribute_reader.hasFilterPipeline()) { |
| 435 | auto filter_pipeline_reader = attribute_reader.getFilterPipeline(); |
| 436 | auto&& [st_fp, f]{ |
| 437 | filter_pipeline_from_capnp(filter_pipeline_reader, datatype)}; |
| 438 | throw_if_not_ok(st_fp); |
| 439 | filters = f.value(); |
| 440 | } else { |
| 441 | filters = make_shared<FilterPipeline>(HERE()); |
| 442 | } |
| 443 | |
| 444 | // Fill value |
| 445 | ByteVecValue fill_value_vec; |
| 446 | uint8_t fill_value_validity = 0; |
| 447 | if (attribute_reader.hasFillValue()) { |
| 448 | // To initialize the ByteVecValue object, we do so by instantiating a |
| 449 | // vector of type uint8_t that points to the data stored in the byte |
| 450 | // vector. |
| 451 | auto capnp_byte_vec = attribute_reader.getFillValue().asBytes(); |
| 452 | auto vec_ptr = capnp_byte_vec.begin(); |
| 453 | std::vector<uint8_t> byte_vec(vec_ptr, vec_ptr + capnp_byte_vec.size()); |
| 454 | fill_value_vec = ByteVecValue(move(byte_vec)); |
| 455 | if (nullable) { |
| 456 | fill_value_validity = attribute_reader.getFillValueValidity(); |
| 457 | } |
| 458 | } else { |
| 459 | // default initialization |
| 460 | fill_value_vec = Attribute::default_fill_value( |
| 461 | datatype, attribute_reader.getCellValNum()); |
| 462 | } |
| 463 | |
| 464 | std::optional<std::string> enmr_name; |
| 465 | if (attribute_reader.hasEnumerationName()) { |
| 466 | enmr_name = attribute_reader.getEnumerationName(); |
| 467 | } |
| 468 | |
| 469 | return tiledb::common::make_shared<Attribute>( |
| 470 | HERE(), |
| 471 | attribute_reader.getName(), |
| 472 | datatype, |
| 473 | nullable, |
| 474 | attribute_reader.getCellValNum(), |
| 475 | *(filters.get()), |
| 476 | fill_value_vec, |
no test coverage detected