|
5 | 5 |
|
6 | 6 | use crate::{ |
7 | 7 | model::{ |
8 | | - DualKeyTraverse, DualKeyTraverseMut, HotKv, HotKvError, HotKvRead, HotKvReadError, |
9 | | - HotKvWrite, KvTraverse, KvTraverseMut, RawDualKeyValue, RawKeyValue, RawValue, |
| 8 | + DualKeyItem, DualKeyTraverse, DualKeyTraverseMut, HotKv, HotKvError, HotKvRead, |
| 9 | + HotKvReadError, HotKvWrite, KvTraverse, KvTraverseMut, RawDualKeyItem, RawDualKeyValue, |
| 10 | + RawKeyValue, RawValue, |
10 | 11 | }, |
11 | 12 | ser::{DeserError, MAX_KEY_SIZE}, |
12 | 13 | }; |
@@ -514,6 +515,47 @@ impl<'a> DualKeyTraverse<MemKvError> for MemKvCursor<'a> { |
514 | 515 | self.set_current_key(*found_key); |
515 | 516 | Ok(Some((found_k1, found_k2, Cow::Borrowed(value.as_ref())))) |
516 | 517 | } |
| 518 | + |
| 519 | + fn iter_items( |
| 520 | + &mut self, |
| 521 | + ) -> Result<impl Iterator<Item = Result<RawDualKeyItem<'_>, MemKvError>> + '_, MemKvError> { |
| 522 | + DualKeyTraverse::first(self)?; |
| 523 | + Ok(MemDualKeyItemIter { cursor: self, prev_k1: None }) |
| 524 | + } |
| 525 | +} |
| 526 | + |
| 527 | +/// Iterator that yields [`DualKeyItem`] for read-only memory cursors. |
| 528 | +struct MemDualKeyItemIter<'a, 'b> { |
| 529 | + cursor: &'a mut MemKvCursor<'b>, |
| 530 | + prev_k1: Option<Vec<u8>>, |
| 531 | +} |
| 532 | + |
| 533 | +impl<'a> Iterator for MemDualKeyItemIter<'a, '_> { |
| 534 | + type Item = Result<RawDualKeyItem<'a>, MemKvError>; |
| 535 | + |
| 536 | + fn next(&mut self) -> Option<Self::Item> { |
| 537 | + let result = DualKeyTraverse::read_next(self.cursor); |
| 538 | + match result { |
| 539 | + Ok(Some((k1, k2, v))) => { |
| 540 | + let k1_vec = k1.as_ref().to_vec(); |
| 541 | + let is_new_k1 = self.prev_k1.as_ref() != Some(&k1_vec); |
| 542 | + self.prev_k1 = Some(k1_vec); |
| 543 | + |
| 544 | + let item = if is_new_k1 { |
| 545 | + DualKeyItem::NewK1( |
| 546 | + Cow::Owned(k1.into_owned()), |
| 547 | + Cow::Owned(k2.into_owned()), |
| 548 | + Cow::Owned(v.into_owned()), |
| 549 | + ) |
| 550 | + } else { |
| 551 | + DualKeyItem::SameK1(Cow::Owned(k2.into_owned()), Cow::Owned(v.into_owned())) |
| 552 | + }; |
| 553 | + Some(Ok(item)) |
| 554 | + } |
| 555 | + Ok(None) => None, |
| 556 | + Err(e) => Some(Err(e)), |
| 557 | + } |
| 558 | + } |
517 | 559 | } |
518 | 560 |
|
519 | 561 | /// Memory cursor for read-write operations |
@@ -1037,6 +1079,47 @@ impl<'a> DualKeyTraverse<MemKvError> for MemKvCursorMut<'a> { |
1037 | 1079 | Cow::Owned(value.to_vec()), |
1038 | 1080 | ))) |
1039 | 1081 | } |
| 1082 | + |
| 1083 | + fn iter_items( |
| 1084 | + &mut self, |
| 1085 | + ) -> Result<impl Iterator<Item = Result<RawDualKeyItem<'_>, MemKvError>> + '_, MemKvError> { |
| 1086 | + DualKeyTraverse::first(self)?; |
| 1087 | + Ok(MemDualKeyItemIterMut { cursor: self, prev_k1: None }) |
| 1088 | + } |
| 1089 | +} |
| 1090 | + |
| 1091 | +/// Iterator that yields [`DualKeyItem`] for read-write memory cursors. |
| 1092 | +struct MemDualKeyItemIterMut<'a, 'b> { |
| 1093 | + cursor: &'a mut MemKvCursorMut<'b>, |
| 1094 | + prev_k1: Option<Vec<u8>>, |
| 1095 | +} |
| 1096 | + |
| 1097 | +impl<'a> Iterator for MemDualKeyItemIterMut<'a, '_> { |
| 1098 | + type Item = Result<RawDualKeyItem<'a>, MemKvError>; |
| 1099 | + |
| 1100 | + fn next(&mut self) -> Option<Self::Item> { |
| 1101 | + let result = DualKeyTraverse::read_next(self.cursor); |
| 1102 | + match result { |
| 1103 | + Ok(Some((k1, k2, v))) => { |
| 1104 | + let k1_vec = k1.as_ref().to_vec(); |
| 1105 | + let is_new_k1 = self.prev_k1.as_ref() != Some(&k1_vec); |
| 1106 | + self.prev_k1 = Some(k1_vec); |
| 1107 | + |
| 1108 | + let item = if is_new_k1 { |
| 1109 | + DualKeyItem::NewK1( |
| 1110 | + Cow::Owned(k1.into_owned()), |
| 1111 | + Cow::Owned(k2.into_owned()), |
| 1112 | + Cow::Owned(v.into_owned()), |
| 1113 | + ) |
| 1114 | + } else { |
| 1115 | + DualKeyItem::SameK1(Cow::Owned(k2.into_owned()), Cow::Owned(v.into_owned())) |
| 1116 | + }; |
| 1117 | + Some(Ok(item)) |
| 1118 | + } |
| 1119 | + Ok(None) => None, |
| 1120 | + Err(e) => Some(Err(e)), |
| 1121 | + } |
| 1122 | + } |
1040 | 1123 | } |
1041 | 1124 |
|
1042 | 1125 | impl DualKeyTraverseMut<MemKvError> for MemKvCursorMut<'_> { |
|
0 commit comments