我試圖用類似SQL的連接迭代器擴展bluss的rust-itertools。我使用散列連接策略遇到了RIGHT OUTER JOIN的特定問題(策略本身實際上非常簡單)。使用HashMap實現類似SQL的RIGHT OUTER JOIN的迭代器適配器
迭代器適配器結構需要2個輸入迭代器,其中第二個(右側)被加載到HashMap中。迭代的工作原理如下:
- 從左側迭代器的項目是對地圖匹配 - 在匹配的情況下,返回這兩個項目
- 當左迭代器耗盡時,從返回非匹配的值地圖
問題是,我試圖在地圖的價值迭代器存儲與地圖存儲它的迭代狀態沿着第二部分。但正如我在answer中所瞭解的那樣,生鏽是不可能的。 不幸的是,我不知道如何做到這一點。
下面是完整的代碼,INNER JOIN適配器,它做的第一部分:
use std::collections::HashMap;
use std::hash::Hash;
pub struct HashJoinInner<I, K, V0, V1> where
I: Iterator<Item=(K, V0)>,
K: Hash + Eq,
V1: Clone,
{
left: I,
right: HashMap<K, V1>,
}
impl<I, K, V0, V1> HashJoinInner<I, K, V0, V1> where
I: Iterator<Item=(K, V0)>,
K: Hash + Eq,
V1: Clone,
{
/// Create a `HashJoinInner` iterator.
pub fn new<J>(l: I, r: J) -> Self
where J: Iterator<Item=(K, V1)>
{
let mut hm: HashMap<K, V1> = HashMap::new();
for (k, v) in r {
hm.insert(k, v);
}
HashJoinInner {
left: l,
right: hm,
}
}
}
impl<I, K, V0, V1> Iterator for HashJoinInner<I, K, V0, V1> where
I: Iterator<Item=(K, V0)>,
K: Hash + Eq,
V1: Clone,
{
type Item = (V0, V1);
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.left.next() {
Some((k0, v0)) => match self.right.get(&k0) {
Some(v1) => return Some((v0, Clone::clone(v1))),
None => continue,
},
None => return None,
}
}
}
}
我將是任何想法感謝。
我很抱歉,這些是我在堆棧溢出的第一步,我沒有意識到我可以添加一個答案,我自己的問題。再次感謝您的幫助 - 您的想法幫助我找到解決方案(下面發佈)。 – milancio