Skip to content

Commit c9e6dfd

Browse files
committed
init
1 parent afc0f98 commit c9e6dfd

File tree

11 files changed

+361
-370
lines changed

11 files changed

+361
-370
lines changed

java/lance-jni/src/blocking_dataset.rs

Lines changed: 73 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use lance::table::format::IndexMetadata;
3737
use lance_core::datatypes::Schema as LanceSchema;
3838
use lance_index::DatasetIndexExt;
3939
use lance_index::{IndexParams, IndexType};
40-
use lance_io::object_store::ObjectStoreRegistry;
40+
use lance_io::object_store::{ObjectStoreRegistry, StorageOptions};
4141
use std::collections::HashMap;
4242
use std::iter::empty;
4343
use std::str::FromStr;
@@ -228,7 +228,7 @@ impl BlockingDataset {
228228
pub fn create_tag(
229229
&mut self,
230230
tag: &str,
231-
version_number: u64,
231+
version_number: Option<u64>,
232232
branch: Option<&str>,
233233
) -> Result<()> {
234234
RT.block_on(
@@ -244,7 +244,12 @@ impl BlockingDataset {
244244
Ok(())
245245
}
246246

247-
pub fn update_tag(&mut self, tag: &str, version: u64, branch: Option<&str>) -> Result<()> {
247+
pub fn update_tag(
248+
&mut self,
249+
tag: &str,
250+
version: Option<u64>,
251+
branch: Option<&str>,
252+
) -> Result<()> {
248253
RT.block_on(self.inner.tags().update_on_branch(tag, version, branch))?;
249254
Ok(())
250255
}
@@ -1080,50 +1085,21 @@ fn inner_shallow_clone<'local>(
10801085
env: &mut JNIEnv<'local>,
10811086
java_dataset: JObject,
10821087
target_path: JString,
1083-
reference: JObject,
1088+
jref: JObject,
10841089
storage_options: JObject,
10851090
) -> Result<JObject<'local>> {
1091+
// Extract parameters before borrowing dataset_guard to avoid multiple mutable borrows of env
10861092
let target_path_str = target_path.extract(env)?;
1087-
let storage_options = env.get_optional(&storage_options, |env, map_obj| {
1088-
let jmap = JMap::from_env(env, map_obj)?;
1089-
to_rust_map(env, &jmap)
1090-
})?;
1091-
1092-
let reference = {
1093-
let version_number = env.get_optional_u64_from_method(&reference, "getVersionNumber")?;
1094-
let tag_name = env.get_optional_string_from_method(&reference, "getTagName")?;
1095-
let branch_name = env.get_optional_string_from_method(&reference, "getBranchName")?;
1096-
match (version_number, branch_name, tag_name) {
1097-
(Some(version_number), branch_name, None) => {
1098-
Ref::Version(branch_name, Some(version_number))
1099-
}
1100-
(None, None, Some(tag_name)) => Ref::Tag(tag_name),
1101-
_ => {
1102-
return Err(Error::input_error(
1103-
"One of (optional branch, version_number) and tag must be specified"
1104-
.to_string(),
1105-
))
1106-
}
1107-
}
1108-
};
1109-
1093+
let reference = transform_jref_to_ref(jref, env)?;
1094+
let storage_opts = transform_jstorage_options(storage_options, env)?;
11101095
let new_ds = {
11111096
let mut dataset_guard =
11121097
unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }?;
1113-
RT.block_on(
1114-
dataset_guard.inner.shallow_clone(
1115-
&target_path_str,
1116-
reference,
1117-
storage_options
1118-
.map(|options| {
1119-
Some(ObjectStoreParams {
1120-
storage_options: Some(options),
1121-
..Default::default()
1122-
})
1123-
})
1124-
.unwrap_or(None),
1125-
),
1126-
)?
1098+
RT.block_on(dataset_guard.inner.shallow_clone(
1099+
target_path_str.as_str(),
1100+
reference,
1101+
storage_opts,
1102+
))?
11271103
};
11281104

11291105
BlockingDataset { inner: new_ds }.into_java(env)
@@ -1637,11 +1613,17 @@ fn inner_list_tags<'local>(
16371613
let array_list = env.new_object("java/util/ArrayList", "()V", &[])?;
16381614

16391615
for (tag_name, tag_contents) in tag_map {
1616+
let branch_name: JObject = if let Some(branch_name) = tag_contents.branch.as_ref() {
1617+
env.new_string(branch_name)?.into()
1618+
} else {
1619+
JObject::null()
1620+
};
16401621
let java_tag = env.new_object(
16411622
"com/lancedb/lance/Tag",
1642-
"(Ljava/lang/String;JI)V",
1623+
"(Ljava/lang/String;Ljava/lang/String;JI)V",
16431624
&[
16441625
JValue::Object(&env.new_string(tag_name)?.into()),
1626+
JValue::Object(&branch_name),
16451627
JValue::Long(tag_contents.version as i64),
16461628
JValue::Int(tag_contents.manifest_size as i32),
16471629
],
@@ -1661,53 +1643,26 @@ pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeCreateTag(
16611643
mut env: JNIEnv,
16621644
java_dataset: JObject,
16631645
jtag_name: JString,
1664-
jtag_version: jlong,
1646+
jref: JObject,
16651647
) {
16661648
ok_or_throw_without_return!(
16671649
env,
1668-
inner_create_tag(&mut env, java_dataset, jtag_name, jtag_version)
1669-
)
1670-
}
1671-
1672-
#[no_mangle]
1673-
pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeCreateTagOnBranch(
1674-
mut env: JNIEnv,
1675-
java_dataset: JObject,
1676-
jtag_name: JString,
1677-
jtag_version: jlong,
1678-
jbranch: JString,
1679-
) {
1680-
ok_or_throw_without_return!(
1681-
env,
1682-
inner_create_tag_on_branch(&mut env, java_dataset, jtag_name, jtag_version, jbranch)
1650+
inner_create_tag(&mut env, java_dataset, jtag_name, jref)
16831651
)
16841652
}
16851653

16861654
fn inner_create_tag(
16871655
env: &mut JNIEnv,
16881656
java_dataset: JObject,
16891657
jtag_name: JString,
1690-
jtag_version: jlong,
1691-
) -> Result<()> {
1692-
let tag = jtag_name.extract(env)?;
1693-
let mut dataset_guard =
1694-
{ unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }? };
1695-
dataset_guard.create_tag(tag.as_str(), jtag_version as u64, None)?;
1696-
Ok(())
1697-
}
1698-
1699-
fn inner_create_tag_on_branch(
1700-
env: &mut JNIEnv,
1701-
java_dataset: JObject,
1702-
jtag_name: JString,
1703-
jtag_version: jlong,
1704-
jbranch: JString,
1658+
jref: JObject,
17051659
) -> Result<()> {
17061660
let tag = jtag_name.extract(env)?;
1707-
let branch = jbranch.extract(env)?;
1661+
let version_number = env.get_optional_u64_from_method(&jref, "getVersionNumber")?;
1662+
let branch = env.get_optional_string_from_method(&jref, "getBranchName")?;
17081663
let mut dataset_guard =
17091664
{ unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }? };
1710-
dataset_guard.create_tag(tag.as_str(), jtag_version as u64, Some(branch.as_str()))?;
1665+
dataset_guard.create_tag(tag.as_str(), version_number, branch.as_deref())?;
17111666
Ok(())
17121667
}
17131668

@@ -1732,54 +1687,26 @@ pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeUpdateTag(
17321687
mut env: JNIEnv,
17331688
java_dataset: JObject,
17341689
jtag_name: JString,
1735-
jtag_version: jlong,
1690+
jref: JObject,
17361691
) {
17371692
ok_or_throw_without_return!(
17381693
env,
1739-
inner_update_tag(&mut env, java_dataset, jtag_name, jtag_version)
1694+
inner_update_tag(&mut env, java_dataset, jtag_name, jref)
17401695
)
17411696
}
17421697

1743-
#[no_mangle]
1744-
pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeUpdateTagOnBranch(
1745-
mut env: JNIEnv,
1746-
java_dataset: JObject,
1747-
jtag_name: JString,
1748-
jtag_version: jlong,
1749-
jbranch: JString,
1750-
) {
1751-
ok_or_throw_without_return!(
1752-
env,
1753-
inner_update_tag_on_branch(&mut env, java_dataset, jtag_name, jtag_version, jbranch)
1754-
)
1755-
}
1756-
1757-
fn inner_update_tag_on_branch(
1758-
env: &mut JNIEnv,
1759-
java_dataset: JObject,
1760-
jtag_name: JString,
1761-
jtag_version: jlong,
1762-
jbranch: JString,
1763-
) -> Result<()> {
1764-
let tag = jtag_name.extract(env)?;
1765-
let branch = jbranch.extract(env)?;
1766-
let mut dataset_guard =
1767-
{ unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }? };
1768-
dataset_guard.update_tag(tag.as_str(), jtag_version as u64, Some(branch.as_str()))?;
1769-
Ok(())
1770-
}
1771-
17721698
fn inner_update_tag(
17731699
env: &mut JNIEnv,
17741700
java_dataset: JObject,
17751701
jtag_name: JString,
1776-
jtag_version: jlong,
1702+
jref: JObject,
17771703
) -> Result<()> {
17781704
let tag = jtag_name.extract(env)?;
1705+
let version_number = env.get_optional_u64_from_method(&jref, "getVersionNumber")?;
1706+
let branch = env.get_optional_string_from_method(&jref, "getBranchName")?;
17791707
let mut dataset_guard =
17801708
{ unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }? };
1781-
dataset_guard.update_tag(tag.as_str(), jtag_version as u64, None)?;
1782-
Ok(())
1709+
dataset_guard.update_tag(tag.as_str(), version_number, branch.as_deref())
17831710
}
17841711

