in cassandra-analytics-common/src/main/java/org/apache/cassandra/spark/utils/ComparisonUtils.java [129:202]
public static boolean equals(Object first, Object second)
{
if (first instanceof UUID && second instanceof String) // Spark does not support UUID. We compare the string values.
{
return first.toString().equals(second);
}
else if (first instanceof ByteBuffer && second instanceof byte[])
{
return Arrays.equals(ByteBufferUtils.getArray((ByteBuffer) first), (byte[]) second);
}
else if (first instanceof InetAddress && second instanceof byte[])
{
return Arrays.equals(((InetAddress) first).getAddress(), (byte[]) second);
}
else if (first instanceof BigInteger && second instanceof BigDecimal)
{
// Compare the string values
return first.toString().equals(second.toString());
}
else if (first instanceof Integer && second instanceof Date)
{
return first.equals((int) ((Date) second).toLocalDate().toEpochDay());
}
if (Objects.equals(first, second))
{
return true;
}
if (first instanceof BigDecimal && second instanceof BigDecimal)
{
return ((BigDecimal) first).compareTo((BigDecimal) second) == 0;
}
else if (first instanceof Collection && second instanceof Collection)
{
Object[] firstArray = ((Collection<Object>) first).toArray();
Arrays.sort(firstArray, NESTED_COMPARATOR);
Object[] secondArray = ((Collection<Object>) second).toArray();
Arrays.sort(secondArray, NESTED_COMPARATOR);
return equals(firstArray, secondArray);
}
else if (first instanceof Map && second instanceof Map)
{
Object[] firstKeys = ((Map<Object, Object>) first).keySet().toArray();
Object[] secondKeys = ((Map<Object, Object>) second).keySet().toArray();
if (firstKeys[0] instanceof Comparable)
{
Arrays.sort(firstKeys);
Arrays.sort(secondKeys);
}
else if (firstKeys[0] instanceof Inet4Address) // Inet4Address is not Comparable so do byte ordering
{
Arrays.sort(firstKeys, INET_COMPARATOR);
Arrays.sort(secondKeys, INET_COMPARATOR);
}
if (equals(firstKeys, secondKeys))
{
Object[] firstValues = new Object[firstKeys.length];
Object[] secondValues = new Object[secondKeys.length];
IntStream.range(0, firstKeys.length).forEach(position -> {
firstValues[position] = ((Map<Object, Object>) first).get(firstKeys[position]);
secondValues[position] = ((Map<Object, Object>) second).get(secondKeys[position]);
});
return equals(firstValues, secondValues);
}
return false;
}
else if (first instanceof Object[] && second instanceof Object[])
{
return equals((Object[]) first, (Object[]) second);
}
return false;
}