You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by xc...@apache.org on 2018/08/21 01:05:51 UTC
[flink] branch master updated: [FLINK-10060] [table] Add RTRIM
function in Table API and SQL
This is an automated email from the ASF dual-hosted git repository.
xccui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new ad15d4f [FLINK-10060] [table] Add RTRIM function in Table API and SQL
ad15d4f is described below
commit ad15d4f9af87206db4bc33c08468044045351a6b
Author: yanghua <ya...@gmail.com>
AuthorDate: Tue Aug 7 17:17:11 2018 +0800
[FLINK-10060] [table] Add RTRIM function in Table API and SQL
This closes #6509.
---
docs/dev/table/functions.md | 36 ++++++++++++++++++++++
.../flink/table/api/scala/expressionDsl.scala | 5 +++
.../table/codegen/calls/FunctionGenerator.scala | 6 ++++
.../table/expressions/stringExpressions.scala | 25 +++++++++++++++
.../table/functions/sql/ScalarSqlFunctions.scala | 8 +++++
.../flink/table/validate/FunctionCatalog.scala | 2 ++
.../table/expressions/ScalarFunctionsTest.scala | 27 ++++++++++++++++
.../table/expressions/SqlExpressionTest.scala | 1 +
8 files changed, 110 insertions(+)
diff --git a/docs/dev/table/functions.md b/docs/dev/table/functions.md
index bfc6a7d..24d8d70 100644
--- a/docs/dev/table/functions.md
+++ b/docs/dev/table/functions.md
@@ -2392,6 +2392,18 @@ LTRIM(string)
<tr>
<td>
{% highlight text %}
+RTRIM(string)
+{% endhighlight %}
+ </td>
+ <td>
+ <p>Returns a string that removes the right whitespaces from <i>string</i>.</p>
+ <p>E.g., <code>RTRIM('This is a test String. ')</code> returns "This is a test String.".</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ {% highlight text %}
OVERLAY(string1 PLACING string2 FROM integer1 [ FOR integer2 ])
{% endhighlight %}
</td>
@@ -2590,6 +2602,18 @@ STRING.ltrim()
<p>E.g., <code>' This is a test String.'.ltrim()</code> returns "This is a test String.".</p>
</td>
</tr>
+
+ <tr>
+ <td>
+ {% highlight java %}
+STRING.rtrim()
+{% endhighlight %}
+ </td>
+ <td>
+ <p>Returns a string that removes the right whitespaces from <i>STRING</i>.</p>
+ <p>E.g., <code>'This is a test String. '.rtrim()</code> returns "This is a test String.".</p>
+ </td>
+ </tr>
<tr>
<td>
@@ -2797,6 +2821,18 @@ STRING.ltrim()
<tr>
<td>
{% highlight scala %}
+STRING.rtrim()
+{% endhighlight %}
+ </td>
+ <td>
+ <p>Returns a string that removes the right whitespaces from <i>STRING</i>.</p>
+ <p>E.g., <code>"This is a test String. ".rtrim()</code> returns "This is a test String.".</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ {% highlight scala %}
STRING1.overlay(STRING2, INT1)
STRING1.overlay(STRING2, INT1, INT2)
{% endhighlight %}
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
index db745d5..8b08af6 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
@@ -568,6 +568,11 @@ trait ImplicitExpressionOperations {
*/
def ltrim() = LTrim(expr)
+ /**
+ * Returns a string that removes the right whitespaces from the given string.
+ */
+ def rtrim() = RTrim(expr)
+
// Temporal operations
/**
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
index b715d5f..7c328c9 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
@@ -170,6 +170,12 @@ object FunctionGenerator {
STRING_TYPE_INFO,
BuiltInMethod.LTRIM.method)
+ addSqlFunctionMethod(
+ RTRIM,
+ Seq(STRING_TYPE_INFO),
+ STRING_TYPE_INFO,
+ BuiltInMethod.RTRIM.method)
+
// ----------------------------------------------------------------------------------------------
// Arithmetic functions
// ----------------------------------------------------------------------------------------------
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala
index 8c9461d..b2d7a3d 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala
@@ -434,3 +434,28 @@ case class LTrim(child: Expression) extends UnaryExpression with InputTypeSpec {
override def toString = s"($child).ltrim"
}
+
+/**
+ * Returns a string that removes the right whitespaces from the given string.
+ */
+case class RTrim(child: Expression) extends UnaryExpression with InputTypeSpec {
+
+ override private[flink] def expectedTypes: Seq[TypeInformation[_]] = Seq(STRING_TYPE_INFO)
+
+ override private[flink] def resultType: TypeInformation[_] = STRING_TYPE_INFO
+
+ override private[flink] def validateInput(): ValidationResult = {
+ if (child.resultType == STRING_TYPE_INFO) {
+ ValidationSuccess
+ } else {
+ ValidationFailure(s"RTrim operator requires a String input, " +
+ s"but $child is of type ${child.resultType}")
+ }
+ }
+
+ override private[flink] def toRexNode(implicit relBuilder: RelBuilder): RexNode = {
+ relBuilder.call(ScalarSqlFunctions.RTRIM, child.toRexNode)
+ }
+
+ override def toString = s"($child).rtrim"
+}
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
index f3753ec..d419000 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
@@ -214,4 +214,12 @@ object ScalarSqlFunctions {
OperandTypes.STRING,
SqlFunctionCategory.STRING)
+ val RTRIM = new SqlFunction(
+ "RTRIM",
+ SqlKind.OTHER_FUNCTION,
+ ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
+ InferTypes.RETURN_TYPE,
+ OperandTypes.STRING,
+ SqlFunctionCategory.STRING)
+
}
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
index 49f73f4..67b8a0e 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
@@ -206,6 +206,7 @@ object FunctionCatalog {
"toBase64" -> classOf[ToBase64],
"uuid" -> classOf[UUID],
"ltrim" -> classOf[LTrim],
+ "rtrim" -> classOf[RTrim],
// math functions
"plus" -> classOf[Plus],
@@ -457,6 +458,7 @@ class BasicOperatorTable extends ReflectiveSqlOperatorTable {
ScalarSqlFunctions.TO_BASE64,
ScalarSqlFunctions.UUID,
ScalarSqlFunctions.LTRIM,
+ ScalarSqlFunctions.RTRIM,
// EXTENSIONS
BasicOperatorTable.TUMBLE,
diff --git a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
index 5ab0c67..27b8afb 100644
--- a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
+++ b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
@@ -653,6 +653,33 @@ class ScalarFunctionsTest extends ScalarTypesTestBase {
"null")
}
+ @Test
+ def testRTrim(): Unit = {
+ testAllApis(
+ 'f8.rtrim(),
+ "f8.rtrim",
+ "RTRIM(f8)",
+ " This is a test String.")
+
+ testAllApis(
+ 'f0.rtrim(),
+ "f0.rtrim",
+ "RTRIM(f0)",
+ "This is a test String.")
+
+ testAllApis(
+ "".rtrim(),
+ "''.rtrim()",
+ "RTRIM('')",
+ "")
+
+ testAllApis(
+ 'f33.rtrim(),
+ "f33.rtrim",
+ "RTRIM(f33)",
+ "null")
+ }
+
// ----------------------------------------------------------------------------------------------
// Math functions
// ----------------------------------------------------------------------------------------------
diff --git a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala
index 73e3e0a..94fabbe 100644
--- a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala
+++ b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala
@@ -137,6 +137,7 @@ class SqlExpressionTest extends ExpressionTestBase {
testSqlApi("TRIM(LEADING 'x' FROM 'xxxxSTRINGxxxx')", "STRINGxxxx")
testSqlApi("TRIM(TRAILING 'x' FROM 'xxxxSTRINGxxxx')", "xxxxSTRING")
testSqlApi("LTRIM(' This is a test String.')", "This is a test String.")
+ testSqlApi("RTRIM('This is a test String. ')", "This is a test String.")
testSqlApi(
"OVERLAY('This is an old string' PLACING ' new' FROM 10 FOR 5)",
"This is a new string")