Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
cbb3377
feat: introduce exact file format identity
Xuanwo Jul 21, 2026
543fe0d
fix(python): preserve data storage version getter
Xuanwo Jul 21, 2026
81a459f
Merge remote-tracking branch 'origin/main' into xuanwo/exact-file-for…
Xuanwo Jul 27, 2026
b7e645b
refactor: name exact file version identity
Xuanwo Jul 27, 2026
e7e92ad
test: use exact version for overlay files
Xuanwo Jul 27, 2026
88346c8
test: lock exact file-version wire contracts
Xuanwo Jul 27, 2026
d4bc6fc
refactor: make v1 the canonical legacy file owner
Xuanwo Jul 27, 2026
4c78d37
refactor: make encoding mechanisms version-free
Xuanwo Jul 27, 2026
aec4d2e
refactor: add exact current-format writers
Xuanwo Jul 27, 2026
d05c05f
test: keep encoding strategy setup lint-clean
Xuanwo Jul 27, 2026
0a68138
Merge branch 'xuanwo/exact-version-stack-04-encoding-mechanisms' into…
Xuanwo Jul 27, 2026
faf3146
refactor: activate exact current-format writers
Xuanwo Jul 27, 2026
daced25
refactor: compose exact current-format readers
Xuanwo Jul 27, 2026
c77a4b8
Merge remote-tracking branch 'origin/main' into xuanwo/exact-file-for…
Xuanwo Jul 27, 2026
c6e695c
Merge branch 'xuanwo/exact-file-format-identity' into xuanwo/exact-ve…
Xuanwo Jul 27, 2026
a77e601
Merge branch 'xuanwo/exact-version-stack-02-fixtures' into xuanwo/exa…
Xuanwo Jul 27, 2026
15ffaf3
Merge branch 'xuanwo/exact-version-stack-03-v1' into xuanwo/exact-ver…
Xuanwo Jul 27, 2026
0ed1f34
Merge branch 'xuanwo/exact-version-stack-04-encoding-mechanisms' into…
Xuanwo Jul 27, 2026
5632498
Merge branch 'xuanwo/exact-version-stack-05-file-runtime' into xuanwo…
Xuanwo Jul 27, 2026
a5ba57d
Merge branch 'xuanwo/exact-version-stack-06-writers' into xuanwo/exac…
Xuanwo Jul 27, 2026
e11ae05
Merge remote-tracking branch 'origin/main' into xuanwo/exact-version-…
Xuanwo Jul 31, 2026
214c848
fix: align exact reader composition with main
Xuanwo Jul 31, 2026
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
19 changes: 9 additions & 10 deletions java/lance-jni/src/file_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ use lance::io::ObjectStore;
use lance_core::cache::LanceCache;
use lance_core::datatypes::{BlobHandling, OnMissing, Projection, Schema};
use lance_encoding::decoder::{DecoderPlugins, FilterExpression};
use lance_encoding::version::LanceFileVersion;
use lance_file::reader::{FileReader, FileReaderOptions, ReaderProjection};
use lance_file::versions as file_versions;
use lance_io::object_store::{ObjectStoreParams, ObjectStoreRegistry};
use lance_io::{
ReadBatchParams,
Expand Down Expand Up @@ -262,18 +262,17 @@ pub extern "system" fn Java_org_lance_file_LanceFileReader_readAllNative(

let transformed_schema = projection.to_bare_schema();

let field_id_to_column_index = base_schema
.fields_pre_order()
.filter(|field| {
file_version < LanceFileVersion::V2_1
|| field.is_leaf()
|| field.is_packed_struct()
let (field_ids, column_indices) =
file_versions::data_file_columns(file_version, &base_schema);
let field_id_to_column_index = field_ids
.into_iter()
.zip(column_indices)
.filter_map(|(field_id, column_index)| {
(column_index >= 0).then_some((field_id as u32, column_index as u32))
})
.enumerate()
.map(|(idx, field)| (field.id as u32, idx as u32))
.collect::<BTreeMap<_, _>>();

Some(ReaderProjection::from_field_ids(
Some(file_versions::reader_projection_from_field_ids(
file_version,
&transformed_schema,
&field_id_to_column_index,
Expand Down
3 changes: 1 addition & 2 deletions python/src/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ use lance_core::utils::path::LancePathExt;
use lance_encoding::decoder::{DecoderPlugins, FilterExpression};
use lance_file::reader::{
BufferDescriptor, CachedFileMetadata, FileReader, FileReaderOptions, FileStatistics,
ReaderProjection,
};
use lance_file::writer::{FileWriter, FileWriterOptions};
use lance_file::{LanceEncodingsIo, version::LanceFileVersion, versions as file_versions};
Expand Down Expand Up @@ -847,7 +846,7 @@ impl LanceFileReader {
let mut base_projection = None;
if let Some(columns) = columns {
base_projection = Some(
ReaderProjection::from_column_names(
file_versions::reader_projection_from_column_names(
file_metadata.version(),
&file_metadata.file_schema,
&columns.iter().map(|s| s.as_str()).collect::<Vec<&str>>(),
Expand Down
11 changes: 3 additions & 8 deletions rust/lance-file/src/compatibility_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ use tokio::io::AsyncWriteExt;

use crate::reader::{EncodedBatchReaderExt, FileReader, FileReaderOptions};
use crate::testing::FsFixture;
use crate::version::{ConcreteFileVersion, LanceFileVersion};
use crate::version::ConcreteFileVersion;
use crate::versions;
use crate::versions::v1::reader::FileReader as V1Reader;
use crate::versions::v1::writer::{
Expand Down Expand Up @@ -338,10 +338,7 @@ async fn assert_current_reader_roundtrip(
)
.await
.unwrap();
assert_eq!(
ConcreteFileVersion::from(reader.metadata().version()),
version
);
assert_eq!(reader.metadata().version(), version);
assert!(
reader
.metadata()
Expand Down Expand Up @@ -421,7 +418,6 @@ async fn v2_0_embedded_writer_and_reader_are_wire_compatible() {
assert_eq!(footer_version(expected_self_described), expected_footer);
assert_eq!(footer_version(expected_mini), expected_footer);

let version = LanceFileVersion::from(ConcreteFileVersion::V2_0);
let self_described =
EncodedBatch::try_from_self_described_lance(Bytes::from_static(expected_self_described))
.unwrap();
Expand All @@ -438,8 +434,7 @@ async fn v2_0_embedded_writer_and_reader_are_wire_compatible() {
assert_record_batch_eq(&decoded, &batch);

let mini =
EncodedBatch::try_from_mini_lance(Bytes::from_static(expected_mini), &schema, version)
.unwrap();
EncodedBatch::try_from_mini_lance(Bytes::from_static(expected_mini), &schema).unwrap();
let decoded = decode_batch(
&mini,
&FilterExpression::no_filter(),
Expand Down
10 changes: 6 additions & 4 deletions rust/lance-file/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,17 @@ use format::MAGIC;
use lance_core::{Error, Result};
use lance_io::object_store::ObjectStore;
use object_store::path::Path;
use version::{ConcreteFileVersion, LanceFileVersion};
use version::ConcreteFileVersion;

pub async fn determine_file_version(
store: &ObjectStore,
path: &Path,
known_size: Option<usize>,
) -> Result<LanceFileVersion> {
) -> Result<ConcreteFileVersion> {
Comment thread
Xuanwo marked this conversation as resolved.
let size = match known_size {
None => store.size(path).await.unwrap() as usize,
None => usize::try_from(store.size(path).await?).map_err(|_| {
Error::invalid_input(format!("file {} is too large for this platform", path))
})?,
Some(size) => size,
};
if size < 8 {
Expand All @@ -53,5 +55,5 @@ pub async fn determine_file_version(
let major_version = u16::from_le_bytes([footer[0], footer[1]]);
let minor_version = u16::from_le_bytes([footer[2], footer[3]]);

ConcreteFileVersion::from_footer_numbers(major_version, minor_version).map(Into::into)
ConcreteFileVersion::from_footer_numbers(major_version, minor_version)
}
Loading
Loading