You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by rx...@apache.org on 2015/07/20 18:35:47 UTC
spark git commit: [SPARK-9153][SQL] codegen StringLPad/StringRPad
Repository: spark
Updated Branches:
refs/heads/master d0b4e93f7 -> 5112b7f58
[SPARK-9153][SQL] codegen StringLPad/StringRPad
Jira: https://issues.apache.org/jira/browse/SPARK-9153
Author: Tarek Auel <ta...@googlemail.com>
Closes #7527 from tarekauel/SPARK-9153 and squashes the following commits:
3840c6b [Tarek Auel] [SPARK-9153] removed codegen fallback
92b6a5d [Tarek Auel] [SPARK-9153] codegen lpad/rpad
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/5112b7f5
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/5112b7f5
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/5112b7f5
Branch: refs/heads/master
Commit: 5112b7f58b9b8031ff79b9184dafe12b71ba1f79
Parents: d0b4e93
Author: Tarek Auel <ta...@googlemail.com>
Authored: Mon Jul 20 09:35:45 2015 -0700
Committer: Reynold Xin <rx...@databricks.com>
Committed: Mon Jul 20 09:35:45 2015 -0700
----------------------------------------------------------------------
.../catalyst/expressions/stringOperations.scala | 54 +++++++++++++++++++-
.../expressions/StringExpressionsSuite.scala | 6 +++
2 files changed, 58 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/5112b7f5/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringOperations.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringOperations.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringOperations.scala
index 5f8ac71..6608036 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringOperations.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringOperations.scala
@@ -401,7 +401,7 @@ case class StringLocate(substr: Expression, str: Expression, start: Expression)
* Returns str, left-padded with pad to a length of len.
*/
case class StringLPad(str: Expression, len: Expression, pad: Expression)
- extends Expression with ImplicitCastInputTypes with CodegenFallback {
+ extends Expression with ImplicitCastInputTypes {
override def children: Seq[Expression] = str :: len :: pad :: Nil
override def foldable: Boolean = children.forall(_.foldable)
@@ -432,6 +432,31 @@ case class StringLPad(str: Expression, len: Expression, pad: Expression)
}
}
+ override protected def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
+ val lenGen = len.gen(ctx)
+ val strGen = str.gen(ctx)
+ val padGen = pad.gen(ctx)
+
+ s"""
+ ${lenGen.code}
+ boolean ${ev.isNull} = ${lenGen.isNull};
+ ${ctx.javaType(dataType)} ${ev.primitive} = ${ctx.defaultValue(dataType)};
+ if (!${ev.isNull}) {
+ ${strGen.code}
+ if (!${strGen.isNull}) {
+ ${padGen.code}
+ if (!${padGen.isNull}) {
+ ${ev.primitive} = ${strGen.primitive}.lpad(${lenGen.primitive}, ${padGen.primitive});
+ } else {
+ ${ev.isNull} = true;
+ }
+ } else {
+ ${ev.isNull} = true;
+ }
+ }
+ """
+ }
+
override def prettyName: String = "lpad"
}
@@ -439,7 +464,7 @@ case class StringLPad(str: Expression, len: Expression, pad: Expression)
* Returns str, right-padded with pad to a length of len.
*/
case class StringRPad(str: Expression, len: Expression, pad: Expression)
- extends Expression with ImplicitCastInputTypes with CodegenFallback {
+ extends Expression with ImplicitCastInputTypes {
override def children: Seq[Expression] = str :: len :: pad :: Nil
override def foldable: Boolean = children.forall(_.foldable)
@@ -470,6 +495,31 @@ case class StringRPad(str: Expression, len: Expression, pad: Expression)
}
}
+ override protected def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
+ val lenGen = len.gen(ctx)
+ val strGen = str.gen(ctx)
+ val padGen = pad.gen(ctx)
+
+ s"""
+ ${lenGen.code}
+ boolean ${ev.isNull} = ${lenGen.isNull};
+ ${ctx.javaType(dataType)} ${ev.primitive} = ${ctx.defaultValue(dataType)};
+ if (!${ev.isNull}) {
+ ${strGen.code}
+ if (!${strGen.isNull}) {
+ ${padGen.code}
+ if (!${padGen.isNull}) {
+ ${ev.primitive} = ${strGen.primitive}.rpad(${lenGen.primitive}, ${padGen.primitive});
+ } else {
+ ${ev.isNull} = true;
+ }
+ } else {
+ ${ev.isNull} = true;
+ }
+ }
+ """
+ }
+
override def prettyName: String = "rpad"
}
http://git-wip-us.apache.org/repos/asf/spark/blob/5112b7f5/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/StringExpressionsSuite.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/StringExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/StringExpressionsSuite.scala
index 96f433b..d573122 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/StringExpressionsSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/StringExpressionsSuite.scala
@@ -413,18 +413,24 @@ class StringExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper {
val row1 = create_row("hi", 5, "??")
val row2 = create_row("hi", 1, "?")
val row3 = create_row(null, 1, "?")
+ val row4 = create_row("hi", null, "?")
+ val row5 = create_row("hi", 1, null)
checkEvaluation(StringLPad(Literal("hi"), Literal(5), Literal("??")), "???hi", row1)
checkEvaluation(StringLPad(Literal("hi"), Literal(1), Literal("??")), "h", row1)
checkEvaluation(StringLPad(s1, s2, s3), "???hi", row1)
checkEvaluation(StringLPad(s1, s2, s3), "h", row2)
checkEvaluation(StringLPad(s1, s2, s3), null, row3)
+ checkEvaluation(StringLPad(s1, s2, s3), null, row4)
+ checkEvaluation(StringLPad(s1, s2, s3), null, row5)
checkEvaluation(StringRPad(Literal("hi"), Literal(5), Literal("??")), "hi???", row1)
checkEvaluation(StringRPad(Literal("hi"), Literal(1), Literal("??")), "h", row1)
checkEvaluation(StringRPad(s1, s2, s3), "hi???", row1)
checkEvaluation(StringRPad(s1, s2, s3), "h", row2)
checkEvaluation(StringRPad(s1, s2, s3), null, row3)
+ checkEvaluation(StringRPad(s1, s2, s3), null, row4)
+ checkEvaluation(StringRPad(s1, s2, s3), null, row5)
}
test("REPEAT") {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org