-
Notifications
You must be signed in to change notification settings - Fork 573
/
relationship.go
53 lines (45 loc) · 1.21 KB
/
relationship.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package segment
import (
"time"
)
type rel int
const (
// relationship overlap read overlap write
inside rel = iota // | S E | <1 1/1
match // matching ranges 1/1 1/1
outside // | | S E 0/1 0/1
overlap // | S | E <1 <1
contain // S | | E 1/1 <1
)
var overlapStrings map[rel]string
// TODO: I bet there's a better way
func init() {
overlapStrings = make(map[rel]string)
overlapStrings[inside] = "inside"
overlapStrings[outside] = "outside"
overlapStrings[match] = "match"
overlapStrings[overlap] = "overlap"
overlapStrings[contain] = "contain"
}
func (r rel) String() string {
return overlapStrings[r]
}
// t1, t2 represent segment node, st, et represent the read/write query time range
func relationship(t1, t2, st, et time.Time) rel {
if t1.Equal(st) && t2.Equal(et) {
return match
}
if !t1.After(st) && !t2.Before(et) {
return inside
}
if !t1.Before(st) && !t2.After(et) {
return contain
}
if !t1.After(st) && !t2.After(st) {
return outside
}
if !t1.Before(et) && !t2.Before(et) {
return outside
}
return overlap
}