Skip to content

Commit c293e94

Browse files
committed
Allow tables to be created without proving a URL
1 parent fff646c commit c293e94

File tree

13 files changed

+78
-32
lines changed

13 files changed

+78
-32
lines changed

crates/store/re_protos/proto/rerun/v1alpha1/cloud.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -863,9 +863,9 @@ message CreateTableEntryRequest {
863863

864864
// Information about the table to register.
865865
//
866-
// This must be encoded message of one one of the following supported types:
866+
// This must be encoded message of one of the following supported types:
867867
// - LanceTable
868-
google.protobuf.Any provider_details = 2;
868+
optional google.protobuf.Any provider_details = 2;
869869

870870
// Schema of the table to create
871871
rerun.common.v1alpha1.Schema schema = 3;

crates/store/re_protos/src/v1alpha1/rerun.cloud.v1alpha1.ext.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ impl TryFrom<crate::cloud::v1alpha1::CreateDatasetEntryResponse> for CreateDatas
761761
pub struct CreateTableEntryRequest {
762762
pub name: String,
763763
pub schema: Schema,
764-
pub provider_details: ProviderDetails,
764+
pub provider_details: Option<ProviderDetails>,
765765
}
766766

767767
impl TryFrom<CreateTableEntryRequest> for crate::cloud::v1alpha1::CreateTableEntryRequest {
@@ -770,7 +770,10 @@ impl TryFrom<CreateTableEntryRequest> for crate::cloud::v1alpha1::CreateTableEnt
770770
Ok(Self {
771771
name: value.name,
772772
schema: Some((&value.schema).try_into()?),
773-
provider_details: Some((&value.provider_details).try_into()?),
773+
provider_details: value
774+
.provider_details
775+
.map(|d| (&d).try_into())
776+
.transpose()?,
774777
})
775778
}
776779
}
@@ -789,12 +792,10 @@ impl TryFrom<crate::cloud::v1alpha1::CreateTableEntryRequest> for CreateTableEnt
789792
"schema"
790793
))?
791794
.try_into()?,
792-
provider_details: ProviderDetails::try_from(&value.provider_details.ok_or(
793-
missing_field!(
794-
crate::cloud::v1alpha1::CreateTableEntryRequest,
795-
"provider_details"
796-
),
797-
)?)?,
795+
provider_details: value
796+
.provider_details
797+
.map(|v| ProviderDetails::try_from(&v))
798+
.transpose()?,
798799
})
799800
}
800801
}

