def generateCompare()

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)
  }