diff --git a/Cargo.lock b/Cargo.lock index 0f2517f43..82b60329a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -524,8 +524,8 @@ dependencies = [ "bytes", "cfg-if", "http", - "indexmap 2.11.4", - "schemars 1.0.4", + "indexmap", + "schemars", "serde", "serde_json", "serde_qs", @@ -635,6 +635,7 @@ dependencies = [ "bitcoincore-rpc", "brk_error", "brk_fetcher", + "brk_grouper", "brk_indexer", "brk_logger", "brk_parser", @@ -677,6 +678,15 @@ dependencies = [ "sonic-rs 0.5.5", ] +[[package]] +name = "brk_grouper" +version = "0.0.111" +dependencies = [ + "brk_structs", + "brk_traversable", + "vecdb", +] + [[package]] name = "brk_indexer" version = "0.0.111" @@ -684,6 +694,7 @@ dependencies = [ "bitcoin", "bitcoincore-rpc", "brk_error", + "brk_grouper", "brk_logger", "brk_parser", "brk_store", @@ -709,11 +720,9 @@ dependencies = [ "derive_deref", "nucleo-matcher", "quick_cache", - "schemars 1.0.4", + "schemars", "serde", "serde_json", - "serde_with", - "sonic-rs 0.5.5", "vecdb", ] @@ -735,7 +744,7 @@ dependencies = [ "brk_interface", "brk_rmcp", "log", - "schemars 1.0.4", + "schemars", "serde", "serde_json", ] @@ -771,7 +780,7 @@ dependencies = [ "paste", "pin-project-lite", "rand 0.9.2", - "schemars 1.0.4", + "schemars", "serde", "serde_json", "sse-stream", @@ -831,7 +840,7 @@ dependencies = [ "derive_more", "dunce", "futures", - "indexmap 2.11.4", + "indexmap", "itertools", "itoa", "memchr", @@ -1114,7 +1123,7 @@ dependencies = [ "fast-glob", "form_urlencoded", "futures", - "indexmap 2.11.4", + "indexmap", "infer", "itoa", "memchr", @@ -1167,7 +1176,7 @@ dependencies = [ "jiff", "log", "quick_cache", - "schemars 1.0.4", + "schemars", "serde", "serde_json", "sonic-rs 0.5.5", @@ -1210,7 +1219,6 @@ dependencies = [ "bitcoin", "bitcoincore-rpc", "brk_error", - "brk_traversable", "byteview", "derive_deref", "itoa", @@ -1218,7 +1226,7 @@ dependencies = [ "num_enum", "rapidhash", "ryu", - "schemars 1.0.4", + "schemars", "serde", "serde_bytes", "strum", @@ -1231,9 +1239,8 @@ dependencies = [ name = "brk_traversable" version = "0.0.111" dependencies = [ + "brk_structs", "brk_traversable_derive", - "schemars 1.0.4", - "serde", "vecdb", ] @@ -1688,7 +1695,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde_core", ] [[package]] @@ -2149,12 +2155,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -2187,12 +2187,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "hex-conservative" version = "0.2.1" @@ -2434,17 +2428,6 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.11.4" @@ -3323,7 +3306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bc696688fc6cbab56971f02badc233541f964f4705240c986abc02535a3728e" dependencies = [ "cfg-if", - "indexmap 2.11.4", + "indexmap", "json-strip-comments", "libc", "once_cell", @@ -3418,7 +3401,7 @@ checksum = "7c10b7504559c08191c3881ef53fb671619c62c9cc26bd5e66274c68057e6ad3" dependencies = [ "base64 0.22.1", "compact_str", - "indexmap 2.11.4", + "indexmap", "itoa", "memchr", "oxc_allocator", @@ -3594,7 +3577,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap 2.11.4", + "indexmap", "serde", ] @@ -4034,7 +4017,7 @@ checksum = "35a640b26f007713818e9a9b65d34da1cf58538207b052916a83d80e43f3ffa4" dependencies = [ "bytes", "hashbrown 0.15.5", - "indexmap 2.11.4", + "indexmap", "munge", "ptr_meta", "rancor", @@ -4143,18 +4126,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - [[package]] name = "schemars" version = "1.0.4" @@ -4163,7 +4134,7 @@ checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ "chrono", "dyn-clone", - "indexmap 2.11.4", + "indexmap", "ref-cast", "schemars_derive", "serde", @@ -4314,7 +4285,7 @@ version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.11.4", + "indexmap", "itoa", "memchr", "ryu", @@ -4367,37 +4338,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.11.4", - "schemars 0.9.0", - "schemars 1.0.4", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "sha1" version = "0.10.6" @@ -4727,12 +4667,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde", "time-core", - "time-macros", ] [[package]] @@ -4741,16 +4679,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" version = "0.8.1" @@ -4835,7 +4763,7 @@ version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ - "indexmap 2.11.4", + "indexmap", "serde_core", "serde_spanned", "toml_datetime", @@ -4859,7 +4787,7 @@ version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ - "indexmap 2.11.4", + "indexmap", "toml_datetime", "toml_parser", "winnow", @@ -5778,7 +5706,7 @@ dependencies = [ "arbitrary", "crc32fast", "flate2", - "indexmap 2.11.4", + "indexmap", "memchr", "zopfli", ] diff --git a/Cargo.toml b/Cargo.toml index 8f439dc8d..c68b63f8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ brk_cli = { version = "0.0.111", path = "crates/brk_cli" } brk_computer = { version = "0.0.111", path = "crates/brk_computer" } brk_error = { version = "0.0.111", path = "crates/brk_error" } brk_fetcher = { version = "0.0.111", path = "crates/brk_fetcher" } +brk_grouper = { version = "0.0.111", path = "crates/brk_grouper" } brk_indexer = { version = "0.0.111", path = "crates/brk_indexer" } brk_interface = { version = "0.0.111", path = "crates/brk_interface" } brk_logger = { version = "0.0.111", path = "crates/brk_logger" } diff --git a/crates/brk_computer/Cargo.toml b/crates/brk_computer/Cargo.toml index 0434de858..f25406677 100644 --- a/crates/brk_computer/Cargo.toml +++ b/crates/brk_computer/Cargo.toml @@ -13,19 +13,20 @@ build = "build.rs" allocative = { workspace = true } bitcoin = { workspace = true } bitcoincore-rpc = { workspace = true } -brk_structs = { workspace = true } brk_error = { workspace = true } brk_fetcher = { workspace = true } +brk_grouper = { workspace = true } brk_indexer = { workspace = true } brk_logger = { workspace = true } -brk_store = { workspace = true } brk_parser = { workspace = true } +brk_store = { workspace = true } +brk_structs = { workspace = true } brk_traversable = { workspace = true } -vecdb = { workspace = true } derive_deref = { workspace = true } log = { workspace = true } pco = "0.4.6" rayon = { workspace = true } serde = { workspace = true } +vecdb = { workspace = true } zerocopy = { workspace = true } zerocopy-derive = { workspace = true } diff --git a/crates/brk_computer/src/stateful/address_cohorts.rs b/crates/brk_computer/src/stateful/address_cohorts.rs index bc226e8a0..dda0c11e2 100644 --- a/crates/brk_computer/src/stateful/address_cohorts.rs +++ b/crates/brk_computer/src/stateful/address_cohorts.rs @@ -1,10 +1,8 @@ use std::path::Path; use brk_error::Result; -use brk_structs::{ - AddressGroups, Bitcoin, ByAmountRange, ByGreatEqualAmount, ByLowerThanAmount, DateIndex, - Dollars, Filtered, Height, Version, -}; +use brk_grouper::{AddressGroups, ByAmountRange, ByGreatEqualAmount, ByLowerThanAmount, Filtered}; +use brk_structs::{Bitcoin, DateIndex, Dollars, Height, Version}; use brk_traversable::Traversable; use derive_deref::{Deref, DerefMut}; use vecdb::{AnyIterableVec, Database, Exit, Format}; diff --git a/crates/brk_computer/src/stateful/addresstype/addresscount.rs b/crates/brk_computer/src/stateful/addresstype/addresscount.rs index c45dbbc97..c6f6e0fbf 100644 --- a/crates/brk_computer/src/stateful/addresstype/addresscount.rs +++ b/crates/brk_computer/src/stateful/addresstype/addresscount.rs @@ -1,4 +1,5 @@ -use brk_structs::{ByAddressType, Height}; +use brk_grouper::ByAddressType; +use brk_structs::Height; use derive_deref::{Deref, DerefMut}; use vecdb::VecIterator; diff --git a/crates/brk_computer/src/stateful/addresstype/height_to_addresscount.rs b/crates/brk_computer/src/stateful/addresstype/height_to_addresscount.rs index 1eb65c605..9570ba9df 100644 --- a/crates/brk_computer/src/stateful/addresstype/height_to_addresscount.rs +++ b/crates/brk_computer/src/stateful/addresstype/height_to_addresscount.rs @@ -1,5 +1,6 @@ use brk_error::Result; -use brk_structs::{ByAddressType, Height, StoredU64}; +use brk_grouper::ByAddressType; +use brk_structs::{Height, StoredU64}; use brk_traversable::Traversable; use derive_deref::{Deref, DerefMut}; use vecdb::{EagerVec, Exit, GenericStoredVec}; diff --git a/crates/brk_computer/src/stateful/addresstype/indexes_to_addresscount.rs b/crates/brk_computer/src/stateful/addresstype/indexes_to_addresscount.rs index 256141c31..9b0799e53 100644 --- a/crates/brk_computer/src/stateful/addresstype/indexes_to_addresscount.rs +++ b/crates/brk_computer/src/stateful/addresstype/indexes_to_addresscount.rs @@ -1,5 +1,6 @@ use brk_error::Result; -use brk_structs::{ByAddressType, StoredU64}; +use brk_grouper::ByAddressType; +use brk_structs::StoredU64; use brk_traversable::Traversable; use derive_deref::{Deref, DerefMut}; use vecdb::Exit; diff --git a/crates/brk_computer/src/stateful/addresstype/typeindex_tree.rs b/crates/brk_computer/src/stateful/addresstype/typeindex_tree.rs index b78d5a977..34d31de0b 100644 --- a/crates/brk_computer/src/stateful/addresstype/typeindex_tree.rs +++ b/crates/brk_computer/src/stateful/addresstype/typeindex_tree.rs @@ -1,6 +1,7 @@ use std::{collections::BTreeMap, mem}; -use brk_structs::{ByAddressType, TypeIndex}; +use brk_grouper::ByAddressType; +use brk_structs::TypeIndex; use derive_deref::{Deref, DerefMut}; #[derive(Debug, Deref, DerefMut)] diff --git a/crates/brk_computer/src/stateful/addresstype/vec.rs b/crates/brk_computer/src/stateful/addresstype/vec.rs index 166a54c03..8ba575292 100644 --- a/crates/brk_computer/src/stateful/addresstype/vec.rs +++ b/crates/brk_computer/src/stateful/addresstype/vec.rs @@ -1,6 +1,6 @@ use std::mem; -use brk_structs::ByAddressType; +use brk_grouper::ByAddressType; use derive_deref::{Deref, DerefMut}; #[derive(Debug, Deref, DerefMut)] diff --git a/crates/brk_computer/src/stateful/mod.rs b/crates/brk_computer/src/stateful/mod.rs index a294e2cd2..a91637235 100644 --- a/crates/brk_computer/src/stateful/mod.rs +++ b/crates/brk_computer/src/stateful/mod.rs @@ -7,13 +7,14 @@ use std::{ }; use brk_error::Result; +use brk_grouper::{ByAddressType, ByAnyAddress, Filtered}; use brk_indexer::Indexer; use brk_structs::{ - AnyAddressDataIndexEnum, AnyAddressIndex, ByAddressType, ByAnyAddress, CheckedSub, DateIndex, - Dollars, EmptyAddressData, EmptyAddressIndex, Filtered, Height, InputIndex, LoadedAddressData, - LoadedAddressIndex, OutputIndex, OutputType, P2AAddressIndex, P2PK33AddressIndex, - P2PK65AddressIndex, P2PKHAddressIndex, P2SHAddressIndex, P2TRAddressIndex, P2WPKHAddressIndex, - P2WSHAddressIndex, Sats, StoredU64, Timestamp, TypeIndex, Version, + AnyAddressDataIndexEnum, AnyAddressIndex, CheckedSub, DateIndex, Dollars, EmptyAddressData, + EmptyAddressIndex, Height, InputIndex, LoadedAddressData, LoadedAddressIndex, OutputIndex, + OutputType, P2AAddressIndex, P2PK33AddressIndex, P2PK65AddressIndex, P2PKHAddressIndex, + P2SHAddressIndex, P2TRAddressIndex, P2WPKHAddressIndex, P2WSHAddressIndex, Sats, StoredU64, + Timestamp, TypeIndex, Version, }; use brk_traversable::Traversable; use log::info; diff --git a/crates/brk_computer/src/stateful/utxo_cohorts.rs b/crates/brk_computer/src/stateful/utxo_cohorts.rs index feb7a3bf9..72f3f5821 100644 --- a/crates/brk_computer/src/stateful/utxo_cohorts.rs +++ b/crates/brk_computer/src/stateful/utxo_cohorts.rs @@ -1,10 +1,12 @@ use std::{collections::BTreeMap, ops::ControlFlow, path::Path}; use brk_error::Result; +use brk_grouper::{ + ByAgeRange, ByAmountRange, ByEpoch, ByGreatEqualAmount, ByLowerThanAmount, ByMaxAge, ByMinAge, + BySpendableType, ByTerm, Filter, Filtered, UTXOGroups, +}; use brk_structs::{ - Bitcoin, ByAgeRange, ByAmountRange, ByEpoch, ByGreatEqualAmount, ByLowerThanAmount, ByMaxAge, - ByMinAge, BySpendableType, ByTerm, CheckedSub, DateIndex, Dollars, Filter, Filtered, - HalvingEpoch, Height, Timestamp, UTXOGroups, Version, + Bitcoin, CheckedSub, DateIndex, Dollars, HalvingEpoch, Height, Timestamp, Version, }; use brk_traversable::Traversable; use derive_deref::{Deref, DerefMut}; diff --git a/crates/brk_computer/src/states/transacted.rs b/crates/brk_computer/src/states/transacted.rs index 53001c9ed..fe8b038dc 100644 --- a/crates/brk_computer/src/states/transacted.rs +++ b/crates/brk_computer/src/states/transacted.rs @@ -1,6 +1,7 @@ use std::ops::{Add, AddAssign}; -use brk_structs::{ByAmountRange, GroupedByType, OutputType, Sats}; +use brk_grouper::{ByAmountRange, GroupedByType}; +use brk_structs::{OutputType, Sats}; use super::SupplyState; diff --git a/crates/brk_grouper/Cargo.toml b/crates/brk_grouper/Cargo.toml new file mode 100644 index 000000000..30030969c --- /dev/null +++ b/crates/brk_grouper/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "brk_grouper" +description = "Groups used throughout BRK" +version.workspace = true +edition.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true +rust-version.workspace = true +build = "build.rs" + +[dependencies] +brk_structs = { workspace = true } +brk_traversable = { workspace = true } +vecdb = { workspace = true } diff --git a/crates/brk_grouper/README.md b/crates/brk_grouper/README.md new file mode 100644 index 000000000..b3922dc02 --- /dev/null +++ b/crates/brk_grouper/README.md @@ -0,0 +1 @@ +# brk_grouper diff --git a/crates/brk_grouper/build.rs b/crates/brk_grouper/build.rs new file mode 100644 index 000000000..a4055a31e --- /dev/null +++ b/crates/brk_grouper/build.rs @@ -0,0 +1,8 @@ +fn main() { + let profile = std::env::var("PROFILE").unwrap_or_default(); + + if profile == "release" { + println!("cargo:rustc-flag=-C"); + println!("cargo:rustc-flag=target-cpu=native"); + } +} diff --git a/crates/brk_structs/src/groups/address.rs b/crates/brk_grouper/src/address.rs similarity index 100% rename from crates/brk_structs/src/groups/address.rs rename to crates/brk_grouper/src/address.rs diff --git a/crates/brk_structs/src/groups/by_address_type.rs b/crates/brk_grouper/src/by_address_type.rs similarity index 99% rename from crates/brk_structs/src/groups/by_address_type.rs rename to crates/brk_grouper/src/by_address_type.rs index a4df4b049..312e5ebee 100644 --- a/crates/brk_structs/src/groups/by_address_type.rs +++ b/crates/brk_grouper/src/by_address_type.rs @@ -1,10 +1,10 @@ use std::ops::{Add, AddAssign}; +use brk_structs::OutputType; use brk_traversable::{Traversable, TreeNode}; use vecdb::AnyCollectableVec; -use super::Filter; -use crate::{Filtered, OutputType}; +use super::{Filter, Filtered}; #[derive(Default, Clone, Debug)] pub struct ByAddressType { diff --git a/crates/brk_structs/src/groups/by_age_range.rs b/crates/brk_grouper/src/by_age_range.rs similarity index 100% rename from crates/brk_structs/src/groups/by_age_range.rs rename to crates/brk_grouper/src/by_age_range.rs diff --git a/crates/brk_structs/src/groups/by_amount_range.rs b/crates/brk_grouper/src/by_amount_range.rs similarity index 99% rename from crates/brk_structs/src/groups/by_amount_range.rs rename to crates/brk_grouper/src/by_amount_range.rs index 5068d33ae..8b34627c7 100644 --- a/crates/brk_structs/src/groups/by_amount_range.rs +++ b/crates/brk_grouper/src/by_amount_range.rs @@ -1,10 +1,9 @@ use std::ops::{Add, AddAssign}; +use brk_structs::Sats; use brk_traversable::Traversable; -use crate::{Filtered, Sats}; - -use super::Filter; +use super::{Filter, Filtered}; #[derive(Debug, Default, Clone, Traversable)] pub struct ByAmountRange { diff --git a/crates/brk_structs/src/groups/by_any_address.rs b/crates/brk_grouper/src/by_any_address.rs similarity index 100% rename from crates/brk_structs/src/groups/by_any_address.rs rename to crates/brk_grouper/src/by_any_address.rs diff --git a/crates/brk_structs/src/groups/by_epoch.rs b/crates/brk_grouper/src/by_epoch.rs similarity index 95% rename from crates/brk_structs/src/groups/by_epoch.rs rename to crates/brk_grouper/src/by_epoch.rs index a352026fc..e2342866f 100644 --- a/crates/brk_structs/src/groups/by_epoch.rs +++ b/crates/brk_grouper/src/by_epoch.rs @@ -1,8 +1,7 @@ +use brk_structs::{HalvingEpoch, Height}; use brk_traversable::Traversable; -use crate::{Filtered, HalvingEpoch, Height}; - -use super::Filter; +use super::{Filter, Filtered}; #[derive(Default, Clone, Traversable)] pub struct ByEpoch { diff --git a/crates/brk_structs/src/groups/by_ge_amount.rs b/crates/brk_grouper/src/by_ge_amount.rs similarity index 98% rename from crates/brk_structs/src/groups/by_ge_amount.rs rename to crates/brk_grouper/src/by_ge_amount.rs index 653e3c315..060f4aa7c 100644 --- a/crates/brk_structs/src/groups/by_ge_amount.rs +++ b/crates/brk_grouper/src/by_ge_amount.rs @@ -1,8 +1,7 @@ +use brk_structs::Sats; use brk_traversable::Traversable; -use crate::{Filtered, Sats}; - -use super::Filter; +use super::{Filter, Filtered}; #[derive(Default, Clone, Traversable)] pub struct ByGreatEqualAmount { diff --git a/crates/brk_structs/src/groups/by_lt_amount.rs b/crates/brk_grouper/src/by_lt_amount.rs similarity index 98% rename from crates/brk_structs/src/groups/by_lt_amount.rs rename to crates/brk_grouper/src/by_lt_amount.rs index cf100ee60..de350b26a 100644 --- a/crates/brk_structs/src/groups/by_lt_amount.rs +++ b/crates/brk_grouper/src/by_lt_amount.rs @@ -1,8 +1,7 @@ +use brk_structs::Sats; use brk_traversable::Traversable; -use crate::{Filtered, Sats}; - -use super::Filter; +use super::{Filter, Filtered}; #[derive(Default, Clone, Traversable)] pub struct ByLowerThanAmount { diff --git a/crates/brk_structs/src/groups/by_max_age.rs b/crates/brk_grouper/src/by_max_age.rs similarity index 100% rename from crates/brk_structs/src/groups/by_max_age.rs rename to crates/brk_grouper/src/by_max_age.rs diff --git a/crates/brk_structs/src/groups/by_min_age.rs b/crates/brk_grouper/src/by_min_age.rs similarity index 100% rename from crates/brk_structs/src/groups/by_min_age.rs rename to crates/brk_grouper/src/by_min_age.rs diff --git a/crates/brk_structs/src/groups/by_spendable_type.rs b/crates/brk_grouper/src/by_spendable_type.rs similarity index 98% rename from crates/brk_structs/src/groups/by_spendable_type.rs rename to crates/brk_grouper/src/by_spendable_type.rs index b0ca8015f..796983383 100644 --- a/crates/brk_structs/src/groups/by_spendable_type.rs +++ b/crates/brk_grouper/src/by_spendable_type.rs @@ -1,10 +1,9 @@ use std::ops::{Add, AddAssign}; +use brk_structs::OutputType; use brk_traversable::Traversable; -use crate::{Filtered, OutputType}; - -use super::Filter; +use super::{Filter, Filtered}; #[derive(Default, Clone, Debug, Traversable)] pub struct BySpendableType { diff --git a/crates/brk_structs/src/groups/by_term.rs b/crates/brk_grouper/src/by_term.rs similarity index 100% rename from crates/brk_structs/src/groups/by_term.rs rename to crates/brk_grouper/src/by_term.rs diff --git a/crates/brk_structs/src/groups/by_type.rs b/crates/brk_grouper/src/by_type.rs similarity index 98% rename from crates/brk_structs/src/groups/by_type.rs rename to crates/brk_grouper/src/by_type.rs index 12b1ebda9..baa3c04e6 100644 --- a/crates/brk_structs/src/groups/by_type.rs +++ b/crates/brk_grouper/src/by_type.rs @@ -1,6 +1,6 @@ use std::ops::{Add, AddAssign}; -use crate::OutputType; +use brk_structs::OutputType; use super::{BySpendableType, ByUnspendableType}; diff --git a/crates/brk_structs/src/groups/by_unspendable_type.rs b/crates/brk_grouper/src/by_unspendable_type.rs similarity index 100% rename from crates/brk_structs/src/groups/by_unspendable_type.rs rename to crates/brk_grouper/src/by_unspendable_type.rs diff --git a/crates/brk_structs/src/groups/by_value.rs b/crates/brk_grouper/src/by_value.rs similarity index 100% rename from crates/brk_structs/src/groups/by_value.rs rename to crates/brk_grouper/src/by_value.rs diff --git a/crates/brk_structs/src/groups/filter.rs b/crates/brk_grouper/src/filter.rs similarity index 98% rename from crates/brk_structs/src/groups/filter.rs rename to crates/brk_grouper/src/filter.rs index 78f667b2f..b8e6c8372 100644 --- a/crates/brk_structs/src/groups/filter.rs +++ b/crates/brk_grouper/src/filter.rs @@ -1,10 +1,9 @@ use std::ops::Range; +use brk_structs::{HalvingEpoch, OutputType}; use brk_traversable::{Traversable, TreeNode}; use vecdb::AnyCollectableVec; -use crate::{HalvingEpoch, OutputType}; - #[derive(Debug, Clone, PartialEq, Eq)] pub enum Filter { All, diff --git a/crates/brk_structs/src/groups/mod.rs b/crates/brk_grouper/src/lib.rs similarity index 94% rename from crates/brk_structs/src/groups/mod.rs rename to crates/brk_grouper/src/lib.rs index 972602dab..6cd423784 100644 --- a/crates/brk_structs/src/groups/mod.rs +++ b/crates/brk_grouper/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + mod address; mod by_address_type; mod by_age_range; diff --git a/crates/brk_structs/src/groups/utxo.rs b/crates/brk_grouper/src/utxo.rs similarity index 100% rename from crates/brk_structs/src/groups/utxo.rs rename to crates/brk_grouper/src/utxo.rs diff --git a/crates/brk_indexer/Cargo.toml b/crates/brk_indexer/Cargo.toml index 5df0c3a1b..d7906635e 100644 --- a/crates/brk_indexer/Cargo.toml +++ b/crates/brk_indexer/Cargo.toml @@ -12,13 +12,14 @@ build = "build.rs" [dependencies] bitcoin = { workspace = true } bitcoincore-rpc = { workspace = true } -brk_structs = { workspace = true } brk_error = { workspace = true } +brk_grouper = { workspace = true } brk_logger = { workspace = true } brk_parser = { workspace = true } brk_store = { workspace = true } +brk_structs = { workspace = true } brk_traversable = { workspace = true } -vecdb = { workspace = true } fjall = { workspace = true } log = { workspace = true } rayon = { workspace = true } +vecdb = { workspace = true } diff --git a/crates/brk_indexer/src/stores.rs b/crates/brk_indexer/src/stores.rs index 677ac7ade..edb31d827 100644 --- a/crates/brk_indexer/src/stores.rs +++ b/crates/brk_indexer/src/stores.rs @@ -1,11 +1,11 @@ use std::{borrow::Cow, fs, path::Path, thread}; use brk_error::Result; +use brk_grouper::ByAddressType; use brk_store::{AnyStore, Store}; use brk_structs::{ - AddressBytes, AddressBytesHash, BlockHashPrefix, ByAddressType, Height, OutputIndex, - OutputType, StoredString, TxIndex, TxidPrefix, TypeIndex, TypeIndexWithOutputindex, Unit, - Version, + AddressBytes, AddressBytesHash, BlockHashPrefix, Height, OutputIndex, OutputType, StoredString, + TxIndex, TxidPrefix, TypeIndex, TypeIndexWithOutputindex, Unit, Version, }; use fjall::{PersistMode, TransactionalKeyspace}; use rayon::prelude::*; diff --git a/crates/brk_interface/Cargo.toml b/crates/brk_interface/Cargo.toml index 79a402de4..28c2807ac 100644 --- a/crates/brk_interface/Cargo.toml +++ b/crates/brk_interface/Cargo.toml @@ -23,6 +23,4 @@ quick_cache = { workspace = true } schemars = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -sonic-rs = { workspace = true } -serde_with = "3.15.0" nucleo-matcher = "0.3.1" diff --git a/crates/brk_interface/src/vecs.rs b/crates/brk_interface/src/vecs.rs index 3eebd29fb..c86c7fdc3 100644 --- a/crates/brk_interface/src/vecs.rs +++ b/crates/brk_interface/src/vecs.rs @@ -83,14 +83,18 @@ impl<'a> Vecs<'a> { this.index_to_metrics .values_mut() .for_each(|ids| sort_ids(ids)); - this.catalog.replace(TreeNode::Branch( - [ - ("indexer".to_string(), indexer.vecs.to_tree_node()), - ("computer".to_string(), computer.to_tree_node()), - ] - .into_iter() - .collect(), - )); + this.catalog.replace( + TreeNode::Branch( + [ + ("indexer".to_string(), indexer.vecs.to_tree_node()), + ("computer".to_string(), computer.to_tree_node()), + ] + .into_iter() + .collect(), + ) + .simplify() + .unwrap(), + ); this } diff --git a/crates/brk_structs/Cargo.toml b/crates/brk_structs/Cargo.toml index d373ca0f0..86f51f998 100644 --- a/crates/brk_structs/Cargo.toml +++ b/crates/brk_structs/Cargo.toml @@ -14,7 +14,6 @@ allocative = { workspace = true } bitcoin = { workspace = true } bitcoincore-rpc = { workspace = true } brk_error = { workspace = true } -brk_traversable = { workspace = true } byteview = { workspace = true } derive_deref = { workspace = true } itoa = "1.0.15" diff --git a/crates/brk_structs/src/structs/addressbytes.rs b/crates/brk_structs/src/addressbytes.rs similarity index 100% rename from crates/brk_structs/src/structs/addressbytes.rs rename to crates/brk_structs/src/addressbytes.rs diff --git a/crates/brk_structs/src/structs/addressbyteshash.rs b/crates/brk_structs/src/addressbyteshash.rs similarity index 100% rename from crates/brk_structs/src/structs/addressbyteshash.rs rename to crates/brk_structs/src/addressbyteshash.rs diff --git a/crates/brk_structs/src/structs/anyaddressindex.rs b/crates/brk_structs/src/anyaddressindex.rs similarity index 95% rename from crates/brk_structs/src/structs/anyaddressindex.rs rename to crates/brk_structs/src/anyaddressindex.rs index 7609045d7..fdda99ba0 100644 --- a/crates/brk_structs/src/structs/anyaddressindex.rs +++ b/crates/brk_structs/src/anyaddressindex.rs @@ -1,10 +1,7 @@ use serde::Serialize; use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout}; -use crate::{ - TypeIndex, - structs::{EmptyAddressIndex, LoadedAddressIndex}, -}; +use crate::{EmptyAddressIndex, LoadedAddressIndex, TypeIndex}; const MIN_EMPTY_INDEX: u32 = u32::MAX - 4_000_000_000; diff --git a/crates/brk_structs/src/structs/bitcoin.rs b/crates/brk_structs/src/bitcoin.rs similarity index 100% rename from crates/brk_structs/src/structs/bitcoin.rs rename to crates/brk_structs/src/bitcoin.rs diff --git a/crates/brk_structs/src/structs/blkmetadata.rs b/crates/brk_structs/src/blkmetadata.rs similarity index 100% rename from crates/brk_structs/src/structs/blkmetadata.rs rename to crates/brk_structs/src/blkmetadata.rs diff --git a/crates/brk_structs/src/structs/blkposition.rs b/crates/brk_structs/src/blkposition.rs similarity index 100% rename from crates/brk_structs/src/structs/blkposition.rs rename to crates/brk_structs/src/blkposition.rs diff --git a/crates/brk_structs/src/structs/block.rs b/crates/brk_structs/src/block.rs similarity index 100% rename from crates/brk_structs/src/structs/block.rs rename to crates/brk_structs/src/block.rs diff --git a/crates/brk_structs/src/structs/blockhash.rs b/crates/brk_structs/src/blockhash.rs similarity index 100% rename from crates/brk_structs/src/structs/blockhash.rs rename to crates/brk_structs/src/blockhash.rs diff --git a/crates/brk_structs/src/structs/blockhashprefix.rs b/crates/brk_structs/src/blockhashprefix.rs similarity index 100% rename from crates/brk_structs/src/structs/blockhashprefix.rs rename to crates/brk_structs/src/blockhashprefix.rs diff --git a/crates/brk_structs/src/structs/cents.rs b/crates/brk_structs/src/cents.rs similarity index 100% rename from crates/brk_structs/src/structs/cents.rs rename to crates/brk_structs/src/cents.rs diff --git a/crates/brk_structs/src/structs/date.rs b/crates/brk_structs/src/date.rs similarity index 100% rename from crates/brk_structs/src/structs/date.rs rename to crates/brk_structs/src/date.rs diff --git a/crates/brk_structs/src/structs/dateindex.rs b/crates/brk_structs/src/dateindex.rs similarity index 100% rename from crates/brk_structs/src/structs/dateindex.rs rename to crates/brk_structs/src/dateindex.rs diff --git a/crates/brk_structs/src/structs/decadeindex.rs b/crates/brk_structs/src/decadeindex.rs similarity index 100% rename from crates/brk_structs/src/structs/decadeindex.rs rename to crates/brk_structs/src/decadeindex.rs diff --git a/crates/brk_structs/src/structs/difficultyepoch.rs b/crates/brk_structs/src/difficultyepoch.rs similarity index 100% rename from crates/brk_structs/src/structs/difficultyepoch.rs rename to crates/brk_structs/src/difficultyepoch.rs diff --git a/crates/brk_structs/src/structs/dollars.rs b/crates/brk_structs/src/dollars.rs similarity index 100% rename from crates/brk_structs/src/structs/dollars.rs rename to crates/brk_structs/src/dollars.rs diff --git a/crates/brk_structs/src/structs/emptyaddressdata.rs b/crates/brk_structs/src/emptyaddressdata.rs similarity index 100% rename from crates/brk_structs/src/structs/emptyaddressdata.rs rename to crates/brk_structs/src/emptyaddressdata.rs diff --git a/crates/brk_structs/src/structs/emptyaddressindex.rs b/crates/brk_structs/src/emptyaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/emptyaddressindex.rs rename to crates/brk_structs/src/emptyaddressindex.rs diff --git a/crates/brk_structs/src/structs/emptyoutputindex.rs b/crates/brk_structs/src/emptyoutputindex.rs similarity index 100% rename from crates/brk_structs/src/structs/emptyoutputindex.rs rename to crates/brk_structs/src/emptyoutputindex.rs diff --git a/crates/brk_structs/src/structs/feerate.rs b/crates/brk_structs/src/feerate.rs similarity index 100% rename from crates/brk_structs/src/structs/feerate.rs rename to crates/brk_structs/src/feerate.rs diff --git a/crates/brk_structs/src/structs/halvingepoch.rs b/crates/brk_structs/src/halvingepoch.rs similarity index 100% rename from crates/brk_structs/src/structs/halvingepoch.rs rename to crates/brk_structs/src/halvingepoch.rs diff --git a/crates/brk_structs/src/structs/height.rs b/crates/brk_structs/src/height.rs similarity index 100% rename from crates/brk_structs/src/structs/height.rs rename to crates/brk_structs/src/height.rs diff --git a/crates/brk_structs/src/structs/index.rs b/crates/brk_structs/src/index.rs similarity index 100% rename from crates/brk_structs/src/structs/index.rs rename to crates/brk_structs/src/index.rs diff --git a/crates/brk_structs/src/structs/indexinfo.rs b/crates/brk_structs/src/indexinfo.rs similarity index 100% rename from crates/brk_structs/src/structs/indexinfo.rs rename to crates/brk_structs/src/indexinfo.rs diff --git a/crates/brk_structs/src/structs/inputindex.rs b/crates/brk_structs/src/inputindex.rs similarity index 100% rename from crates/brk_structs/src/structs/inputindex.rs rename to crates/brk_structs/src/inputindex.rs diff --git a/crates/brk_structs/src/lib.rs b/crates/brk_structs/src/lib.rs index 365a39b0c..9e6635600 100644 --- a/crates/brk_structs/src/lib.rs +++ b/crates/brk_structs/src/lib.rs @@ -1,9 +1,175 @@ #![doc = include_str!("../README.md")] -mod groups; -mod structs; - -pub use groups::*; -pub use structs::*; - pub use vecdb::{CheckedSub, Exit, PrintableIndex, Version}; + +use brk_error::{Error, Result}; + +mod addressbytes; +mod addressbyteshash; +mod anyaddressindex; +mod bitcoin; +mod blkmetadata; +mod blkposition; +mod block; +mod blockhash; +mod blockhashprefix; +mod cents; +mod date; +mod dateindex; +mod decadeindex; +mod difficultyepoch; +mod dollars; +mod emptyaddressdata; +mod emptyaddressindex; +mod emptyoutputindex; +mod feerate; +mod halvingepoch; +mod height; +mod index; +mod indexinfo; +mod inputindex; +mod loadedaddressdata; +mod loadedaddressindex; +mod monthindex; +mod ohlc; +mod opreturnindex; +mod outputindex; +mod outputtype; +mod p2aaddressindex; +mod p2msoutputindex; +mod p2pk33addressindex; +mod p2pk65addressindex; +mod p2pkhaddressindex; +mod p2shaddressindex; +mod p2traddressindex; +mod p2wpkhaddressindex; +mod p2wshaddressindex; +mod pool; +mod poolid; +mod pools; +mod quarterindex; +mod rawlocktime; +mod sats; +mod semesterindex; +mod stored_bool; +mod stored_f32; +mod stored_f64; +mod stored_i16; +mod stored_string; +mod stored_u16; +mod stored_u32; +mod stored_u64; +mod stored_u8; +mod timestamp; +mod treenode; +mod txid; +mod txidprefix; +mod txindex; +mod txversion; +mod typeindex; +mod typeindex_with_outputindex; +mod unit; +mod unknownoutputindex; +mod vin; +mod vout; +mod weekindex; +mod weight; +mod yearindex; + +pub use addressbytes::*; +pub use addressbyteshash::*; +pub use anyaddressindex::*; +pub use bitcoin::*; +pub use blkmetadata::*; +pub use blkposition::*; +pub use block::*; +pub use blockhash::*; +pub use blockhashprefix::*; +pub use cents::*; +pub use date::*; +pub use dateindex::*; +pub use decadeindex::*; +pub use difficultyepoch::*; +pub use dollars::*; +pub use emptyaddressdata::*; +pub use emptyaddressindex::*; +pub use emptyoutputindex::*; +pub use feerate::*; +pub use halvingepoch::*; +pub use height::*; +pub use index::*; +pub use indexinfo::*; +pub use inputindex::*; +pub use loadedaddressdata::*; +pub use loadedaddressindex::*; +pub use monthindex::*; +pub use ohlc::*; +pub use opreturnindex::*; +pub use outputindex::*; +pub use outputtype::*; +pub use p2aaddressindex::*; +pub use p2msoutputindex::*; +pub use p2pk33addressindex::*; +pub use p2pk65addressindex::*; +pub use p2pkhaddressindex::*; +pub use p2shaddressindex::*; +pub use p2traddressindex::*; +pub use p2wpkhaddressindex::*; +pub use p2wshaddressindex::*; +pub use pool::*; +pub use poolid::*; +pub use pools::*; +pub use quarterindex::*; +pub use rawlocktime::*; +pub use sats::*; +pub use semesterindex::*; +pub use stored_bool::*; +pub use stored_f32::*; +pub use stored_f64::*; +pub use stored_i16::*; +pub use stored_string::*; +pub use stored_u8::*; +pub use stored_u16::*; +pub use stored_u32::*; +pub use stored_u64::*; +pub use timestamp::*; +pub use treenode::*; +pub use txid::*; +pub use txidprefix::*; +pub use txindex::*; +pub use txversion::*; +pub use typeindex::*; +pub use typeindex_with_outputindex::*; +pub use unit::*; +pub use unknownoutputindex::*; +pub use vin::*; +pub use vout::*; +pub use weekindex::*; +pub use weight::*; +pub use yearindex::*; + +#[allow(clippy::result_unit_err)] +pub fn copy_first_4bytes(slice: &[u8]) -> Result<[u8; 4]> { + let mut buf: [u8; 4] = [0; 4]; + let buf_len = buf.len(); + if slice.len() < buf_len { + return Err(Error::Str("Buffer is too small to convert to 8 bytes")); + } + slice.iter().take(buf_len).enumerate().for_each(|(i, r)| { + buf[i] = *r; + }); + Ok(buf) +} + +#[allow(clippy::result_unit_err)] +pub fn copy_first_8bytes(slice: &[u8]) -> Result<[u8; 8]> { + let mut buf: [u8; 8] = [0; 8]; + let buf_len = buf.len(); + if slice.len() < buf_len { + return Err(Error::Str("Buffer is too small to convert to 8 bytes")); + } + slice.iter().take(buf_len).enumerate().for_each(|(i, r)| { + buf[i] = *r; + }); + Ok(buf) +} diff --git a/crates/brk_structs/src/structs/loadedaddressdata.rs b/crates/brk_structs/src/loadedaddressdata.rs similarity index 100% rename from crates/brk_structs/src/structs/loadedaddressdata.rs rename to crates/brk_structs/src/loadedaddressdata.rs diff --git a/crates/brk_structs/src/structs/loadedaddressindex.rs b/crates/brk_structs/src/loadedaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/loadedaddressindex.rs rename to crates/brk_structs/src/loadedaddressindex.rs diff --git a/crates/brk_structs/src/structs/monthindex.rs b/crates/brk_structs/src/monthindex.rs similarity index 100% rename from crates/brk_structs/src/structs/monthindex.rs rename to crates/brk_structs/src/monthindex.rs diff --git a/crates/brk_structs/src/structs/ohlc.rs b/crates/brk_structs/src/ohlc.rs similarity index 100% rename from crates/brk_structs/src/structs/ohlc.rs rename to crates/brk_structs/src/ohlc.rs diff --git a/crates/brk_structs/src/structs/opreturnindex.rs b/crates/brk_structs/src/opreturnindex.rs similarity index 100% rename from crates/brk_structs/src/structs/opreturnindex.rs rename to crates/brk_structs/src/opreturnindex.rs diff --git a/crates/brk_structs/src/structs/outputindex.rs b/crates/brk_structs/src/outputindex.rs similarity index 100% rename from crates/brk_structs/src/structs/outputindex.rs rename to crates/brk_structs/src/outputindex.rs diff --git a/crates/brk_structs/src/structs/outputtype.rs b/crates/brk_structs/src/outputtype.rs similarity index 100% rename from crates/brk_structs/src/structs/outputtype.rs rename to crates/brk_structs/src/outputtype.rs diff --git a/crates/brk_structs/src/structs/p2aaddressindex.rs b/crates/brk_structs/src/p2aaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2aaddressindex.rs rename to crates/brk_structs/src/p2aaddressindex.rs diff --git a/crates/brk_structs/src/structs/p2msoutputindex.rs b/crates/brk_structs/src/p2msoutputindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2msoutputindex.rs rename to crates/brk_structs/src/p2msoutputindex.rs diff --git a/crates/brk_structs/src/structs/p2pk33addressindex.rs b/crates/brk_structs/src/p2pk33addressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2pk33addressindex.rs rename to crates/brk_structs/src/p2pk33addressindex.rs diff --git a/crates/brk_structs/src/structs/p2pk65addressindex.rs b/crates/brk_structs/src/p2pk65addressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2pk65addressindex.rs rename to crates/brk_structs/src/p2pk65addressindex.rs diff --git a/crates/brk_structs/src/structs/p2pkhaddressindex.rs b/crates/brk_structs/src/p2pkhaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2pkhaddressindex.rs rename to crates/brk_structs/src/p2pkhaddressindex.rs diff --git a/crates/brk_structs/src/structs/p2shaddressindex.rs b/crates/brk_structs/src/p2shaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2shaddressindex.rs rename to crates/brk_structs/src/p2shaddressindex.rs diff --git a/crates/brk_structs/src/structs/p2traddressindex.rs b/crates/brk_structs/src/p2traddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2traddressindex.rs rename to crates/brk_structs/src/p2traddressindex.rs diff --git a/crates/brk_structs/src/structs/p2wpkhaddressindex.rs b/crates/brk_structs/src/p2wpkhaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2wpkhaddressindex.rs rename to crates/brk_structs/src/p2wpkhaddressindex.rs diff --git a/crates/brk_structs/src/structs/p2wshaddressindex.rs b/crates/brk_structs/src/p2wshaddressindex.rs similarity index 100% rename from crates/brk_structs/src/structs/p2wshaddressindex.rs rename to crates/brk_structs/src/p2wshaddressindex.rs diff --git a/crates/brk_structs/src/structs/pool.rs b/crates/brk_structs/src/pool.rs similarity index 100% rename from crates/brk_structs/src/structs/pool.rs rename to crates/brk_structs/src/pool.rs diff --git a/crates/brk_structs/src/structs/poolid.rs b/crates/brk_structs/src/poolid.rs similarity index 100% rename from crates/brk_structs/src/structs/poolid.rs rename to crates/brk_structs/src/poolid.rs diff --git a/crates/brk_structs/src/structs/pools.rs b/crates/brk_structs/src/pools.rs similarity index 99% rename from crates/brk_structs/src/structs/pools.rs rename to crates/brk_structs/src/pools.rs index f548c0909..37c78d112 100644 --- a/crates/brk_structs/src/structs/pools.rs +++ b/crates/brk_structs/src/pools.rs @@ -4,7 +4,7 @@ use allocative::Allocative; use crate::{JSONPool, PoolId}; -use super::super::Pool; +use super::Pool; const POOL_COUNT: usize = 158; diff --git a/crates/brk_structs/src/structs/quarterindex.rs b/crates/brk_structs/src/quarterindex.rs similarity index 100% rename from crates/brk_structs/src/structs/quarterindex.rs rename to crates/brk_structs/src/quarterindex.rs diff --git a/crates/brk_structs/src/structs/rawlocktime.rs b/crates/brk_structs/src/rawlocktime.rs similarity index 100% rename from crates/brk_structs/src/structs/rawlocktime.rs rename to crates/brk_structs/src/rawlocktime.rs diff --git a/crates/brk_structs/src/structs/sats.rs b/crates/brk_structs/src/sats.rs similarity index 100% rename from crates/brk_structs/src/structs/sats.rs rename to crates/brk_structs/src/sats.rs diff --git a/crates/brk_structs/src/structs/semesterindex.rs b/crates/brk_structs/src/semesterindex.rs similarity index 100% rename from crates/brk_structs/src/structs/semesterindex.rs rename to crates/brk_structs/src/semesterindex.rs diff --git a/crates/brk_structs/src/structs/stored_bool.rs b/crates/brk_structs/src/stored_bool.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_bool.rs rename to crates/brk_structs/src/stored_bool.rs diff --git a/crates/brk_structs/src/structs/stored_f32.rs b/crates/brk_structs/src/stored_f32.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_f32.rs rename to crates/brk_structs/src/stored_f32.rs diff --git a/crates/brk_structs/src/structs/stored_f64.rs b/crates/brk_structs/src/stored_f64.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_f64.rs rename to crates/brk_structs/src/stored_f64.rs diff --git a/crates/brk_structs/src/structs/stored_i16.rs b/crates/brk_structs/src/stored_i16.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_i16.rs rename to crates/brk_structs/src/stored_i16.rs diff --git a/crates/brk_structs/src/structs/stored_string.rs b/crates/brk_structs/src/stored_string.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_string.rs rename to crates/brk_structs/src/stored_string.rs diff --git a/crates/brk_structs/src/structs/stored_u16.rs b/crates/brk_structs/src/stored_u16.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_u16.rs rename to crates/brk_structs/src/stored_u16.rs diff --git a/crates/brk_structs/src/structs/stored_u32.rs b/crates/brk_structs/src/stored_u32.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_u32.rs rename to crates/brk_structs/src/stored_u32.rs diff --git a/crates/brk_structs/src/structs/stored_u64.rs b/crates/brk_structs/src/stored_u64.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_u64.rs rename to crates/brk_structs/src/stored_u64.rs diff --git a/crates/brk_structs/src/structs/stored_u8.rs b/crates/brk_structs/src/stored_u8.rs similarity index 100% rename from crates/brk_structs/src/structs/stored_u8.rs rename to crates/brk_structs/src/stored_u8.rs diff --git a/crates/brk_structs/src/structs/mod.rs b/crates/brk_structs/src/structs/mod.rs deleted file mode 100644 index 9eb2f94f0..000000000 --- a/crates/brk_structs/src/structs/mod.rs +++ /dev/null @@ -1,171 +0,0 @@ -use brk_error::{Error, Result}; - -mod addressbytes; -mod addressbyteshash; -mod anyaddressindex; -mod bitcoin; -mod blkmetadata; -mod blkposition; -mod block; -mod blockhash; -mod blockhashprefix; -mod cents; -mod date; -mod dateindex; -mod decadeindex; -mod difficultyepoch; -mod dollars; -mod emptyaddressdata; -mod emptyaddressindex; -mod emptyoutputindex; -mod feerate; -mod halvingepoch; -mod height; -mod index; -mod indexinfo; -mod inputindex; -mod loadedaddressdata; -mod loadedaddressindex; -mod monthindex; -mod ohlc; -mod opreturnindex; -mod outputindex; -mod outputtype; -mod p2aaddressindex; -mod p2msoutputindex; -mod p2pk33addressindex; -mod p2pk65addressindex; -mod p2pkhaddressindex; -mod p2shaddressindex; -mod p2traddressindex; -mod p2wpkhaddressindex; -mod p2wshaddressindex; -mod pool; -mod poolid; -mod pools; -mod quarterindex; -mod rawlocktime; -mod sats; -mod semesterindex; -mod stored_bool; -mod stored_f32; -mod stored_f64; -mod stored_i16; -mod stored_string; -mod stored_u16; -mod stored_u32; -mod stored_u64; -mod stored_u8; -mod timestamp; -mod treenode; -mod txid; -mod txidprefix; -mod txindex; -mod txversion; -mod typeindex; -mod typeindex_with_outputindex; -mod unit; -mod unknownoutputindex; -mod vin; -mod vout; -mod weekindex; -mod weight; -mod yearindex; - -pub use addressbytes::*; -pub use addressbyteshash::*; -pub use anyaddressindex::*; -pub use bitcoin::*; -pub use blkmetadata::*; -pub use blkposition::*; -pub use block::*; -pub use blockhash::*; -pub use blockhashprefix::*; -pub use cents::*; -pub use date::*; -pub use dateindex::*; -pub use decadeindex::*; -pub use difficultyepoch::*; -pub use dollars::*; -pub use emptyaddressdata::*; -pub use emptyaddressindex::*; -pub use emptyoutputindex::*; -pub use feerate::*; -pub use halvingepoch::*; -pub use height::*; -pub use index::*; -pub use indexinfo::*; -pub use inputindex::*; -pub use loadedaddressdata::*; -pub use loadedaddressindex::*; -pub use monthindex::*; -pub use ohlc::*; -pub use opreturnindex::*; -pub use outputindex::*; -pub use outputtype::*; -pub use p2aaddressindex::*; -pub use p2msoutputindex::*; -pub use p2pk33addressindex::*; -pub use p2pk65addressindex::*; -pub use p2pkhaddressindex::*; -pub use p2shaddressindex::*; -pub use p2traddressindex::*; -pub use p2wpkhaddressindex::*; -pub use p2wshaddressindex::*; -pub use pool::*; -pub use poolid::*; -pub use pools::*; -pub use quarterindex::*; -pub use rawlocktime::*; -pub use sats::*; -pub use semesterindex::*; -pub use stored_bool::*; -pub use stored_f32::*; -pub use stored_f64::*; -pub use stored_i16::*; -pub use stored_string::*; -pub use stored_u8::*; -pub use stored_u16::*; -pub use stored_u32::*; -pub use stored_u64::*; -pub use timestamp::*; -pub use treenode::*; -pub use txid::*; -pub use txidprefix::*; -pub use txindex::*; -pub use txversion::*; -pub use typeindex::*; -pub use typeindex_with_outputindex::*; -pub use unit::*; -pub use unknownoutputindex::*; -pub use vin::*; -pub use vout::*; -pub use weekindex::*; -pub use weight::*; -pub use yearindex::*; - -#[allow(clippy::result_unit_err)] -pub fn copy_first_4bytes(slice: &[u8]) -> Result<[u8; 4]> { - let mut buf: [u8; 4] = [0; 4]; - let buf_len = buf.len(); - if slice.len() < buf_len { - return Err(Error::Str("Buffer is too small to convert to 8 bytes")); - } - slice.iter().take(buf_len).enumerate().for_each(|(i, r)| { - buf[i] = *r; - }); - Ok(buf) -} - -#[allow(clippy::result_unit_err)] -pub fn copy_first_8bytes(slice: &[u8]) -> Result<[u8; 8]> { - let mut buf: [u8; 8] = [0; 8]; - let buf_len = buf.len(); - if slice.len() < buf_len { - return Err(Error::Str("Buffer is too small to convert to 8 bytes")); - } - slice.iter().take(buf_len).enumerate().for_each(|(i, r)| { - buf[i] = *r; - }); - Ok(buf) -} diff --git a/crates/brk_structs/src/structs/timestamp.rs b/crates/brk_structs/src/timestamp.rs similarity index 100% rename from crates/brk_structs/src/structs/timestamp.rs rename to crates/brk_structs/src/timestamp.rs diff --git a/crates/brk_structs/src/structs/treenode.rs b/crates/brk_structs/src/treenode.rs similarity index 69% rename from crates/brk_structs/src/structs/treenode.rs rename to crates/brk_structs/src/treenode.rs index aceb60301..0e2d2da2e 100644 --- a/crates/brk_structs/src/structs/treenode.rs +++ b/crates/brk_structs/src/treenode.rs @@ -1,3 +1,10 @@ +use std::{collections::BTreeMap, sync::LazyLock}; + +use schemars::JsonSchema; +use serde::Serialize; + +use super::Index; + #[derive(Debug, Clone, Serialize, PartialEq, Eq, JsonSchema)] #[serde(untagged)] /// Hierarchical tree node for organizing metrics into categories @@ -9,6 +16,17 @@ pub enum TreeNode { Leaf(String), } +const BASE: &str = "base"; + +/// List of prefixes to remove during simplification +static PREFIXES: LazyLock> = LazyLock::new(|| { + ["indexes", "timeindexes", "chainindexes"] + .into_iter() + .chain(Index::all().iter().map(|i| i.serialize_long())) + .map(|s| format!("{s}_to_")) + .collect() +}); + impl TreeNode { pub fn is_empty(&self) -> bool { if let Self::Branch(tree) = self { @@ -18,8 +36,15 @@ impl TreeNode { } } + pub fn as_mut_branch(&mut self) -> &mut BTreeMap { + match self { + Self::Branch(b) => b, + _ => panic!(), + } + } + /// Merges all first-level branches into a single flattened structure. - /// Root-level leaves are placed under "default" key. + /// Root-level leaves are placed under BASE key. /// Returns None if conflicts are found (same key with incompatible values). pub fn merge_branches(&self) -> Option { let Self::Branch(tree) = self else { @@ -31,7 +56,7 @@ impl TreeNode { for node in tree.values() { match node { Self::Leaf(value) => { - Self::merge_node(&mut merged, "base", &Self::Leaf(value.clone()))?; + Self::merge_node(&mut merged, BASE, &Self::Leaf(value.clone()))?; } Self::Branch(inner) => { for (key, inner_node) in inner { @@ -86,20 +111,35 @@ impl TreeNode { target.insert(key.to_string(), node.clone()); Some(()) } - Some(existing) => match (existing, node) { + Some(existing) => match (&existing, node) { // Same leaf values: ok (Self::Leaf(a), Self::Leaf(b)) if a == b => Some(()), // Different leaf values: conflict - (Self::Leaf(_), Self::Leaf(_)) => None, - // Leaf vs branch: conflict - (Self::Leaf(_), Self::Branch(_)) | (Self::Branch(_), Self::Leaf(_)) => { - // dbg!((&existing, &node)); + (Self::Leaf(a), Self::Leaf(b)) => { + eprintln!("Conflict: Different leaf values for key '{key}'"); + eprintln!(" Existing: {a:?}"); + eprintln!(" New: {b:?}"); None } + (Self::Leaf(leaf), Self::Branch(branch)) => { + let mut new_branch = BTreeMap::new(); + new_branch.insert(BASE.to_string(), Self::Leaf(leaf.clone())); + + for (k, v) in branch { + Self::merge_node(&mut new_branch, k, v)?; + } + + *existing = Self::Branch(new_branch); + Some(()) + } + (Self::Branch(_), Self::Leaf(leaf)) => { + Self::merge_node(existing.as_mut_branch(), BASE, &Self::Leaf(leaf.clone()))?; + Some(()) + } // Both branches: merge recursively - (Self::Branch(existing_inner), Self::Branch(new_inner)) => { + (Self::Branch(_), Self::Branch(new_inner)) => { for (k, v) in new_inner { - Self::merge_node(existing_inner, k, v)?; + Self::merge_node(existing.as_mut_branch(), k, v)?; } Some(()) } @@ -107,20 +147,6 @@ impl TreeNode { } } - /// List of prefixes to remove during simplification - const PREFIXES: &'static [&'static str] = &[ - "indexes_to_", - "chainindexes_to_", - "timeindexes_to_", - "txindex_to_", - "height_to_", - "dateindex_to_", - "weekindex_to_", - "difficultyepoch_to_", - "halvingepoch_to_", - // Add more prefixes here - ]; - /// Recursively simplifies the tree by removing known prefixes from keys. /// If multiple keys map to the same simplified name, checks for conflicts. /// Returns None if there are conflicts (same simplified key, different values). @@ -135,7 +161,7 @@ impl TreeNode { let simplified_node = node.simplify()?; // Remove prefixes from the key - let simplified_key = Self::PREFIXES + let simplified_key = PREFIXES .iter() .find_map(|prefix| key.strip_prefix(prefix)) .map(String::from) diff --git a/crates/brk_structs/src/structs/txid.rs b/crates/brk_structs/src/txid.rs similarity index 100% rename from crates/brk_structs/src/structs/txid.rs rename to crates/brk_structs/src/txid.rs diff --git a/crates/brk_structs/src/structs/txidprefix.rs b/crates/brk_structs/src/txidprefix.rs similarity index 100% rename from crates/brk_structs/src/structs/txidprefix.rs rename to crates/brk_structs/src/txidprefix.rs diff --git a/crates/brk_structs/src/structs/txindex.rs b/crates/brk_structs/src/txindex.rs similarity index 100% rename from crates/brk_structs/src/structs/txindex.rs rename to crates/brk_structs/src/txindex.rs diff --git a/crates/brk_structs/src/structs/txversion.rs b/crates/brk_structs/src/txversion.rs similarity index 100% rename from crates/brk_structs/src/structs/txversion.rs rename to crates/brk_structs/src/txversion.rs diff --git a/crates/brk_structs/src/structs/typeindex.rs b/crates/brk_structs/src/typeindex.rs similarity index 100% rename from crates/brk_structs/src/structs/typeindex.rs rename to crates/brk_structs/src/typeindex.rs diff --git a/crates/brk_structs/src/structs/typeindex_with_outputindex.rs b/crates/brk_structs/src/typeindex_with_outputindex.rs similarity index 100% rename from crates/brk_structs/src/structs/typeindex_with_outputindex.rs rename to crates/brk_structs/src/typeindex_with_outputindex.rs diff --git a/crates/brk_structs/src/structs/unit.rs b/crates/brk_structs/src/unit.rs similarity index 100% rename from crates/brk_structs/src/structs/unit.rs rename to crates/brk_structs/src/unit.rs diff --git a/crates/brk_structs/src/structs/unknownoutputindex.rs b/crates/brk_structs/src/unknownoutputindex.rs similarity index 100% rename from crates/brk_structs/src/structs/unknownoutputindex.rs rename to crates/brk_structs/src/unknownoutputindex.rs diff --git a/crates/brk_structs/src/structs/vin.rs b/crates/brk_structs/src/vin.rs similarity index 100% rename from crates/brk_structs/src/structs/vin.rs rename to crates/brk_structs/src/vin.rs diff --git a/crates/brk_structs/src/structs/vout.rs b/crates/brk_structs/src/vout.rs similarity index 100% rename from crates/brk_structs/src/structs/vout.rs rename to crates/brk_structs/src/vout.rs diff --git a/crates/brk_structs/src/structs/weekindex.rs b/crates/brk_structs/src/weekindex.rs similarity index 100% rename from crates/brk_structs/src/structs/weekindex.rs rename to crates/brk_structs/src/weekindex.rs diff --git a/crates/brk_structs/src/structs/weight.rs b/crates/brk_structs/src/weight.rs similarity index 100% rename from crates/brk_structs/src/structs/weight.rs rename to crates/brk_structs/src/weight.rs diff --git a/crates/brk_structs/src/structs/yearindex.rs b/crates/brk_structs/src/yearindex.rs similarity index 100% rename from crates/brk_structs/src/structs/yearindex.rs rename to crates/brk_structs/src/yearindex.rs diff --git a/crates/brk_traversable/Cargo.toml b/crates/brk_traversable/Cargo.toml index e4a2d48a3..5642d5af2 100644 --- a/crates/brk_traversable/Cargo.toml +++ b/crates/brk_traversable/Cargo.toml @@ -15,6 +15,4 @@ derive = ["brk_traversable_derive"] [dependencies] brk_structs = { workspace = true } brk_traversable_derive = { workspace = true, optional = true } -schemars = { workspace = true } -serde = { workspace = true } vecdb = { workspace = true } diff --git a/crates/brk_traversable/src/lib.rs b/crates/brk_traversable/src/lib.rs index 1b52577d3..1fd321c59 100644 --- a/crates/brk_traversable/src/lib.rs +++ b/crates/brk_traversable/src/lib.rs @@ -1,9 +1,9 @@ use std::{collections::BTreeMap, fmt::Debug}; +pub use brk_structs::TreeNode; + #[cfg(feature = "derive")] pub use brk_traversable_derive::Traversable; -use schemars::JsonSchema; -use serde::Serialize; use vecdb::{ AnyCollectableVec, AnyVec, CompressedVec, ComputedVec, EagerVec, LazyVecFrom1, LazyVecFrom2, LazyVecFrom3, RawVec, StoredCompressed, StoredIndex, StoredRaw, StoredVec,