|
|
|
@ -1,5 +1,10 @@ |
|
|
|
|
package main |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
Frequency is a custom unit to represent the time intervals that snapshots are taken in. |
|
|
|
|
*/ |
|
|
|
@ -11,3 +16,83 @@ const weekly frequency = 2 |
|
|
|
|
const daily frequency = 3 |
|
|
|
|
const hourly frequency = 4 |
|
|
|
|
const frequent frequency = 5 |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
A snapshotTreeNode is a node in the tree representation of snapshots. |
|
|
|
|
*/ |
|
|
|
|
type snapshotTreeNode struct { |
|
|
|
|
Data Snapshot |
|
|
|
|
Before []snapshotTreeNode |
|
|
|
|
After []snapshotTreeNode |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
addSnapshot adds a snapshot into a tree |
|
|
|
|
*/ |
|
|
|
|
func (node *snapshotTreeNode) addSnapshot(s Snapshot) (err error) { |
|
|
|
|
var tempNode snapshotTreeNode = snapshotTreeNode{Data: s} |
|
|
|
|
if node == nil { |
|
|
|
|
node = &tempNode |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
if node.frequency() > s.frequency() { |
|
|
|
|
return fmt.Errorf("%s from a longer interval than %s", node.Data.String(), s.String()) |
|
|
|
|
} |
|
|
|
|
if node.frequency() == s.frequency() { |
|
|
|
|
return fmt.Errorf("%s is from the same interval as %s", node.Data.String(), s.String()) |
|
|
|
|
} |
|
|
|
|
if node.frequency() < s.frequency() { |
|
|
|
|
if node.frequency()+1 == s.frequency() { |
|
|
|
|
if node.Data.TimeStamp.After(s.TimeStamp) { |
|
|
|
|
if node.Before == nil { |
|
|
|
|
node.Before = append(node.Before, tempNode) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
var tSlice []snapshotTreeNode |
|
|
|
|
for index := 0; index < len(node.Before); index++ { |
|
|
|
|
if node.Before[index].Data.TimeStamp.Before(s.TimeStamp) { |
|
|
|
|
tSlice = append(tSlice, tempNode) |
|
|
|
|
copy(tSlice, node.Before[index:]) |
|
|
|
|
break |
|
|
|
|
} else { |
|
|
|
|
tSlice = append(tSlice, node.Before[index]) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
node.Before = tSlice |
|
|
|
|
} |
|
|
|
|
if node.Data.TimeStamp.Before(s.TimeStamp) { |
|
|
|
|
if node.After == nil { |
|
|
|
|
node.After = append(node.After, tempNode) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
var tSlice []snapshotTreeNode |
|
|
|
|
for index := 0; index < len(node.After); index++ { |
|
|
|
|
if node.After[index].Data.TimeStamp.Before(s.TimeStamp) { |
|
|
|
|
tSlice = append(tSlice, tempNode) |
|
|
|
|
copy(tSlice, node.After[index:]) |
|
|
|
|
break |
|
|
|
|
} else { |
|
|
|
|
tSlice = append(tSlice, node.After[index]) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
node.After = tSlice |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if node.Data.TimeStamp.After(s.TimeStamp) { |
|
|
|
|
for index := 0; index < len(node.Before); index++ { |
|
|
|
|
node.Before[index].Data.TimeStamp.Before(s.TimeStamp) |
|
|
|
|
node.Before[index].addSnapshot(s) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return errors.New("Non implemented branch in func (node * snapshotTreeNode) addSnapshot(s Snapshot)") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
The frequency of this snapshot's interval in the tree? |
|
|
|
|
*/ |
|
|
|
|
func (node snapshotTreeNode) frequency() frequency { |
|
|
|
|
return node.Data.Interval |
|
|
|
|
} |
|
|
|
|