crates/store/re_protos/src/v1alpha1/rerun.cloud.v1alpha1.rs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_redap_client/src/connection_client.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -816,12 +816,11 @@ where
816816
pub async fn create_table_entry(
817817
&mut self,
818818
name: &str,
819-
url: &Url,
819+
url: Option<Url>,
820820
schema: SchemaRef,
821821
) -> ApiResult<TableEntry> {
822-
let provider_details = ProviderDetails::LanceTable(LanceTable {
823-
table_url: url.clone(),
824-
});
822+
let provider_details =
823+
url.map(|url| ProviderDetails::LanceTable(LanceTable { table_url: url }));
825824
let request = CreateTableEntryRequest {
826825
name: name.to_owned(),
827826
schema: schema.as_ref().clone(),

crates/store/re_redap_tests/src/tests/create_dataset.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ pub async fn create_dataset_tests(service: impl RerunCloudService) {
144144
let create_table_request = CreateTableEntryRequest {
145145
name: table_name.to_owned(),
146146
schema: schema.clone(),
147-
provider_details,
147+
provider_details: Some(provider_details),
148148
}
149149
.try_into()
150150
.expect("Unable to create table request");

crates/store/re_redap_tests/src/tests/create_table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub async fn create_table_entry(service: impl RerunCloudService) {
2828
let create_table_request = CreateTableEntryRequest {
2929
name: table_name.to_owned(),
3030
schema: schema.clone(),
31-
provider_details,
31+
provider_details: Some(provider_details),
3232
}
3333
.try_into()
3434
.expect("Unable to create table request");

crates/store/re_redap_tests/src/tests/update_entry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ async fn create_table_entry(
275275
CreateTableEntryRequest {
276276
name: table_name.to_owned(),
277277
schema: schema.clone(),
278-
provider_details,
278+
provider_details: Some(provider_details),
279279
}
280280
.try_into()
281281
.unwrap(),

crates/store/re_server/src/rerun_cloud.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use re_arrow_util::RecordBatchExt as _;
1212
use re_chunk_store::{Chunk, ChunkStore, ChunkStoreHandle};
1313
use re_log_encoding::ToTransport as _;
1414
use re_log_types::{EntityPath, EntryId, StoreId, StoreKind};
15+
use re_protos::cloud::v1alpha1::ext::LanceTable;
1516
use re_protos::cloud::v1alpha1::ext::{
1617
self, CreateDatasetEntryRequest, CreateDatasetEntryResponse, CreateTableEntryRequest,
1718
CreateTableEntryResponse, DataSource, DatasetDetails, EntryDetailsUpdate, ProviderDetails,
@@ -38,17 +39,39 @@ use tonic::{Code, Request, Response, Status};
3839
use crate::chunk_index::DatasetChunkIndexes;
3940
use crate::entrypoint::NamedPath;
4041
use crate::store::{ChunkKey, Dataset, InMemoryStore, Table};
42+
use re_tuid::Tuid;
4143

42-
#[derive(Debug, Default)]
43-
pub struct RerunCloudHandlerSettings {}
44+
#[derive(Debug)]
45+
pub struct RerunCloudHandlerSettings {
46+
storage_dir: tempfile::TempDir,
47+
}
48+
49+
impl Default for RerunCloudHandlerSettings {
50+
fn default() -> Self {
51+
Self {
52+
storage_dir: create_data_dir().expect("Failed to create data directory"),
53+
}
54+
}
55+
}
56+
57+
fn create_data_dir() -> Result<tempfile::TempDir, crate::store::Error> {
58+
Ok(tempfile::Builder::new().prefix("rerun-data-").tempdir()?)
59+
}
4460

45-
#[derive(Default)]
4661
pub struct RerunCloudHandlerBuilder {
4762
settings: RerunCloudHandlerSettings,
48-
4963
store: InMemoryStore,
5064
}
5165

66+
impl Default for RerunCloudHandlerBuilder {
67+
fn default() -> Self {
68+
Self {
69+
settings: Default::default(),
70+
store: InMemoryStore::default(),
71+
}
72+
}
73+
}
74+
5275
impl RerunCloudHandlerBuilder {
5376
pub fn new() -> Self {
5477
Self::default()
@@ -90,7 +113,6 @@ impl RerunCloudHandlerBuilder {
90113
const DUMMY_TASK_ID: &str = "task_00000000DEADBEEF";
91114

92115
pub struct RerunCloudHandler {
93-
#[expect(dead_code)]
94116
settings: RerunCloudHandlerSettings,
95117

96118
store: tokio::sync::RwLock<InMemoryStore>,
@@ -1478,7 +1500,28 @@ impl RerunCloudService for RerunCloudHandler {
14781500

14791501
let schema = Arc::new(request.schema);
14801502

1481-
let table = match &request.provider_details {
1503+
let details = match request.provider_details {
1504+
Some(details) => details,
1505+
None => {
1506+
// Create a directory in the storage directory. We use a tuid to avoid collisions
1507+
// and avoid any sanitization issue with the provided table name.
1508+
let table_path = self
1509+
.settings
1510+
.storage_dir
1511+
.path()
1512+
.join(format!("lance-{}", Tuid::new().to_string()));
1513+
ProviderDetails::LanceTable(LanceTable {
1514+
table_url: url::Url::from_directory_path(table_path).map_err(|_| {
1515+
Status::internal(format!(
1516+
"Failed to create table directory in {:?}",
1517+
self.settings.storage_dir.path()
1518+
))
1519+
})?,
1520+
})
1521+
}
1522+
};
1523+
1524+
let table = match details {
14821525
ProviderDetails::LanceTable(table) => {
14831526
store
14841527
.create_table_entry(table_name, &table.table_url, schema)

rerun_py/rerun_bindings/rerun_bindings.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1669,7 +1669,7 @@ class CatalogClientInternal:
16691669

16701670
def create_dataset(self, name: str) -> DatasetEntryInternal: ...
16711671
def register_table(self, name: str, url: str) -> TableEntryInternal: ...
1672-
def create_table(self, name: str, schema: pa.Schema, url: str) -> TableEntryInternal: ...
1672+
def create_table(self, name: str, schema: pa.Schema, url: str | None) -> TableEntryInternal: ...
16731673
def write_table(self, name: str, batches: pa.RecordBatchReader, insert_mode: TableInsertMode) -> None: ...
16741674
def ctx(self) -> dfn.SessionContext: ...
16751675

rerun_py/rerun_sdk/rerun/catalog/_catalog_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ def register_table(self, name: str, url: str) -> TableEntry:
289289

290290
return TableEntry(self._internal.register_table(name, url))
291291

292-
def create_table(self, name: str, schema: pa.Schema, url: str) -> TableEntry:
292+
def create_table(self, name: str, schema: pa.Schema, url: str | None) -> TableEntry:
293293
"""
294294
Create and register a new table.
295295

0 commit comments

Comments
 (0)