@@ -37,7 +37,7 @@ use lance::table::format::IndexMetadata;
3737use lance_core:: datatypes:: Schema as LanceSchema ;
3838use lance_index:: DatasetIndexExt ;
3939use lance_index:: { IndexParams , IndexType } ;
40- use lance_io:: object_store:: ObjectStoreRegistry ;
40+ use lance_io:: object_store:: { ObjectStoreRegistry , StorageOptions } ;
4141use std:: collections:: HashMap ;
4242use std:: iter:: empty;
4343use 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
16861654fn 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-
17721698fn 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
18731800fn 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]
19281854pub extern "system" fn Java_com_lancedb_lance_Dataset_nativeDeleteBranch (
19291855 mut env : JNIEnv ,
0 commit comments