mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 22:47:56 +00:00
Optimize next_storage_key (#8956)
* Optimize `next_storage_key` - Do not rely on recursion - Use an iterator over the overlay to not always call the same method * Fix bug
This commit is contained in:
@@ -426,11 +426,11 @@ impl OverlayedChangeSet {
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the change that is next to the supplied key.
|
||||
pub fn next_change(&self, key: &[u8]) -> Option<(&[u8], &OverlayedValue)> {
|
||||
/// Get the iterator over all changes that follow the supplied `key`.
|
||||
pub fn changes_after(&self, key: &[u8]) -> impl Iterator<Item = (&[u8], &OverlayedValue)> {
|
||||
use sp_std::ops::Bound;
|
||||
let range = (Bound::Excluded(key), Bound::Unbounded);
|
||||
self.changes.range::<[u8], _>(range).next().map(|(k, v)| (&k[..], v))
|
||||
self.changes.range::<[u8], _>(range).map(|(k, v)| (k.as_slice(), v))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -707,29 +707,29 @@ mod test {
|
||||
changeset.set(b"key4".to_vec(), Some(b"val4".to_vec()), Some(4));
|
||||
changeset.set(b"key11".to_vec(), Some(b"val11".to_vec()), Some(11));
|
||||
|
||||
assert_eq!(changeset.next_change(b"key0").unwrap().0, b"key1");
|
||||
assert_eq!(changeset.next_change(b"key0").unwrap().1.value(), Some(&b"val1".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key1").unwrap().0, b"key11");
|
||||
assert_eq!(changeset.next_change(b"key1").unwrap().1.value(), Some(&b"val11".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key11").unwrap().0, b"key2");
|
||||
assert_eq!(changeset.next_change(b"key11").unwrap().1.value(), Some(&b"val2".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key2").unwrap().0, b"key3");
|
||||
assert_eq!(changeset.next_change(b"key2").unwrap().1.value(), Some(&b"val3".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key3").unwrap().0, b"key4");
|
||||
assert_eq!(changeset.next_change(b"key3").unwrap().1.value(), Some(&b"val4".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key4"), None);
|
||||
assert_eq!(changeset.changes_after(b"key0").next().unwrap().0, b"key1");
|
||||
assert_eq!(changeset.changes_after(b"key0").next().unwrap().1.value(), Some(&b"val1".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key1").next().unwrap().0, b"key11");
|
||||
assert_eq!(changeset.changes_after(b"key1").next().unwrap().1.value(), Some(&b"val11".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key11").next().unwrap().0, b"key2");
|
||||
assert_eq!(changeset.changes_after(b"key11").next().unwrap().1.value(), Some(&b"val2".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key2").next().unwrap().0, b"key3");
|
||||
assert_eq!(changeset.changes_after(b"key2").next().unwrap().1.value(), Some(&b"val3".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key3").next().unwrap().0, b"key4");
|
||||
assert_eq!(changeset.changes_after(b"key3").next().unwrap().1.value(), Some(&b"val4".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key4").next(), None);
|
||||
|
||||
changeset.rollback_transaction().unwrap();
|
||||
|
||||
assert_eq!(changeset.next_change(b"key0").unwrap().0, b"key1");
|
||||
assert_eq!(changeset.next_change(b"key0").unwrap().1.value(), Some(&b"val1".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key1").unwrap().0, b"key2");
|
||||
assert_eq!(changeset.next_change(b"key1").unwrap().1.value(), Some(&b"val2".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key11").unwrap().0, b"key2");
|
||||
assert_eq!(changeset.next_change(b"key11").unwrap().1.value(), Some(&b"val2".to_vec()));
|
||||
assert_eq!(changeset.next_change(b"key2"), None);
|
||||
assert_eq!(changeset.next_change(b"key3"), None);
|
||||
assert_eq!(changeset.next_change(b"key4"), None);
|
||||
assert_eq!(changeset.changes_after(b"key0").next().unwrap().0, b"key1");
|
||||
assert_eq!(changeset.changes_after(b"key0").next().unwrap().1.value(), Some(&b"val1".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key1").next().unwrap().0, b"key2");
|
||||
assert_eq!(changeset.changes_after(b"key1").next().unwrap().1.value(), Some(&b"val2".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key11").next().unwrap().0, b"key2");
|
||||
assert_eq!(changeset.changes_after(b"key11").next().unwrap().1.value(), Some(&b"val2".to_vec()));
|
||||
assert_eq!(changeset.changes_after(b"key2").next(), None);
|
||||
assert_eq!(changeset.changes_after(b"key3").next(), None);
|
||||
assert_eq!(changeset.changes_after(b"key4").next(), None);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user