| 500 | } |
| 501 | |
| 502 | void readDictionaryVector( |
| 503 | ByteInputStream* source, |
| 504 | const TypePtr& type, |
| 505 | bolt::memory::MemoryPool* pool, |
| 506 | VectorPtr& result, |
| 507 | vector_size_t resultOffset, |
| 508 | bool useLosslessTimestamp) { |
| 509 | const auto size = source->read<int32_t>(); |
| 510 | |
| 511 | std::vector<TypePtr> childTypes = {type}; |
| 512 | std::vector<VectorPtr> children{BaseVector::create(type, 0, pool)}; |
| 513 | readColumns(source, pool, childTypes, children, 0, useLosslessTimestamp); |
| 514 | |
| 515 | // Read indices. |
| 516 | BufferPtr indices = allocateIndices(size, pool); |
| 517 | source->readBytes(indices->asMutable<char>(), size * sizeof(int32_t)); |
| 518 | |
| 519 | // Skip 3 * 8 bytes of 'instance id'. Bolt doesn't use 'instance id' for |
| 520 | // dictionary vectors. |
| 521 | source->skip(24); |
| 522 | |
| 523 | auto dictionaryVector = |
| 524 | BaseVector::wrapInDictionary(nullptr, indices, size, children[0]); |
| 525 | if (resultOffset == 0) { |
| 526 | result = std::move(dictionaryVector); |
| 527 | } else { |
| 528 | result->resize(resultOffset + size); |
| 529 | |
| 530 | SelectivityVector rows(resultOffset + size, false); |
| 531 | rows.setValidRange(resultOffset, resultOffset + size, true); |
| 532 | rows.updateBounds(); |
| 533 | |
| 534 | BaseVector::ensureWritable(rows, type, pool, result); |
| 535 | result->copy(dictionaryVector.get(), resultOffset, 0, size); |
| 536 | } |
| 537 | } |
| 538 | |
| 539 | void readArrayVector( |
| 540 | ByteInputStream* source, |
no test coverage detected