Skip to content

Commit f7d2811

Browse files
committed
Fix substraction to possible negative number
1 parent e31914c commit f7d2811

5 files changed

Lines changed: 228 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
55

66
## [Unreleased]
77

8+
## Fixed
9+
10+
- Crash could occur when finding inversed connected nodes in PrePost graph
11+
storage due to a subtraction resulting in negative number.
12+
813
## [3.7.1] - 2025-04-14
914

1015
### Fixed

core/src/graph/storage/prepost.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -345,13 +345,16 @@ where
345345
root.pre.to_usize(),
346346
root.post.to_usize(),
347347
) {
348-
let diff_level = root_level - current_level;
349-
if current_pre <= root_pre
350-
&& current_post >= root_post
351-
&& min_distance <= diff_level
352-
&& diff_level <= max_distance
353-
{
354-
Some(*current_node)
348+
if let Some(diff_level) = root_level.checked_sub(current_level) {
349+
if current_pre <= root_pre
350+
&& current_post >= root_post
351+
&& min_distance <= diff_level
352+
&& diff_level <= max_distance
353+
{
354+
Some(*current_node)
355+
} else {
356+
None
357+
}
355358
} else {
356359
None
357360
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,9 @@ impl AQLUpdateGraphIndex {
195195
.map(|gs| gs.as_edgecontainer())
196196
.collect();
197197

198-
let union = UnionEdgeContainer::new(containers);
198+
let union_container = UnionEdgeContainer::new(containers);
199199

200-
let dfs = CycleSafeDFS::new_inverse(&union, node, 0, usize::MAX);
200+
let dfs = CycleSafeDFS::new_inverse(&union_container, node, 0, usize::MAX);
201201
for step in dfs {
202202
let step = step?;
203203
self.invalid_nodes.insert(step.node, true)?;
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
---
2+
source: graphannis/src/annis/db/aql/model/tests.rs
3+
expression: "String::from_utf8_lossy(&output)"
4+
---
5+
<?xml version="1.0" encoding="UTF-8"?>
6+
<graphml>
7+
<key id="k0" for="node" attr.name="syntax::cat" attr.type="string"/>
8+
<key id="k1" for="node" attr.name="annis::doc" attr.type="string"/>
9+
<key id="k2" for="node" attr.name="annis::layer" attr.type="string"/>
10+
<key id="k3" for="node" attr.name="annis::node_type" attr.type="string"/>
11+
<key id="k4" for="node" attr.name="default_ns::pos" attr.type="string"/>
12+
<key id="k5" for="node" attr.name="annis::tok" attr.type="string"/>
13+
<key id="k6" for="node" attr.name="annis::tok-whitespace-before" attr.type="string"/>
14+
<graph edgedefault="directed" parse.order="nodesfirst" parse.nodeids="free" parse.edgeids="canonical">
15+
<node id="single_sentence">
16+
<data key="k3">corpus</data>
17+
</node>
18+
<node id="single_sentence/zossen">
19+
<data key="k1">zossen</data>
20+
<data key="k3">corpus</data>
21+
</node>
22+
<node id="single_sentence/zossen#text">
23+
<data key="k3">datasource</data>
24+
</node>
25+
<node id="single_sentence/zossen#n1">
26+
<data key="k0">ROOT</data>
27+
<data key="k2">syntax</data>
28+
<data key="k3">node</data>
29+
</node>
30+
<node id="single_sentence/zossen#n2">
31+
<data key="k0">S</data>
32+
<data key="k2">syntax</data>
33+
<data key="k3">node</data>
34+
</node>
35+
<node id="single_sentence/zossen#n3">
36+
<data key="k0">NP</data>
37+
<data key="k2">syntax</data>
38+
<data key="k3">node</data>
39+
</node>
40+
<node id="single_sentence/zossen#t1">
41+
<data key="k2">default_layer</data>
42+
<data key="k3">node</data>
43+
<data key="k4">ART</data>
44+
<data key="k5">Die</data>
45+
</node>
46+
<node id="single_sentence/zossen#t2">
47+
<data key="k2">default_layer</data>
48+
<data key="k3">node</data>
49+
<data key="k4">NN</data>
50+
<data key="k5">Jugendlichen</data>
51+
<data key="k6"> </data>
52+
</node>
53+
<node id="single_sentence/zossen#n4">
54+
<data key="k0">PP</data>
55+
<data key="k2">syntax</data>
56+
<data key="k3">node</data>
57+
</node>
58+
<node id="single_sentence/zossen#t3">
59+
<data key="k2">default_layer</data>
60+
<data key="k3">node</data>
61+
<data key="k4">APPR</data>
62+
<data key="k5">in</data>
63+
<data key="k6"> </data>
64+
</node>
65+
<node id="single_sentence/zossen#t4">
66+
<data key="k2">default_layer</data>
67+
<data key="k3">node</data>
68+
<data key="k4">NE</data>
69+
<data key="k5">Zossen</data>
70+
<data key="k6"> </data>
71+
</node>
72+
<node id="single_sentence/zossen#t5">
73+
<data key="k2">default_layer</data>
74+
<data key="k3">node</data>
75+
<data key="k4">VMFIN</data>
76+
<data key="k5">wollen</data>
77+
<data key="k6"> </data>
78+
</node>
79+
<node id="single_sentence/zossen#n5">
80+
<data key="k0">NP</data>
81+
<data key="k2">syntax</data>
82+
<data key="k3">node</data>
83+
</node>
84+
<node id="single_sentence/zossen#t6">
85+
<data key="k2">default_layer</data>
86+
<data key="k3">node</data>
87+
<data key="k4">ART</data>
88+
<data key="k5">ein</data>
89+
<data key="k6"> </data>
90+
</node>
91+
<node id="single_sentence/zossen#t7">
92+
<data key="k2">default_layer</data>
93+
<data key="k3">node</data>
94+
<data key="k4">NN</data>
95+
<data key="k5">Musikcafé</data>
96+
<data key="k6"> </data>
97+
</node>
98+
<node id="single_sentence/zossen#t8">
99+
<data key="k2">default_layer</data>
100+
<data key="k3">node</data>
101+
<data key="k4">$.</data>
102+
<data key="k5">.</data>
103+
<data key="k6"> </data>
104+
</node>
105+
<node id="single_sentence/zossen#newToken">
106+
<data key="k3">node</data>
107+
<data key="k5"></data>
108+
</node>
109+
<edge id="e0" source="single_sentence/zossen#n1" target="single_sentence/zossen#n2" label="Dominance/syntax/">
110+
</edge>
111+
<edge id="e1" source="single_sentence/zossen#n1" target="single_sentence/zossen#t8" label="Dominance/syntax/">
112+
</edge>
113+
<edge id="e2" source="single_sentence/zossen#n2" target="single_sentence/zossen#n3" label="Dominance/syntax/">
114+
</edge>
115+
<edge id="e3" source="single_sentence/zossen#n2" target="single_sentence/zossen#t5" label="Dominance/syntax/">
116+
</edge>
117+
<edge id="e4" source="single_sentence/zossen#n2" target="single_sentence/zossen#n5" label="Dominance/syntax/">
118+
</edge>
119+
<edge id="e5" source="single_sentence/zossen#n3" target="single_sentence/zossen#t1" label="Dominance/syntax/">
120+
</edge>
121+
<edge id="e6" source="single_sentence/zossen#n3" target="single_sentence/zossen#t2" label="Dominance/syntax/">
122+
</edge>
123+
<edge id="e7" source="single_sentence/zossen#n3" target="single_sentence/zossen#n4" label="Dominance/syntax/">
124+
</edge>
125+
<edge id="e8" source="single_sentence/zossen#n4" target="single_sentence/zossen#t3" label="Dominance/syntax/">
126+
</edge>
127+
<edge id="e9" source="single_sentence/zossen#n4" target="single_sentence/zossen#t4" label="Dominance/syntax/">
128+
</edge>
129+
<edge id="e10" source="single_sentence/zossen#n5" target="single_sentence/zossen#t6" label="Dominance/syntax/">
130+
</edge>
131+
<edge id="e11" source="single_sentence/zossen#n5" target="single_sentence/zossen#t7" label="Dominance/syntax/">
132+
</edge>
133+
<edge id="e12" source="single_sentence/zossen#n1" target="single_sentence/zossen#n2" label="Dominance/syntax/edge">
134+
</edge>
135+
<edge id="e13" source="single_sentence/zossen#n1" target="single_sentence/zossen#t8" label="Dominance/syntax/edge">
136+
</edge>
137+
<edge id="e14" source="single_sentence/zossen#n2" target="single_sentence/zossen#n3" label="Dominance/syntax/edge">
138+
</edge>
139+
<edge id="e15" source="single_sentence/zossen#n2" target="single_sentence/zossen#t5" label="Dominance/syntax/edge">
140+
</edge>
141+
<edge id="e16" source="single_sentence/zossen#n2" target="single_sentence/zossen#n5" label="Dominance/syntax/edge">
142+
</edge>
143+
<edge id="e17" source="single_sentence/zossen#n3" target="single_sentence/zossen#t1" label="Dominance/syntax/edge">
144+
</edge>
145+
<edge id="e18" source="single_sentence/zossen#n3" target="single_sentence/zossen#t2" label="Dominance/syntax/edge">
146+
</edge>
147+
<edge id="e19" source="single_sentence/zossen#n3" target="single_sentence/zossen#n4" label="Dominance/syntax/edge">
148+
</edge>
149+
<edge id="e20" source="single_sentence/zossen#n4" target="single_sentence/zossen#t3" label="Dominance/syntax/edge">
150+
</edge>
151+
<edge id="e21" source="single_sentence/zossen#n4" target="single_sentence/zossen#t4" label="Dominance/syntax/edge">
152+
</edge>
153+
<edge id="e22" source="single_sentence/zossen#n5" target="single_sentence/zossen#t6" label="Dominance/syntax/edge">
154+
</edge>
155+
<edge id="e23" source="single_sentence/zossen#n5" target="single_sentence/zossen#t7" label="Dominance/syntax/edge">
156+
</edge>
157+
<edge id="e24" source="single_sentence/zossen#t1" target="single_sentence/zossen#t2" label="Ordering/annis/">
158+
</edge>
159+
<edge id="e25" source="single_sentence/zossen#t2" target="single_sentence/zossen#t3" label="Ordering/annis/">
160+
</edge>
161+
<edge id="e26" source="single_sentence/zossen#t3" target="single_sentence/zossen#t4" label="Ordering/annis/">
162+
</edge>
163+
<edge id="e27" source="single_sentence/zossen#t4" target="single_sentence/zossen#newToken" label="Ordering/annis/">
164+
</edge>
165+
<edge id="e28" source="single_sentence/zossen#t5" target="single_sentence/zossen#t6" label="Ordering/annis/">
166+
</edge>
167+
<edge id="e29" source="single_sentence/zossen#t6" target="single_sentence/zossen#t7" label="Ordering/annis/">
168+
</edge>
169+
<edge id="e30" source="single_sentence/zossen#t7" target="single_sentence/zossen#t8" label="Ordering/annis/">
170+
</edge>
171+
<edge id="e31" source="single_sentence/zossen#newToken" target="single_sentence/zossen#t5" label="Ordering/annis/">
172+
</edge>
173+
<edge id="e32" source="single_sentence/zossen" target="single_sentence" label="PartOf/annis/">
174+
</edge>
175+
<edge id="e33" source="single_sentence/zossen#text" target="single_sentence/zossen" label="PartOf/annis/">
176+
</edge>
177+
<edge id="e34" source="single_sentence/zossen#n1" target="single_sentence/zossen#text" label="PartOf/annis/">
178+
</edge>
179+
<edge id="e35" source="single_sentence/zossen#n2" target="single_sentence/zossen#text" label="PartOf/annis/">
180+
</edge>
181+
<edge id="e36" source="single_sentence/zossen#n3" target="single_sentence/zossen#text" label="PartOf/annis/">
182+
</edge>
183+
<edge id="e37" source="single_sentence/zossen#t1" target="single_sentence/zossen#text" label="PartOf/annis/">
184+
</edge>
185+
<edge id="e38" source="single_sentence/zossen#t2" target="single_sentence/zossen#text" label="PartOf/annis/">
186+
</edge>
187+
<edge id="e39" source="single_sentence/zossen#n4" target="single_sentence/zossen#text" label="PartOf/annis/">
188+
</edge>
189+
<edge id="e40" source="single_sentence/zossen#t3" target="single_sentence/zossen#text" label="PartOf/annis/">
190+
</edge>
191+
<edge id="e41" source="single_sentence/zossen#t4" target="single_sentence/zossen#text" label="PartOf/annis/">
192+
</edge>
193+
<edge id="e42" source="single_sentence/zossen#t5" target="single_sentence/zossen#text" label="PartOf/annis/">
194+
</edge>
195+
<edge id="e43" source="single_sentence/zossen#n5" target="single_sentence/zossen#text" label="PartOf/annis/">
196+
</edge>
197+
<edge id="e44" source="single_sentence/zossen#t6" target="single_sentence/zossen#text" label="PartOf/annis/">
198+
</edge>
199+
<edge id="e45" source="single_sentence/zossen#t7" target="single_sentence/zossen#text" label="PartOf/annis/">
200+
</edge>
201+
<edge id="e46" source="single_sentence/zossen#t8" target="single_sentence/zossen#text" label="PartOf/annis/">
202+
</edge>
203+
<edge id="e47" source="single_sentence/zossen#newToken" target="single_sentence/zossen#text" label="PartOf/annis/">
204+
</edge>
205+
</graph>
206+
</graphml>

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,21 +285,21 @@ fn add_token_to_single_sentence() {
285285
let mut updates = GraphUpdate::new();
286286
updates
287287
.add_event(UpdateEvent::AddNode {
288-
node_name: "single_sentence/zossen#tok9".into(),
288+
node_name: "single_sentence/zossen#newToken".into(),
289289
node_type: "node".into(),
290290
})
291291
.unwrap();
292292
updates
293293
.add_event(UpdateEvent::AddNodeLabel {
294-
node_name: "single_sentence/zossen#tok9".into(),
294+
node_name: "single_sentence/zossen#newToken".into(),
295295
anno_ns: "annis".into(),
296296
anno_name: "tok".into(),
297297
anno_value: "".into(),
298298
})
299299
.unwrap();
300300
updates
301301
.add_event(UpdateEvent::AddEdge {
302-
source_node: "single_sentence/zossen#tok9".into(),
302+
source_node: "single_sentence/zossen#newToken".into(),
303303
target_node: "single_sentence/zossen#text".into(),
304304
layer: "annis".into(),
305305
component_type: "PartOf".into(),
@@ -318,15 +318,15 @@ fn add_token_to_single_sentence() {
318318
updates
319319
.add_event(UpdateEvent::AddEdge {
320320
source_node: "single_sentence/zossen#t4".into(),
321-
target_node: "single_sentence/zossen#tok9".into(),
321+
target_node: "single_sentence/zossen#newToken".into(),
322322
layer: "annis".into(),
323323
component_type: "Ordering".into(),
324324
component_name: "".into(),
325325
})
326326
.unwrap();
327327
updates
328328
.add_event(UpdateEvent::AddEdge {
329-
source_node: "single_sentence/zossen#tok9".into(),
329+
source_node: "single_sentence/zossen#newToken".into(),
330330
target_node: "single_sentence/zossen#t5".into(),
331331
layer: "annis".into(),
332332
component_type: "Ordering".into(),

0 commit comments

Comments
 (0)