github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/metastore/partition_collection.go (about) 1 package metastore 2 3 import ( 4 "fmt" 5 6 mserrors "github.com/treeverse/lakefs/pkg/metastore/errors" 7 ) 8 9 type PartitionCollection struct { 10 partitions []*Partition 11 } 12 13 func NewPartitionCollection(partitions []*Partition) *PartitionCollection { 14 return &PartitionCollection{partitions: partitions} 15 } 16 17 func (p *PartitionCollection) Name(i int) string { 18 return p.partitions[i].Name() 19 } 20 21 func (p *PartitionCollection) Len() int { 22 return len(p.partitions) 23 } 24 25 func (p *PartitionCollection) Less(i, j int) bool { 26 return comparePartitions(p.partitions[i], p.partitions[j]) == ItemLess 27 } 28 29 func (p *PartitionCollection) Swap(i, j int) { 30 p.partitions[i], p.partitions[j] = p.partitions[j], p.partitions[i] 31 } 32 33 func (p *PartitionCollection) Value(i int) interface{} { 34 return p.partitions[i] 35 } 36 37 func (p *PartitionCollection) CompareWith(i int, v interface{}, j int) CompareResult { 38 if otherIter, ok := v.(*PartitionCollection); ok { 39 return comparePartitions(p.partitions[i], otherIter.partitions[j]) 40 } 41 err := fmt.Errorf("%w *PartitionCollection, got %T", mserrors.ErrExpectedType, v) 42 panic(err) 43 } 44 45 func partitionValueEqual(partitionA, partitionB *Partition) bool { 46 if partitionA.Sd == nil && partitionB.Sd == nil { 47 return true 48 } 49 if partitionA.Sd == nil || partitionB.Sd == nil { 50 return false 51 } 52 return partitionA.LastAccessTime == partitionB.LastAccessTime && len(partitionA.Sd.Cols) == len(partitionB.Sd.Cols) 53 } 54 55 func comparePartitions(partitionA, partitionB *Partition) CompareResult { 56 nameA, nameB := partitionA.Name(), partitionB.Name() 57 if nameA < nameB { 58 return ItemLess 59 } 60 if nameA > nameB { 61 return ItemGreater 62 } 63 if partitionValueEqual(partitionA, partitionB) { 64 return ItemSame 65 } 66 return ItemSameKey 67 }