store params in the graph

This commit is contained in:
Aleksey Kladov 2018-09-12 17:16:58 +03:00
parent 907d44a751
commit 0e493160c0

View file

@ -91,12 +91,13 @@ impl Clone for Db {
} }
} }
type QueryDeps = Vec<(QueryInvocationId, Arc<Any>, OutputHash)>;
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub(crate) struct Cache { pub(crate) struct Cache {
gen: Gen, gen: Gen,
green: im::HashMap<QueryInvocationId, (Gen, OutputHash)>, green: im::HashMap<QueryInvocationId, (Gen, OutputHash)>,
deps: im::HashMap<QueryInvocationId, Vec<(QueryInvocationId, OutputHash)>>, deps: im::HashMap<QueryInvocationId, QueryDeps>,
results: im::HashMap<QueryInvocationId, Arc<Any>>, results: im::HashMap<QueryInvocationId, Arc<Any>>,
} }
@ -124,7 +125,7 @@ impl Cache {
pub(crate) struct QueryCtx { pub(crate) struct QueryCtx {
db: Arc<Db>, db: Arc<Db>,
stack: RefCell<Vec<(QueryInvocationId, Vec<(QueryInvocationId, OutputHash)>)>>, stack: RefCell<Vec<(QueryInvocationId, QueryDeps)>>,
pub(crate) trace: RefCell<Vec<TraceEvent>>, pub(crate) trace: RefCell<Vec<TraceEvent>>,
} }
@ -148,7 +149,8 @@ impl QueryCtx {
{ {
let mut stack = self.stack.borrow_mut(); let mut stack = self.stack.borrow_mut();
if let Some((_, ref mut deps)) = stack.last_mut() { if let Some((_, ref mut deps)) = stack.last_mut() {
deps.push((me, output_hash::<Q>(&res))); let params = Arc::new(params.clone());
deps.push((me, params, output_hash::<Q>(&res)));
} }
} }
@ -161,7 +163,7 @@ impl QueryCtx {
pub(crate) trait Query { pub(crate) trait Query {
const ID: u32; const ID: u32;
type Params: Hash + Eq + Debug + Any + 'static; type Params: Hash + Eq + Debug + Clone + Any + 'static;
type Output: Hash + Debug + Any + 'static; type Output: Hash + Debug + Any + 'static;
} }
@ -212,7 +214,7 @@ where
}; };
let deps_are_fresh = cache.deps[&id] let deps_are_fresh = cache.deps[&id]
.iter() .iter()
.all(|&(dep_id, dep_hash)| { .all(|&(dep_id, _, dep_hash)| {
match cache.green.get(&dep_id) { match cache.green.get(&dep_id) {
//TODO: store the value of parameters, and re-execute the query //TODO: store the value of parameters, and re-execute the query
Some((gen, hash)) if gen == &curr_gen && hash == &dep_hash => true, Some((gen, hash)) if gen == &curr_gen && hash == &dep_hash => true,