@@ -33,26 +33,20 @@ impl crate::storage::common::Storage for BasicStorage {
33
33
return Err ( format ! ( "Key name already exists: {}" , user_id_key_name) ) ;
34
34
}
35
35
} else {
36
- _update_dir ( & mut maps, user_id, key_name) ;
36
+ _maintain_prefixes_along_path ( & mut maps, user_id, key_name) ;
37
37
}
38
38
maps. key_path_to_value
39
39
. insert ( key_path_created. clone ( ) , value. to_vec ( ) ) ;
40
40
maps. key_name_to_timestamp
41
41
. insert ( user_id_key_name, timestamp) ;
42
- let prefix = get_prefix ( key_name) ;
43
- let keys_directory = format ! ( "{}::{}" , user_id, prefix) ;
44
- let contains_key = maps. prefix_to_key_paths . contains_key ( & keys_directory) ;
45
- if contains_key {
46
- let key_list_set = maps. prefix_to_key_paths . get_mut ( & keys_directory) . unwrap ( ) ;
47
- key_list_set. 0 . insert ( key_path_created. clone ( ) ) ;
48
- key_list_set. 1 . insert ( key_path_created. clone ( ) ) ;
49
- } else {
50
- let mut key_list_set = ( HashSet :: new ( ) , HashSet :: new ( ) ) ;
51
- key_list_set. 0 . insert ( key_path_created. clone ( ) ) ;
52
- key_list_set. 1 . insert ( key_path_created. clone ( ) ) ;
53
- maps. prefix_to_key_paths
54
- . insert ( keys_directory, key_list_set) ;
55
- }
42
+ let key_name_prefix = get_prefix ( key_name) ;
43
+ let prefix = format ! ( "{}::{}" , user_id, key_name_prefix) ;
44
+ let prefix_set = maps
45
+ . prefix_to_key_paths
46
+ . entry ( prefix)
47
+ . or_insert ( ( HashSet :: new ( ) , HashSet :: new ( ) ) ) ;
48
+ prefix_set. 0 . insert ( key_path_created. clone ( ) ) ;
49
+ prefix_set. 1 . insert ( key_path_created. clone ( ) ) ;
56
50
Ok ( key_path_created)
57
51
}
58
52
@@ -102,11 +96,11 @@ impl crate::storage::common::Storage for BasicStorage {
102
96
let res = maps. prefix_to_key_paths . get ( & format ! ( "{}:" , prefix) ) ;
103
97
Ok ( match res {
104
98
None => vec ! [ ] ,
105
- Some ( key_list_set ) => {
99
+ Some ( prefix_set ) => {
106
100
if include_history {
107
- Vec :: from_iter ( key_list_set . 1 . clone ( ) )
101
+ Vec :: from_iter ( prefix_set . 1 . clone ( ) )
108
102
} else {
109
- Vec :: from_iter ( key_list_set . 0 . clone ( ) )
103
+ Vec :: from_iter ( prefix_set . 0 . clone ( ) )
110
104
}
111
105
}
112
106
} )
@@ -124,31 +118,25 @@ impl crate::storage::common::Storage for BasicStorage {
124
118
. insert ( user_id_key_name. clone ( ) , timestamp)
125
119
. unwrap_or ( 0_i64 ) ;
126
120
if old_timestamp == 0 {
127
- _update_dir ( & mut maps, user_id, key_name) ;
121
+ _maintain_prefixes_along_path ( & mut maps, user_id, key_name) ;
128
122
}
129
- let prefix = get_prefix ( key_name) ;
130
- let keys_directory = format ! ( "{}::{}" , user_id, prefix) ;
131
- let contains_key = maps. prefix_to_key_paths . contains_key ( & keys_directory) ;
132
- if contains_key {
133
- let key_list_set = maps. prefix_to_key_paths . get_mut ( & keys_directory) . unwrap ( ) ;
134
- if old_timestamp != 0
135
- && key_list_set
136
- . 0
137
- . contains ( & format ! ( "{}@{}" , user_id_key_name, old_timestamp) )
138
- {
139
- key_list_set
140
- . 0
141
- . remove ( & format ! ( "{}@{}" , user_id_key_name, old_timestamp) ) ;
142
- }
143
- key_list_set. 0 . insert ( key_path_created. clone ( ) ) ;
144
- key_list_set. 1 . insert ( key_path_created. clone ( ) ) ;
145
- } else {
146
- let mut key_list_set = ( HashSet :: new ( ) , HashSet :: new ( ) ) ;
147
- key_list_set. 0 . insert ( key_path_created. clone ( ) ) ;
148
- key_list_set. 1 . insert ( key_path_created. clone ( ) ) ;
149
- maps. prefix_to_key_paths
150
- . insert ( keys_directory, key_list_set) ;
123
+ let key_name_prefix = get_prefix ( key_name) ;
124
+ let prefix = format ! ( "{}::{}" , user_id, key_name_prefix) ;
125
+ let prefix_set = maps
126
+ . prefix_to_key_paths
127
+ . entry ( prefix)
128
+ . or_insert ( ( HashSet :: new ( ) , HashSet :: new ( ) ) ) ;
129
+ if old_timestamp != 0
130
+ && prefix_set
131
+ . 0
132
+ . contains ( & format ! ( "{}@{}" , user_id_key_name, old_timestamp) )
133
+ {
134
+ prefix_set
135
+ . 0
136
+ . remove ( & format ! ( "{}@{}" , user_id_key_name, old_timestamp) ) ;
151
137
}
138
+ prefix_set. 0 . insert ( key_path_created. clone ( ) ) ;
139
+ prefix_set. 1 . insert ( key_path_created. clone ( ) ) ;
152
140
Ok ( key_path_created)
153
141
}
154
142
@@ -167,17 +155,16 @@ impl crate::storage::common::Storage for BasicStorage {
167
155
. key_name_to_timestamp
168
156
. insert ( user_id_key_name. clone ( ) , timestamp)
169
157
. unwrap_or ( 0_i64 ) ;
170
- let prefix = get_prefix ( key_name) ;
171
- let keys_directory = format ! ( "{}::{}" , user_id, prefix) ;
172
- let contains_key = maps. prefix_to_key_paths . contains_key ( & keys_directory) ;
173
- if contains_key {
174
- let key_list_set = maps. prefix_to_key_paths . get_mut ( & keys_directory) . unwrap ( ) ;
158
+ let key_name_prefix = get_prefix ( key_name) ;
159
+ let prefix = format ! ( "{}::{}" , user_id, key_name_prefix) ;
160
+ if maps. prefix_to_key_paths . contains_key ( & prefix) {
161
+ let prefix_set = maps. prefix_to_key_paths . get_mut ( & prefix) . unwrap ( ) ;
175
162
if old_timestamp != 0
176
- && key_list_set
163
+ && prefix_set
177
164
. 0
178
165
. contains ( & format ! ( "{}@{}" , user_id_key_name, old_timestamp) )
179
166
{
180
- key_list_set
167
+ prefix_set
181
168
. 0
182
169
. remove ( & format ! ( "{}@{}" , user_id_key_name, old_timestamp) ) ;
183
170
}
@@ -189,24 +176,18 @@ impl crate::storage::common::Storage for BasicStorage {
189
176
}
190
177
}
191
178
192
- fn _update_dir ( maps : & mut StorageMap , user_id : & str , key_name : & str ) {
193
- let split: Vec < & str > = key_name. split ( ':' ) . collect ( ) ;
194
- let mut path1 = user_id. to_string ( ) + "::" ;
195
- let mut path2 = user_id. to_string ( ) + "::" + split[ 0 ] ;
196
- for i in 0 ..split. len ( ) - 1 {
197
- let contains_key = maps. prefix_to_key_paths . contains_key ( & path1) ;
198
- let value = path2. clone ( ) + "@0" ;
199
- if contains_key {
200
- let key_list_set = maps. prefix_to_key_paths . get_mut ( & path1) . unwrap ( ) ;
201
- key_list_set. 0 . insert ( value. clone ( ) ) ;
202
- key_list_set. 1 . insert ( value) ;
203
- } else {
204
- let mut key_list_set = ( HashSet :: new ( ) , HashSet :: new ( ) ) ;
205
- key_list_set. 0 . insert ( value. clone ( ) ) ;
206
- key_list_set. 1 . insert ( value) ;
207
- maps. prefix_to_key_paths . insert ( path1, key_list_set) ;
208
- }
209
- path1 = path2. clone ( ) + ":" ;
210
- path2 = path2 + ":" + split[ i + 1 ] ;
179
+ fn _maintain_prefixes_along_path ( maps : & mut StorageMap , user_id : & str , key_name : & str ) {
180
+ let splits: Vec < & str > = key_name. split ( ':' ) . collect ( ) ;
181
+ let mut current_path = user_id. to_string ( ) + "::" ;
182
+ let mut next_path = user_id. to_string ( ) + "::" + splits[ 0 ] ;
183
+ for i in 0 ..splits. len ( ) - 1 {
184
+ let current_set = maps
185
+ . prefix_to_key_paths
186
+ . entry ( current_path)
187
+ . or_insert ( ( HashSet :: new ( ) , HashSet :: new ( ) ) ) ;
188
+ current_set. 0 . insert ( next_path. clone ( ) + "@0" ) ;
189
+ current_set. 1 . insert ( next_path. clone ( ) + "@0" ) ;
190
+ current_path = next_path. clone ( ) + ":" ;
191
+ next_path = next_path + ":" + splits[ i + 1 ] ;
211
192
}
212
193
}
0 commit comments