50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
|
package pilorama
|
||
|
|
||
|
import "bytes"
|
||
|
|
||
|
// MultiNode represents a group of internal nodes accessible by the same path, but having different id.
|
||
|
type MultiNode []Node
|
||
|
|
||
|
// MultiNodeInfo represents a group of internal nodes accessible by the same path, but having different id.
|
||
|
type MultiNodeInfo struct {
|
||
|
Children MultiNode
|
||
|
Parents MultiNode
|
||
|
Timestamps []uint64
|
||
|
Meta []KeyValue
|
||
|
}
|
||
|
|
||
|
func (r *MultiNodeInfo) Add(info NodeInfo) bool {
|
||
|
if !isInternal(info.Meta.Items) || !isInternal(r.Meta) ||
|
||
|
!bytes.Equal(r.Meta[0].Value, info.Meta.Items[0].Value) {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
r.Children = append(r.Children, info.ID)
|
||
|
r.Parents = append(r.Parents, info.ParentID)
|
||
|
r.Timestamps = append(r.Timestamps, info.Meta.Time)
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func (n NodeInfo) ToMultiNode() MultiNodeInfo {
|
||
|
return MultiNodeInfo{
|
||
|
Children: MultiNode{n.ID},
|
||
|
Parents: MultiNode{n.ParentID},
|
||
|
Timestamps: []uint64{n.Meta.Time},
|
||
|
Meta: n.Meta.Items,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func isInternal(m []KeyValue) bool {
|
||
|
return len(m) == 1 && m[0].Key == AttributeFilename
|
||
|
}
|
||
|
|
||
|
func mergeNodeInfos(ns []NodeInfo) []MultiNodeInfo {
|
||
|
var r []MultiNodeInfo
|
||
|
for _, info := range ns {
|
||
|
if len(r) == 0 || !r[len(r)-1].Add(info) {
|
||
|
r = append(r, info.ToMultiNode())
|
||
|
}
|
||
|
}
|
||
|
return r
|
||
|
}
|