github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/metastore/column_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 ColumnCollection struct { 10 columns []*FieldSchema 11 } 12 13 func (c *ColumnCollection) Name(i int) string { 14 return c.columns[i].Name 15 } 16 17 func (c *ColumnCollection) Len() int { 18 return len(c.columns) 19 } 20 21 func (c *ColumnCollection) Less(i, j int) bool { 22 return compareColumns(c.columns[i], c.columns[j]) == ItemLess 23 } 24 25 func (c *ColumnCollection) Swap(i, j int) { 26 c.columns[i], c.columns[j] = c.columns[j], c.columns[i] 27 } 28 29 func (c *ColumnCollection) Value(i int) interface{} { 30 return c.columns[i] 31 } 32 33 func (c *ColumnCollection) CompareWith(i int, v interface{}, j int) CompareResult { 34 if otherIter, ok := v.(*ColumnCollection); ok { 35 return compareColumns(c.columns[i], otherIter.columns[j]) 36 } 37 err := fmt.Errorf("%w ColumnCollection, got %T", mserrors.ErrExpectedType, v) 38 panic(err) 39 } 40 41 func compareColumns(columnA, columnB *FieldSchema) CompareResult { 42 nameA, nameB := columnA.Name, columnB.Name 43 if nameA < nameB { 44 return ItemLess 45 } 46 if nameA > nameB { 47 return ItemGreater 48 } 49 if columnA.Type == columnB.Type && columnA.Comment == columnB.Comment { 50 return ItemSame 51 } 52 return ItemSameKey 53 } 54 55 func NewColumnCollection(columns []*FieldSchema) *ColumnCollection { 56 return &ColumnCollection{ 57 columns: columns, 58 } 59 }