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 3742079  [FLINK-10059] [table] Add LTRIM function in Table API and SQL
3742079 is described below

commit 37420794e4df425204ec0c896f233ca22e01acfd
Author: yanghua <[email protected]>
AuthorDate: Sun Aug 5 17:09:07 2018 +0800

    [FLINK-10059] [table] Add LTRIM function in Table API and SQL
    
    This closes #6494.
---
 docs/dev/table/functions.md                        | 37 +++++++++++++++++++++-
 .../flink/table/api/scala/expressionDsl.scala      |  7 +++-
 .../table/codegen/calls/FunctionGenerator.scala    |  6 ++++
 .../table/expressions/stringExpressions.scala      | 24 ++++++++++++++
 .../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(+), 2 deletions(-)

diff --git a/docs/dev/table/functions.md b/docs/dev/table/functions.md
index eac6d16..bfc6a7d 100644
--- a/docs/dev/table/functions.md
+++ b/docs/dev/table/functions.md
@@ -2376,6 +2376,18 @@ TRIM([ BOTH | LEADING | TRAILING ] string1 FROM string2)
         <p>Returns a string that removes leading and/or trailing characters 
<i>string1</i> from <i>string2</i>. By default, whitespaces at both sides are 
removed.</p>
       </td>
     </tr>
+    
+    <tr>
+      <td>
+        {% highlight text %}
+LTRIM(string)
+{% endhighlight %}
+      </td>
+      <td>
+        <p>Returns a string that removes the left whitespaces from 
<i>string</i>.</p> 
+        <p>E.g., <code>LTRIM(' This is a test String.')</code> returns "This 
is a test String.".</p>
+      </td>
+    </tr>
 
     <tr>
       <td>
@@ -2570,6 +2582,18 @@ STRING1.trim()
     <tr>
       <td>
         {% highlight java %}
+STRING.ltrim()
+{% endhighlight %}
+      </td>
+      <td>
+        <p>Returns a string that removes the left whitespaces from 
<i>STRING</i>.</p> 
+        <p>E.g., <code>' This is a test String.'.ltrim()</code> returns "This 
is a test String.".</p>
+      </td>
+    </tr>
+    
+    <tr>
+      <td>
+        {% highlight java %}
 STRING1.overlay(STRING2, INT1)
 STRING1.overlay(STRING2, INT1, INT2)
 {% endhighlight %}
@@ -2674,7 +2698,6 @@ STRING.toBase64()
          <p>E.g., <code>'hello world'.toBase64()</code> returns 
"aGVsbG8gd29ybGQ=".</p>
       </td>
     </tr>
-    
   </tbody>
 </table>
 </div>
@@ -2762,6 +2785,18 @@ STRING.trim(
     <tr>
       <td>
         {% highlight scala %}
+STRING.ltrim()
+{% endhighlight %}
+      </td>
+      <td>
+        <p>Returns a string that removes the left whitespaces from 
<i>STRING</i>.</p> 
+        <p>E.g., <code>" This is a test String.".ltrim()</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 dfe69cb..db745d5 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
@@ -172,7 +172,7 @@ trait ImplicitExpressionOperations {
     * If all values are null, 0 is returned.
     */
   def sum0 = Sum0(expr)
-  
+
   /**
     * Returns the minimum value of field across all input values.
     */
@@ -563,6 +563,11 @@ trait ImplicitExpressionOperations {
     */
   def toBase64() = ToBase64(expr)
 
+  /**
+    * Returns a string that removes the left whitespaces from the given string.
+    */
+  def ltrim() = LTrim(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 a29259b..b715d5f 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
@@ -164,6 +164,12 @@ object FunctionGenerator {
     STRING_TYPE_INFO,
     BuiltInMethods.UUID)
 
+  addSqlFunctionMethod(
+    LTRIM,
+    Seq(STRING_TYPE_INFO),
+    STRING_TYPE_INFO,
+    BuiltInMethod.LTRIM.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 f844308..8c9461d 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
@@ -410,3 +410,27 @@ case class ToBase64(child: Expression) extends 
UnaryExpression with InputTypeSpe
   override def toString: String = s"($child).toBase64"
 
 }
+
+/**
+  * Returns a string that removes the left whitespaces from the given string.
+  */
+case class LTrim(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"LTrim 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.LTRIM, child.toRexNode)
+  }
+
+  override def toString = s"($child).ltrim"
+}
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 0df4468..f3753ec 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
@@ -206,4 +206,12 @@ object ScalarSqlFunctions {
     SqlFunctionCategory.STRING
   )
 
+  val LTRIM = new SqlFunction(
+    "LTRIM",
+    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 f5d1330..49f73f4 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
@@ -205,6 +205,7 @@ object FunctionCatalog {
     "fromBase64" -> classOf[FromBase64],
     "toBase64" -> classOf[ToBase64],
     "uuid" -> classOf[UUID],
+    "ltrim" -> classOf[LTrim],
 
     // math functions
     "plus" -> classOf[Plus],
@@ -455,6 +456,7 @@ class BasicOperatorTable extends ReflectiveSqlOperatorTable 
{
     ScalarSqlFunctions.FROM_BASE64,
     ScalarSqlFunctions.TO_BASE64,
     ScalarSqlFunctions.UUID,
+    ScalarSqlFunctions.LTRIM,
 
     // 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 145f3c5..5ab0c67 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
@@ -626,6 +626,33 @@ class ScalarFunctionsTest extends ScalarTypesTestBase {
       "-")
   }
 
+  @Test
+  def testLTrim(): Unit = {
+    testAllApis(
+      'f8.ltrim(),
+      "f8.ltrim",
+      "LTRIM(f8)",
+      "This is a test String. ")
+
+    testAllApis(
+      'f0.ltrim(),
+      "f0.ltrim",
+      "LTRIM(f0)",
+      "This is a test String.")
+
+    testAllApis(
+      "".ltrim(),
+      "''.ltrim()",
+      "LTRIM('')",
+      "")
+
+    testAllApis(
+      'f33.ltrim(),
+      "f33.ltrim",
+      "LTRIM(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 5846fc0..73e3e0a 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
@@ -136,6 +136,7 @@ class SqlExpressionTest extends ExpressionTestBase {
     testSqlApi("TRIM(BOTH ' STRING ')", "STRING")
     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(
       "OVERLAY('This is an old string' PLACING ' new' FROM 10 FOR 5)",
       "This is a new string")

Reply via email to