Skip to content
Closed
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
cc6dd14
update
XiangpengHao Sep 4, 2024
5837fc7
update
XiangpengHao Dec 22, 2024
fec6313
update
XiangpengHao Dec 28, 2024
948db87
update
XiangpengHao Dec 29, 2024
8c50d90
poc reader
XiangpengHao Dec 30, 2024
f5422ce
update
XiangpengHao Dec 31, 2024
dfdc1b6
avoid recreating new buffers
XiangpengHao Dec 31, 2024
3c526f8
update
XiangpengHao Dec 31, 2024
53f5fad
bug fix
XiangpengHao Dec 31, 2024
56980de
selective cache
XiangpengHao Jan 1, 2025
4dd1b6b
clean up changes
XiangpengHao Jan 1, 2025
f8f983e
clean up more and format
XiangpengHao Jan 1, 2025
882aaf1
cleanup and add docs
XiangpengHao Jan 1, 2025
c8bdbcf
switch to mutex instead of rwlock
XiangpengHao Jan 2, 2025
cdb1d85
revert irrelevant changes
XiangpengHao Jan 2, 2025
69720e5
submodule
XiangpengHao Jan 3, 2025
a9550ab
update
XiangpengHao Jan 3, 2025
be1435f
rebase
XiangpengHao Jan 6, 2025
e4d9eb7
Merge remote-tracking branch 'upstream/main' into better-decoder
XiangpengHao Jan 8, 2025
21e015b
remove unrelated changes
XiangpengHao Jan 8, 2025
bbc3595
Merge remote-tracking branch 'upstream/main' into better-decoder
XiangpengHao Jan 10, 2025
547fb46
fix clippy
XiangpengHao Jan 10, 2025
05c8c8f
make various ci improvements
XiangpengHao Jan 10, 2025
314fda1
Merge remote-tracking branch 'apache/main' into better-decoder
alamb Mar 21, 2025
c895dd2
whitespace
alamb Mar 21, 2025
3cf0a98
Reduce some ugliness, avoid unwrap
alamb Mar 21, 2025
7b72f9d
more factory
alamb Mar 21, 2025
5bdf51a
lint
alamb Mar 22, 2025
a77e1e7
Merge remote-tracking branch 'apache/main' into better-decoder
alamb Mar 26, 2025
90a55d5
Isolate reader cache more
alamb Mar 26, 2025
9ffa81c
Merge remote-tracking branch 'apache/main' into better-decoder
alamb Mar 27, 2025
7c10b4a
Merge remote-tracking branch 'apache/main' into better-decoder
alamb Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
bug fix
  • Loading branch information
XiangpengHao committed Jan 7, 2025
commit 53f5fad772578f74dd7e9a4b05945da0cf9205c5
52 changes: 7 additions & 45 deletions parquet/src/arrow/array_reader/byte_view_array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@ use arrow_data::ByteView;
use arrow_schema::DataType as ArrowType;
use bytes::Bytes;
use std::any::Any;
// use std::collections::hash_map::Entry;
// use std::collections::HashMap;
use std::sync::Arc;

/// Returns an [`ArrayReader`] that decodes the provided byte array column to view types.
pub fn make_byte_view_array_reader(
Expand Down Expand Up @@ -130,14 +127,11 @@ impl ArrayReader for ByteViewArrayReader {

/// A [`ColumnValueDecoder`] for variable length byte arrays
struct ByteViewArrayColumnValueDecoder {
dict: Option<Arc<ViewBuffer>>,
dict: Option<ViewBuffer>,
decoder: Option<ByteViewArrayDecoder>,
validate_utf8: bool,
}

// pub(crate) static DICT_CACHE: LazyLock<Mutex<HashMap<usize, Arc<ViewBuffer>>>> =
// LazyLock::new(|| Mutex::new(HashMap::new()));

impl ColumnValueDecoder for ByteViewArrayColumnValueDecoder {
type Buffer = ViewBuffer;

Expand All @@ -150,7 +144,6 @@ impl ColumnValueDecoder for ByteViewArrayColumnValueDecoder {
}
}

#[inline(never)]
fn set_dict(
&mut self,
buf: Bytes,
Expand All @@ -177,38 +170,11 @@ impl ColumnValueDecoder for ByteViewArrayColumnValueDecoder {
);
decoder.read(&mut buffer, usize::MAX)?;

let dict = Arc::new(buffer);
self.dict = Some(dict);

// let buf_id = buf.as_ptr() as usize;

// let mut cache = DICT_CACHE.lock().unwrap();

// match cache.entry(buf_id) {
// Entry::Vacant(v) => {
// let mut buffer = ViewBuffer::with_capacity(num_values as usize, 1);
// let mut decoder = ByteViewArrayDecoderPlain::new(
// buf,
// num_values as usize,
// Some(num_values as usize),
// self.validate_utf8,
// );
// decoder.read(&mut buffer, usize::MAX)?;

// let dict = Arc::new(buffer);
// v.insert(dict.clone());
// self.dict = Some(dict);
// }
// Entry::Occupied(e) => {
// // Remove and take ownership of the existing dictionary
// self.dict = Some(e.remove());
// // self.dict = Some(e.get().clone());
// }
// }
self.dict = Some(buffer);

Ok(())
}

#[inline(never)]
fn set_data(
&mut self,
encoding: Encoding,
Expand All @@ -226,24 +192,22 @@ impl ColumnValueDecoder for ByteViewArrayColumnValueDecoder {
Ok(())
}

#[inline(never)]
fn read(&mut self, out: &mut Self::Buffer, num_values: usize) -> Result<usize> {
let decoder = self
.decoder
.as_mut()
.ok_or_else(|| general_err!("no decoder set"))?;

decoder.read(out, num_values, self.dict.as_ref().map(|b| b.as_ref()))
decoder.read(out, num_values, self.dict.as_ref())
}

#[inline(never)]
fn skip_values(&mut self, num_values: usize) -> Result<usize> {
let decoder = self
.decoder
.as_mut()
.ok_or_else(|| general_err!("no decoder set"))?;

decoder.skip(num_values, self.dict.as_ref().map(|b| b.as_ref()))
decoder.skip(num_values, self.dict.as_ref())
}
}

Expand Down Expand Up @@ -293,7 +257,6 @@ impl ByteViewArrayDecoder {
}

/// Read up to `len` values to `out` with the optional dictionary
#[inline(never)]
pub fn read(
&mut self,
out: &mut ViewBuffer,
Expand Down Expand Up @@ -357,11 +320,11 @@ impl ByteViewArrayDecoderPlain {
}
}

#[inline(never)]
pub fn read(&mut self, output: &mut ViewBuffer, len: usize) -> Result<usize> {
// let block_id = output.append_block(self.buf.clone());
let need_to_create_new_buffer = {
if let Some(last_buffer) = output.buffers.last() {
last_buffer.ptr_eq(&self.buf)
!last_buffer.ptr_eq(&self.buf)
} else {
true
}
Expand Down Expand Up @@ -485,7 +448,6 @@ impl ByteViewArrayDecoderDictionary {
/// Assumptions / Optimization
/// This function checks if dict.buffers() are the last buffers in `output`, and if so
/// reuses the dictionary page buffers directly without copying data
#[inline(never)]
fn read(&mut self, output: &mut ViewBuffer, dict: &ViewBuffer, len: usize) -> Result<usize> {
if dict.is_empty() || len == 0 {
return Ok(0);
Expand Down