in arrow/array/compare.go [200:352]
func Equal(left, right arrow.Array) bool {
switch {
case !baseArrayEqual(left, right):
return false
case left.Len() == 0:
return true
case left.NullN() == left.Len():
return true
}
// at this point, we know both arrays have same type, same length, same number of nulls
// and nulls at the same place.
// compare the values.
switch l := left.(type) {
case *Null:
return true
case *Boolean:
r := right.(*Boolean)
return arrayEqualBoolean(l, r)
case *FixedSizeBinary:
r := right.(*FixedSizeBinary)
return arrayEqualFixedSizeBinary(l, r)
case *Binary:
r := right.(*Binary)
return arrayEqualBinary(l, r)
case *String:
r := right.(*String)
return arrayEqualString(l, r)
case *LargeBinary:
r := right.(*LargeBinary)
return arrayEqualLargeBinary(l, r)
case *LargeString:
r := right.(*LargeString)
return arrayEqualLargeString(l, r)
case *BinaryView:
r := right.(*BinaryView)
return arrayEqualBinaryView(l, r)
case *StringView:
r := right.(*StringView)
return arrayEqualStringView(l, r)
case *Int8:
r := right.(*Int8)
return arrayEqualFixedWidth(l, r)
case *Int16:
r := right.(*Int16)
return arrayEqualFixedWidth(l, r)
case *Int32:
r := right.(*Int32)
return arrayEqualFixedWidth(l, r)
case *Int64:
r := right.(*Int64)
return arrayEqualFixedWidth(l, r)
case *Uint8:
r := right.(*Uint8)
return arrayEqualFixedWidth(l, r)
case *Uint16:
r := right.(*Uint16)
return arrayEqualFixedWidth(l, r)
case *Uint32:
r := right.(*Uint32)
return arrayEqualFixedWidth(l, r)
case *Uint64:
r := right.(*Uint64)
return arrayEqualFixedWidth(l, r)
case *Float16:
r := right.(*Float16)
return arrayEqualFixedWidth(l, r)
case *Float32:
r := right.(*Float32)
return arrayEqualFixedWidth(l, r)
case *Float64:
r := right.(*Float64)
return arrayEqualFixedWidth(l, r)
case *Decimal32:
r := right.(*Decimal32)
return arrayEqualDecimal(l, r)
case *Decimal64:
r := right.(*Decimal64)
return arrayEqualDecimal(l, r)
case *Decimal128:
r := right.(*Decimal128)
return arrayEqualDecimal(l, r)
case *Decimal256:
r := right.(*Decimal256)
return arrayEqualDecimal(l, r)
case *Date32:
r := right.(*Date32)
return arrayEqualFixedWidth(l, r)
case *Date64:
r := right.(*Date64)
return arrayEqualFixedWidth(l, r)
case *Time32:
r := right.(*Time32)
return arrayEqualFixedWidth(l, r)
case *Time64:
r := right.(*Time64)
return arrayEqualFixedWidth(l, r)
case *Timestamp:
r := right.(*Timestamp)
return arrayEqualTimestamp(l, r)
case *List:
r := right.(*List)
return arrayEqualList(l, r)
case *LargeList:
r := right.(*LargeList)
return arrayEqualLargeList(l, r)
case *ListView:
r := right.(*ListView)
return arrayEqualListView(l, r)
case *LargeListView:
r := right.(*LargeListView)
return arrayEqualLargeListView(l, r)
case *FixedSizeList:
r := right.(*FixedSizeList)
return arrayEqualFixedSizeList(l, r)
case *Struct:
r := right.(*Struct)
return arrayEqualStruct(l, r)
case *MonthInterval:
r := right.(*MonthInterval)
return arrayEqualMonthInterval(l, r)
case *DayTimeInterval:
r := right.(*DayTimeInterval)
return arrayEqualDayTimeInterval(l, r)
case *MonthDayNanoInterval:
r := right.(*MonthDayNanoInterval)
return arrayEqualMonthDayNanoInterval(l, r)
case *Duration:
r := right.(*Duration)
return arrayEqualFixedWidth(l, r)
case *Map:
r := right.(*Map)
return arrayEqualMap(l, r)
case ExtensionArray:
r := right.(ExtensionArray)
return arrayEqualExtension(l, r)
case *Dictionary:
r := right.(*Dictionary)
return arrayEqualDict(l, r)
case *SparseUnion:
r := right.(*SparseUnion)
return arraySparseUnionEqual(l, r)
case *DenseUnion:
r := right.(*DenseUnion)
return arrayDenseUnionEqual(l, r)
case *RunEndEncoded:
r := right.(*RunEndEncoded)
return arrayRunEndEncodedEqual(l, r)
default:
panic(fmt.Errorf("arrow/array: unknown array type %T", l))
}
}