in src/spark-project/sparder/src/main/scala/org/apache/spark/sql/catalyst/expressions/gluten/KapExpressionTransformer.scala [54:152]
def expressionSigList: Seq[Sig] = Seq(
Sig[FloorDateTime]("date_trunc"),
Sig[CeilDateTime]("ceil_datetime"),
Sig[KapAddMonths]("kap_add_months"),
Sig[KapSubtractMonths]("kap_months_between"),
Sig[YMDintBetween]("kap_ymd_int_between"),
Sig[Truncate]("truncate"),
Sig[KylinSplitPart]("kylin_split_part"),
Sig[KylinInstr]("kylin_instr"),
Sig[PreciseCardinality]("ke_bitmap_cardinality"),
Sig[PreciseCountDistinctDecode]("ke_bitmap_cardinality"),
Sig[ReusePreciseCountDistinct]("ke_bitmap_or_data"),
Sig[PreciseCountDistinctAndValue]("ke_bitmap_and_value"),
Sig[PreciseCountDistinctAndArray]("ke_bitmap_and_ids"),
Sig[PreciseCountDistinct]("ke_bitmap_or_cardinality"),
Sig[KylinTimestampAdd]("kylin_timestamp_add"),
Sig[Sum0]("sum0")
)
/** Replace extension expression to transformer. */
override def replaceWithExtensionExpressionTransformer(substraitExprName: String,
expr: Expression,
attributeSeq: Seq[Attribute]): ExpressionTransformer = expr match {
case preciseCardinality: PreciseCardinality =>
new KeBitmapFunctionTransformer(
substraitExprName,
ExpressionConverter
.replaceWithExpressionTransformer(preciseCardinality.child, attributeSeq),
preciseCardinality
)
case preciseCountDistinctDecode: PreciseCountDistinctDecode =>
new KeBitmapFunctionTransformer(
substraitExprName,
ExpressionConverter
.replaceWithExpressionTransformer(preciseCountDistinctDecode.child, attributeSeq),
preciseCountDistinctDecode
)
case kylinTimestampAdd: KylinTimestampAdd =>
new TimestampAddTransformer(
ExpressionConverter
.replaceWithExpressionTransformer(kylinTimestampAdd.left, attributeSeq),
ExpressionConverter
.replaceWithExpressionTransformer(kylinTimestampAdd.mid, attributeSeq),
ExpressionConverter
.replaceWithExpressionTransformer(kylinTimestampAdd.right, attributeSeq),
kylinTimestampAdd
)
case ceilDateTime: CeilDateTime =>
val floorTime = FloorDateTime(ceilDateTime.left, ceilDateTime.right, ceilDateTime.timeZoneId)
val floorAddUnitTime = KylinTimestampAdd(ceilDateTime.right, Literal(1L), floorTime)
val equalsExp = If(EqualTo(ceilDateTime.left, floorTime), floorTime, floorAddUnitTime)
ExpressionConverter.replaceWithExpressionTransformer(equalsExp, attributeSeq)
case floorDateTime: FloorDateTime =>
new FloorDateTimeTransformer(
ExpressionConverter.replaceWithExpressionTransformer(floorDateTime.left, attributeSeq),
ExpressionConverter.replaceWithExpressionTransformer(floorDateTime.right, attributeSeq),
floorDateTime
)
case kylinSplitPart: KylinSplitPart if kylinSplitPart.second.isInstanceOf[Literal] =>
new GenericExpressionTransformer(
substraitExprName,
Seq(
ExpressionConverter.replaceWithExpressionTransformer(kylinSplitPart.first, attributeSeq),
LiteralTransformer(kylinSplitPart.second.asInstanceOf[Literal]),
ExpressionConverter.replaceWithExpressionTransformer(kylinSplitPart.third, attributeSeq)
),
kylinSplitPart
)
case kylinInstr: KylinInstr =>
val stringLocate = StringLocate(kylinInstr.second, kylinInstr.first, kylinInstr.third)
ExpressionConverter.replaceWithExpressionTransformer(stringLocate, attributeSeq)
case kapAddMonths: KapAddMonths =>
val addMonths = KylinTimestampAdd(Literal("month"), kapAddMonths.right, kapAddMonths.left)
val equalsExp = If(EqualTo(kapAddMonths.left, LastDay(kapAddMonths.left)), LastDay(addMonths), addMonths)
ExpressionConverter.replaceWithExpressionTransformer(equalsExp, attributeSeq)
case kapSubtractMonths: KapSubtractMonths =>
GenericExpressionTransformer("kap_months_between",
Seq(
ExpressionConverter.replaceWithExpressionTransformer(kapSubtractMonths.right, attributeSeq),
ExpressionConverter.replaceWithExpressionTransformer(kapSubtractMonths.left, attributeSeq)),
kapSubtractMonths)
case kapYmdIntBetween: YMDintBetween =>
GenericExpressionTransformer("kap_ymd_int_between",
Seq(
ExpressionConverter.replaceWithExpressionTransformer(kapYmdIntBetween.left, attributeSeq),
ExpressionConverter.replaceWithExpressionTransformer(kapYmdIntBetween.right, attributeSeq)),
kapYmdIntBetween)
case truncate: Truncate =>
GenericExpressionTransformer(
"truncate",
Seq(
ExpressionConverter.replaceWithExpressionTransformer(truncate.left, attributeSeq),
ExpressionConverter.replaceWithExpressionTransformer(truncate.right, attributeSeq)),
truncate)
case _ =>
throw new UnsupportedOperationException(
s"${expr.getClass} or $expr is not currently supported.")
}