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