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