17851712
#[no_mangle]
@@ -1861,69 +1788,68 @@ pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeCreateBranch<'local>
18611788
mut env: JNIEnv<'local>,
18621789
java_dataset: JObject,
18631790
jbranch: JString,
1864-
jversion: jlong,
1865-
source_branch_obj: JObject, // Optional<String>
1791+
jref: JObject,
1792+
jstorage_options: JObject, // Optional<String>
18661793
) -> JObject<'local> {
18671794
ok_or_throw!(
18681795
env,
1869-
inner_create_branch(&mut env, java_dataset, jbranch, jversion, source_branch_obj)
1796+
inner_create_branch(&mut env, java_dataset, jbranch, jref, jstorage_options)
18701797
)
18711798
}
18721799

18731800
fn inner_create_branch<'local>(
18741801
env: &mut JNIEnv<'local>,
18751802
java_dataset: JObject,
18761803
jbranch: JString,
1877-
jversion: jlong,
1878-
source_branch_obj: JObject, // Optional<String>
1879-
) -> Result<JObject<'local>> {
1880-
let branch_name: String = jbranch.extract(env)?;
1881-
let version = jversion as u64;
1882-
let source_branch = env.get_string_opt(&source_branch_obj)?;
1883-
let new_dataset = {
1884-
let mut dataset_guard =
1885-
unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }?;
1886-
dataset_guard.create_branch(&branch_name, version, source_branch.as_deref())?
1887-
};
1888-
new_dataset.into_java(env)
1889-
}
1890-
1891-
#[no_mangle]
1892-
pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeCreateBranchOnTag<'local>(
1893-
mut env: JNIEnv<'local>,
1894-
java_dataset: JObject,
1895-
jbranch: JString,
1896-
jtag_name: JString,
1897-
) -> JObject<'local> {
1898-
ok_or_throw!(
1899-
env,
1900-
inner_create_branch_on_tag(&mut env, java_dataset, jbranch, jtag_name)
1901-
)
1902-
}
1903-
1904-
fn inner_create_branch_on_tag<'local>(
1905-
env: &mut JNIEnv<'local>,
1906-
java_dataset: JObject,
1907-
jbranch: JString,
1908-
jtag_name: JString,
1804+
jref: JObject,
1805+
jstorage_options: JObject, // Optional<String>
19091806
) -> Result<JObject<'local>> {
19101807
let branch_name: String = jbranch.extract(env)?;
1911-
let tag_name: String = jtag_name.extract(env)?;
1912-
let reference = Ref::from(tag_name.as_str());
1808+
let reference = transform_jref_to_ref(jref, env)?;
1809+
let storage_opts = transform_jstorage_options(jstorage_options, env)?;
19131810

