Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
d7102fc
WIP
Handy-caT Dec 12, 2024
dbc38d9
merge main into app-operations-as-structs
Handy-caT Dec 12, 2024
06ffde0
WIP
Handy-caT Dec 12, 2024
2703dd8
WIP
Handy-caT Dec 14, 2024
f96cdfc
WIP
Handy-caT Dec 16, 2024
0e930b3
Merge branch 'main' into app-operations-as-structs
Handy-caT Dec 17, 2024
f32a49a
rename `Space` as `SpaceFile`
Handy-caT Dec 17, 2024
ad836e9
WIP
Handy-caT Dec 17, 2024
f788c47
Merge branch 'main' into app-operations-as-structs
Handy-caT Dec 17, 2024
a521cd1
WIP
Handy-caT Dec 18, 2024
fabd60f
WIP
Handy-caT Dec 19, 2024
1d592a2
add test for data sync
Handy-caT Dec 26, 2024
f754aea
merge main into app-operations-as-structs
Handy-caT Dec 28, 2024
bf51739
add file data update
Handy-caT Dec 28, 2024
c30d849
WIP
Handy-caT Dec 30, 2024
ffb6298
Merge main into app-operations-as-structs
Handy-caT Jan 2, 2025
76fbc3f
WIP
Handy-caT Jan 3, 2025
eb1ef41
WIP
Handy-caT Jan 5, 2025
fa10fd3
merge main into app-operations-as-structs
Handy-caT Jan 6, 2025
1ed230c
WIP
Handy-caT Jan 9, 2025
6c78f97
still WIP
Handy-caT Jan 12, 2025
64b7411
add tests with real files for current toc and space index states
Handy-caT Jan 12, 2025
3c9d9a5
WIP
Handy-caT Jan 15, 2025
aac2f93
Finally insert works fine
Handy-caT Jan 16, 2025
eb169c3
add proper node_id update
Handy-caT Jan 18, 2025
aa4b8af
add proper node_id update for remove too
Handy-caT Jan 18, 2025
c3bcfb1
test corrections
Handy-caT Jan 19, 2025
85da6ed
WIP
Handy-caT Jan 19, 2025
d1857bd
Refactor TOC next_page usage
Handy-caT Jan 26, 2025
5f921ed
add empty pages reuse logic
Handy-caT Jan 26, 2025
b23fbef
little fns reorder
Handy-caT Jan 26, 2025
059d639
little fns reorder
Handy-caT Jan 26, 2025
54d74c7
add unit test for empty page id usage
Handy-caT Jan 26, 2025
afa4072
update test files
Handy-caT Jan 26, 2025
e106cf6
fix wrong node_id value in SpaceIndex and add test for second node cr…
Handy-caT Jan 27, 2025
b2d1fb9
add tests for remove node
Handy-caT Jan 28, 2025
e880a39
finalise split node logic
Handy-caT Jan 31, 2025
6e7d1b0
slit node corrections
Handy-caT Jan 31, 2025
8f92fb9
start indexset compatibility tests implementation
Handy-caT Feb 1, 2025
a41c5e0
continue indexset compatibility tests implementation
Handy-caT Feb 1, 2025
d9d78a7
merge main
Handy-caT Feb 4, 2025
df771a3
space info corrections
Handy-caT Feb 8, 2025
b6116de
apply name corrections from data bucket
Handy-caT Feb 9, 2025
b471b74
refactor space data/index to construct from path
Handy-caT Feb 9, 2025
df1dff0
update persistence engine with new space data and index models
Handy-caT Feb 9, 2025
44c8efa
remove DatabaseManager and replace it with PersistManager
Handy-caT Feb 9, 2025
6bbec18
continue space index generation
Handy-caT Feb 9, 2025
22d953e
merge main into app-operations-as-structs
Handy-caT Feb 12, 2025
7f8c126
WIP
Handy-caT Feb 12, 2025
dabdb00
Big part of corrections on pages read/write logic. Big refactor of Sp…
Handy-caT Feb 15, 2025
199aab1
Add SpaceData bootstrap because it had no SpaceInfo on startup
Handy-caT Feb 16, 2025
ffebcb2
Add SpaceIndex bootstrap because it had no SpaceInfo on startup
Handy-caT Feb 16, 2025
efc69c2
something starting (inserts sync is working)
Handy-caT Feb 16, 2025
626c8bb
fix pk_gen sync logic
Handy-caT Feb 18, 2025
f540e95
fix tests
Handy-caT Feb 18, 2025
ff4f3eb
WIP
Handy-caT Feb 19, 2025
8e35332
merge main into app-operations-as-structs
Handy-caT Feb 19, 2025
a6d1985
WIP
Handy-caT Feb 19, 2025
455262b
fix update logic
Handy-caT Feb 21, 2025
e360750
fix update query logic
Handy-caT Feb 22, 2025
6a5a0a2
support delete sync
Handy-caT Feb 22, 2025
c184ebf
WIP
Handy-caT Feb 25, 2025
4d8fc90
fix data length logic
Handy-caT Feb 27, 2025
016e281
fix pk gen persist
Handy-caT Feb 27, 2025
2020d03
merge main into app-operations-as-structs
Handy-caT Feb 27, 2025
52246ab
Corrections
Handy-caT Feb 27, 2025
7c7955e
Add detached task for write ops
Handy-caT Mar 2, 2025
5612e78
tests correction
Handy-caT Mar 4, 2025
24eabe3
fix clippy
Handy-caT Mar 6, 2025
d8fcde4
fix tests
Handy-caT Mar 6, 2025
90d529e
WIP
Handy-caT Mar 7, 2025
f0955b8
WIP
Handy-caT Mar 8, 2025
9a8cb0d
fix clippy
Handy-caT Mar 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,19 @@ perf_measurements = ["dep:performance_measurement", "dep:performance_measurement
eyre = "0.6.12"
derive_more = { version = "1.0.0", features = ["from", "error", "display", "into"] }
tokio = { version = "1", features = ["full"] }
tracing = "0.1.40"
rkyv = { version = "0.8.9", features = ["uuid-1"] }
lockfree = { version = "0.5.1" }
worktable_codegen = { path = "codegen", version = "0.4.1" }
scc = "2.1.16"
futures = "0.3.30"
uuid = { version = "1.10.0", features = ["v4"] }
data_bucket = { git = "https://github.com/pathscale/DataBucket", branch = "main" }
#data_bucket = { path = "../DataBucket", version = "0.1.1" }
# data_bucket = { path = "../DataBucket", version = "0.1.0" }
performance_measurement_codegen = { path = "performance_measurement/codegen", version = "0.1.0", optional = true }
performance_measurement = { path = "performance_measurement", version = "0.1.0", optional = true }
indexset = { version = "0.10.3", features = ["concurrent", "multimap"] }
# indexset = { path = "../indexset", version = "0.10.3", features = ["concurrent", "multimap"] }
indexset = { version = "0.11.2", features = ["concurrent", "cdc", "multimap"] }
convert_case = "0.6.0"

[dev-dependencies]
async-std = "1.13.0"
288 changes: 109 additions & 179 deletions codegen/src/persist_index/generator.rs

Large diffs are not rendered by default.

9 changes: 3 additions & 6 deletions codegen/src/persist_index/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use crate::persist_index::parser::Parser;

mod generator;
mod parser;
mod space;

pub fn expand(input: TokenStream) -> syn::Result<TokenStream> {
let input_struct = Parser::parse_struct(input)?;
Expand All @@ -14,19 +15,20 @@ pub fn expand(input: TokenStream) -> syn::Result<TokenStream> {
let type_def = gen.gen_persist_type()?;
let persistable_def = gen.gen_persistable_impl()?;
let impl_def = gen.gen_persist_impl()?;
let space_index = gen.gen_space_index();

Ok(quote! {
#type_def
#impl_def
#persistable_def
#space_index
})
}

#[cfg(test)]
mod tests {
use quote::quote;
use rkyv::{Archive, Deserialize, Serialize};
use scc::TreeIndex;

use crate::persist_index::expand;

Expand All @@ -39,11 +41,6 @@ mod tests {
pub length: u32,
}

pub struct TestIndex {
test_idx: TreeIndex<i64, Link>,
exchange_idx: TreeIndex<String, std::sync::Arc<lockfree::set::Set<Link>>>,
}

#[test]
fn test() {
let input = quote! {
Expand Down
38 changes: 38 additions & 0 deletions codegen/src/persist_index/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,41 @@ impl Parser {
}
}
}

#[cfg(test)]
mod tests {
use crate::persist_index::parser::Parser;
use quote::quote;

#[test]
fn parses_index_struct() {
let input = quote! {
#[derive(Debug, Default, Clone)]
pub struct TestIndex {
test_idx: TreeIndex<i64, Link>,
exchnage_idx: TreeIndex<String, std::sync::Arc<LockFreeSet<Link>>>
}
};
assert!(Parser::parse_struct(input).is_ok())
}

#[test]
fn errors_on_type() {
let input = quote! {
pub type TestIndex = Srting;
};
assert!(Parser::parse_struct(input).is_err())
}

#[test]
fn errors_on_enum() {
let input = quote! {
#[derive(Debug, Default, Clone)]
pub enum TestIndex {
First,
Second
}
};
assert!(Parser::parse_struct(input).is_err())
}
}
129 changes: 129 additions & 0 deletions codegen/src/persist_index/space.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
use proc_macro2::{Literal, TokenStream};
use quote::quote;

use crate::name_generator::WorktableNameGenerator;
use crate::persist_index::generator::Generator;

impl Generator {
pub fn gen_space_index(&self) -> TokenStream {
let secondary_index = self.gen_space_secondary_index_type();
let secondary_impl = self.gen_space_secondary_index_impl_space_index();
let secondary_index_events = self.gen_space_secondary_index_events_type();

quote! {
#secondary_index_events
#secondary_index
#secondary_impl
}
}

fn gen_space_secondary_index_events_type(&self) -> TokenStream {
let name_generator = WorktableNameGenerator::from_index_ident(&self.struct_def.ident);
let ident = name_generator.get_space_secondary_index_events_ident();

let fields: Vec<_> = self
.field_types
.iter()
.map(|(i, t)| {
quote! {
#i: Vec<indexset::cdc::change::ChangeEvent<
indexset::core::pair::Pair<#t, Link>
>>,
}
})
.collect();

quote! {
#[derive(Debug)]
pub struct #ident {
#(#fields)*
}
}
}

fn gen_space_secondary_index_type(&self) -> TokenStream {
let name_generator = WorktableNameGenerator::from_index_ident(&self.struct_def.ident);
let ident = name_generator.get_space_secondary_index_ident();
let inner_const_name = name_generator.get_page_inner_size_const_ident();

let fields: Vec<_> = self
.field_types
.iter()
.map(|(i, t)| {
quote! {
#i: SpaceIndex<#t, { #inner_const_name as u32}>,
}
})
.collect();

quote! {
#[derive(Debug)]
pub struct #ident {
#(#fields)*
}
}
}

fn gen_space_secondary_index_impl_space_index(&self) -> TokenStream {
let name_generator = WorktableNameGenerator::from_index_ident(&self.struct_def.ident);
let events_ident = name_generator.get_space_secondary_index_events_ident();
let ident = name_generator.get_space_secondary_index_ident();

let from_table_files_path_fn = self.gen_space_secondary_index_from_table_files_path_fn();
let index_process_change_events_fn =
self.gen_space_secondary_index_process_change_events_fn();

quote! {
impl SpaceSecondaryIndexOps<#events_ident> for #ident {
#from_table_files_path_fn
#index_process_change_events_fn
}
}
}

fn gen_space_secondary_index_from_table_files_path_fn(&self) -> TokenStream {
let fields: Vec<_> = self
.field_types
.keys()
.map(|i| {
let literal_name = Literal::string(i.to_string().as_str());
quote! {
#i: SpaceIndex::secondary_from_table_files_path(path, #literal_name)?,
}
})
.collect();

quote! {
fn from_table_files_path<S: AsRef<str>>(path: S) -> eyre::Result<Self> {
let path = path.as_ref();
Ok(Self {
#(#fields)*
})
}
}
}

fn gen_space_secondary_index_process_change_events_fn(&self) -> TokenStream {
let name_generator = WorktableNameGenerator::from_index_ident(&self.struct_def.ident);
let events_ident = name_generator.get_space_secondary_index_events_ident();

let process: Vec<_> = self
.field_types
.keys()
.map(|i| {
quote! {
for event in events.#i {
self.#i.process_change_event(event)?;
}
}
})
.collect();

quote! {
fn process_change_events(&mut self, events: #events_ident) -> eyre::Result<()> {
#(#process)*
core::result::Result::Ok(())
}
}
}
}
19 changes: 15 additions & 4 deletions codegen/src/persist_table/generator/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::name_generator::WorktableNameGenerator;
pub use space_file::WT_INDEX_EXTENSION;

