From 436eafc0a3ce7b0d884935d6f80f1fbb6694622d Mon Sep 17 00:00:00 2001
From: Yang Cen <159225399+BubbleCal@users.noreply.github.com>
Date: Fri, 9 Oct 2026 23:32:21 +0800
Subject: [PATCH 1/2] feat(bindings): expose layered RaBitQ build and query
options
---
java/lance-jni/src/blocking_scanner.rs | 7 +++
java/lance-jni/src/utils.rs | 8 ++-
.../org/lance/index/vector/RQBuildParams.java | 13 +++++
java/src/main/java/org/lance/ipc/Query.java | 30 ++++++++++
.../main/java/org/lance/ipc/RQPrecision.java | 30 ++++++++++
java/src/test/java/org/lance/JNITest.java | 15 +++++
.../java/org/lance/index/VectorIndexTest.java | 32 +++++++++-
python/python/lance/dataset.py | 30 +++++++++-
python/python/tests/test_vector_index.py | 58 +++++++++++++++++++
python/src/dataset.rs | 37 +++++++++++-
10 files changed, 253 insertions(+), 7 deletions(-)
create mode 100644 java/src/main/java/org/lance/ipc/RQPrecision.java
diff --git a/java/lance-jni/src/blocking_scanner.rs b/java/lance-jni/src/blocking_scanner.rs
index 9d65220aa53..33b06efc1e3 100644
--- a/java/lance-jni/src/blocking_scanner.rs
+++ b/java/lance-jni/src/blocking_scanner.rs
@@ -420,6 +420,13 @@ pub(crate) fn build_scanner_with_options<'a>(
let approx_mode_str = env.get_string_from_method(&java_obj, "getApproxModeString")?;
scanner.approx_mode(parse_approx_mode(&approx_mode_str)?);
+ scanner.rq_precision(
+ env.get_string_from_method(&java_obj, "getRqPrecisionString")?
+ .parse()?,
+ );
+ if let Some(factor) = env.get_optional_u32_from_method(&java_obj, "getRqCascadeFactor")? {
+ scanner.rq_cascade_factor(factor)?;
+ }
Ok(())
})?;
diff --git a/java/lance-jni/src/utils.rs b/java/lance-jni/src/utils.rs
index 5a3f795880c..fa8551ba662 100644
--- a/java/lance-jni/src/utils.rs
+++ b/java/lance-jni/src/utils.rs
@@ -315,6 +315,9 @@ pub fn get_query(env: &mut JNIEnv, query_obj: JObject) -> Result