forked from TrueCloudLab/frostfs-node
49 lines
1.2 KiB
Go
49 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
|
|
}
|