in arrow/array/compare.go [462:617]
func arrayApproxEqual(left, right arrow.Array, opt equalOption) 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 arrayApproxEqualString(l, r)
case *LargeBinary:
r := right.(*LargeBinary)
return arrayEqualLargeBinary(l, r)
case *LargeString:
r := right.(*LargeString)
return arrayApproxEqualLargeString(l, r)
case *BinaryView:
r := right.(*BinaryView)
return arrayEqualBinaryView(l, r)
case *StringView:
r := right.(*StringView)
return arrayApproxEqualStringView(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 arrayApproxEqualFloat16(l, r, opt)
case *Float32:
r := right.(*Float32)
return arrayApproxEqualFloat32(l, r, opt)
case *Float64:
r := right.(*Float64)
return arrayApproxEqualFloat64(l, r, opt)
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 arrayApproxEqualList(l, r, opt)
case *LargeList:
r := right.(*LargeList)
return arrayApproxEqualLargeList(l, r, opt)
case *ListView:
r := right.(*ListView)
return arrayApproxEqualListView(l, r, opt)
case *LargeListView:
r := right.(*LargeListView)
return arrayApproxEqualLargeListView(l, r, opt)
case *FixedSizeList:
r := right.(*FixedSizeList)
return arrayApproxEqualFixedSizeList(l, r, opt)
case *Struct:
r := right.(*Struct)
return arrayApproxEqualStruct(l, r, opt)
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)
if opt.unorderedMapKeys {
return arrayApproxEqualMap(l, r, opt)
}
return arrayApproxEqualList(l.List, r.List, opt)
case *Dictionary:
r := right.(*Dictionary)
return arrayApproxEqualDict(l, r, opt)
case ExtensionArray:
r := right.(ExtensionArray)
return arrayApproxEqualExtension(l, r, opt)
case *SparseUnion:
r := right.(*SparseUnion)
return arraySparseUnionApproxEqual(l, r, opt)
case *DenseUnion:
r := right.(*DenseUnion)
return arrayDenseUnionApproxEqual(l, r, opt)
case *RunEndEncoded:
r := right.(*RunEndEncoded)
return arrayRunEndEncodedApproxEqual(l, r, opt)
default:
panic(fmt.Errorf("arrow/array: unknown array type %T", l))
}
}