revlogindex: update DAG hints

Summary:
Follow up of D22638454.

This makes revlogindex marks its compatible DAG so "all()" fast paths can be used properly.

Reviewed By: sfilipco

Differential Revision: D22638459

fbshipit-source-id: 074e95b9fccbc486b69a947fec5172662e7dd3b7
This commit is contained in:
Jun Wu 2020-07-30 20:24:12 -07:00 committed by Facebook GitHub Bot
parent a2b44103bd
commit c68d389d95

View File

@ -814,7 +814,9 @@ impl DagAlgorithm for RevlogIndex {
let id = self.vertex_id(name?)?;
spans.push(id);
}
Ok(Set::from_spans_idmap(spans, self.get_snapshot()))
let result = Set::from_spans_idmap(spans, self.get_snapshot());
result.hints().set_dag(self);
Ok(result)
}
}
@ -838,7 +840,7 @@ impl DagAlgorithm for RevlogIndex {
IdSet::from(Id(0)..=Id(self.len() as u64 - 1))
};
let result = Set::from_spans_idmap(id_set, self.get_snapshot());
result.hints().add_flags(Flags::FULL);
result.hints().add_flags(Flags::FULL).set_dag(self);
Ok(result)
}
@ -877,8 +879,9 @@ impl DagAlgorithm for RevlogIndex {
let map = self.get_snapshot() as Arc<dyn IdConvert + Send + Sync>;
let set = Set::from_iter_idmap(iter, map);
set.hints()
.add_flags(Flags::ID_DESC | Flags::TOPO_DESC | Flags::ANCESTORS);
set.hints().set_max_id(max_id);
.add_flags(Flags::ID_DESC | Flags::TOPO_DESC | Flags::ANCESTORS)
.set_max_id(max_id)
.set_dag(self);
Ok(set)
}
@ -918,6 +921,7 @@ impl DagAlgorithm for RevlogIndex {
let idmap = dag;
let result = Set::from_spans_idmap(id_spans, idmap);
result.hints().set_dag(self);
Ok(result)
}
@ -942,8 +946,10 @@ impl DagAlgorithm for RevlogIndex {
let map = self.get_snapshot() as Arc<dyn IdConvert + Send + Sync>;
let set = Set::from_iter_idmap(iter, map);
set.hints().add_flags(Flags::ID_ASC);
set.hints().set_min_id(min_id);
set.hints()
.add_flags(Flags::ID_ASC)
.set_min_id(min_id)
.set_dag(self);
Ok(set)
}
@ -968,9 +974,11 @@ impl DagAlgorithm for RevlogIndex {
})
.map(Ok);
let set = Set::from_iter_idmap(iter, self.get_snapshot());
set.hints().add_flags(Flags::ID_DESC | Flags::TOPO_DESC);
set.hints().set_min_id(min_id);
set.hints().set_max_id(max_id);
set.hints()
.add_flags(Flags::ID_DESC | Flags::TOPO_DESC)
.set_min_id(min_id)
.set_max_id(max_id)
.set_dag(self);
Ok(set)
}
@ -1016,7 +1024,9 @@ impl DagAlgorithm for RevlogIndex {
let revs: Vec<u32> = id_set.iter().map(|id| id.0 as u32).collect();
let gcas = self.gca_revs(&revs, usize::max_value());
let spans = IdSet::from_spans(gcas.into_iter().map(|r| Id(r as _)));
Ok(Set::from_spans_idmap(spans, self.get_snapshot()))
let result = Set::from_spans_idmap(spans, self.get_snapshot());
result.hints().set_dag(self);
Ok(result)
}
/// Tests if `ancestor` is an ancestor of `descendant`.
@ -1080,7 +1090,9 @@ impl DagAlgorithm for RevlogIndex {
}
}
}
Ok(Set::from_spans_idmap(result_id_set, self.get_snapshot()))
let result = Set::from_spans_idmap(result_id_set, self.get_snapshot());
result.hints().set_dag(self);
Ok(result)
}
/// Calculate the heads of the set.
@ -1100,7 +1112,9 @@ impl DagAlgorithm for RevlogIndex {
let head_revs: Vec<u32> = head_ids.into_iter().map(|i| i.0 as u32).collect();
let result_revs = self.range_revs(&root_revs, &head_revs);
let result_id_set = IdSet::from_spans(result_revs.into_iter().map(|r| Id(r as _)));
Ok(Set::from_spans_idmap(result_id_set, self.get_snapshot()))
let result = Set::from_spans_idmap(result_id_set, self.get_snapshot());
result.hints().set_dag(self);
Ok(result)
}
/// Calculate `::reachable - ::unreachable`.
@ -1170,6 +1184,7 @@ impl DagAlgorithm for RevlogIndex {
}
let result = Set::from_spans_idmap(result, self.get_snapshot());
result.hints().set_dag(self);
Ok(result)
}
@ -1184,7 +1199,8 @@ impl DagAlgorithm for RevlogIndex {
self.phasesets(unreachable_revs, reachable_revs);
let only = Set::from_spans_idmap(result_reachable_id_set, self.get_snapshot());
let ancestors = Set::from_spans_idmap(result_unreachable_id_set, self.get_snapshot());
ancestors.hints().add_flags(Flags::ANCESTORS);
ancestors.hints().add_flags(Flags::ANCESTORS).set_dag(self);
only.hints().set_dag(self);
Ok((only, ancestors))
}
@ -1220,8 +1236,10 @@ impl DagAlgorithm for RevlogIndex {
let map = self.get_snapshot() as Arc<dyn IdConvert + Send + Sync>;
let set = Set::from_iter_idmap(iter, map);
set.hints().add_flags(Flags::ID_ASC);
set.hints().set_min_id(min_id);
set.hints()
.add_flags(Flags::ID_ASC)
.set_min_id(min_id)
.set_dag(self);
Ok(set)
}
}