From 9478fd995e91b6f5c100227ae4a82815ac8274ca Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 14 Apr 2024 11:16:38 +0800 Subject: [PATCH] feat: add compressBasic.py case --- tests/army/community/storage/compressBasic.py | 19 ++-- tests/army/frame/autogen.py | 92 +++++++++++++++++-- tests/army/frame/sql.py | 2 +- 3 files changed, 99 insertions(+), 14 deletions(-) diff --git a/tests/army/community/storage/compressBasic.py b/tests/army/community/storage/compressBasic.py index 10366703f4..666e6da637 100644 --- a/tests/army/community/storage/compressBasic.py +++ b/tests/army/community/storage/compressBasic.py @@ -46,7 +46,7 @@ class TDTestCase(TBase): # datatype 17 dtypes = [ "tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned", "bigint","bigint unsigned","timestamp","bool","float","double","binary(16)","nchar(16)", - "varchar(16)","varbinary(16)","geometry(32)"] + "varchar(16)","varbinary(16)"] def genAllSqls(self, stbName, max): # encode @@ -222,22 +222,27 @@ class TDTestCase(TBase): tdLog.debug(f"start to excute {__file__}") # create db and stable - self.autoGen = AutoGen() + self.autoGen = AutoGen(step = 10, genDataMode = "fillts") self.autoGen.create_db(self.db, 2, 3) tdSql.execute(f"use {self.db}") - self.colCnt = 18 - self.autoGen.create_stable(self.stb, 5, self.colCnt, 8, 8) + self.colCnt = 17 + self.autoGen.create_stable(self.stb, 5, self.colCnt, 32, 32) self.childCnt = 4 self.autoGen.create_child(self.stb, "d", self.childCnt) - self.autoGen.insert_data(10000) + self.autoGen.insert_data(1000) # sql syntax self.checkSqlSyntax() # operateor - self.writeData(10000) + self.writeData(1000) self.flushDb() - self.writeData(10000) + self.writeData(1000) + + # check data correct + sql = f"select * from {self.db}.{self.stb}" + tdSql.query(sql) + self.autoGen.dataCorrect(tdSql.res, tdSql.getRows(), 10000) tdLog.success(f"{__file__} successfully executed") diff --git a/tests/army/frame/autogen.py b/tests/army/frame/autogen.py index 4b5a8e1384..42979cbec0 100644 --- a/tests/army/frame/autogen.py +++ b/tests/army/frame/autogen.py @@ -8,18 +8,21 @@ import threading import random import string import time +import math # # Auto Gen class # + +# genDataMode fillone fillts others class AutoGen: - def __init__(self, startTs = 1600000000000, step = 1000, batch = 500, fillOne=False): + def __init__(self, startTs = 1600000000000, step = 1000, batch = 500, genDataMode="others"): self.startTs = startTs self.ts = startTs self.step = step self.batch_size = batch - self.fillOne = fillOne + self.genDataMode = genDataMode seed = time.time() % 10000 random.seed(seed) @@ -111,6 +114,76 @@ class AutoGen: datas += '1' return datas + + # gen tags data + def fillts_data(self, ts, marr): + datas = "" + for c in marr: + data = "" + if c == 0 : # timestamp + data = "%d" % (ts) + elif c <= 2 : # tinyint + data = "%d"%(ts%100) + elif c <= 4 : # smallint + data = "%d"%(ts%10000) + elif c <= 6 : # int32 + data = f"{ts%1000000000}" + elif c <= 8 : # bigint + data = f"{ts}" + elif c == 9 : # float + data = "%f"%(ts%10000000 ) + elif c == 10 : # double + data = "%f"%(ts%1000000000000000) + elif c <= 11 : # bool + data = "%d"%(ts%2) + elif c == 16 : # geometry + data = f'"point({ts%100} {ts%1000})"' + else : # string binary nchar varchar + data = f"'{ts}'" + if datas != "": + datas += "," + datas += data + + return datas + + # check row correct + def rowCorrect(self, ts, value, c): + if c == 0 : # timestamp + ival = int(value.timestamp() * 1000) + return (ival == ts, ts) + elif c <= 2 : # tinyint + return (value == ts%100, ts%100) + elif c <= 4 : # smallint + return (value == ts%10000, ts%10000) + elif c <= 6 : # int + return (value == ts%1000000000, ts%1000000000) + elif c <= 8 : # bigint + return (value == ts, ts) + elif c == 9 : # float + fval = (ts%10000000) + return (abs(value - fval) < 0.01, fval) + elif c == 10 : # double + fval = (ts%1000000000000000) + return (abs(value - fval) < 0.0001, fval) + elif c <= 11 : # bool + return (value == ts%2, ts%2) + elif c == 16 : # geometry + return (value == f'point({ts%100} {ts%1000})', f'point({ts%100} {ts%1000})') + else : # string binary nchar varchar + return (int(value) == ts, f"{ts}") + + + # check row data correct + def dataCorrect(self, res, rowCnt, showStep = 1000): + colCnt = len(self.mcols) + for i in range(rowCnt): + for j in range(colCnt): + ts = int(res[i][0].timestamp() * 1000) + ret, value = self.rowCorrect(ts, res[i][j+1], self.mcols[j]) # j + 1 , remove first ts column + if ret == False: + tdLog.exit(f"rowCorrect check failed. i={i} j={j} data={res[i][j+1]} expect={value}") + if i > 0 and i % showStep == 0: + tdLog.info(f"check data correct rows {i}") # generate specail wide random string @@ -151,17 +224,24 @@ class AutoGen: # loop do for i in range(cnt): - if self.fillOne : + # gen other col data + if self.genDataMode == "fillone": value = self.fillone_data(i, self.mcols) - else: - value = self.gen_data(i, self.mcols) - ts += step + elif self.genDataMode == "fillts": + value = self.fillts_data(ts, self.mcols) + else: + value = self.gen_data(ts, self.mcols) + + # check to execute sql values += f"({ts},{value}) " if batch_size == 1 or (i > 0 and i % batch_size == 0) : sql = f"insert into {self.dbname}.{child_name} values {values}" tdSql.execute(sql) values = "" + # move next + ts += step + # end batch if values != "": sql = f"insert into {self.dbname}.{child_name} values {values}" diff --git a/tests/army/frame/sql.py b/tests/army/frame/sql.py index dd31d6da9a..91cd29d18b 100644 --- a/tests/army/frame/sql.py +++ b/tests/army/frame/sql.py @@ -168,7 +168,7 @@ class TDSql: time.sleep(1) continue - def execute(self, sql, queryTimes=30, show=False): + def execute(self, sql, queryTimes=10, show=False): self.sql = sql if show: tdLog.info(sql)