fix split windows

This commit is contained in:
wangjiaming0909 2024-03-06 08:51:28 +08:00
parent db00faeb02
commit cf750bfdd4
2 changed files with 26 additions and 13 deletions

View File

@ -5976,12 +5976,13 @@ static int32_t tsmaInfoCompWithIntervalDesc(const void* pLeft, const void* pRigh
}
static const STSMAOptUsefulTsma* tsmaOptFindUsefulTsma(const SArray* pUsefulTsmas, int32_t startIdx,
int64_t alignInterval, int8_t precision) {
int64_t alignInterval, int64_t alignInterval2,
int8_t precision) {
int64_t tsmaInterval;
for (int32_t i = startIdx; i < pUsefulTsmas->size; ++i) {
const STSMAOptUsefulTsma* pUsefulTsma = taosArrayGet(pUsefulTsmas, i);
getDuration(pUsefulTsma->pTsma->interval, pUsefulTsma->pTsma->unit, &tsmaInterval, precision);
if (alignInterval % tsmaInterval == 0) {
if (alignInterval % tsmaInterval == 0 && alignInterval2 % tsmaInterval == 0) {
return pUsefulTsma;
}
}
@ -6034,20 +6035,21 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc
startOfEkeyFirstWin = taosTimeTruncate(pScanRange->ekey, pInterval);
endOfEkeyFirstWin =
taosTimeAdd(startOfEkeyFirstWin, pInterval->interval, pInterval->intervalUnit, pTsmaOptCtx->precision);
isEkeyAlignedWithTsma = ((pScanRange->ekey + 1 - startOfEkeyFirstWin) % tsmaInterval == 0);
if (startOfEkeyFirstWin > startOfSkeyFirstWin) {
needTailWindow = true;
// TODO add some notes
isEkeyAlignedWithTsma = ((pScanRange->ekey + 1 - startOfEkeyFirstWin) % tsmaInterval == 0);
}
}
// add head tsma if possible
if (!isSkeyAlignedWithTsma && scanRange.ekey >= endOfSkeyFirstWin - 1) {
if (!isSkeyAlignedWithTsma) {
scanRange.ekey = TMIN(
scanRange.ekey,
taosTimeAdd(startOfSkeyFirstWin, pInterval->interval * 1, pInterval->intervalUnit, pTsmaOptCtx->precision) - 1);
const STSMAOptUsefulTsma* pTsmaFound = tsmaOptFindUsefulTsma(
pTsmaOptCtx->pUsefulTsmas, tsmaStartIdx + 1, pScanRange->skey - startOfSkeyFirstWin, pTsmaOptCtx->precision);
const STSMAOptUsefulTsma* pTsmaFound =
tsmaOptFindUsefulTsma(pTsmaOptCtx->pUsefulTsmas, tsmaStartIdx + 1, scanRange.skey - startOfSkeyFirstWin,
(scanRange.ekey + 1 - startOfSkeyFirstWin), pTsmaOptCtx->precision);
STSMAOptUsefulTsma usefulTsma = {.pTsma = pTsmaFound ? pTsmaFound->pTsma : NULL,
.scanRange = scanRange,
.pTsmaScanCols = pTsmaFound ? pTsmaFound->pTsmaScanCols : NULL};
@ -6055,7 +6057,7 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc
}
// the main tsma
if (endOfSkeyFirstWin < startOfEkeyFirstWin || (endOfSkeyFirstWin == startOfEkeyFirstWin && isSkeyAlignedWithTsma)) {
if (endOfSkeyFirstWin < startOfEkeyFirstWin || (endOfSkeyFirstWin == startOfEkeyFirstWin && (isSkeyAlignedWithTsma || isEkeyAlignedWithTsma))) {
scanRange.ekey =
TMIN(pScanRange->ekey, isEkeyAlignedWithTsma ? pScanRange->ekey : startOfEkeyFirstWin - 1);
if (!isSkeyAlignedWithTsma) {
@ -6071,8 +6073,8 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc
scanRange.skey = startOfEkeyFirstWin;
scanRange.ekey = pScanRange->ekey;
const STSMAOptUsefulTsma* pTsmaFound =
tsmaOptFindUsefulTsma(pTsmaOptCtx->pUsefulTsmas, tsmaStartIdx + 1, pScanRange->ekey + 1 - startOfEkeyFirstWin,
pTsmaOptCtx->precision);
tsmaOptFindUsefulTsma(pTsmaOptCtx->pUsefulTsmas, tsmaStartIdx + 1, scanRange.skey - startOfEkeyFirstWin,
scanRange.ekey + 1 - startOfEkeyFirstWin, pTsmaOptCtx->precision);
STSMAOptUsefulTsma usefulTsma = {.pTsma = pTsmaFound ? pTsmaFound->pTsma : NULL,
.scanRange = scanRange,
.pTsmaScanCols = pTsmaFound ? pTsmaFound->pTsmaScanCols : NULL};

View File

@ -346,7 +346,6 @@ class TSMATestSQLGenerator:
return sql
def can_ignore_res_order(self):
self.generate_str_func('tbname', 1)
return self.res_.can_ignore_res_order()
def generate_where(self) -> str:
@ -420,7 +419,12 @@ class TSMATestSQLGenerator:
ret = ''
for _ in range(used_tag_num):
tag_idx = random.randint(1,self.opts_.tag_num)
ret = ret + self.opts_.tags_prefix + f'{tag_idx},'
tag_name = self.opts_.tags_prefix + f'{tag_idx}'
if False and random.random() < 0.5:
tag_func = self.generate_str_func(tag_name, 2)
else:
tag_func = tag_name
ret = ret + f'{tag_func},'
return ret[:-1]
def generate_tbname_tag_list(self):
@ -446,7 +450,10 @@ class TSMATestSQLGenerator:
ret = ''
rand = random.random()
if rand < 0.4:
ret = 'tbname'
if False and random.random() < 0.5:
ret = self.generate_str_func('tbname', 3)
else:
ret = 'tbname'
elif rand < 0.8:
ret = self.generate_tag_list()
else:
@ -712,7 +719,7 @@ class TDTestCase:
opts.partition_by = True
opts.interval = True
opts.where_ts_range = True
for _ in range(1, 1000):
for _ in range(1, 10000):
sql_generator = TSMATestSQLGenerator(opts)
sql = sql_generator.generate_one('avg(c1), avg(c2)', 'meters', '', interval_list)
ctxs.append(TSMAQCBuilder().with_sql(sql).ignore_query_table().ignore_res_order(sql_generator.can_ignore_res_order()).get_qc())
@ -786,6 +793,10 @@ class TDTestCase:
sql = 'select avg(c1+c2) from meters'
ctxs.append(TSMAQCBuilder().with_sql(sql).should_query_with_table('meters').get_qc())
sql = 'select avg(c1), avg(c2) from meters where ts >= "2018-09-17 9:25:00" and ts < "2018-09-17 10:00:00" limit 6'
ctxs.append(TSMAQCBuilder().with_sql(sql).should_query_with_tsma('tsma1', '2018-09-17 9:25:00', '2018-09-17 9:29:59.999') \
.should_query_with_tsma('tsma2', '2018-09-17 9:30:00', '2018-09-17 9:59:59.999').get_qc())
return ctxs
def test_query_with_tsma_agg_group_by_tbname(self):