fix split windows
This commit is contained in:
parent
db00faeb02
commit
cf750bfdd4
|
@ -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};
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue