You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2017/06/19 17:29:49 UTC
calcite git commit: [CALCITE-1647] CLASSIFIER and MATCH_NUMBER syntax
support for MATCH_RECOGNIZE
Repository: calcite
Updated Branches:
refs/heads/master 86a5cc9a4 -> 304eb9c54
[CALCITE-1647] CLASSIFIER and MATCH_NUMBER syntax support for MATCH_RECOGNIZE
Close apache/calcite#473
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/304eb9c5
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/304eb9c5
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/304eb9c5
Branch: refs/heads/master
Commit: 304eb9c54dd0565fd48006b75c715c944f82f974
Parents: 86a5cc9
Author: Zhiqiang-He <ab...@qq.com>
Authored: Tue Jun 13 16:46:14 2017 +0800
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Mon Jun 19 18:11:56 2017 +0100
----------------------------------------------------------------------
core/src/main/codegen/templates/Parser.jj | 9 +++++++++
.../org/apache/calcite/sql/fun/SqlStdOperatorTable.java | 10 ++++++++++
.../apache/calcite/rel/rel2sql/RelToSqlConverterTest.java | 6 +++++-
.../java/org/apache/calcite/sql/parser/SqlParserTest.java | 9 +++++++--
.../java/org/apache/calcite/sql/test/SqlAdvisorTest.java | 2 ++
.../org/apache/calcite/test/SqlToRelConverterTest.java | 4 +++-
.../org/apache/calcite/test/SqlToRelConverterTest.xml | 4 ++--
site/_docs/reference.md | 7 +------
8 files changed, 39 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index 3d05826..c6a657f 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -4664,9 +4664,18 @@ SqlCall TimestampDiffFunctionCall() :
SqlCall MatchRecognizeFunctionCall() :
{
final SqlCall func;
+ final Span s;
}
{
(
+ <CLASSIFIER> { s = span(); } <LPAREN> <RPAREN> {
+ func = SqlStdOperatorTable.CLASSIFIER.createCall(s.end(this));
+ }
+ |
+ <MATCH_NUMBER> { s = span(); } <LPAREN> <RPAREN> {
+ func = SqlStdOperatorTable.MATCH_NUMBER.createCall(s.end(this));
+ }
+ |
func = MatchRecognizeNavigationLogical()
|
func = MatchRecognizeNavigationPhysical()
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java
index 03be569..13b94b9 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java
@@ -1463,6 +1463,16 @@ public class SqlStdOperatorTable extends ReflectiveSqlOperatorTable {
new SqlFunction("NEXT", SqlKind.NEXT, ReturnTypes.ARG0_NULLABLE, null,
OperandTypes.ANY_NUMERIC, SqlFunctionCategory.MATCH_RECOGNIZE);
+ /** {@code CLASSIFIER} function to be used within {@code MATCH_RECOGNIZE}. */
+ public static final SqlFunction CLASSIFIER =
+ new SqlFunction("CLASSIFIER", SqlKind.CLASSIFIER, ReturnTypes.VARCHAR_2000,
+ null, OperandTypes.NILADIC, SqlFunctionCategory.MATCH_RECOGNIZE);
+
+ /** {@code MATCH_NUMBER} function to be used within {@code MATCH_RECOGNIZE}. */
+ public static final SqlFunction MATCH_NUMBER =
+ new SqlFunction("MATCH_NUMBER ", SqlKind.MATCH_NUMBER, ReturnTypes.BIGINT_NULLABLE,
+ null, OperandTypes.NILADIC, SqlFunctionCategory.MATCH_RECOGNIZE);
+
public static final SqlFunction NULLIF = new SqlNullifFunction();
/**
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 16417ad..26481f9 100644
--- a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -1165,7 +1165,9 @@ public class RelToSqlConverterTest {
final String sql = "select *\n"
+ " from \"product\" match_recognize\n"
+ " (\n"
- + " measures STRT.\"net_weight\" as start_nw,"
+ + " measures MATCH_NUMBER() as match_num, "
+ + " CLASSIFIER() as var_match, "
+ + " STRT.\"net_weight\" as start_nw,"
+ " LAST(DOWN.\"net_weight\") as bottom_nw,"
+ " LAST(up.\"net_weight\") as end_nw"
+ " pattern (strt down+ up+)\n"
@@ -1179,6 +1181,8 @@ public class RelToSqlConverterTest {
+ "FROM \"foodmart\".\"product\") "
+ "MATCH_RECOGNIZE(\n"
+ "MEASURES "
+ + "FINAL MATCH_NUMBER () AS \"MATCH_NUM\", "
+ + "FINAL CLASSIFIER() AS \"VAR_MATCH\", "
+ "FINAL \"STRT\".\"net_weight\" AS \"START_NW\", "
+ "FINAL LAST(\"DOWN\".\"net_weight\", 0) AS \"BOTTOM_NW\", "
+ "FINAL LAST(\"UP\".\"net_weight\", 0) AS \"END_NW\"\n"
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index 9c9f0c2..f132a24 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -7521,7 +7521,10 @@ public class SqlParserTest {
final String sql = "select *\n"
+ " from t match_recognize\n"
+ " (\n"
- + " measures STRT.ts as start_ts,"
+ + " measures "
+ + " MATCH_NUMBER() as match_num,"
+ + " CLASSIFIER() as var_match,"
+ + " STRT.ts as start_ts,"
+ " LAST(DOWN.ts) as bottom_ts,"
+ " LAST(up.ts) as end_ts"
+ " pattern (strt down+ up+)\n"
@@ -7531,7 +7534,9 @@ public class SqlParserTest {
+ " ) mr";
final String expected = "SELECT *\n"
+ "FROM `T` MATCH_RECOGNIZE(\n"
- + "MEASURES `STRT`.`TS` AS `START_TS`, "
+ + "MEASURES (MATCH_NUMBER ()) AS `MATCH_NUM`, "
+ + "(CLASSIFIER()) AS `VAR_MATCH`, "
+ + "`STRT`.`TS` AS `START_TS`, "
+ "LAST(`DOWN`.`TS`, 0) AS `BOTTOM_TS`, "
+ "LAST(`UP`.`TS`, 0) AS `END_TS`\n"
+ "PATTERN (((`STRT` (`DOWN` +)) (`UP` +)))\n"
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
index 085de9b..51ca055 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
@@ -126,6 +126,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase {
"KEYWORD(CEILING)",
"KEYWORD(CHARACTER_LENGTH)",
"KEYWORD(CHAR_LENGTH)",
+ "KEYWORD(CLASSIFIER)",
"KEYWORD(COALESCE)",
"KEYWORD(COLLECT)",
"KEYWORD(CONVERT)",
@@ -164,6 +165,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase {
"KEYWORD(LOCALTIME)",
"KEYWORD(LOCALTIMESTAMP)",
"KEYWORD(LOWER)",
+ "KEYWORD(MATCH_NUMBER)",
"KEYWORD(MAX)",
"KEYWORD(MIN)",
"KEYWORD(MINUTE)",
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index dc05610..a596c9b 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -2480,7 +2480,9 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
+ " (\n"
+ " partition by job, sal\n"
+ " order by job asc, sal desc\n"
- + " measures STRT.mgr as start_nw,"
+ + " measures MATCH_NUMBER() as match_num, "
+ + " CLASSIFIER() as var_match, "
+ + " STRT.mgr as start_nw,"
+ " LAST(DOWN.mgr) as bottom_nw,"
+ " LAST(up.mgr) as end_nw"
+ " pattern (strt down+ up+)\n"
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 4edf405..aa5ed59 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -4697,8 +4697,8 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$
</Resource>
<Resource name="plan">
<![CDATA[
-LogicalProject(START_NW=[$0], BOTTOM_NW=[$1], END_NW=[$2])
- LogicalMatch(partition=[[$2, $5]], order=[[2, 5 DESC]], outputFields=[[START_NW, BOTTOM_NW, END_NW]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[(('STRT', PATTERN_QUANTIFIER('DOWN', 1, -1, false)), PATTERN_QUANTIFIER('UP', 1, -1, false))], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[<(PREV(DOWN.$3, 0), PREV(DOWN.$3, 1)), >(PREV(UP.$3, 0), PREV(UP.$3, 1))]], inputFields=[[EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, SLACKER]])
+LogicalProject(MATCH_NUM=[$0], VAR_MATCH=[$1], START_NW=[$2], BOTTOM_NW=[$3], END_NW=[$4])
+ LogicalMatch(partition=[[$2, $5]], order=[[2, 5 DESC]], outputFields=[[MATCH_NUM, VAR_MATCH, START_NW, BOTTOM_NW, END_NW]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[(('STRT', PATTERN_QUANTIFIER('DOWN', 1, -1, false)), PATTERN_QUANTIFIER('UP', 1, -1, false))], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[<(PREV(DOWN.$3, 0), PREV(DOWN.$3, 1)), >(PREV(UP.$3, 0), PREV(UP.$3, 1))]], inputFields=[[EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, SLACKER]])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
http://git-wip-us.apache.org/repos/asf/calcite/blob/304eb9c5/site/_docs/reference.md
----------------------------------------------------------------------
diff --git a/site/_docs/reference.md b/site/_docs/reference.md
index 6553cc4..09c92f2 100644
--- a/site/_docs/reference.md
+++ b/site/_docs/reference.md
@@ -1690,9 +1690,4 @@ patternQuantifier:
{% endhighlight %}
In *patternQuantifier*, *repeat* is a positive integer,
-and *minRepeat* and *maxRepeat* are non-negative integers.
-
-The following clauses are not implemented:
-
-* `PARTITION BY`
-* `ORDER BY`
+and *minRepeat* and *maxRepeat* are non-negative integers.
\ No newline at end of file