2025-06-17 07:25:25 +00:00
import time
import math
2025-06-22 10:37:36 +00:00
from new_test_framework . utils import (
tdLog ,
tdSql ,
tdStream ,
StreamTableType ,
StreamTable ,
StreamItem ,
StreamResultCheckMode ,
)
2025-06-17 11:28:40 +00:00
from datetime import datetime
2025-06-17 07:25:25 +00:00
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
class TestStreamDevBasic :
def setup_class ( cls ) :
tdLog . debug ( f " start to execute { __file__ } " )
def test_stream_dev_basic ( self ) :
""" Stream basic development testing 11
Verification testing during the development process .
Catalog :
- Streams : Others
Since : v3 .3 .3 .7
Labels : common , ci
Jira : None
History :
- 2025 - 6 - 16 xsRen Created
"""
tdStream . createSnode ( )
2025-06-19 08:32:59 +00:00
# self.generateDataExample()
self . checkResultExample ( )
2025-06-19 07:18:51 +00:00
self . stateWindowTest1 ( )
self . stateWindowTest2 ( )
2025-06-22 10:37:36 +00:00
2025-06-17 08:34:32 +00:00
@staticmethod
def custom_cint_generator ( row ) :
2025-06-19 07:18:51 +00:00
return str ( row / 10 ) # 每行的 cint 为 row / 10
2025-06-22 10:37:36 +00:00
2025-06-19 01:43:07 +00:00
def generateDataExample ( self ) :
2025-06-17 07:25:25 +00:00
tdLog . info ( f " basic test 1 " )
tdStream . dropAllStreamsAndDbs ( )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
tdStream . init_database ( " test " )
tdStream . init_database ( " test1 " )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
st1 = StreamTable ( " test " , " st " , StreamTableType . TYPE_SUP_TABLE )
st1 . createTable ( )
st1 . appendSubTables ( 200 , 240 )
st1 . append_data ( 0 , 40 )
st1 . append_subtable_data ( " st_1 " , 40 , 50 )
st1 . update_data ( 3 , 4 )
st1 . update_subtable_data ( " st_1 " , 6 , 7 )
st1 . delete_data ( 7 , 9 )
st1 . delete_subtable_data ( " st_2 " , 8 , 10 )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
ntb = StreamTable ( " test " , " ntb " , StreamTableType . TYPE_NORMAL_TABLE )
ntb . createTable ( )
ntb . append_data ( 0 , 40 )
ntb . update_data ( 3 , 4 )
ntb . delete_data ( 7 , 9 )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
ntb2 = StreamTable ( " test1 " , " ntb2 " , StreamTableType . TYPE_NORMAL_TABLE )
ntb2 . set_columns ( " ts timestamp, c0 int, c1 int, c2 int " )
2025-06-17 08:34:32 +00:00
ntb2 . register_column_generator ( " c0 " , self . custom_cint_generator )
2025-06-17 07:25:25 +00:00
ntb2 . createTable ( )
ntb2 . append_data ( 0 , 10 )
ntb2 . append_data ( 20 , 30 )
ntb2 . update_data ( 3 , 6 )
2025-06-22 10:37:36 +00:00
2025-06-19 08:32:59 +00:00
def checkResultExample ( self ) :
tdLog . info ( f " basic test 1 " )
tdStream . dropAllStreamsAndDbs ( )
2025-06-22 10:37:36 +00:00
2025-06-19 08:32:59 +00:00
tdStream . init_database ( " test " )
2025-06-22 10:37:36 +00:00
2025-06-19 08:32:59 +00:00
st1 = StreamTable ( " test " , " trigger " , StreamTableType . TYPE_SUP_TABLE )
st1 . createTable ( 3 )
st1 . append_data ( 0 , 10 )
2025-06-22 10:37:36 +00:00
tdSql . error (
f " create stream s0 state_window (cint) from test.trigger options(fill_history_first(1)) into test.out0 \
as select _twstart ts , _twend , avg ( cint ) avg_cint , count ( cint ) count_cint from % % trows ; "
)
2025-06-19 10:33:11 +00:00
sql = f " create stream s0 state_window (cint) from test.trigger_0 options(fill_history_first(1)) into test.out0 \
2025-06-19 08:32:59 +00:00
as select _twstart ts , _twend , avg ( cint ) avg_cint , count ( cint ) count_cint from % % trows ; "
2025-06-22 10:37:36 +00:00
2025-06-19 08:32:59 +00:00
stream = StreamItem (
id = 0 ,
stream = sql ,
res_query = " select * from test.out0; " ,
2025-06-22 10:37:36 +00:00
exp_query = " select ' {_wstart} ' , ' {_twend} ' , avg(cint), count(cint) from test.trigger_0 where cts >= ' {_wstart} ' and cts <= ' {_twend} ' ; " ,
check_mode = StreamResultCheckMode . CHECK_ROW_BY_SQL ,
exp_query_param_mapping = { " _wstart " : 0 , " _twend " : 1 } ,
2025-06-19 08:32:59 +00:00
)
stream . createStream ( )
expectRows = 9
stream . awaitRowStability ( expectRows )
stream . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
def stateWindowTest1 ( self ) :
tdLog . info ( f " state window test 1 " )
2025-06-17 07:25:25 +00:00
tdStream . dropAllStreamsAndDbs ( )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
tdStream . init_database ( " test " )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
trigger = StreamTable ( " test " , " trigger " , StreamTableType . TYPE_SUP_TABLE )
trigger . createTable ( 10 )
trigger . append_data ( 0 , 40 )
trigger . update_data ( 3 , 4 )
2025-06-22 10:37:36 +00:00
2025-06-17 07:25:25 +00:00
st1 = StreamTable ( " test " , " st " , StreamTableType . TYPE_SUP_TABLE )
st1 . createTable ( )
st1 . appendSubTables ( 200 , 240 )
st1 . append_data ( 0 , 40 )
2025-06-22 10:37:36 +00:00
2025-06-21 01:00:39 +00:00
sql = f " create stream s7 state_window (cint) from test.trigger_0 options(fill_history_first(1)) into st7 as select _twstart ts, _twend, avg(cint) avg_cint, count(cint) count_cint from test.st where cts <= _twstart; "
2025-06-22 10:37:36 +00:00
2025-06-17 11:28:40 +00:00
stream1 = StreamItem (
id = 0 ,
stream = sql ,
res_query = " select * from test.st7; " ,
2025-06-22 10:37:36 +00:00
exp_query = " select ' {_wstart} ' , ' {_twend} ' , avg(cint), count(cint) from test.st where cts <= ' {_wstart} ' ; " ,
check_mode = StreamResultCheckMode . CHECK_ROW_BY_SQL ,
exp_query_param_mapping = { " _wstart " : 0 , " _twend " : 1 } ,
2025-06-17 11:28:40 +00:00
)
2025-06-19 07:18:51 +00:00
2025-06-17 11:28:40 +00:00
stream1 . createStream ( )
2025-06-19 01:43:07 +00:00
expectRows = 39
stream1 . awaitRowStability ( expectRows )
2025-06-19 07:18:51 +00:00
stream1 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 01:43:07 +00:00
# 追加写入
trigger . append_data ( 60 , 70 )
expectRows = 49
stream1 . awaitRowStability ( expectRows )
2025-06-19 07:18:51 +00:00
stream1 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 01:43:07 +00:00
# 乱序写入
trigger . append_data ( 50 , 55 )
expectRows = 54
stream1 . awaitRowStability ( expectRows )
2025-06-19 07:18:51 +00:00
stream1 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 01:43:07 +00:00
# 子表追加写入
trigger . append_subtable_data ( " trigger_1 " , 55 , 60 )
expectRows = 59
stream1 . awaitRowStability ( expectRows )
2025-06-19 07:18:51 +00:00
stream1 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 01:43:07 +00:00
# 更新写入
tdSql . execute ( " delete * from st7; " )
trigger . update_data ( 10 , 20 )
trigger . append_data ( 70 , 71 )
expectRows = 60
stream1 . awaitRowStability ( expectRows )
2025-06-22 10:37:36 +00:00
stream1 . checkResultsByRow ( )
2025-06-19 01:43:07 +00:00
# 删除数据
trigger . delete_data ( 30 , 40 )
trigger . append_data ( 71 , 72 )
expectRows = 61
stream1 . awaitRowStability ( expectRows )
2025-06-19 07:18:51 +00:00
stream1 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 01:43:07 +00:00
# 删除子表数据
trigger . delete_subtable_data ( " st_1 " , 20 , 30 )
trigger . append_data ( 72 , 73 )
expectRows = 62
stream1 . awaitRowStability ( expectRows )
2025-06-19 07:18:51 +00:00
stream1 . checkResultsByRow ( )
2025-06-17 07:25:25 +00:00
2025-06-19 07:18:51 +00:00
tdLog . info ( " ======over " )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
def stateWindowTest2 ( self ) :
tdLog . info ( f " state window test 2 " )
tdStream . dropAllStreamsAndDbs ( )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
tdStream . init_database ( " test " )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
trigger = StreamTable ( " test " , " trigger " , StreamTableType . TYPE_SUP_TABLE )
trigger . register_column_generator ( " cint " , self . custom_cint_generator )
trigger . setInterval ( 0.1 )
trigger . createTable ( 10 )
trigger . append_data ( 0 , 40 )
trigger . update_data ( 3 , 4 )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
st1 = StreamTable ( " test " , " st " , StreamTableType . TYPE_SUP_TABLE )
st1 . createTable ( )
st1 . setInterval ( 0.1 )
st1 . appendSubTables ( 200 , 240 )
st1 . append_data ( 0 , 40 )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
sql1 = f " create stream s1 state_window (cint) from test.trigger options(fill_history_first(1)) into out1 as \
select _twstart ts , _twend , avg ( cint ) avg_cint , count ( cint ) count_cint from test . st where cts < = _twstart ; "
sql2 = f " create stream s2 state_window (cint) from test.trigger partition by tbname options(fill_history_first(1)) into out2 as \
select _twstart ts , _twend , avg ( cint ) avg_cint , count ( cint ) count_cint from test . st where cts < = _twstart ; "
2025-06-19 08:04:26 +00:00
sql3 = f " create stream s3 state_window (cint) from test.trigger partition by tbname options(fill_history_first(1)) into out3 as \
2025-06-19 08:32:59 +00:00
select _twstart ts , _twend , avg ( cint ) avg_cint , count ( cint ) count_cint from % % trows ; "
2025-06-19 07:18:51 +00:00
stream1 = StreamItem (
id = 0 ,
stream = sql1 ,
res_query = " select * from test.out1; " ,
2025-06-22 10:37:36 +00:00
exp_query = " select ' {_wstart} ' , ' {_twend} ' , avg(cint), count(cint) from test.st where cts <= ' {_wstart} ' ; " ,
check_mode = StreamResultCheckMode . CHECK_ROW_BY_SQL ,
exp_query_param_mapping = { " _wstart " : 0 , " _twend " : 1 } ,
2025-06-19 07:18:51 +00:00
)
stream2 = StreamItem (
id = 0 ,
stream = sql2 ,
res_query = " select * from test.out2 where tag_tbname= ' trigger_0 ' ; " ,
2025-06-22 10:37:36 +00:00
exp_query = " select ' {_wstart} ' , ' {_twend} ' , avg(cint), count(cint) from test.st where cts <= ' {_wstart} ' ; " ,
check_mode = StreamResultCheckMode . CHECK_ROW_BY_SQL ,
exp_query_param_mapping = { " _wstart " : 0 , " _twend " : 1 } ,
2025-06-19 07:18:51 +00:00
)
2025-06-19 08:04:26 +00:00
stream3 = StreamItem (
id = 0 ,
stream = sql3 ,
res_query = " select * from test.out3 where tag_tbname= ' trigger_0 ' ; " ,
2025-06-22 10:37:36 +00:00
exp_query = " select ' {_wstart} ' , ' {_twend} ' , avg(cint), count(cint) from test.trigger_0 where cts <= ' {_wstart} ' and cts <= ' {_twend} ' ; " ,
check_mode = StreamResultCheckMode . CHECK_ROW_BY_SQL ,
exp_query_param_mapping = { " _wstart " : 0 , " _twend " : 1 } ,
2025-06-19 08:04:26 +00:00
)
2025-06-19 07:18:51 +00:00
stream1 . createStream ( )
stream2 . createStream ( )
2025-06-19 08:04:26 +00:00
stream3 . createStream ( )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
expectRows1 = 5
stream1 . awaitRowStability ( expectRows1 )
stream1 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 07:18:51 +00:00
expectRows2 = 50
stream2 . awaitRowStability ( expectRows2 )
stream2 . checkResultsByRow ( )
2025-06-22 10:37:36 +00:00
2025-06-19 08:04:26 +00:00
expectRows3 = 50
stream3 . awaitRowStability ( expectRows3 )
stream3 . checkResultsByRow ( )