|
1 | 1 | use std::{ops::Deref, sync::Arc}; |
2 | 2 |
|
3 | 3 | use dashmap::{mapref::one::Ref, DashMap, DashSet}; |
| 4 | +use qp_trie::wrapper::BString; |
4 | 5 | use tokio::sync::RwLock; |
5 | 6 |
|
6 | | -use crate::{record::Record, utils::PrefixTrie}; |
| 7 | +use crate::{ |
| 8 | + record::Record, |
| 9 | + utils::{ImStr, PrefixTrie}, |
| 10 | +}; |
7 | 11 |
|
8 | 12 | #[derive(Default)] |
9 | 13 | pub struct RecordIndex { |
10 | | - inner: DashMap<String, Record>, |
11 | | - by_model: DashMap<String, DashSet<String>>, |
12 | | - by_inherit_id: DashMap<String, DashSet<String>>, |
| 14 | + inner: DashMap<ImStr, Record>, |
| 15 | + by_model: DashMap<ImStr, DashSet<ImStr>>, |
| 16 | + by_inherit_id: DashMap<ImStr, DashSet<ImStr>>, |
13 | 17 | pub by_prefix: Arc<RwLock<PrefixTrie>>, |
14 | 18 | } |
15 | 19 |
|
16 | 20 | impl Deref for RecordIndex { |
17 | | - type Target = DashMap<String, Record>; |
| 21 | + type Target = DashMap<ImStr, Record>; |
18 | 22 | #[inline] |
19 | 23 | fn deref(&self) -> &Self::Target { |
20 | 24 | &self.inner |
21 | 25 | } |
22 | 26 | } |
23 | 27 |
|
24 | 28 | impl RecordIndex { |
25 | | - pub async fn insert(&self, qualified_id: String, record: Record, prefix: Option<&mut PrefixTrie>) { |
| 29 | + pub async fn insert(&self, qualified_id: ImStr, record: Record, prefix: Option<&mut PrefixTrie>) { |
26 | 30 | if let Some(model) = &record.model { |
27 | 31 | self.by_model |
28 | | - .entry(model.to_string()) |
| 32 | + .entry(model.clone()) |
29 | 33 | .or_default() |
30 | | - .insert(qualified_id.to_string()); |
| 34 | + .insert(qualified_id.clone()); |
31 | 35 | } |
32 | 36 | if let Some(inherit_id) = &record.inherit_id { |
33 | 37 | let inherit_id = match inherit_id { |
34 | 38 | (Some(module), xml_id) => format!("{module}.{xml_id}"), |
35 | 39 | (None, xml_id) => format!("{}.{xml_id}", record.module), |
36 | 40 | }; |
37 | 41 | self.by_inherit_id |
38 | | - .entry(inherit_id) |
| 42 | + .entry(inherit_id.into()) |
39 | 43 | .or_default() |
40 | | - .insert(qualified_id.to_string()); |
| 44 | + .insert(qualified_id.clone()); |
41 | 45 | } |
42 | 46 | if let Some(prefix) = prefix { |
43 | | - prefix.insert_str(&qualified_id, qualified_id.to_string()); |
| 47 | + prefix |
| 48 | + .entry(BString::from(record.id.as_str())) |
| 49 | + .or_insert_with(DashSet::default) |
| 50 | + .insert(qualified_id.clone()); |
44 | 51 | } else { |
45 | 52 | self.by_prefix |
46 | 53 | .write() |
47 | 54 | .await |
48 | | - .insert_str(&qualified_id, qualified_id.to_string()); |
| 55 | + .entry(BString::from(record.id.as_str())) |
| 56 | + .or_insert_with(DashSet::default) |
| 57 | + .insert(qualified_id.clone()); |
49 | 58 | } |
50 | | - self.inner.insert(qualified_id, record); |
| 59 | + self.inner.insert(qualified_id.into(), record); |
51 | 60 | } |
52 | 61 | pub async fn extend_records(&self, prefix: Option<&mut PrefixTrie>, records: impl IntoIterator<Item = Record>) { |
53 | 62 | if let Some(prefix) = prefix { |
54 | 63 | for record in records { |
55 | | - self.insert(record.qualified_id(), record, Some(prefix)).await; |
| 64 | + self.insert(record.qualified_id().into(), record, Some(prefix)).await; |
56 | 65 | } |
57 | 66 | } else { |
58 | 67 | let mut prefix = self.by_prefix.write().await; |
59 | 68 | for record in records { |
60 | | - self.insert(record.qualified_id(), record, Some(&mut prefix)).await; |
| 69 | + self.insert(record.qualified_id().into(), record, Some(&mut prefix)) |
| 70 | + .await; |
61 | 71 | } |
62 | 72 | } |
63 | 73 | } |
64 | | - pub fn by_model(&self, model: &str) -> impl Iterator<Item = Ref<String, Record>> { |
| 74 | + pub fn by_model(&self, model: &str) -> impl Iterator<Item = Ref<ImStr, Record>> { |
65 | 75 | self.by_model |
66 | 76 | .get(model) |
67 | 77 | .into_iter() |
68 | 78 | .flat_map(|ids| self.resolve_references(ids)) |
69 | 79 | } |
70 | | - pub fn by_inherit_id(&self, inherit_id: &str) -> impl Iterator<Item = Ref<String, Record>> { |
| 80 | + pub fn by_inherit_id(&self, inherit_id: &str) -> impl Iterator<Item = Ref<ImStr, Record>> { |
71 | 81 | self.by_inherit_id |
72 | 82 | .get(inherit_id) |
73 | 83 | .into_iter() |
74 | 84 | .flat_map(|ids| self.resolve_references(ids)) |
75 | 85 | } |
76 | | - fn resolve_references(&self, ids: Ref<String, DashSet<String>>) -> impl IntoIterator<Item = Ref<String, Record>> { |
| 86 | + fn resolve_references(&self, ids: Ref<ImStr, DashSet<ImStr>>) -> impl IntoIterator<Item = Ref<ImStr, Record>> { |
77 | 87 | ids.value() |
78 | 88 | .iter() |
79 | 89 | .flat_map(|id| self.get(id.key()).into_iter()) |
|
0 commit comments