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  }