[CALCITE-1689] Remove PATTERN_DEFINE_AS in SqlStdOperatorTable; MATCH_RECOGNIZE 
now uses AS (Zhiqiang-He)

Close apache/calcite#399


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/598cf642
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/598cf642
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/598cf642

Branch: refs/heads/master
Commit: 598cf6422510d81d97a6fe7e930e4e2950c3d25f
Parents: 55ffb5e
Author: Zhiqiang-He <[email protected]>
Authored: Fri Mar 10 16:43:50 2017 +0800
Committer: Julian Hyde <[email protected]>
Committed: Tue Mar 14 21:42:13 2017 -0700

----------------------------------------------------------------------
 core/src/main/codegen/templates/Parser.jj       |  2 +-
 .../calcite/rel/rel2sql/RelToSqlConverter.java  | 22 ++++++--------
 .../apache/calcite/sql/SqlMatchRecognize.java   | 13 ++++++--
 .../calcite/sql/fun/SqlStdOperatorTable.java    | 31 --------------------
 .../sql2rel/StandardConvertletTable.java        |  8 -----
 .../apache/calcite/test/SqlValidatorTest.java   |  3 --
 6 files changed, 20 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/598cf642/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 6371c24..63cf983 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -2700,7 +2700,7 @@ SqlNode PatternDefinition() :
     var = SimpleIdentifier()
     <AS>
     e = Expression(ExprContext.ACCEPT_SUB_QUERY) {
-        return SqlStdOperatorTable.PATTERN_DEFINE_AS.createCall(
+        return SqlStdOperatorTable.AS.createCall(
             var.getParserPosition().plus(getPos()), e, var);
     }
 }

http://git-wip-us.apache.org/repos/asf/calcite/blob/598cf642/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java 
b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
index 1231dbc..baf093a 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
@@ -369,9 +369,7 @@ public class RelToSqlConverter extends SqlImplementor
             }), POS);
   }
 
