joiner convenience function

main
Ziyang Hu 2 years ago
parent 18092b6186
commit 8f2f42566a

@ -435,15 +435,7 @@ impl SessionTx {
if ret.is_unit() { if ret.is_unit() {
ret = const_rel; ret = const_rel;
} else { } else {
ret = Relation::Join(Box::new(InnerJoin { ret = ret.cartesian_join(const_rel);
left: ret,
right: const_rel,
joiner: Joiner {
left_keys: vec![],
right_keys: vec![],
},
to_eliminate: Default::default(),
}));
} }
let mut join_left_keys = vec![temp_join_key_left]; let mut join_left_keys = vec![temp_join_key_left];
@ -467,15 +459,7 @@ impl SessionTx {
bindings: [temp_join_key_right, v_kw], bindings: [temp_join_key_right, v_kw],
}); });
debug_assert_eq!(join_left_keys.len(), join_right_keys.len()); debug_assert_eq!(join_left_keys.len(), join_right_keys.len());
ret = Relation::Join(Box::new(InnerJoin { ret = ret.join(right, join_left_keys, join_right_keys);
left: ret,
right,
joiner: Joiner {
left_keys: join_left_keys,
right_keys: join_right_keys,
},
to_eliminate: Default::default(),
}));
} }
(Term::Var(e_kw), Term::Const(val)) => { (Term::Var(e_kw), Term::Const(val)) => {
let temp_join_key_left = next_ignored_kw(); let temp_join_key_left = next_ignored_kw();
@ -488,15 +472,7 @@ impl SessionTx {
if ret.is_unit() { if ret.is_unit() {
ret = const_rel; ret = const_rel;
} else { } else {
ret = Relation::Join(Box::new(InnerJoin { ret = ret.cartesian_join(const_rel);
left: ret,
right: const_rel,
joiner: Joiner {
left_keys: vec![],
right_keys: vec![],
},
to_eliminate: Default::default(),
}));
} }
let mut join_left_keys = vec![temp_join_key_left]; let mut join_left_keys = vec![temp_join_key_left];
@ -519,15 +495,7 @@ impl SessionTx {
bindings: [e_kw, temp_join_key_right], bindings: [e_kw, temp_join_key_right],
}); });
debug_assert_eq!(join_left_keys.len(), join_right_keys.len()); debug_assert_eq!(join_left_keys.len(), join_right_keys.len());
ret = Relation::Join(Box::new(InnerJoin { ret = ret.join(right, join_left_keys, join_right_keys);
left: ret,
right,
joiner: Joiner {
left_keys: join_left_keys,
right_keys: join_right_keys,
},
to_eliminate: Default::default(),
}));
} }
(Term::Var(e_kw), Term::Var(v_kw)) => { (Term::Var(e_kw), Term::Var(v_kw)) => {
let mut join_left_keys = vec![]; let mut join_left_keys = vec![];
@ -566,15 +534,7 @@ impl SessionTx {
ret = right; ret = right;
} else { } else {
debug_assert_eq!(join_left_keys.len(), join_right_keys.len()); debug_assert_eq!(join_left_keys.len(), join_right_keys.len());
ret = Relation::Join(Box::new(InnerJoin { ret = ret.join(right, join_left_keys, join_right_keys);
left: ret,
right,
joiner: Joiner {
left_keys: join_left_keys,
right_keys: join_right_keys,
},
to_eliminate: Default::default(),
}));
} }
} }
(Term::Const(eid), Term::Const(val)) => { (Term::Const(eid), Term::Const(val)) => {
@ -587,15 +547,7 @@ impl SessionTx {
if ret.is_unit() { if ret.is_unit() {
ret = const_rel; ret = const_rel;
} else { } else {
ret = Relation::Join(Box::new(InnerJoin { ret = ret.cartesian_join(const_rel);
left: ret,
right: const_rel,
joiner: Joiner {
left_keys: vec![],
right_keys: vec![],
},
to_eliminate: Default::default(),
}));
} }
let (right_var_1, right_var_2) = (next_ignored_kw(), next_ignored_kw()); let (right_var_1, right_var_2) = (next_ignored_kw(), next_ignored_kw());
@ -604,15 +556,11 @@ impl SessionTx {
vld, vld,
bindings: [right_var_1.clone(), right_var_2.clone()], bindings: [right_var_1.clone(), right_var_2.clone()],
}); });
ret = Relation::Join(Box::new(InnerJoin { ret = ret.join(
left: ret,
right, right,
joiner: Joiner { vec![left_var_1.clone(), left_var_2.clone()],
left_keys: vec![left_var_1.clone(), left_var_2.clone()], vec![right_var_1.clone(), right_var_2.clone()],
right_keys: vec![right_var_1.clone(), right_var_2.clone()], );
},
to_eliminate: Default::default(),
}));
} }
}, },
Atom::Rule(rule_app) => { Atom::Rule(rule_app) => {
@ -661,15 +609,7 @@ impl SessionTx {
data: vec![temp_left_joiner_vals], data: vec![temp_left_joiner_vals],
to_eliminate: Default::default(), to_eliminate: Default::default(),
}); });
ret = Relation::Join(Box::new(InnerJoin { ret = ret.cartesian_join(const_joiner);
left: ret,
right: const_joiner,
joiner: Joiner {
left_keys: vec![],
right_keys: vec![],
},
to_eliminate: Default::default(),
}))
} }
let right = Relation::Derived(StoredDerivedRelation { let right = Relation::Derived(StoredDerivedRelation {
@ -677,15 +617,7 @@ impl SessionTx {
storage: store, storage: store,
}); });
debug_assert_eq!(prev_joiner_vars.len(), right_joiner_vars.len()); debug_assert_eq!(prev_joiner_vars.len(), right_joiner_vars.len());
ret = Relation::Join(Box::new(InnerJoin { ret = ret.join(right, prev_joiner_vars, right_joiner_vars);
left: ret,
right,
joiner: Joiner {
left_keys: prev_joiner_vars,
right_keys: right_joiner_vars,
},
to_eliminate: Default::default(),
}))
} }
Atom::Predicate(_) => { Atom::Predicate(_) => {
todo!() todo!()
@ -698,15 +630,7 @@ impl SessionTx {
ret.eliminate_temp_vars(&ret_vars_set)?; ret.eliminate_temp_vars(&ret_vars_set)?;
let cur_ret_set: BTreeSet<_> = ret.bindings().into_iter().collect(); let cur_ret_set: BTreeSet<_> = ret.bindings().into_iter().collect();
if cur_ret_set != ret_vars_set { if cur_ret_set != ret_vars_set {
ret = Relation::Join(Box::new(InnerJoin { ret = ret.cartesian_join(Relation::unit());
left: ret,
right: Relation::unit(),
joiner: Joiner {
left_keys: vec![],
right_keys: vec![],
},
to_eliminate: Default::default(),
}));
ret.eliminate_temp_vars(&ret_vars_set)?; ret.eliminate_temp_vars(&ret_vars_set)?;
} }

@ -33,6 +33,25 @@ impl Relation {
false false
} }
} }
pub(crate) fn cartesian_join(self, right: Relation) -> Self {
self.join(right, vec![], vec![])
}
pub(crate) fn join(
self,
right: Relation,
left_keys: Vec<Keyword>,
right_keys: Vec<Keyword>,
) -> Self {
Relation::Join(Box::new(InnerJoin {
left: self,
right,
joiner: Joiner {
left_keys,
right_keys,
},
to_eliminate: Default::default(),
}))
}
} }
#[derive(Debug)] #[derive(Debug)]
@ -526,10 +545,7 @@ impl StoredDerivedRelation {
} }
}; };
Box::new( Box::new(self.storage.scan_all_for_epoch(scan_epoch))
self.storage
.scan_all_for_epoch(scan_epoch),
)
} }
fn join_is_prefix(&self, right_join_indices: &[usize]) -> bool { fn join_is_prefix(&self, right_join_indices: &[usize]) -> bool {
let mut indices = right_join_indices.to_vec(); let mut indices = right_join_indices.to_vec();

Loading…
Cancel
Save