void MaterializedArray::materialize(const shared_ptr<Query>& query, MemChunk& materializedChunk, ConstChunk const& chunk, MaterializeFormat format) { nMaterializedChunks += 1; materializedChunk.initialize(chunk); materializedChunk.setBitmapChunk((Chunk*)chunk.getBitmapChunk()); boost::shared_ptr<ConstChunkIterator> src = chunk.getConstIterator(ChunkIterator::IGNORE_DEFAULT_VALUES|ChunkIterator::IGNORE_EMPTY_CELLS| (chunk.isSolid() ? ChunkIterator::INTENDED_TILE_MODE : 0)); boost::shared_ptr<ChunkIterator> dst = materializedChunk.getIterator(query, (src->getMode() & ChunkIterator::TILE_MODE)|ChunkIterator::ChunkIterator::NO_EMPTY_CHECK|ChunkIterator::SEQUENTIAL_WRITE); size_t count = 0; while (!src->end()) { if (!dst->setPosition(src->getPosition())) throw SYSTEM_EXCEPTION(SCIDB_SE_MERGE, SCIDB_LE_OPERATION_FAILED) << "setPosition"; dst->writeItem(src->getItem()); count += 1; ++(*src); } if (!(src->getMode() & ChunkIterator::TILE_MODE) && !chunk.getArrayDesc().hasOverlap()) { materializedChunk.setCount(count); } dst->flush(); }
bool RemoteArray::proceedChunkMsg(AttributeID attId, MemChunk& chunk) { boost::shared_ptr<MessageDesc> chunkDesc = _messages[attId]; _messages[attId].reset(); StatisticsScope sScope(_statistics); boost::shared_ptr<scidb_msg::Chunk> chunkMsg = chunkDesc->getRecord<scidb_msg::Chunk>(); currentStatistics->receivedSize += chunkDesc->getMessageSize(); currentStatistics->receivedMessages++; if (!chunkMsg->eof()) { LOG4CXX_TRACE(logger, "RemoteArray received next chunk message"); assert(chunkDesc->getBinary()); const int compMethod = chunkMsg->compression_method(); const size_t decompressedSize = chunkMsg->decompressed_size(); Address firstElem; firstElem.attId = attId; firstElem.arrId = getArrayDesc().getId(); for (int i = 0; i < chunkMsg->coordinates_size(); i++) { firstElem.coords.push_back(chunkMsg->coordinates(i)); } chunk.initialize(this, &desc, firstElem, compMethod); chunk.setSparse(chunkMsg->sparse()); chunk.setCount(chunkMsg->count()); boost::shared_ptr<CompressedBuffer> compressedBuffer = dynamic_pointer_cast<CompressedBuffer>(chunkDesc->getBinary()); compressedBuffer->setCompressionMethod(compMethod); compressedBuffer->setDecompressedSize(decompressedSize); chunk.decompress(*compressedBuffer); LOG4CXX_TRACE(logger, "RemoteArray initializes next chunk"); requestNextChunk(attId); return true; } else { return false; } }