MCPcopy Create free account
hub / github.com/apache/arrow / Deserialize

Method Deserialize

cpp/src/parquet/bloom_filter.cc:288–353  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

286}
287
288BlockSplitBloomFilter BlockSplitBloomFilter::Deserialize(
289 const ReaderProperties& properties, ArrowInputStream* input,
290 std::optional<int64_t> bloom_filter_length) {
291 ThriftDeserializer deserializer(properties);
292 format::BloomFilterHeader header;
293 int64_t bloom_filter_header_read_size = 0;
294 if (bloom_filter_length.has_value()) {
295 bloom_filter_header_read_size = bloom_filter_length.value();
296 } else {
297 // NOTE: we don't know the bloom filter header size upfront without
298 // bloom_filter_length, and we can't rely on InputStream::Peek() which isn't always
299 // implemented. Therefore, we must first Read() with an upper bound estimate of the
300 // header size, then once we know the bloom filter data size, we can Read() the exact
301 // number of remaining data bytes.
302 bloom_filter_header_read_size = kBloomFilterHeaderSizeGuess;
303 }
304
305 // Read and deserialize bloom filter header
306 PARQUET_ASSIGN_OR_THROW(auto header_buf, input->Read(bloom_filter_header_read_size));
307 // This gets used, then set by DeserializeThriftMsg
308 uint32_t header_size = static_cast<uint32_t>(header_buf->size());
309 try {
310 deserializer.DeserializeMessage(header_buf->data(), &header_size, &header);
311 DCHECK_LE(header_size, header_buf->size());
312 } catch (std::exception& e) {
313 std::stringstream ss;
314 ss << "Deserializing bloom filter header failed.\n" << e.what();
315 throw ParquetException(ss.str());
316 }
317 PARQUET_THROW_NOT_OK(ValidateBloomFilterHeader(header));
318
319 const int32_t bloom_filter_size = header.numBytes;
320 if (bloom_filter_size + header_size <= header_buf->size()) {
321 // The bloom filter data is entirely contained in the buffer we just read
322 // => just return it.
323 BlockSplitBloomFilter bloom_filter(properties.memory_pool());
324 bloom_filter.Init(header_buf->data() + header_size, bloom_filter_size);
325 return bloom_filter;
326 }
327 if (bloom_filter_length && *bloom_filter_length != bloom_filter_size + header_size) {
328 // We know the bloom filter data size, but the real size is different.
329 std::stringstream ss;
330 ss << "Bloom filter length (" << bloom_filter_length.value()
331 << ") does not match the actual bloom filter (size: "
332 << bloom_filter_size + header_size << ").";
333 throw ParquetException(ss.str());
334 }
335 // We have read a part of the bloom filter already, copy it to the target buffer
336 // and read the remaining part from the InputStream.
337 auto buffer = AllocateBuffer(properties.memory_pool(), bloom_filter_size);
338
339 const auto bloom_filter_bytes_in_header = header_buf->size() - header_size;
340 if (bloom_filter_bytes_in_header > 0) {
341 std::memcpy(buffer->mutable_data(), header_buf->data() + header_size,
342 static_cast<size_t>(bloom_filter_bytes_in_header));
343 }
344
345 const auto required_read_size = bloom_filter_size - bloom_filter_bytes_in_header;

Callers 2

GroupToStructFunction · 0.45

Calls 13

ParquetExceptionFunction · 0.85
DeserializeMessageMethod · 0.80
strMethod · 0.80
AllocateBufferFunction · 0.70
valueMethod · 0.45
sizeMethod · 0.45
dataMethod · 0.45
whatMethod · 0.45
memory_poolMethod · 0.45
InitMethod · 0.45

Tested by

no test coverage detected