diff --git a/src/encodings/decoding.rs b/src/encodings/decoding.rs index ceeb3c7..27178c2 100644 --- a/src/encodings/decoding.rs +++ b/src/encodings/decoding.rs @@ -777,11 +777,15 @@ impl DeltaByteArrayDecoder { impl<'m, T: DataType> Decoder for DeltaByteArrayDecoder { default fn set_data(&mut self, _: ByteBufferPtr, _: usize) -> Result<()> { - Err(general_err!("DeltaByteArrayDecoder only support ByteArrayType")) + Err(general_err!( + "DeltaByteArrayDecoder only supports ByteArrayType and FixedLenByteArrayType" + )) } default fn get(&mut self, _: &mut [T::T]) -> Result { - Err(general_err!("DeltaByteArrayDecoder only support ByteArrayType")) + Err(general_err!( + "DeltaByteArrayDecoder only supports ByteArrayType and FixedLenByteArrayType" + )) } fn values_left(&self) -> usize { @@ -815,13 +819,13 @@ impl<> Decoder for DeltaByteArrayDecoder { assert!(self.suffix_decoder.is_some()); let num_values = cmp::min(buffer.len(), self.num_values); + let mut v: [ByteArray; 1] = [ByteArray::new(); 1]; for i in 0..num_values { // Process suffix // TODO: this is awkward - maybe we should add a non-vectorized API? - let mut suffix = vec![ByteArray::new(); 1]; let suffix_decoder = self.suffix_decoder.as_mut().unwrap(); - suffix_decoder.get(&mut suffix[..])?; - let suffix = suffix[0].data(); + suffix_decoder.get(&mut v[..])?; + let suffix = v[0].data(); // Extract current prefix length, can be 0 let prefix_len = self.prefix_lengths[self.current_idx] as usize; @@ -842,6 +846,17 @@ impl<> Decoder for DeltaByteArrayDecoder { } } +impl<> Decoder for DeltaByteArrayDecoder { + fn set_data(&mut self, data: ByteBufferPtr, num_values: usize) -> Result<()> { + let s: &mut DeltaByteArrayDecoder = unsafe { mem::transmute(self) }; + s.set_data(data, num_values) + } + + fn get(&mut self, buffer: &mut [ByteArray]) -> Result { + let s: &mut DeltaByteArrayDecoder = unsafe { mem::transmute(self) }; + s.get(buffer) + } +} #[cfg(test)] mod tests { diff --git a/src/encodings/encoding.rs b/src/encodings/encoding.rs index 068b159..57b79a2 100644 --- a/src/encodings/encoding.rs +++ b/src/encodings/encoding.rs @@ -832,7 +832,7 @@ impl DeltaByteArrayEncoder { impl Encoder for DeltaByteArrayEncoder { default fn put(&mut self, _values: &[T::T]) -> Result<()> { - panic!("DeltaByteArrayEncoder only supports ByteArrayType"); + panic!("DeltaByteArrayEncoder only supports ByteArrayType and FixedLenByteArrayType"); } fn encoding(&self) -> Encoding { @@ -840,7 +840,7 @@ impl Encoder for DeltaByteArrayEncoder { } default fn flush_buffer(&mut self) -> Result { - panic!("DeltaByteArrayEncoder only supports ByteArrayType"); + panic!("DeltaByteArrayEncoder only supports ByteArrayType and FixedLenByteArrayType"); } } @@ -883,6 +883,18 @@ impl Encoder for DeltaByteArrayEncoder { } } +impl Encoder for DeltaByteArrayEncoder { + fn put(&mut self, values: &[ByteArray]) -> Result<()> { + let s: &mut DeltaByteArrayEncoder = unsafe { mem::transmute(self) }; + s.put(values) + } + + fn flush_buffer(&mut self) -> Result { + let s: &mut DeltaByteArrayEncoder = unsafe { mem::transmute(self) }; + s.flush_buffer() + } +} + #[cfg(test)] mod tests { @@ -946,6 +958,7 @@ mod tests { fn test_fixed_lenbyte_array() { FixedLenByteArrayType::test(Encoding::PLAIN, TEST_SET_SIZE, 100); FixedLenByteArrayType::test(Encoding::PLAIN_DICTIONARY, TEST_SET_SIZE, 100); + FixedLenByteArrayType::test(Encoding::DELTA_BYTE_ARRAY, TEST_SET_SIZE, 100); } trait EncodingTester {