TDengine/test/cases/13-StreamProcessing/07-SubQuery/test_subquery_basic.py

159 lines
5.5 KiB
Python
Raw Normal View History

2025-05-26 05:50:51 +00:00
import time
from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck, tdStream
class TestStreamSubqueryBasic:
def setup_class(cls):
tdLog.debug(f"start to execute {__file__}")
def test_stream_subquery_basic(self):
"""As SubQuery basic test
1. -
Catalog:
- Streams:SubQuery
Since: v3.0.0.0
Labels: common,ci
Jira: None
History:
- 2025-5-13 Simon Guan Create Case
"""
2025-05-28 05:46:20 +00:00
self.createSnode()
self.createDatabase()
self.prepareQueryData()
self.prepareTriggerData()
self.createStream()
2025-05-28 06:56:30 +00:00
self.triggerStream()
2025-05-28 05:46:20 +00:00
self.checkStreamStatus()
self.checkResults()
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
tdSql.pause()
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
def createSnode(self):
2025-05-26 05:50:51 +00:00
tdLog.info("create snode")
tdStream.createSnode(1)
2025-05-28 05:46:20 +00:00
def createDatabase(self):
2025-05-26 05:50:51 +00:00
tdLog.info(f"create database")
2025-05-28 05:46:20 +00:00
tdSql.prepare(dbname="qdb", vgroups=1)
tdSql.prepare(dbname="tdb", vgroups=1)
2025-05-28 06:56:30 +00:00
tdSql.prepare("rdb", vgroups=1)
2025-05-26 05:50:51 +00:00
# tdSql.prepare("qdb2", vgroups=1)
clusterComCheck.checkDbReady("qdb")
2025-05-28 05:46:20 +00:00
clusterComCheck.checkDbReady("tdb")
2025-05-28 06:56:30 +00:00
clusterComCheck.checkDbReady("rdb")
2025-05-26 05:50:51 +00:00
# clusterComCheck.checkDbReady("qdb2")
2025-05-28 05:46:20 +00:00
def prepareQueryData(self):
tdLog.info("prepare child tables for query")
tdStream.prepareChildTables(db="qdb", stb="meters", tbBatch=2, rowBatch=2)
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
tdLog.info("prepare normal tables for query")
tdStream.prepareNormalTables(db="qdb", tables=10, rowBatch=2)
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
tdLog.info("prepare virtual tables for query")
tdStream.prepareVirtualTables(db="qdb", tables=10)
tdSql.query("select cint from qdb.v0")
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
def prepareTriggerData(self):
tdLog.info("prepare child tables for trigger")
tdSql.execute(
"create table tdb.triggers (ts timestamp, c1 int, c2 int) tags(t1 int);"
2025-05-26 05:50:51 +00:00
)
2025-05-28 05:46:20 +00:00
tdSql.execute("create table tdb.t1 using tdb.triggers tags(1)")
tdSql.execute("create table tdb.t2 using tdb.triggers tags(1)")
tdSql.execute("create table tdb.t3 using tdb.triggers tags(1)")
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
def createStream(self):
2025-05-28 06:56:30 +00:00
data = [
2025-05-26 05:50:51 +00:00
self.TestStreamSubqueryBaiscItem(
2025-05-28 06:56:30 +00:00
id=1,
2025-05-27 01:53:00 +00:00
trigger="interval(5m) sliding(5m) from qdb.meters partition by tbname",
output="tags(gid bigint as _tgrpid)",
2025-05-28 06:56:30 +00:00
sub_query="select _twstart ts, count(cint) c1, avg(cint) c2 from qdb.meters where ts >= _twstart and ts < _twend;",
res_query="select ts, c1, c2 from rdb.s1",
exp_query="select _wstart ts, count(cint) c1, avg(cint) c2 from qdb.meters interval(5m)",
2025-05-26 05:50:51 +00:00
exp_rows=[],
),
self.TestStreamSubqueryBaiscItem(
2025-05-28 06:56:30 +00:00
id=2,
2025-05-27 01:53:00 +00:00
trigger="create stream s0 interval(5m) sliding(5m) from qdb.meters into rdb.rs0 tags (gid bigint as _tgrpid)",
output="",
2025-05-26 05:50:51 +00:00
sub_query="select _wstart ts, count(current) cnt from qdb.meters",
2025-05-27 01:53:00 +00:00
res_query="select count(current) cnt from rsb.s1 interval(5m)",
2025-05-26 05:50:51 +00:00
exp_query="select count(current) cnt from qdb.meters where ts >= 1704038400000 and ts < 1704038700000",
exp_rows=(0 for _ in range(12)),
),
]
2025-05-28 06:56:30 +00:00
self.streams = []
self.streams.append(data[0])
2025-05-26 05:50:51 +00:00
2025-05-28 06:56:30 +00:00
tdLog.info(f"create total:{len(self.streams)} streams")
2025-05-26 05:50:51 +00:00
for stream in self.streams:
2025-05-28 06:56:30 +00:00
stream.createStream()
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
def checkStreamStatus(self):
2025-05-28 06:56:30 +00:00
tdLog.info(f"wait total:{len(self.streams)} streams run finish")
2025-05-28 05:46:20 +00:00
tdStream.checkStreamStatus()
2025-05-28 06:56:30 +00:00
def triggerStream(self):
tdLog.info("write data to trigger stream")
2025-05-28 05:46:20 +00:00
sqls = [
"insert into tdb.t1 values ('2025-01-01 00:00:00', 0, 0), ('2025-01-01 00:05:00', 1, 1), ('2025-01-01 00:10:00', 2, 2)"
]
tdSql.executes(sqls)
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
def checkResults(self):
2025-05-28 06:56:30 +00:00
tdLog.info(f"check total:{len(self.streams)} streams result")
2025-05-26 05:50:51 +00:00
for stream in self.streams:
2025-05-28 06:56:30 +00:00
stream.checkResults(print=True)
2025-05-26 05:50:51 +00:00
class TestStreamSubqueryBaiscItem:
2025-05-28 05:46:20 +00:00
def __init__(
self, id, trigger, output, sub_query, res_query, exp_query, exp_rows=[]
):
2025-05-26 05:50:51 +00:00
self.id = id
self.name = f"s{id}"
2025-05-27 01:53:00 +00:00
self.trigger = trigger
self.output = output
2025-05-26 05:50:51 +00:00
self.sub_query = sub_query
self.res_query = res_query
self.exp_query = exp_query
self.exp_rows = exp_rows
self.exp_result = []
2025-05-28 05:46:20 +00:00
def createStream(self):
2025-05-27 01:53:00 +00:00
sql = f"create stream s{self.id} {self.trigger} into rdb.s{self.id} {self.output} as {self.sub_query}"
2025-05-26 05:50:51 +00:00
tdLog.info(f"create stream:{self.name}, sql:{sql}")
2025-05-28 06:56:30 +00:00
tdSql.execute(sql)
2025-05-26 05:50:51 +00:00
2025-05-28 05:46:20 +00:00
def checkResults(self, print=False):
2025-05-26 05:50:51 +00:00
tdLog.info(f"check stream:{self.name} result")
2025-05-28 06:56:30 +00:00
tdSql.pause()
2025-05-26 05:50:51 +00:00
tmp_result = tdSql.getResult(self.exp_query)
if self.exp_rows == []:
self.exp_rows = range(len(tmp_result))
for r in self.exp_rows:
self.exp_result.append(tmp_result[r])
if print:
tdSql.printResult(
f"{self.name} expect",
input_result=self.exp_result,
input_sql=self.exp_query,
)
2025-05-27 01:54:55 +00:00
tdSql.checkResultsByArray(self.res_query, self.exp_result, self.exp_query)
2025-05-26 05:50:51 +00:00
tdLog.info(f"check stream:{self.name} result successfully")