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(); }
ConstChunk const& getChunk(AttributeID attr, size_t rowIndex) { _chunkAddress.coords[1] = _rowIndex -1; shared_ptr<Query> query = Query::getValidQueryPtr(_query); _chunk.initialize(this, &super::getArrayDesc(), _chunkAddress, 0); shared_ptr<ChunkIterator> chunkIt = _chunk.getIterator(query, ChunkIterator::SEQUENTIAL_WRITE | ChunkIterator::NO_EMPTY_CHECK); Value v; if(_buffer[_bufferSize-1] == _delimiter) //add the null-termination character; replace the last delimiter character if one is present { v.setSize(_bufferSize); char *d = (char*) v.data(); memcpy(d, _buffer, _bufferSize); d[_bufferSize-1] = 0; } else { v.setSize(_bufferSize+1); char *d = (char*) v.data(); memcpy(d, _buffer, _bufferSize); d[_bufferSize] = 0; } chunkIt->writeItem(v); chunkIt->flush(); return _chunk; }