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