mod size_measurable;
mod space;
mod space_file;

pub struct Generator {
Expand All @@ -22,11 +23,21 @@ impl WorktableNameGenerator {
)
}

//pub fn get_space_ident(&self) -> Ident {
// Ident::new(format!("{}Space", self.name).as_str(), Span::mixed_site())
//}

pub fn get_dir_name(&self) -> String {
self.name.from_case(Case::Pascal).to_case(Case::Snake)
}

pub fn get_persistence_engine_ident(&self) -> Ident {
Ident::new(
format!("{}PersistenceEngine", self.name).as_str(),
Span::mixed_site(),
)
}

pub fn get_persistence_task_ident(&self) -> Ident {
Ident::new(
format!("{}PersistenceTask", self.name).as_str(),
Span::mixed_site(),
)
}
}
45 changes: 45 additions & 0 deletions codegen/src/persist_table/generator/space.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
use crate::name_generator::WorktableNameGenerator;
use crate::persist_table::generator::Generator;
use proc_macro2::TokenStream;
use quote::quote;

impl Generator {
pub fn get_persistence_task_type(&self) -> TokenStream {
let name_generator = WorktableNameGenerator::from_struct_ident(&self.struct_def.ident);
let ident = name_generator.get_persistence_task_ident();
let primary_key_type = name_generator.get_primary_key_type_ident();
let space_secondary_indexes_events =
name_generator.get_space_secondary_index_events_ident();

quote! {
pub type #ident = PersistenceTask<
<<#primary_key_type as TablePrimaryKey>::Generator as PrimaryKeyGeneratorState>::State,
#primary_key_type,
#space_secondary_indexes_events,
>;
}
}

pub fn get_persistence_engine_type(&self) -> TokenStream {
let name_generator = WorktableNameGenerator::from_struct_ident(&self.struct_def.ident);
let ident = name_generator.get_persistence_engine_ident();
let primary_key_type = name_generator.get_primary_key_type_ident();
let inner_const_name = name_generator.get_page_inner_size_const_ident();
let space_secondary_indexes = name_generator.get_space_secondary_index_ident();
let space_secondary_indexes_events =
name_generator.get_space_secondary_index_events_ident();

quote! {
pub type #ident = PersistenceEngine<
SpaceData<
<<#primary_key_type as TablePrimaryKey>::Generator as PrimaryKeyGeneratorState>::State,
{ #inner_const_name as u32 }
>,
SpaceIndex<#primary_key_type, { #inner_const_name as u32 }>,
#space_secondary_indexes,
#primary_key_type,
#space_secondary_indexes_events,
>;
}
}
}
Loading
Loading