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