-  /**
-   * @see #dispatch
-   */
+  /** @see #dispatch */
   public Result visit(Match e) {
     final RelNode input = e.getInput();
     final Result x = visitChild(0, input);
@@ -381,22 +379,20 @@ public class RelToSqlConverter extends SqlImplementor
 
     RexNode rexPattern = e.getPattern();
     final SqlNode pattern = context.toSql(null, rexPattern);
-    final SqlLiteral isStrictStarts = 
SqlLiteral.createBoolean(e.isStrictStart(), POS);
-    final SqlLiteral isStrictEnds = SqlLiteral.createBoolean(e.isStrictEnd(), 
POS);
+    final SqlLiteral strictStart = SqlLiteral.createBoolean(e.isStrictStart(), 
POS);
+    final SqlLiteral strictEnd = SqlLiteral.createBoolean(e.isStrictEnd(), 
POS);
 
-    List<SqlNode> list = Lists.newArrayList();
+    final SqlNodeList patternDefList = new SqlNodeList(POS);
     for (Map.Entry<String, RexNode> entry : 
e.getPatternDefinitions().entrySet()) {
       String alias = entry.getKey();
       SqlNode sqlNode = context.toSql(null, entry.getValue());
-      sqlNode = SqlStdOperatorTable.PATTERN_DEFINE_AS.createCall(POS,
-        sqlNode, new SqlIdentifier(alias, POS));
-      list.add(sqlNode);
+      patternDefList.add(
+          SqlStdOperatorTable.AS.createCall(POS, sqlNode,
+              new SqlIdentifier(alias, POS)));
     }
 
-    final SqlNodeList patternDefList = new SqlNodeList(list, POS);
-
-    final SqlNode matchRecognize = new SqlMatchRecognize(POS, tableRef,
-      pattern, isStrictStarts, isStrictEnds, patternDefList);
+    final SqlNode matchRecognize = new SqlMatchRecognize(POS, tableRef, 
pattern,
+        strictStart, strictEnd, patternDefList);
     return result(matchRecognize, Expressions.list(Clause.FROM), e, null);
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/598cf642/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java 
b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
index 23350fb..770ec61 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
@@ -204,10 +204,17 @@ public class SqlMatchRecognize extends SqlCall {
       writer.newlineAndIndent();
       writer.sep("DEFINE");
 
-      SqlWriter.Frame patternDefFrame = writer.startList("", "");
-      pattern.patternDefList.unparse(writer, 0, 0);
+      final SqlWriter.Frame patternDefFrame = writer.startList("", "");
+      final SqlNodeList newDefineList = new SqlNodeList(SqlParserPos.ZERO);
+      for (SqlNode node : pattern.getPatternDefList()) {
+        final SqlCall call2 = (SqlCall) node;
+        // swap the position of alias position in AS operator
+        newDefineList.add(
+            call2.getOperator().createCall(SqlParserPos.ZERO, call2.operand(1),
+                call2.operand(0)));
+      }
+      newDefineList.unparse(writer, 0, 0);
       writer.endList(patternDefFrame);
-
       writer.endList(mrFrame);
     }
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/598cf642/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 f0e7868..7c00a2e 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
@@ -57,7 +57,6 @@ import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.util.ReflectiveSqlOperatorTable;
 import org.apache.calcite.sql.validate.SqlModality;
 import org.apache.calcite.util.Litmus;
-import org.apache.calcite.util.Util;
 
 /**
  * Implementation of {@link org.apache.calcite.sql.SqlOperatorTable} containing
@@ -2028,36 +2027,6 @@ public class SqlStdOperatorTable extends 
ReflectiveSqlOperatorTable {
         }
       };
 
-  /** {@code AS} function that defines a measure inside {@code 
MATCH_RECOGNIZE}.
-   * The order of operands will change when the expression is unparsed. */
-  public static final SqlSpecialOperator PATTERN_DEFINE_AS =
-      new SqlAsOperator("PATTERN_DEFINE_AS", SqlKind.AS, 20, true,
-          ReturnTypes.ARG0, InferTypes.RETURN_TYPE, OperandTypes.ANY_ANY) {
-        @Override public void unparse(SqlWriter writer, SqlCall call,
-            int leftPrec, int rightPrec) {
-          assert call.operandCount() >= 2;
-          final SqlWriter.Frame frame =
-              writer.startList(
-                  SqlWriter.FrameTypeEnum.SIMPLE);
-          call.operand(1).unparse(writer, leftPrec, getLeftPrec());
-          final boolean needsSpace = true;
-          writer.setNeedWhitespace(needsSpace);
-          writer.sep("AS");
-          writer.setNeedWhitespace(needsSpace);
-          call.operand(0).unparse(writer, getRightPrec(), rightPrec);
-          if (call.operandCount() > 2) {
-            final SqlWriter.Frame frame1 =
-                writer.startList(SqlWriter.FrameTypeEnum.SIMPLE, "(", ")");
-            for (SqlNode operand : Util.skip(call.getOperandList(), 2)) {
-              writer.sep(",", false);
-              operand.unparse(writer, 0, 0);
-            }
-            writer.endList(frame1);
-          }
-          writer.endList(frame);
-        }
-      };
-
   //~ Methods ----------------------------------------------------------------
 
   /**

http://git-wip-us.apache.org/repos/asf/calcite/blob/598cf642/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java 
b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
index 7d6a313..33856d5 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
@@ -257,14 +257,6 @@ public class StandardConvertletTable extends 
ReflectiveConvertletTable {
             return cx.convertExpression(expanded);
           }
         });
-    registerOp(
-      SqlStdOperatorTable.PATTERN_DEFINE_AS,
-      new SqlRexConvertlet() {
-        public RexNode convertCall(SqlRexContext cx, SqlCall call) {
-          SqlNode expanded = call.operand(0);
-          return cx.convertExpression(expanded);
-        }
-      });
     // "SQRT(x)" is equivalent to "POWER(x, .5)"
     registerOp(
         SqlStdOperatorTable.SQRT,

http://git-wip-us.apache.org/repos/asf/calcite/blob/598cf642/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java 
b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 3ed8f22..9749461 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -8018,7 +8018,6 @@ public class SqlValidatorTest extends 
SqlValidatorTestCase {
         + "AS -\n"
         + "DESC post\n"
         + "OVER left\n"
-        + "PATTERN_DEFINE_AS -\n"
         + "TABLESAMPLE -\n"
         + "\n"
         + "INTERSECT left\n"
@@ -8961,8 +8960,6 @@ public class SqlValidatorTest extends 
SqlValidatorTestCase {
   /** Tries to create a calls to some internal operators in
    * MATCH_RECOGNIZE. Should fail. */
   @Test public void testMatchRecognizeInternals() throws Exception {
-    sql("values ^pattern_define_as(1, 2)^")
-        .fails("No match found for function signature .*");
     sql("values ^pattern_exclude(1, 2)^")
         .fails("No match found for function signature .*");
     sql("values ^\"|\"(1, 2)^")

Reply via email to