From 87959cf6ec550c8fd84efdaf6fbab87730d3dfbe Mon Sep 17 00:00:00 2001 From: Jesse Tuglu Date: Mon, 8 Jun 2026 13:34:29 -0700 Subject: [PATCH] fix: fix compaction_mode param JNI --- java/lance-jni/src/optimize.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/java/lance-jni/src/optimize.rs b/java/lance-jni/src/optimize.rs index 0ce92baeec8..be419b2fa27 100644 --- a/java/lance-jni/src/optimize.rs +++ b/java/lance-jni/src/optimize.rs @@ -312,6 +312,7 @@ const REWRITE_RESULT_CLASS: &str = "org/lance/compaction/RewriteResult"; const REWRITE_RESULT_CONSTRUCTOR_SIG: &str = "(Lorg/lance/compaction/CompactionMetrics;Ljava/util/List;Ljava/util/List;J[B)V"; const COMPACTION_OPTIONS_CLASS: &str = "org/lance/compaction/CompactionOptions"; +const COMPACTION_MODE_CLASS: &str = "org/lance/compaction/CompactionMode"; const COMPACTION_OPTIONS_CONSTRUCTOR_SIG: &str = "(Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;Ljava/util/Optional;)V"; impl IntoJava for &TaskData { @@ -361,13 +362,22 @@ impl IntoJava for &CompactionOptions { let batch_size_opt = to_java_optional(env, batch_size)?; let defer_index_remap = to_java_boolean_obj(env, Some(self.defer_index_remap))?; let defer_index_remap_opt = to_java_optional(env, defer_index_remap)?; - let compaction_mode_str = self.compaction_mode.as_ref().map(|mode| match mode { - CompactionMode::Reencode => "reencode", - CompactionMode::TryBinaryCopy => "try_binary_copy", - CompactionMode::ForceBinaryCopy => "force_binary_copy", + // Build the Java CompactionMode enum constant (not a String): the Java field is + // Optional, and passing a String here corrupts it across JNI's + // type-erased Optional signature. + let compaction_mode_name = self.compaction_mode.as_ref().map(|mode| match mode { + CompactionMode::Reencode => "REENCODE", + CompactionMode::TryBinaryCopy => "TRY_BINARY_COPY", + CompactionMode::ForceBinaryCopy => "FORCE_BINARY_COPY", }); - let compaction_mode_obj = match compaction_mode_str { - Some(s) => env.new_string(s)?.into(), + let compaction_mode_obj = match compaction_mode_name { + Some(name) => env + .get_static_field( + COMPACTION_MODE_CLASS, + name, + format!("L{};", COMPACTION_MODE_CLASS), + )? + .l()?, None => JObject::null(), }; let compaction_mode_opt = to_java_optional(env, compaction_mode_obj)?;