Skip to content

Commit 7e7787b

Browse files
committed
Pre-calculate some of the repeatly used components
1 parent b249354 commit 7e7787b

1 file changed

Lines changed: 31 additions & 35 deletions

File tree

graphannis/src/annis/db/aql/model.rs

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -111,65 +111,44 @@ pub struct AQLGlobalStatistics {
111111
fn calculate_inherited_coverage_edges(
112112
graph: &mut AnnotationGraph,
113113
n: NodeID,
114-
all_cov_components: &[AnnotationComponent],
115-
all_dom_components: &[AnnotationComponent],
114+
other_cov_gs: &[Arc<dyn GraphStorage>],
115+
all_text_coverage_components: &[AnnotationComponent],
116+
inherited_cov_component: &AnnotationComponent,
116117
) -> std::result::Result<FxHashSet<NodeID>, ComponentTypeError> {
117118
// Iterate over all all nodes that are somehow covered (by coverage or
118119
// dominance edges) starting from the given node.
119-
let all_text_coverage_components: Vec<AnnotationComponent> =
120-
[all_cov_components, all_dom_components].concat();
121-
122-
let all_text_coverage_gs: Vec<_> = all_text_coverage_components
120+
let all_text_cov_components_gs: Vec<_> = all_text_coverage_components
123121
.iter()
124122
.filter_map(|c| graph.get_graphstorage_as_ref(c))
125123
.map(|gs| gs.as_edgecontainer())
126124
.collect();
127-
let combined_gs = UnionEdgeContainer::new(all_text_coverage_gs);
128-
129-
let mut covered_token = FxHashSet::default();
130125

131-
let inherited_cov_component = AnnotationComponent::new(
132-
AnnotationComponentType::Coverage,
133-
ANNIS_NS.into(),
134-
"inherited-coverage".into(),
135-
);
126+
let all_text_cov_components_combined = UnionEdgeContainer::new(all_text_cov_components_gs);
136127

128+
let mut covered_token = FxHashSet::default();
137129
{
138130
let tok_helper = TokenHelper::new(graph)?;
139-
for step in CycleSafeDFS::new(&combined_gs, n, 1, usize::MAX) {
131+
for step in CycleSafeDFS::new(&all_text_cov_components_combined, n, 1, usize::MAX) {
140132
let step = step?;
141133
if tok_helper.is_token(step.node)? {
142134
covered_token.insert(step.node);
143135
}
144136
}
145137
};
146-
let other_coverage_gs: Vec<Arc<dyn GraphStorage>> = graph
147-
.get_all_components(Some(AnnotationComponentType::Coverage), None)
148-
.into_iter()
149-
.filter(|c| c != &inherited_cov_component)
150-
.filter_map(|c| graph.get_graphstorage(&c))
151-
.filter(|gs| {
152-
if let Some(stats) = gs.get_statistics() {
153-
stats.nodes > 0
154-
} else {
155-
true
156-
}
157-
})
158-
.collect();
159138

160139
// Connect all non-token nodes to the covered token nodes if no such direct coverage already exists
161140
let mut direct_coverage_targets = FxHashSet::default();
162-
for gs in other_coverage_gs.iter() {
141+
for gs in other_cov_gs.iter() {
163142
for target in gs.get_outgoing_edges(n) {
164143
direct_coverage_targets.insert(target?);
165144
}
166145
}
167-
let gs_cov = graph.get_or_create_writable(&inherited_cov_component)?;
146+
let inherited_gs_cov = graph.get_or_create_writable(&inherited_cov_component)?;
168147

169148
for target in &covered_token {
170149
if n != *target {
171150
if !direct_coverage_targets.contains(target) {
172-
gs_cov.add_edge(Edge {
151+
inherited_gs_cov.add_edge(Edge {
173152
source: n,
174153
target: *target,
175154
})?;
@@ -286,19 +265,36 @@ impl AQLUpdateGraphIndex {
286265
) -> std::result::Result<(), ComponentTypeError> {
287266
self.clear_left_right_token(graph)?;
288267

289-
let all_cov_components =
290-
graph.get_all_components(Some(AnnotationComponentType::Coverage), None);
268+
let inherited_cov_component = AnnotationComponent::new(
269+
AnnotationComponentType::Coverage,
270+
ANNIS_NS.into(),
271+
"inherited-coverage".into(),
272+
);
273+
let all_cov_components: Vec<_> = graph
274+
.get_all_components(Some(AnnotationComponentType::Coverage), None)
275+
.into_iter()
276+
.filter(|c| c != &inherited_cov_component)
277+
.collect();
278+
279+
let all_cov_gs: Vec<_> = all_cov_components
280+
.iter()
281+
.filter_map(|c| graph.get_graphstorage(c))
282+
.collect();
283+
291284
let all_dom_components =
292285
graph.get_all_components(Some(AnnotationComponentType::Dominance), None);
286+
let all_text_coverage_components: Vec<AnnotationComponent> =
287+
[all_cov_components, all_dom_components].concat();
293288

294289
// go over each node and calculate the left-most and right-most token
295290
for invalid in self.invalid_nodes.iter()? {
296291
let (n, _) = invalid?;
297292
let covered_token = calculate_inherited_coverage_edges(
298293
graph,
299294
n,
300-
&all_cov_components,
301-
&all_dom_components,
295+
&all_cov_gs,
296+
&all_text_coverage_components,
297+
&inherited_cov_component,
302298
)?;
303299
self.calculate_token_alignment(
304300
graph,

0 commit comments

Comments
 (0)