19141811
let new_blocking_dataset = {
19151812
let mut dataset_guard =
19161813
unsafe { env.get_rust_field::<_, _, BlockingDataset>(java_dataset, NATIVE_DATASET) }?;
19171814
let inner = RT.block_on(dataset_guard.inner.create_branch(
19181815
branch_name.as_str(),
19191816
reference,
1920-
None,
1817+
storage_opts,
19211818
))?;
19221819
BlockingDataset { inner }
19231820
};
19241821
new_blocking_dataset.into_java(env)
19251822
}
19261823

1824+
fn transform_jref_to_ref(jref: JObject, env: &mut JNIEnv) -> Result<Ref> {
1825+
let source_tag_name = env.get_optional_string_from_method(&jref, "getTagName")?;
1826+
let source_version_number = env.get_optional_u64_from_method(&jref, "getVersionNumber")?;
1827+
let source_branch = env.get_optional_string_from_method(&jref, "getBranchName")?;
1828+
if let Some(tag_name) = source_tag_name {
1829+
Ok(Ref::Tag(tag_name))
1830+
} else {
1831+
Ok(Ref::Version(source_branch, source_version_number))
1832+
}
1833+
}
1834+
1835+
fn transform_jstorage_options(
1836+
jstorage_options: JObject,
1837+
env: &mut JNIEnv,
1838+
) -> Result<Option<ObjectStoreParams>> {
1839+
let storage_options = env.get_optional(&jstorage_options, |env, map_obj| {
1840+
let jmap = JMap::from_env(env, map_obj)?;
1841+
to_rust_map(env, &jmap)
1842+
})?;
1843+
Ok(storage_options
1844+
.map(|options| {
1845+
Some(ObjectStoreParams {
1846+
storage_options: Some(options),
1847+
..Default::default()
1848+
})
1849+
})
1850+
.unwrap_or(None))
1851+
}
1852+
19271853
#[no_mangle]
19281854
pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeDeleteBranch(
19291855
mut env: JNIEnv,

0 commit comments

Comments
 (0)