in paimon-codegen/src/main/scala/org/apache/paimon/codegen/GenerateUtils.scala [111:183]
def generateCompare(
ctx: CodeGeneratorContext,
t: DataType,
nullsIsLast: Boolean,
leftTerm: String,
rightTerm: String): String = t.getTypeRoot match {
// ordered by type root definition
case CHAR | VARCHAR | DECIMAL | TIMESTAMP_WITHOUT_TIME_ZONE | TIMESTAMP_WITH_LOCAL_TIME_ZONE =>
s"$leftTerm.compareTo($rightTerm)"
case BOOLEAN =>
s"($leftTerm == $rightTerm ? 0 : ($leftTerm ? 1 : -1))"
case BINARY | VARBINARY =>
val sortUtil =
classOf[org.apache.paimon.utils.SortUtil].getCanonicalName
s"$sortUtil.compareBinary($leftTerm, $rightTerm)"
case TINYINT | SMALLINT | INTEGER | BIGINT | FLOAT | DOUBLE | DATE | TIME_WITHOUT_TIME_ZONE =>
s"($leftTerm > $rightTerm ? 1 : $leftTerm < $rightTerm ? -1 : 0)"
case ARRAY =>
val at = t.asInstanceOf[ArrayType]
val compareFunc = newName("compareArray")
val compareCode = generateArrayCompare(ctx, nullsIsLast = false, at, "a", "b")
val funcCode: String =
s"""
public int $compareFunc($ARRAY_DATA a, $ARRAY_DATA b) {
$compareCode
return 0;
}
"""
ctx.addReusableMember(funcCode)
s"$compareFunc($leftTerm, $rightTerm)"
case MAP =>
val at = t.asInstanceOf[MapType]
val compareFunc = newName("compareMap")
val compareCode = generateMapCompare(ctx, nullsIsLast = false, at, "a", "b")
val funcCode: String =
s"""
public int $compareFunc($MAP_DATA a, $MAP_DATA b) {
$compareCode
return 0;
}
"""
ctx.addReusableMember(funcCode)
s"$compareFunc($leftTerm, $rightTerm)"
case MULTISET =>
val at = t.asInstanceOf[MultisetType]
val compareFunc = newName("compareMultiset")
val compareCode = generateMultisetCompare(ctx, nullsIsLast = false, at, "a", "b")
val funcCode: String =
s"""
public int $compareFunc($MAP_DATA a, $MAP_DATA b) {
$compareCode
return 0;
}
"""
ctx.addReusableMember(funcCode)
s"$compareFunc($leftTerm, $rightTerm)"
case ROW =>
val fieldCount = getFieldCount(t)
val comparisons =
generateRowCompare(ctx, t, getAscendingSortSpec((0 until fieldCount).toArray), "a", "b")
val compareFunc = newName("compareRow")
val funcCode: String =
s"""
public int $compareFunc($ROW_DATA a, $ROW_DATA b) {
$comparisons
return 0;
}
"""
ctx.addReusableMember(funcCode)
s"$compareFunc($leftTerm, $rightTerm)"
case _ =>
throw new IllegalArgumentException("Illegal type: " + t)
}