in paimon-codegen/src/main/scala/org/apache/paimon/codegen/ScalarOperatorGens.scala [98:166]
def generateComparison(
ctx: CodeGeneratorContext,
operator: String,
left: GeneratedExpression,
right: GeneratedExpression,
resultType: DataType): GeneratedExpression = {
generateOperatorIfNotNull(ctx, resultType, left, right) {
// either side is decimal
if (isDecimal(left.resultType) || isDecimal(right.resultType)) {
(leftTerm, rightTerm) => s"$leftTerm.compareTo($rightTerm) $operator 0"
}
// both sides are numeric
else if (isNumeric(left.resultType) && isNumeric(right.resultType)) {
(leftTerm, rightTerm) => s"$leftTerm $operator $rightTerm"
}
// both sides are timestamp
else if (isTimestamp(left.resultType) && isTimestamp(right.resultType)) {
(leftTerm, rightTerm) => s"$leftTerm.compareTo($rightTerm) $operator 0"
}
// both sides are timestamp with local zone
else if (
isTimestampWithLocalZone(left.resultType) &&
isTimestampWithLocalZone(right.resultType)
) { (leftTerm, rightTerm) => s"$leftTerm.compareTo($rightTerm) $operator 0" }
// both sides are temporal of same type
else if (
isTemporal(left.resultType) &&
isInteroperable(left.resultType, right.resultType)
) { (leftTerm, rightTerm) => s"$leftTerm $operator $rightTerm" }
// both sides are boolean
else if (
isBoolean(left.resultType) &&
isInteroperable(left.resultType, right.resultType)
) {
operator match {
case "==" | "!=" => (leftTerm, rightTerm) => s"$leftTerm $operator $rightTerm"
case ">" | "<" | "<=" | ">=" =>
(leftTerm, rightTerm) => s"java.lang.Boolean.compare($leftTerm, $rightTerm) $operator 0"
case _ => throw new CodeGenException(s"Unsupported boolean comparison '$operator'.")
}
}
// both sides are binary type
else if (
isBinaryString(left.resultType) &&
isInteroperable(left.resultType, right.resultType)
) {
val utilName = classOf[InternalRowUtils].getCanonicalName
val dataTypeRootName = classOf[DataTypeRoot].getCanonicalName
(leftTerm, rightTerm) =>
s"$utilName.compare($leftTerm, $rightTerm, $dataTypeRootName.${left.resultType.getTypeRoot}) $operator 0"
}
// both sides are same comparable type
else if (
isComparable(left.resultType) &&
isInteroperable(left.resultType, right.resultType)
) {
(leftTerm, rightTerm) =>
s"(($leftTerm == null) ? (($rightTerm == null) ? 0 : -1) : (($rightTerm == null) ? " +
s"1 : ($leftTerm.compareTo($rightTerm)))) $operator 0"
} else {
throw new CodeGenException(
s"Incomparable types: ${left.resultType} and " +
s"${right.resultType}")
}
}
}