| 234 | } |
| 235 | |
| 236 | void ListChunkData::write(ColumnChunkData* chunk, ColumnChunkData* dstOffsets, RelMultiplicity) { |
| 237 | DASSERT(chunk->getDataType().getPhysicalType() == dataType.getPhysicalType() && |
| 238 | dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && |
| 239 | chunk->getNumValues() == dstOffsets->getNumValues()); |
| 240 | checkOffsetSortedAsc = true; |
| 241 | offset_t currentIndex = dataColumnChunk->getNumValues(); |
| 242 | auto& otherListChunk = chunk->cast<ListChunkData>(); |
| 243 | dataColumnChunk->resize( |
| 244 | dataColumnChunk->getNumValues() + otherListChunk.dataColumnChunk->getNumValues()); |
| 245 | dataColumnChunk->append(otherListChunk.dataColumnChunk.get(), 0, |
| 246 | otherListChunk.dataColumnChunk->getNumValues()); |
| 247 | offset_t maxDstOffset = 0; |
| 248 | for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { |
| 249 | auto posInChunk = dstOffsets->getValue<offset_t>(i); |
| 250 | if (posInChunk > maxDstOffset) { |
| 251 | maxDstOffset = posInChunk; |
| 252 | } |
| 253 | } |
| 254 | while (maxDstOffset >= numValues) { |
| 255 | appendNullList(); |
| 256 | } |
| 257 | for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { |
| 258 | auto posInChunk = dstOffsets->getValue<offset_t>(i); |
| 259 | auto appendSize = otherListChunk.getListSize(i); |
| 260 | currentIndex += appendSize; |
| 261 | nullData->setNull(posInChunk, otherListChunk.nullData->isNull(i)); |
| 262 | setOffsetChunkValue(currentIndex, posInChunk); |
| 263 | sizeColumnChunk->setValue<list_size_t>(appendSize, posInChunk); |
| 264 | } |
| 265 | DASSERT(sanityCheck()); |
| 266 | } |
| 267 | |
| 268 | void ListChunkData::write(const ValueVector* vector, offset_t offsetInVector, |
| 269 | offset_t offsetInChunk) { |
nothing calls this directly
no test coverage detected