fix query tsma with month/year interval
This commit is contained in:
parent
73d4fa48f9
commit
cdca567ad3
|
@ -6237,20 +6237,6 @@ static int32_t tsmaInfoCompWithIntervalDesc(const void* pLeft, const void* pRigh
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const STSMAOptUsefulTsma* tsmaOptFindUsefulTsma(const SArray* pUsefulTsmas, int32_t startIdx,
|
||||
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);
|
||||
tsmaInterval = pUsefulTsma->pTsma->interval;
|
||||
if (alignInterval % tsmaInterval == 0 && alignInterval2 % tsmaInterval == 0) {
|
||||
return pUsefulTsma;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void tsmaOptInitIntervalFromTsma(SInterval* pInterval, const STableTSMAInfo* pTsma, int8_t precision) {
|
||||
pInterval->interval = pTsma->interval;
|
||||
pInterval->intervalUnit = pTsma->unit;
|
||||
|
@ -6261,14 +6247,28 @@ static void tsmaOptInitIntervalFromTsma(SInterval* pInterval, const STableTSMAIn
|
|||
pInterval->precision = precision;
|
||||
}
|
||||
|
||||
static const STSMAOptUsefulTsma* tsmaOptFindUsefulTsma(const SArray* pUsefulTsmas, int32_t startIdx,
|
||||
int64_t startAlignInterval, int64_t endAlignInterval,
|
||||
int8_t precision) {
|
||||
SInterval tsmaInterval;
|
||||
for (int32_t i = startIdx; i < pUsefulTsmas->size; ++i) {
|
||||
const STSMAOptUsefulTsma* pUsefulTsma = taosArrayGet(pUsefulTsmas, i);
|
||||
tsmaOptInitIntervalFromTsma(&tsmaInterval, pUsefulTsma->pTsma, precision);
|
||||
if (taosTimeTruncate(startAlignInterval, &tsmaInterval) == startAlignInterval &&
|
||||
taosTimeTruncate(endAlignInterval, &tsmaInterval) == endAlignInterval) {
|
||||
return pUsefulTsma;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pScanRange) {
|
||||
bool needTailWindow = false;
|
||||
bool isSkeyAlignedWithTsma = true, isEkeyAlignedWithTsma = true;
|
||||
int64_t winSkey = TSKEY_MIN, winEkey = TSKEY_MAX;
|
||||
int64_t startOfSkeyFirstWin = pScanRange->skey, endOfSkeyFirstWin;
|
||||
int64_t startOfEkeyFirstWin = pScanRange->ekey, endOfEkeyFirstWin;
|
||||
int64_t tsmaInterval;
|
||||
SInterval interval;
|
||||
SInterval interval, tsmaInterval;
|
||||
STimeWindow scanRange = *pScanRange;
|
||||
const SInterval* pInterval = pTsmaOptCtx->queryInterval;
|
||||
const STSMAOptUsefulTsma* pUsefulTsma = taosArrayGet(pTsmaOptCtx->pUsefulTsmas, 0);
|
||||
|
@ -6281,14 +6281,14 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc
|
|||
pInterval = &interval;
|
||||
}
|
||||
|
||||
tsmaInterval = pTsma->interval;
|
||||
tsmaOptInitIntervalFromTsma(&tsmaInterval, pTsma, pTsmaOptCtx->precision);
|
||||
|
||||
// check for head windows
|
||||
if (pScanRange->skey != TSKEY_MIN) {
|
||||
startOfSkeyFirstWin = taosTimeTruncate(pScanRange->skey, pInterval);
|
||||
endOfSkeyFirstWin =
|
||||
taosTimeAdd(startOfSkeyFirstWin, pInterval->interval, pInterval->intervalUnit, pTsmaOptCtx->precision);
|
||||
isSkeyAlignedWithTsma = ((pScanRange->skey - startOfSkeyFirstWin) % tsmaInterval == 0);
|
||||
isSkeyAlignedWithTsma = taosTimeTruncate(pScanRange->skey, &tsmaInterval) == pScanRange->skey;
|
||||
} else {
|
||||
endOfSkeyFirstWin = TSKEY_MIN;
|
||||
}
|
||||
|
@ -6298,7 +6298,7 @@ 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);
|
||||
isEkeyAlignedWithTsma = taosTimeTruncate(pScanRange->ekey + 1, &tsmaInterval) == (pScanRange->ekey + 1);
|
||||
if (startOfEkeyFirstWin > startOfSkeyFirstWin) {
|
||||
needTailWindow = true;
|
||||
}
|
||||
|
@ -6310,8 +6310,7 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc
|
|||
scanRange.ekey,
|
||||
taosTimeAdd(startOfSkeyFirstWin, pInterval->interval * 1, pInterval->intervalUnit, pTsmaOptCtx->precision) - 1);
|
||||
const STSMAOptUsefulTsma* pTsmaFound =
|
||||
tsmaOptFindUsefulTsma(pTsmaOptCtx->pUsefulTsmas, 1, scanRange.skey - startOfSkeyFirstWin,
|
||||
(scanRange.ekey + 1 - startOfSkeyFirstWin), pTsmaOptCtx->precision);
|
||||
tsmaOptFindUsefulTsma(pTsmaOptCtx->pUsefulTsmas, 1, scanRange.skey, scanRange.ekey + 1, pTsmaOptCtx->precision);
|
||||
STSMAOptUsefulTsma usefulTsma = {.pTsma = pTsmaFound ? pTsmaFound->pTsma : NULL,
|
||||
.scanRange = scanRange,
|
||||
.pTsmaScanCols = pTsmaFound ? pTsmaFound->pTsmaScanCols : NULL};
|
||||
|
|
Loading…
Reference in New Issue