Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
910 changes: 313 additions & 597 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ keywords = ["vortex"]
license = "Apache-2.0"
readme = "README.md"
repository = "https://github.com/spiraldb/vortex"
rust-version = "1.90.0"
rust-version = "1.91.0"
version = "0.1.0"

[workspace.dependencies]
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/lance-bench/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ version.workspace = true
publish = false

[dependencies]
lance = { version = "2.0.0", default-features = false }
lance-encoding = { version = "2.0.0" }
lance = { version = "4", default-features = false }
lance-encoding = { version = "4" }

anyhow = { workspace = true }
arrow-cast = { version = "57" }
Expand Down
9 changes: 7 additions & 2 deletions benchmarks/vector-search-bench/src/ingest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,13 @@ mod tests {
let chunk =
StructArray::from_fields(&[("id", id_array(&[0, 1])), ("emb", emb)])?.into_array();
let out = transform_chunk(chunk, &mut ctx)?;
let out_struct = out.as_opt::<Struct>().expect("returns Struct");
let out_emb = out_struct.unmasked_field_by_name("emb").unwrap().clone();
let out_struct = out
.as_opt::<Struct>()
.context("transform_chunk should return a Struct array")?;
let out_emb = out_struct
.unmasked_field_by_name("emb")
.context("transform_chunk output should contain an emb field")?
.clone();
let DType::Extension(ext) = out_emb.dtype() else {
panic!("expected extension dtype, got {}", out_emb.dtype());
};
Expand Down
7 changes: 1 addition & 6 deletions encodings/datetime-parts/src/canonical.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,12 +158,7 @@ mod test {
.execute::<PrimitiveArray>(&mut ctx)?;

assert_arrays_eq!(primitive_values, milliseconds);
assert!(
primitive_values
.validity()
.unwrap()
.mask_eq(&validity, &mut ctx)?
);
assert!(primitive_values.validity()?.mask_eq(&validity, &mut ctx)?);
Ok(())
}
}
33 changes: 21 additions & 12 deletions encodings/fastlanes/src/bitpacking/array/bitpack_compress.rs
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ mod test {
use vortex_array::session::ArraySession;
use vortex_buffer::Buffer;
use vortex_error::VortexError;
use vortex_error::vortex_err;
use vortex_session::VortexSession;

use super::*;
Expand Down Expand Up @@ -540,13 +541,15 @@ mod test {
.for_each(|&idx| values[idx] = patch_value);

let array = PrimitiveArray::from_iter(values);
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx).unwrap();
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx)?;

let patches = bitpacked.patches().unwrap();
let patches = bitpacked
.patches()
.ok_or_else(|| vortex_err!("expected patches"))?;
let chunk_offsets = patches
.chunk_offsets()
.as_ref()
.unwrap()
.ok_or_else(|| vortex_err!("expected chunk offsets"))?
.clone()
.execute::<PrimitiveArray>(&mut ctx)?;

Expand All @@ -570,13 +573,15 @@ mod test {
.for_each(|&idx| values[idx] = patch_value);

let array = PrimitiveArray::from_iter(values);
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx).unwrap();
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx)?;

let patches = bitpacked.patches().unwrap();
let patches = bitpacked
.patches()
.ok_or_else(|| vortex_err!("expected patches"))?;
let chunk_offsets = patches
.chunk_offsets()
.as_ref()
.unwrap()
.ok_or_else(|| vortex_err!("expected chunk offsets"))?
.clone()
.execute::<PrimitiveArray>(&mut ctx)?;

Expand All @@ -596,13 +601,15 @@ mod test {
.for_each(|&idx| values[idx] = patch_value);

let array = PrimitiveArray::from_iter(values);
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx).unwrap();
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx)?;

let patches = bitpacked.patches().unwrap();
let patches = bitpacked
.patches()
.ok_or_else(|| vortex_err!("expected patches"))?;
let chunk_offsets = patches
.chunk_offsets()
.as_ref()
.unwrap()
.ok_or_else(|| vortex_err!("expected chunk offsets"))?
.clone()
.execute::<PrimitiveArray>(&mut ctx)?;

Expand All @@ -627,13 +634,15 @@ mod test {
.for_each(|&idx| values[idx] = patch_value);

let array = PrimitiveArray::from_iter(values);
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx).unwrap();
let bitpacked = bitpack_encode(&array, 4, None, &mut ctx)?;

let patches = bitpacked.patches().unwrap();
let patches = bitpacked
.patches()
.ok_or_else(|| vortex_err!("expected patches"))?;
let chunk_offsets = patches
.chunk_offsets()
.as_ref()
.unwrap()
.ok_or_else(|| vortex_err!("expected chunk offsets"))?
.clone()
.execute::<PrimitiveArray>(&mut ctx)?;

