Files
lancedb/java
Dan RammerandClaude Opus 5 0ed17a653b feat: update lance dependency to v12.0.0 (#4216)
Targets `release/v0.39`, not `main`. That branch was cut from
`56bbd19f`, the last commit on `main` still pinned to lance 12, and
carries eight backported fixes; it will publish the next stable lancedb
on the lance 12.0.0 release.

## What changed

Rust workspace lance crates and `java/pom.xml` `lance-core` move from
`v12.0.0-beta.18` to
[`v12.0.0`](https://github.com/lance-format/lance/releases/tag/v12.0.0).
No compatibility fixes were needed.

Because the target is a stable lance, `ci/set_lance_version.py` takes
the `set_stable_version` path, so the workspace dependencies drop their
`git` and `tag` fields and resolve from crates.io. That switch is
required for the release itself — `cargo publish` rejects a crate with
git dependencies — and `Cargo.lock` now has zero `lance-format/lance`
references.

## Validation

* `python3 ci/validate_stable_lance.py` passes — the gate the `Create
Release Commit` workflow runs for a stable release.
* `cargo fmt --all`, `git diff --check` clean.
* All lance 12.0.0 crates confirmed published on crates.io, and
`org.lance:lance-core:12.0.0` on Maven Central.
* Full build and test verification is delegated to this PR's CI, which
also exercises the eight backported fixes on the branch.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:47:16 -05:00
..

LanceDB Java Enterprise Client

Configuration and Initialization

LanceDB Cloud

For LanceDB Cloud, use the simplified builder API:

import com.lancedb.LanceDbNamespaceClientBuilder;
import org.lance.namespace.LanceNamespace;

// If your DB url is db://example-db, then your database here is example-db
LanceNamespace namespaceClient = LanceDbNamespaceClientBuilder.newBuilder()
    .apiKey("your_lancedb_cloud_api_key")
    .database("your_database_name")
    .build();

LanceDB Enterprise

For Enterprise deployments, use your custom endpoint:

LanceNamespace namespaceClient = LanceDbNamespaceClientBuilder.newBuilder()
    .apiKey("your_lancedb_enterprise_api_key")
    .database("your_database_name")
    .endpoint("<your_enterprise_endpoint>")
    .build();

MemWAL LSM write path

Most table operations reach LanceDB through the LanceNamespace above, which is generated from the Lance Namespace specification. The MemWAL LSM routes are not part of that specification, so they are issued through a separate client:

import com.lancedb.LanceDbRestClient;
import com.lancedb.LanceDbTableLsm;
import com.lancedb.LsmWriteSpec;

LanceDbRestClient client = LanceDbNamespaceClientBuilder.newBuilder()
    .apiKey("your_lancedb_cloud_api_key")
    .database("your_database_name")
    .buildRestClient();

LanceDbTableLsm lsm = new LanceDbTableLsm(client, "my_table");

// Route future merge_insert upserts through the MemWAL, hash-bucketed by `id`.
lsm.setLsmWriteSpec(LsmWriteSpec.bucket("id", 16));

// ... merge_insert traffic ...

// Converge the fresh tier into the base table.
lsm.checkpointLsm();

// Inspect live per-bucket state.
lsm.getLsmStats().ifPresent(stats -> stats.buckets().forEach(bucket ->
    System.out.println(bucket.shardId() + ": " + bucket.generations().size() + " L0 generations")));

client.close();

maintainedIndexes is tri-state, and the null default is the opposite of what a Java reader usually expects:

Value Meaning
unset (null) Maintain every index the MemWAL can, resolved on install
Collections.emptyList() Maintain none
Arrays.asList("id_idx") Maintain exactly those

Development

Build:

./mvnw install -pl lancedb-core -am

Run tests:

./mvnw test -pl lancedb-core