def build()

in spark-doris-connector/spark-doris-connector-spark-3.4/src/main/scala/org/apache/doris/spark/read/expression/V2ExpressionBuilder.scala [27:79]


  def build(predicate: Expression): String = {
    predicate match {
      case and: And => s"(${build(and.left())} AND ${build(and.right())})"
      case or: Or => s"(${build(or.left())} OR ${build(or.right())})"
      case not: Not =>
        not.child().name() match {
          case "IS_NULL" => build(new GeneralScalarExpression("IS_NOT_NULL", not.children()(0).children()))
          case "=" => build(new GeneralScalarExpression("!=", not.children()(0).children()))
          case _ => s"NOT (${build(not.child())})"
        }
      case _: AlwaysTrue => "1=1"
      case _: AlwaysFalse => "1=0"
      case expr: Expression =>
        expr match {
          case literal: Literal[_] => visitLiteral(literal)
          case namedRef: NamedReference => namedRef.toString
          case e: GeneralScalarExpression => e.name() match {
            case "IN" =>
              val expressions = e.children()
              if (expressions.nonEmpty && expressions.length <= inValueLengthLimit) {
                s"""`${build(expressions(0))}` IN (${expressions.slice(1, expressions.length).map(build).mkString(",")})"""
              } else null
            case "IS_NULL" => s"`${build(e.children()(0))}` IS NULL"
            case "IS_NOT_NULL" => s"`${build(e.children()(0))}` IS NOT NULL"
            case "STARTS_WITH" => visitStartWith(build(e.children()(0)), build(e.children()(1)));
            case "ENDS_WITH" => visitEndWith(build(e.children()(0)), build(e.children()(1)));
            case "CONTAINS" => visitContains(build(e.children()(0)), build(e.children()(1)));
            case "=" => s"`${build(e.children()(0))}` = ${build(e.children()(1))}"
            case "!=" | "<>" => s"`${build(e.children()(0))}` != ${build(e.children()(1))}"
            case "<" => s"`${build(e.children()(0))}` < ${build(e.children()(1))}"
            case "<=" => s"`${build(e.children()(0))}` <= ${build(e.children()(1))}"
            case ">" => s"`${build(e.children()(0))}` > ${build(e.children()(1))}"
            case ">=" => s"`${build(e.children()(0))}` >= ${build(e.children()(1))}"
            case "CASE_WHEN" =>
              val fragment = new StringBuilder("CASE ")
              val expressions = e.children()

              for(i<- 0 until expressions.size - 1 by 2){
                fragment.append(s" WHEN ${build(expressions(i))} THEN ${build(expressions(i+1))} ")
              }

              if (expressions.length % 2 != 0) {
                val last = expressions(expressions.length - 1)
                fragment.append(s" ELSE ${build(last)} ")
              }
              fragment.append(" END")

              fragment.mkString
            case _ => null
          }
        }
    }
  }