From cf750bfdd43093be3d28ddea920e275e7ce8f630 Mon Sep 17 00:00:00 2001 From: wangjiaming0909 <604227650@qq.com> Date: Wed, 6 Mar 2024 08:51:28 +0800 Subject: [PATCH] fix split windows --- source/libs/planner/src/planOptimizer.c | 20 +++++++++++--------- tests/system-test/2-query/tsma.py | 19 +++++++++++++++---- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index fbf4f4f76c..8a37a22d29 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -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}; diff --git a/tests/system-test/2-query/tsma.py b/tests/system-test/2-query/tsma.py index 665bc5fc6e..12f9f353d5 100644 --- a/tests/system-test/2-query/tsma.py +++ b/tests/system-test/2-query/tsma.py @@ -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):