From 441016cf257920aa4cac64185043cf06c071140d Mon Sep 17 00:00:00 2001 From: Annanay Agarwal Date: Mon, 27 Jun 2022 21:18:10 +0530 Subject: [PATCH] Use interface cast-check to set metadata offsets in reader Signed-off-by: Annanay Agarwal --- bloom/filter.go | 7 ++++++- file.go | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/bloom/filter.go b/bloom/filter.go index f4699b96..33091091 100644 --- a/bloom/filter.go +++ b/bloom/filter.go @@ -86,7 +86,12 @@ func CheckSplitBlock(r io.ReaderAt, n int64, x uint64) (bool, error) { block := acquireBlock() defer releaseBlock(block) offset := BlockSize * fasthash1x64(x, int32(n/BlockSize)) - _, err := r.ReadAt(block.Bytes(), int64(offset)) + + buf := block.Bytes() + if cast, ok := r.(interface{ SetBloomFilterSection(offset, length int64) }); ok { + cast.SetBloomFilterSection(int64(offset), int64(len(buf))) + } + _, err := r.ReadAt(buf, int64(offset)) return block.Check(uint32(x)), err } diff --git a/file.go b/file.go index 0302b269..454e43e1 100644 --- a/file.go +++ b/file.go @@ -47,6 +47,9 @@ func OpenFile(r io.ReaderAt, size int64, options ...FileOption) (*File, error) { return nil, err } + if cast, ok := f.reader.(interface{ SetMagicHeaderSection(offset, length int64) }); ok { + cast.SetMagicHeaderSection(0, 4) + } if _, err := r.ReadAt(b[:4], 0); err != nil { return nil, fmt.Errorf("reading magic header of parquet file: %w", err) } @@ -54,6 +57,9 @@ func OpenFile(r io.ReaderAt, size int64, options ...FileOption) (*File, error) { return nil, fmt.Errorf("invalid magic header of parquet file: %q", b[:4]) } + if cast, ok := f.reader.(interface{ SetMagicFooterSection(offset, length int64) }); ok { + cast.SetMagicFooterSection(size-8, 8) + } if _, err := r.ReadAt(b[:8], size-8); err != nil { return nil, fmt.Errorf("reading magic footer of parquet file: %w", err) } @@ -64,6 +70,9 @@ func OpenFile(r io.ReaderAt, size int64, options ...FileOption) (*File, error) { footerSize := int64(binary.LittleEndian.Uint32(b[:4])) footerData := make([]byte, footerSize) + if cast, ok := f.reader.(interface{ SetFooterSection(offset, length int64) }); ok { + cast.SetFooterSection(size-(footerSize+8), footerSize) + } if _, err := f.reader.ReadAt(footerData, size-(footerSize+8)); err != nil { return nil, fmt.Errorf("reading footer of parquet file: %w", err) } @@ -192,6 +201,9 @@ func (f *File) ReadPageIndex() ([]format.ColumnIndex, []format.OffsetIndex, erro if columnIndexOffset > 0 { columnIndexData := indexBuffer[:columnIndexLength] + if cast, ok := f.reader.(interface{ SetColumnIndexSection(offset, length int64) }); ok { + cast.SetColumnIndexSection(columnIndexOffset, columnIndexLength) + } if _, err := f.reader.ReadAt(columnIndexData, columnIndexOffset); err != nil { return nil, nil, fmt.Errorf("reading %d bytes column index at offset %d: %w", columnIndexLength, columnIndexOffset, err) } @@ -213,6 +225,9 @@ func (f *File) ReadPageIndex() ([]format.ColumnIndex, []format.OffsetIndex, erro if offsetIndexOffset > 0 { offsetIndexData := indexBuffer[:offsetIndexLength] + if cast, ok := f.reader.(interface{ SetOffsetIndexSection(offset, length int64) }); ok { + cast.SetOffsetIndexSection(offsetIndexOffset, offsetIndexLength) + } if _, err := f.reader.ReadAt(offsetIndexData, offsetIndexOffset); err != nil { return nil, nil, fmt.Errorf("reading %d bytes offset index at offset %d: %w", offsetIndexLength, offsetIndexOffset, err) }