Skip to content

Commit 90c87fe

Browse files
committed
add macro to cover s3 sync engine generation
1 parent 2954b4a commit 90c87fe

File tree

8 files changed

+93
-27
lines changed

8 files changed

+93
-27
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ description = "WorkTable is in-memory storage"
1212

1313
[features]
1414
perf_measurements = ["dep:performance_measurement", "dep:performance_measurement_codegen"]
15-
s3-support = ["dep:rust-s3", "dep:aws-creds", "dep:aws-region", "dep:walkdir"]
15+
s3-support = ["dep:rust-s3", "dep:aws-creds", "dep:aws-region", "dep:walkdir", "worktable_codegen/s3-support"]
1616

1717
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1818

codegen/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ edition = "2024"
55
license = "MIT"
66
description = "WorkTable codegeneration crate"
77

8+
[features]
9+
s3-support = []
10+
811
[lib]
912
name = "worktable_codegen"
1013
path = "src/lib.rs"

codegen/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ mod mem_stat;
22
mod name_generator;
33
mod persist_index;
44
mod persist_table;
5+
#[cfg(feature = "s3-support")]
6+
mod s3_persistence;
57
mod worktable;
68

79
use proc_macro::TokenStream;
@@ -14,6 +16,14 @@ pub fn worktable(input: TokenStream) -> TokenStream {
1416
.into()
1517
}
1618

19+
#[cfg(feature = "s3-support")]
20+
#[proc_macro]
21+
pub fn s3_sync_persistence(input: TokenStream) -> TokenStream {
22+
s3_persistence::expand(input.into())
23+
.unwrap_or_else(|e| e.to_compile_error())
24+
.into()
25+
}
26+
1727
#[proc_macro_derive(PersistIndex)]
1828
pub fn persist_index(input: TokenStream) -> TokenStream {
1929
persist_index::expand(input.into())

codegen/src/name_generator.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,26 @@ impl WorktableNameGenerator {
117117
Span::mixed_site(),
118118
)
119119
}
120+
121+
pub fn get_space_secondary_index_ident(&self) -> Ident {
122+
Ident::new(
123+
format!("{}SpaceSecondaryIndex", self.name).as_str(),
124+
Span::mixed_site(),
125+
)
126+
}
127+
128+
pub fn get_space_secondary_index_events_ident(&self) -> Ident {
129+
Ident::new(
130+
format!("{}SpaceSecondaryIndexEvents", self.name).as_str(),
131+
Span::mixed_site(),
132+
)
133+
}
134+
135+
#[cfg(feature = "s3-support")]
136+
pub fn get_s3_sync_persistence_engine_ident(&self) -> Ident {
137+
Ident::new(
138+
format!("{}SyncPersistenceEngine", self.name).as_str(),
139+
Span::mixed_site(),
140+
)
141+
}
120142
}

codegen/src/persist_index/generator.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,6 @@ impl WorktableNameGenerator {
3030
Span::mixed_site(),
3131
)
3232
}
33-
34-
pub fn get_space_secondary_index_events_ident(&self) -> Ident {
35-
Ident::new(
36-
format!("{}SpaceSecondaryIndexEvents", self.name).as_str(),
37-
Span::mixed_site(),
38-
)
39-
}
40-
41-
pub fn get_space_secondary_index_ident(&self) -> Ident {
42-
Ident::new(
43-
format!("{}SpaceSecondaryIndex", self.name).as_str(),
44-
Span::mixed_site(),
45-
)
46-
}
4733
}
4834

4935
impl Generator {

codegen/src/s3_persistence/mod.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use proc_macro2::TokenStream;
2+
use quote::quote;
3+
use syn::parse::{Parse, ParseStream};
4+
use syn::{Ident, Result};
5+
6+
use crate::name_generator::WorktableNameGenerator;
7+
8+
struct S3PersistenceInput {
9+
table_name: Ident,
10+
}
11+
12+
impl Parse for S3PersistenceInput {
13+
fn parse(input: ParseStream) -> Result<Self> {
14+
let table_name: Ident = input.parse()?;
15+
Ok(S3PersistenceInput { table_name })
16+
}
17+
}
18+
19+
pub fn expand(input: TokenStream) -> Result<TokenStream> {
20+
let input: S3PersistenceInput = syn::parse2(input)?;
21+
22+
let name_str = input.table_name.to_string();
23+
let base_name = name_str
24+
.strip_suffix("WorkTable")
25+
.unwrap_or(&name_str)
26+
.to_string();
27+
28+
let generator = WorktableNameGenerator::from_table_name(base_name);
29+
30+
let output_ident = generator.get_s3_sync_persistence_engine_ident();
31+
let primary_key = generator.get_primary_key_type_ident();
32+
let space_secondary_index = generator.get_space_secondary_index_ident();
33+
let space_secondary_index_events = generator.get_space_secondary_index_events_ident();
34+
let available_indexes = generator.get_available_indexes_ident();
35+
let inner_size_const = generator.get_page_inner_size_const_ident();
36+
let page_size_const = generator.get_page_size_const_ident();
37+
38+
Ok(quote! {
39+
type #output_ident = S3SyncDiskPersistenceEngine<
40+
SpaceData<
41+
<<#primary_key as TablePrimaryKey>::Generator as PrimaryKeyGeneratorState>::State,
42+
{ #inner_size_const },
43+
{ #page_size_const as u32 },
44+
>,
45+
SpaceIndex<#primary_key, { #inner_size_const as u32 }>,
46+
#space_secondary_index,
47+
#primary_key,
48+
#space_secondary_index_events,
49+
#available_indexes,
50+
>;
51+
})
52+
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ pub use table::*;
1919
pub use data_bucket;
2020
pub use worktable_codegen::worktable;
2121

22+
#[cfg(feature = "s3-support")]
23+
pub use worktable_codegen::s3_sync_persistence;
24+
2225
pub mod prelude {
2326
pub use crate::in_memory::{
2427
ArchivedRowWrapper, Data, DataPages, Query, RowWrapper, StorableRow,

tests/persistence/s3/mod.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::remove_dir_if_exists;
22
use worktable::prelude::*;
3+
use worktable::s3_sync_persistence;
34
use worktable::worktable;
45

56
worktable!(
@@ -11,18 +12,7 @@ worktable!(
1112
},
1213
);
1314

14-
type TestS3SyncPersistenceEngine = S3SyncDiskPersistenceEngine<
15-
SpaceData<
16-
<<TestS3PrimaryKey as TablePrimaryKey>::Generator as PrimaryKeyGeneratorState>::State,
17-
{ TEST_S_3_INNER_SIZE },
18-
{ TEST_S_3_PAGE_SIZE as u32 },
19-
>,
20-
SpaceIndex<TestS3PrimaryKey, { TEST_S_3_INNER_SIZE as u32 }>,
21-
TestS3SpaceSecondaryIndex,
22-
TestS3PrimaryKey,
23-
TestS3SpaceSecondaryIndexEvents,
24-
TestS3AvailableIndexes,
25-
>;
15+
s3_sync_persistence!(TestS3WorkTable);
2616

2717
#[test]
2818
fn test_s3_engine_compiles() {

0 commit comments

Comments
 (0)