| <?xml version="1.0" ?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to you under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <Root> |
| <TestCase name="testCascadeMatch"> |
| <Resource name="sql"> |
| <![CDATA[ |
| SELECT * |
| FROM ( |
| SELECT |
| symbol, |
| matchRowtime, |
| price, |
| TUMBLE_START(matchRowtime, interval '3' second) as startTime |
| FROM Ticker |
| MATCH_RECOGNIZE ( |
| PARTITION BY symbol |
| ORDER BY ts_ltz |
| MEASURES |
| A.price as price, |
| A.tax as tax, |
| MATCH_ROWTIME(ts_ltz) as matchRowtime |
| ONE ROW PER MATCH |
| PATTERN (A) |
| DEFINE |
| A AS A.price > 0 |
| ) AS T |
| GROUP BY symbol, matchRowtime, price, TUMBLE(matchRowtime, interval '3' second) |
| ) |
| MATCH_RECOGNIZE ( |
| PARTITION BY symbol |
| ORDER BY matchRowtime |
| MEASURES |
| A.price as dPrice, |
| A.matchRowtime as matchRowtime |
| PATTERN (A) |
| DEFINE |
| A AS A.matchRowtime >= (CURRENT_TIMESTAMP - INTERVAL '1' day) |
| ) |
| ]]> |
| </Resource> |
| <Resource name="ast"> |
| <![CDATA[ |
| LogicalProject(symbol=[$0], dPrice=[$1], matchRowtime=[$2]) |
| +- LogicalMatch(partition=[[0]], order=[[1 ASC-nulls-first]], outputFields=[[symbol, dPrice, matchRowtime]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[_UTF-16LE'A'], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[>=(PREV(A.$1, 0), -(CURRENT_TIMESTAMP, 86400000:INTERVAL DAY))]], inputFields=[[symbol, matchRowtime, price, startTime]]) |
| +- LogicalProject(symbol=[$0], matchRowtime=[$1], price=[$2], startTime=[TUMBLE_START($3)]) |
| +- LogicalAggregate(group=[{0, 1, 2, 3}]) |
| +- LogicalProject(symbol=[$0], matchRowtime=[$3], price=[$1], $f3=[$TUMBLE($3, 3000:INTERVAL SECOND)]) |
| +- LogicalMatch(partition=[[0]], order=[[1 ASC-nulls-first]], outputFields=[[symbol, price, tax, matchRowtime]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[_UTF-16LE'A'], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[>(PREV(A.$2, 0), 0)]], inputFields=[[symbol, ts_ltz, price, tax]]) |
| +- LogicalWatermarkAssigner(rowtime=[ts_ltz], watermark=[-($1, 1000:INTERVAL SECOND)]) |
| +- LogicalTableScan(table=[[default_catalog, default_database, Ticker]]) |
| ]]> |
| </Resource> |
| <Resource name="optimized rel plan"> |
| <![CDATA[ |
| Match(partitionBy=[symbol], orderBy=[matchRowtime ASC], measures=[FINAL(A.price) AS dPrice, FINAL(A.matchRowtime) AS matchRowtime], rowsPerMatch=[ONE ROW PER MATCH], after=[SKIP TO NEXT ROW], pattern=[_UTF-16LE'A'], define=[{A=>=(PREV(A.$1, 0), -(CURRENT_TIMESTAMP, 86400000:INTERVAL DAY))}]) |
| +- Exchange(distribution=[hash[symbol]]) |
| +- Calc(select=[symbol, matchRowtime, price, w$start AS startTime]) |
| +- GroupWindowAggregate(groupBy=[symbol, price, matchRowtime], window=[TumblingGroupWindow('w$, matchRowtime0, 3000)], properties=[w$start, w$end, w$rowtime, w$proctime], select=[symbol, price, matchRowtime, start('w$) AS w$start, end('w$) AS w$end, rowtime('w$) AS w$rowtime, proctime('w$) AS w$proctime]) |
| +- Exchange(distribution=[hash[symbol, price, matchRowtime]]) |
| +- Calc(select=[symbol, price, tax, CAST(matchRowtime) AS matchRowtime]) |
| +- Match(partitionBy=[symbol], orderBy=[ts_ltz ASC], measures=[FINAL(A.price) AS price, FINAL(A.tax) AS tax, FINAL(MATCH_ROWTIME(*.ts_ltz)) AS matchRowtime], rowsPerMatch=[ONE ROW PER MATCH], after=[SKIP TO NEXT ROW], pattern=[_UTF-16LE'A'], define=[{A=>(PREV(A.$2, 0), 0)}]) |
| +- Exchange(distribution=[hash[symbol]]) |
| +- WatermarkAssigner(rowtime=[ts_ltz], watermark=[-(ts_ltz, 1000:INTERVAL SECOND)]) |
| +- TableSourceScan(table=[[default_catalog, default_database, Ticker]], fields=[symbol, ts_ltz, price, tax]) |
| ]]> |
| </Resource> |
| </TestCase> |
| <TestCase name="testMatchRecognizeOnRowtime"> |
| <Resource name="sql"> |
| <![CDATA[ |
| SELECT |
| symbol, |
| SUM(price) as price, |
| TUMBLE_ROWTIME(matchRowtime, interval '3' second) as rowTime, |
| TUMBLE_START(matchRowtime, interval '3' second) as startTime |
| FROM Ticker1 |
| MATCH_RECOGNIZE ( |
| PARTITION BY symbol |
| ORDER BY ts |
| MEASURES |
| A.price as price, |
| A.tax as tax, |
| MATCH_ROWTIME() as matchRowtime |
| ONE ROW PER MATCH |
| PATTERN (A) |
| DEFINE |
| A AS A.price > 0 |
| ) AS T |
| GROUP BY symbol, TUMBLE(matchRowtime, interval '3' second) |
| ]]> |
| </Resource> |
| <Resource name="ast"> |
| <![CDATA[ |
| LogicalProject(symbol=[$0], price=[$2], rowTime=[TUMBLE_ROWTIME($1)], startTime=[TUMBLE_START($1)]) |
| +- LogicalAggregate(group=[{0, 1}], price=[SUM($2)]) |
| +- LogicalProject(symbol=[$0], $f1=[$TUMBLE($3, 3000:INTERVAL SECOND)], price=[$1]) |
| +- LogicalMatch(partition=[[0]], order=[[1 ASC-nulls-first]], outputFields=[[symbol, price, tax, matchRowtime]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[_UTF-16LE'A'], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[>(PREV(A.$2, 0), 0)]], inputFields=[[symbol, ts, price, tax]]) |
| +- LogicalWatermarkAssigner(rowtime=[ts], watermark=[-($1, 1000:INTERVAL SECOND)]) |
| +- LogicalTableScan(table=[[default_catalog, default_database, Ticker1]]) |
| ]]> |
| </Resource> |
| <Resource name="optimized rel plan"> |
| <![CDATA[ |
| Calc(select=[symbol, price, CAST(w$rowtime) AS rowTime, w$start AS startTime]) |
| +- GroupWindowAggregate(groupBy=[symbol], window=[TumblingGroupWindow('w$, matchRowtime, 3000)], properties=[w$start, w$end, w$rowtime, w$proctime], select=[symbol, SUM(price) AS price, start('w$) AS w$start, end('w$) AS w$end, rowtime('w$) AS w$rowtime, proctime('w$) AS w$proctime]) |
| +- Exchange(distribution=[hash[symbol]]) |
| +- Calc(select=[symbol, matchRowtime, price]) |
| +- Match(partitionBy=[symbol], orderBy=[ts ASC], measures=[FINAL(A.price) AS price, FINAL(A.tax) AS tax, FINAL(MATCH_ROWTIME()) AS matchRowtime], rowsPerMatch=[ONE ROW PER MATCH], after=[SKIP TO NEXT ROW], pattern=[_UTF-16LE'A'], define=[{A=>(PREV(A.$2, 0), 0)}]) |
| +- Exchange(distribution=[hash[symbol]]) |
| +- WatermarkAssigner(rowtime=[ts], watermark=[-(ts, 1000:INTERVAL SECOND)]) |
| +- TableSourceScan(table=[[default_catalog, default_database, Ticker1]], fields=[symbol, ts, price, tax]) |
| ]]> |
| </Resource> |
| </TestCase> |
| <TestCase name="testOverWindowOnMatchRecognizeOnRowtimeLTZ"> |
| <Resource name="sql"> |
| <![CDATA[ |
| SELECT |
| symbol, |
| price, |
| tax, |
| matchRowtime, |
| SUM(price) OVER ( |
| PARTITION BY symbol ORDER BY matchRowtime RANGE UNBOUNDED PRECEDING) as price_sum |
| FROM T |
| ]]> |
| </Resource> |
| <Resource name="ast"> |
| <![CDATA[ |
| LogicalProject(symbol=[$0], price=[$1], tax=[$2], matchRowtime=[$3], price_sum=[CASE(>(COUNT($1) OVER (PARTITION BY $0 ORDER BY $3 NULLS FIRST), 0), $SUM0($1) OVER (PARTITION BY $0 ORDER BY $3 NULLS FIRST), null:INTEGER)]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, INTEGER price_sum)] |
| +- LogicalMatch(partition=[[0]], order=[[1 ASC-nulls-first]], outputFields=[[symbol, price, tax, matchRowtime]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[_UTF-16LE'A'], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[>(PREV(A.$2, 0), 0)]], inputFields=[[symbol, ts_ltz, price, tax]]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime)] |
| +- LogicalWatermarkAssigner(rowtime=[ts_ltz], watermark=[-($1, 1000:INTERVAL SECOND)]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_LTZ(3) *ROWTIME* ts_ltz, INTEGER price, INTEGER tax)] |
| +- LogicalTableScan(table=[[default_catalog, default_database, Ticker]]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_WITH_LOCAL_TIME_ZONE(3) ts_ltz, INTEGER price, INTEGER tax)] |
| ]]> |
| </Resource> |
| <Resource name="optimized rel plan"> |
| <![CDATA[ |
| Calc(select=[symbol, price, tax, matchRowtime, CASE(>(w0$o0, 0:BIGINT), w0$o1, null:INTEGER) AS price_sum]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, INTEGER price_sum)] |
| +- OverAggregate(partitionBy=[symbol], orderBy=[matchRowtime ASC], window=[ RANG BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], select=[symbol, price, tax, matchRowtime, COUNT(price) AS w0$o0, $SUM0(price) AS w0$o1]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, BIGINT w0$o0, INTEGER w0$o1)] |
| +- Exchange(distribution=[hash[symbol]]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime)] |
| +- Match(partitionBy=[symbol], orderBy=[ts_ltz ASC], measures=[FINAL(A.price) AS price, FINAL(A.tax) AS tax, FINAL(MATCH_ROWTIME(*.ts_ltz)) AS matchRowtime], rowsPerMatch=[ONE ROW PER MATCH], after=[SKIP TO NEXT ROW], pattern=[_UTF-16LE'A'], define=[{A=>(PREV(A.$2, 0), 0)}]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime)] |
| +- Exchange(distribution=[hash[symbol]]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_LTZ(3) *ROWTIME* ts_ltz, INTEGER price, INTEGER tax)] |
| +- WatermarkAssigner(rowtime=[ts_ltz], watermark=[-(ts_ltz, 1000:INTERVAL SECOND)]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_LTZ(3) *ROWTIME* ts_ltz, INTEGER price, INTEGER tax)] |
| +- TableSourceScan(table=[[default_catalog, default_database, Ticker]], fields=[symbol, ts_ltz, price, tax]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_WITH_LOCAL_TIME_ZONE(3) ts_ltz, INTEGER price, INTEGER tax)] |
| ]]> |
| </Resource> |
| </TestCase> |
| <TestCase name="testMatchRecognizeOnRowtimeLTZ"> |
| <Resource name="sql"> |
| <![CDATA[ |
| SELECT |
| symbol, |
| SUM(price) as price, |
| TUMBLE_ROWTIME(matchRowtime, interval '3' second) as rowTime, |
| TUMBLE_START(matchRowtime, interval '3' second) as startTime |
| FROM Ticker |
| MATCH_RECOGNIZE ( |
| PARTITION BY symbol |
| ORDER BY ts_ltz |
| MEASURES |
| A.price as price, |
| A.tax as tax, |
| MATCH_ROWTIME(ts_ltz) as matchRowtime |
| ONE ROW PER MATCH |
| PATTERN (A) |
| DEFINE |
| A AS A.price > 0 |
| ) AS T |
| GROUP BY symbol, TUMBLE(matchRowtime, interval '3' second) |
| ]]> |
| </Resource> |
| <Resource name="ast"> |
| <![CDATA[ |
| LogicalProject(symbol=[$0], price=[$2], rowTime=[TUMBLE_ROWTIME($1)], startTime=[TUMBLE_START($1)]) |
| +- LogicalAggregate(group=[{0, 1}], price=[SUM($2)]) |
| +- LogicalProject(symbol=[$0], $f1=[$TUMBLE($3, 3000:INTERVAL SECOND)], price=[$1]) |
| +- LogicalMatch(partition=[[0]], order=[[1 ASC-nulls-first]], outputFields=[[symbol, price, tax, matchRowtime]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[_UTF-16LE'A'], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[>(PREV(A.$2, 0), 0)]], inputFields=[[symbol, ts_ltz, price, tax]]) |
| +- LogicalWatermarkAssigner(rowtime=[ts_ltz], watermark=[-($1, 1000:INTERVAL SECOND)]) |
| +- LogicalTableScan(table=[[default_catalog, default_database, Ticker]]) |
| ]]> |
| </Resource> |
| <Resource name="optimized rel plan"> |
| <![CDATA[ |
| Calc(select=[symbol, price, w$rowtime AS rowTime, w$start AS startTime]) |
| +- GroupWindowAggregate(groupBy=[symbol], window=[TumblingGroupWindow('w$, matchRowtime, 3000)], properties=[w$start, w$end, w$rowtime, w$proctime], select=[symbol, SUM(price) AS price, start('w$) AS w$start, end('w$) AS w$end, rowtime('w$) AS w$rowtime, proctime('w$) AS w$proctime]) |
| +- Exchange(distribution=[hash[symbol]]) |
| +- Calc(select=[symbol, matchRowtime, price]) |
| +- Match(partitionBy=[symbol], orderBy=[ts_ltz ASC], measures=[FINAL(A.price) AS price, FINAL(A.tax) AS tax, FINAL(MATCH_ROWTIME(*.ts_ltz)) AS matchRowtime], rowsPerMatch=[ONE ROW PER MATCH], after=[SKIP TO NEXT ROW], pattern=[_UTF-16LE'A'], define=[{A=>(PREV(A.$2, 0), 0)}]) |
| +- Exchange(distribution=[hash[symbol]]) |
| +- WatermarkAssigner(rowtime=[ts_ltz], watermark=[-(ts_ltz, 1000:INTERVAL SECOND)]) |
| +- TableSourceScan(table=[[default_catalog, default_database, Ticker]], fields=[symbol, ts_ltz, price, tax]) |
| ]]> |
| </Resource> |
| </TestCase> |
| <TestCase name="testWindowTVFOnMatchRecognizeOnRowtimeLTZ"> |
| <Resource name="sql"> |
| <![CDATA[ |
| SELECT * |
| FROM TABLE(TUMBLE(TABLE T, DESCRIPTOR(matchRowtime), INTERVAL '3' second)) |
| ]]> |
| </Resource> |
| <Resource name="ast"> |
| <![CDATA[ |
| LogicalProject(symbol=[$0], price=[$1], tax=[$2], matchRowtime=[$3], window_start=[$4], window_end=[$5], window_time=[$6]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end, TIMESTAMP_LTZ(3) *ROWTIME* window_time)] |
| +- LogicalTableFunctionScan(invocation=[TUMBLE($3, DESCRIPTOR($3), 3000:INTERVAL SECOND)], rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end, TIMESTAMP_LTZ(3) *ROWTIME* window_time)]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end, TIMESTAMP_LTZ(3) *ROWTIME* window_time)] |
| +- LogicalProject(symbol=[$0], price=[$1], tax=[$2], matchRowtime=[$3]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime)] |
| +- LogicalMatch(partition=[[0]], order=[[1 ASC-nulls-first]], outputFields=[[symbol, price, tax, matchRowtime]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[_UTF-16LE'A'], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[>(PREV(A.$2, 0), 0)]], inputFields=[[symbol, ts_ltz, price, tax]]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime)] |
| +- LogicalWatermarkAssigner(rowtime=[ts_ltz], watermark=[-($1, 1000:INTERVAL SECOND)]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_LTZ(3) *ROWTIME* ts_ltz, INTEGER price, INTEGER tax)] |
| +- LogicalTableScan(table=[[default_catalog, default_database, Ticker]]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_WITH_LOCAL_TIME_ZONE(3) ts_ltz, INTEGER price, INTEGER tax)] |
| ]]> |
| </Resource> |
| <Resource name="optimized rel plan"> |
| <![CDATA[ |
| WindowTableFunction(window=[TUMBLE(time_col=[matchRowtime], size=[3 s])]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end, TIMESTAMP_LTZ(3) *ROWTIME* window_time)] |
| +- Match(partitionBy=[symbol], orderBy=[ts_ltz ASC], measures=[FINAL(A.price) AS price, FINAL(A.tax) AS tax, FINAL(MATCH_ROWTIME(*.ts_ltz)) AS matchRowtime], rowsPerMatch=[ONE ROW PER MATCH], after=[SKIP TO NEXT ROW], pattern=[_UTF-16LE'A'], define=[{A=>(PREV(A.$2, 0), 0)}]), rowType=[RecordType(VARCHAR(2147483647) symbol, INTEGER price, INTEGER tax, TIMESTAMP_LTZ(3) *ROWTIME* matchRowtime)] |
| +- Exchange(distribution=[hash[symbol]]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_LTZ(3) *ROWTIME* ts_ltz, INTEGER price, INTEGER tax)] |
| +- WatermarkAssigner(rowtime=[ts_ltz], watermark=[-(ts_ltz, 1000:INTERVAL SECOND)]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_LTZ(3) *ROWTIME* ts_ltz, INTEGER price, INTEGER tax)] |
| +- TableSourceScan(table=[[default_catalog, default_database, Ticker]], fields=[symbol, ts_ltz, price, tax]), rowType=[RecordType(VARCHAR(2147483647) symbol, TIMESTAMP_WITH_LOCAL_TIME_ZONE(3) ts_ltz, INTEGER price, INTEGER tax)] |
| ]]> |
| </Resource> |
| </TestCase> |
| </Root> |