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")