Expand Down
39 changes: 14 additions & 25 deletions encodings/fastlanes/src/bitpacking/array/bitpack_decompress.rs
Original file line number Diff line number Diff line change
Expand Up @@ -305,11 +305,8 @@ mod tests {
let bitpacked = encode(&zeros, 10);
assert_eq!(bitpacked.len(), 1025);
assert!(bitpacked.patches().is_some());
let slice_ref = bitpacked.into_array().slice(1023..1025).unwrap();
let actual = slice_ref
.execute::<Canonical>(&mut ctx)
.unwrap()
.into_primitive();
let slice_ref = bitpacked.into_array().slice(1023..1025)?;
let actual = slice_ref.execute::<Canonical>(&mut ctx)?.into_primitive();
assert_arrays_eq!(actual, PrimitiveArray::from_iter([1535u16, 1536]));
Ok(())
}
Expand All @@ -323,11 +320,8 @@ mod tests {
let bitpacked = encode(&zeros, 10);
assert_eq!(bitpacked.len(), 2229);
assert!(bitpacked.patches().is_some());
let slice_ref = bitpacked.into_array().slice(1023..2049).unwrap();
let actual = slice_ref
.execute::<Canonical>(&mut ctx)
.unwrap()
.into_primitive();
let slice_ref = bitpacked.into_array().slice(1023..2049)?;
let actual = slice_ref.execute::<Canonical>(&mut ctx)?.into_primitive();
assert_arrays_eq!(
actual,
PrimitiveArray::from_iter((1023u16..2049).map(|x| x + 512))
Expand Down Expand Up @@ -380,11 +374,11 @@ mod tests {
// Verify the validity mask was correctly applied.
assert_eq!(result.len(), 5);
let mut ctx = SESSION.create_execution_ctx();
assert!(!result.execute_scalar(0, &mut ctx).unwrap().is_null());
assert!(result.execute_scalar(1, &mut ctx).unwrap().is_null());
assert!(!result.execute_scalar(2, &mut ctx).unwrap().is_null());
assert!(!result.execute_scalar(3, &mut ctx).unwrap().is_null());
assert!(result.execute_scalar(4, &mut ctx).unwrap().is_null());
assert!(!result.execute_scalar(0, &mut ctx)?.is_null());
assert!(result.execute_scalar(1, &mut ctx)?.is_null());
assert!(!result.execute_scalar(2, &mut ctx)?.is_null());
assert!(!result.execute_scalar(3, &mut ctx)?.is_null());
assert!(result.execute_scalar(4, &mut ctx)?.is_null());
Ok(())
}

Expand Down Expand Up @@ -504,10 +498,7 @@ mod tests {

let executed = {
let mut ctx = SESSION.create_execution_ctx();
bitpacked
.into_array()
.execute::<Canonical>(&mut ctx)
.unwrap()
bitpacked.into_array().execute::<Canonical>(&mut ctx)?
};

assert_eq!(
Expand All @@ -530,8 +521,7 @@ mod tests {
let mut ctx = SESSION.create_execution_ctx();
unpacked_array
.into_array()
.execute::<Canonical>(&mut ctx)
.unwrap()
.execute::<Canonical>(&mut ctx)?
.into_primitive()
};
assert_eq!(
Expand Down Expand Up @@ -560,13 +550,12 @@ mod tests {
// Test with sliced array (offset > 0).
let values = PrimitiveArray::from_iter(0u32..2048);
let bitpacked = encode(&values, 11);
let slice_ref = bitpacked.into_array().slice(500..1500).unwrap();
let slice_ref = bitpacked.into_array().slice(500..1500)?;
let sliced = {
let mut ctx = SESSION.create_execution_ctx();
slice_ref
.clone()
.execute::<Canonical>(&mut ctx)
.unwrap()
.execute::<Canonical>(&mut ctx)?
.into_primitive()
};

Expand All @@ -575,7 +564,7 @@ mod tests {
let unpacked_array = sliced;
let executed = {
let mut ctx = SESSION.create_execution_ctx();
slice_ref.execute::<Canonical>(&mut ctx).unwrap()
slice_ref.execute::<Canonical>(&mut ctx)?
};

assert_eq!(
Expand Down
4 changes: 2 additions & 2 deletions encodings/fastlanes/src/delta/array/delta_compress.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,8 @@ mod tests {
let array = PrimitiveArray::from_option_iter(
(0u8..200).map(|i| (!(50..100).contains(&i)).then_some(i)),
);
let (bases, deltas) = delta_compress(&array, &mut ctx).unwrap();
let bitpacked_deltas = bitpack_encode(&deltas, 1, None, &mut ctx).unwrap();
let (bases, deltas) = delta_compress(&array, &mut ctx)?;
let bitpacked_deltas = bitpack_encode(&deltas, 1, None, &mut ctx)?;
let packed_delta = Delta::try_new(
bases.into_array(),
bitpacked_deltas.into_array(),
Expand Down
4 changes: 2 additions & 2 deletions encodings/fastlanes/src/for/array/for_compress.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ mod test {
// Create a range offset by a million.
let expect = PrimitiveArray::from_iter((0u32..1024).map(|x| x % 7 + 10));
let array = PrimitiveArray::from_iter((0u32..1024).map(|x| x % 7));
let bp = BitPackedData::encode(&array.into_array(), 2, &mut ctx).unwrap();
let bp = BitPackedData::encode(&array.into_array(), 2, &mut ctx)?;
let compressed = FoR::try_new(bp.clone().into_array(), 10u32.into())?;
let decompressed = fused_decompress::<u32>(&compressed, bp.as_view(), &mut ctx)?;
assert_arrays_eq!(decompressed, expect);
Expand All @@ -154,7 +154,7 @@ mod test {
fn test_overflow() -> VortexResult<()> {
let mut ctx = SESSION.create_execution_ctx();
let array = PrimitiveArray::from_iter(i8::MIN..=i8::MAX);
let compressed = FoRData::encode(array.clone()).unwrap();
let compressed = FoRData::encode(array.clone())?;
assert_eq!(
i8::MIN,
compressed
Expand Down
54 changes: 25 additions & 29 deletions encodings/fastlanes/src/rle/array/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ mod tests {
fn test_rle_serialization() -> VortexResult<()> {
let mut exec_ctx = SESSION.create_execution_ctx();
let primitive = PrimitiveArray::from_iter((0..2048).map(|i| (i / 100) as u32));
let rle_array = RLEData::encode(primitive.as_view(), &mut exec_ctx).unwrap();
let rle_array = RLEData::encode(primitive.as_view(), &mut exec_ctx)?;
assert_eq!(rle_array.len(), 2048);

let original_data = rle_array
Expand All @@ -374,26 +374,24 @@ mod tests {
.execute::<PrimitiveArray>(&mut exec_ctx)?;

let ctx = ArrayContext::empty();
let serialized = rle_array
.into_array()
.serialize(&ctx, &SESSION, &SerializeOptions::default())
.unwrap();
let serialized =
rle_array
.into_array()
.serialize(&ctx, &SESSION, &SerializeOptions::default())?;

let mut concat = ByteBufferMut::empty();
for buf in serialized {
concat.extend_from_slice(buf.as_ref());
}
let concat = concat.freeze();

let parts = SerializedArray::try_from(concat).unwrap();
let decoded = parts
.decode(
&DType::Primitive(PType::U32, Nullability::NonNullable),
2048,
&ReadContext::new(ctx.to_ids()),
&SESSION,
)
.unwrap();
let parts = SerializedArray::try_from(concat)?;
let decoded = parts.decode(
&DType::Primitive(PType::U32, Nullability::NonNullable),
2048,
&ReadContext::new(ctx.to_ids()),
&SESSION,
)?;

let decoded_data = decoded.execute::<PrimitiveArray>(&mut exec_ctx)?;

Expand All @@ -405,7 +403,7 @@ mod tests {
fn test_rle_serialization_slice() -> VortexResult<()> {
let mut exec_ctx = SESSION.create_execution_ctx();
let primitive = PrimitiveArray::from_iter((0..2048).map(|i| (i / 100) as u32));
let rle_array = RLEData::encode(primitive.as_view(), &mut exec_ctx).unwrap();
let rle_array = RLEData::encode(primitive.as_view(), &mut exec_ctx)?;

let sliced = RLE::try_new(
rle_array.values().clone(),
Expand All @@ -418,27 +416,25 @@ mod tests {
assert_eq!(sliced.len(), 100);

let ctx = ArrayContext::empty();
let serialized = sliced
.clone()
.into_array()
.serialize(&ctx, &SESSION, &SerializeOptions::default())
.unwrap();
let serialized =
sliced
.clone()
.into_array()
.serialize(&ctx, &SESSION, &SerializeOptions::default())?;

let mut concat = ByteBufferMut::empty();
for buf in serialized {
concat.extend_from_slice(buf.as_ref());
}
let concat = concat.freeze();

let parts = SerializedArray::try_from(concat).unwrap();
let decoded = parts
.decode(
sliced.dtype(),
sliced.len(),
&ReadContext::new(ctx.to_ids()),
&SESSION,
)
.unwrap();
let parts = SerializedArray::try_from(concat)?;
let decoded = parts.decode(
sliced.dtype(),
sliced.len(),
&ReadContext::new(ctx.to_ids()),
&SESSION,
)?;

let original_data = sliced
.as_array()
Expand Down
Loading
Loading