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  }