From 218757ce216fd24d59a46bc9c03d049403d3e207 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Tue, 10 May 2022 17:03:58 +0800 Subject: [PATCH] bags union --- src/db/plan.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/db/plan.rs b/src/db/plan.rs index 3f1f11c5..f5098cb4 100644 --- a/src/db/plan.rs +++ b/src/db/plan.rs @@ -4,7 +4,7 @@ use std::cmp::Ordering; use pest::iterators::Pair; use cozorocks::{IteratorPtr}; use crate::db::engine::Session; -use crate::db::eval::{compare_tuple_by_keys, extract_table_ref, tuple_eval}; +use crate::db::eval::{compare_tuple_by_keys, tuple_eval}; use crate::db::query::{FromEl, Selection}; use crate::db::table::{ColId, TableId, TableInfo}; use crate::error::CozoError::LogicError; @@ -166,6 +166,7 @@ pub enum MegaTupleIt<'a> { KeyedDifferenceIt { left: Box>, right: Box> }, FilterIt { it: Box>, filter: Value<'a> }, EvalIt { it: Box>, keys: Vec>, vals: Vec>, prefix: u32 }, + BagsUnionIt { bags: Vec> }, } impl<'a> MegaTupleIt<'a> { @@ -251,6 +252,33 @@ impl<'a> MegaTupleIt<'a> { MegaTupleIt::KeyedDifferenceIt { .. } => { todo!() } + MegaTupleIt::BagsUnionIt { .. } => { + todo!() + } + } + } +} + +pub struct BagsUnionIterator<'a> { + bags: Vec> + 'a>>, + current: usize, +} + +impl<'a> Iterator for BagsUnionIterator<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + let cur_it = self.bags.get_mut(self.current).unwrap(); + match cur_it.next() { + None => { + if self.current == self.bags.len() - 1 { + None + } else { + self.current += 1; + self.next() + } + } + v => v } } }