fix: fill if window pseudo column
This commit is contained in:
parent
1540881cb6
commit
dc6baa13a6
|
@ -36,6 +36,7 @@
|
||||||
#define GET_DEST_SLOT_ID(_p) ((_p)->pExpr->base.resSchema.slotId)
|
#define GET_DEST_SLOT_ID(_p) ((_p)->pExpr->base.resSchema.slotId)
|
||||||
|
|
||||||
static void doSetVal(SColumnInfoData* pDstColInfoData, int32_t rowIndex, const SGroupKeys* pKey);
|
static void doSetVal(SColumnInfoData* pDstColInfoData, int32_t rowIndex, const SGroupKeys* pKey);
|
||||||
|
static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, int32_t rowIndex);
|
||||||
|
|
||||||
static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowIndex) {
|
static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowIndex) {
|
||||||
for(int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
|
for(int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
|
||||||
|
@ -43,9 +44,8 @@ static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowInd
|
||||||
int32_t dstSlotId = GET_DEST_SLOT_ID(pCol);
|
int32_t dstSlotId = GET_DEST_SLOT_ID(pCol);
|
||||||
SColumnInfoData* pDstColInfo = taosArrayGet(pBlock->pDataBlock, dstSlotId);
|
SColumnInfoData* pDstColInfo = taosArrayGet(pBlock->pDataBlock, dstSlotId);
|
||||||
if (pCol->notFillCol) {
|
if (pCol->notFillCol) {
|
||||||
if (pDstColInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
bool filled = fillIfWindowPseudoColumn(pFillInfo, pCol, pDstColInfo, rowIndex);
|
||||||
colDataAppend(pDstColInfo, rowIndex, (const char*)&pFillInfo->currentKey, false);
|
if (!filled) {
|
||||||
} else {
|
|
||||||
SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
|
SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
|
||||||
SGroupKeys* pKey = taosArrayGet(p, i);
|
SGroupKeys* pKey = taosArrayGet(p, i);
|
||||||
doSetVal(pDstColInfo, rowIndex, pKey);
|
doSetVal(pDstColInfo, rowIndex, pKey);
|
||||||
|
@ -76,8 +76,32 @@ static void doSetUserSpecifiedValue(SColumnInfoData* pDst, SVariant* pVar, int32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool fillWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, int32_t rowIndex) {
|
//fill windows pseudo column, _wstart, _wend, _wduration and return true, otherwise return false
|
||||||
//fill windows pseduo column, _wstart, _wend, _wduration and return true
|
static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, int32_t rowIndex) {
|
||||||
|
if (!pCol->notFillCol) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pCol->pExpr->pExpr->nodeType == QUERY_NODE_COLUMN) {
|
||||||
|
if (pCol->pExpr->base.numOfParams != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pCol->pExpr->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_START) {
|
||||||
|
colDataAppend(pDstColInfoData, rowIndex, (const char*)&pFillInfo->currentKey, false);
|
||||||
|
return true;
|
||||||
|
} else if (pCol->pExpr->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_END) {
|
||||||
|
//TODO: include endpoint
|
||||||
|
SInterval* pInterval = &pFillInfo->interval;
|
||||||
|
int32_t step = (pFillInfo->order == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
int64_t windowEnd =
|
||||||
|
taosTimeAdd(pFillInfo->currentKey, pInterval->sliding * step, pInterval->slidingUnit, pInterval->precision);
|
||||||
|
colDataAppend(pDstColInfoData, rowIndex, (const char*)&windowEnd, false);
|
||||||
|
return true;
|
||||||
|
} else if (pCol->pExpr->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_DURATION) {
|
||||||
|
//TODO: include endpoint
|
||||||
|
colDataAppend(pDstColInfoData, rowIndex, (const char*)&pFillInfo->interval.sliding, false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,10 +121,8 @@ static void doFillOneRow(SFillInfo* pFillInfo, SSDataBlock* pBlock, SSDataBlock*
|
||||||
SFillColInfo* pCol = &pFillInfo->pFillCol[i];
|
SFillColInfo* pCol = &pFillInfo->pFillCol[i];
|
||||||
|
|
||||||
SColumnInfoData* pDstColInfoData = taosArrayGet(pBlock->pDataBlock, GET_DEST_SLOT_ID(pCol));
|
SColumnInfoData* pDstColInfoData = taosArrayGet(pBlock->pDataBlock, GET_DEST_SLOT_ID(pCol));
|
||||||
|
bool filled = fillIfWindowPseudoColumn(pFillInfo, pCol, pDstColInfoData, index);
|
||||||
if (pDstColInfoData->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
if (!filled) {
|
||||||
colDataAppend(pDstColInfoData, index, (const char*)&pFillInfo->currentKey, false);
|
|
||||||
} else {
|
|
||||||
SGroupKeys* pKey = taosArrayGet(p, i);
|
SGroupKeys* pKey = taosArrayGet(p, i);
|
||||||
doSetVal(pDstColInfoData, index, pKey);
|
doSetVal(pDstColInfoData, index, pKey);
|
||||||
}
|
}
|
||||||
|
@ -111,10 +133,8 @@ static void doFillOneRow(SFillInfo* pFillInfo, SSDataBlock* pBlock, SSDataBlock*
|
||||||
for (int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
|
for (int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
|
||||||
SFillColInfo* pCol = &pFillInfo->pFillCol[i];
|
SFillColInfo* pCol = &pFillInfo->pFillCol[i];
|
||||||
SColumnInfoData* pDstColInfoData = taosArrayGet(pBlock->pDataBlock, GET_DEST_SLOT_ID(pCol));
|
SColumnInfoData* pDstColInfoData = taosArrayGet(pBlock->pDataBlock, GET_DEST_SLOT_ID(pCol));
|
||||||
|
bool filled = fillIfWindowPseudoColumn(pFillInfo, pCol, pDstColInfoData, index);
|
||||||
if (pDstColInfoData->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
if (!filled) {
|
||||||
colDataAppend(pDstColInfoData, index, (const char*)&pFillInfo->currentKey, false);
|
|
||||||
} else {
|
|
||||||
SGroupKeys* pKey = taosArrayGet(p, i);
|
SGroupKeys* pKey = taosArrayGet(p, i);
|
||||||
doSetVal(pDstColInfoData, index, pKey);
|
doSetVal(pDstColInfoData, index, pKey);
|
||||||
}
|
}
|
||||||
|
@ -132,9 +152,8 @@ static void doFillOneRow(SFillInfo* pFillInfo, SSDataBlock* pBlock, SSDataBlock*
|
||||||
int16_t type = pDstCol->info.type;
|
int16_t type = pDstCol->info.type;
|
||||||
|
|
||||||
if (pCol->notFillCol) {
|
if (pCol->notFillCol) {
|
||||||
if (type == TSDB_DATA_TYPE_TIMESTAMP) {
|
bool filled = fillIfWindowPseudoColumn(pFillInfo, pCol, pDstCol, index);
|
||||||
colDataAppend(pDstCol, index, (const char*)&pFillInfo->currentKey, false);
|
if (!filled) {
|
||||||
} else {
|
|
||||||
SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
|
SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
|
||||||
SGroupKeys* pKey = taosArrayGet(p, i);
|
SGroupKeys* pKey = taosArrayGet(p, i);
|
||||||
doSetVal(pDstCol, index, pKey);
|
doSetVal(pDstCol, index, pKey);
|
||||||
|
@ -175,9 +194,8 @@ static void doFillOneRow(SFillInfo* pFillInfo, SSDataBlock* pBlock, SSDataBlock*
|
||||||
SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, slotId);
|
SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, slotId);
|
||||||
|
|
||||||
if (pCol->notFillCol) {
|
if (pCol->notFillCol) {
|
||||||
if (pDst->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
bool filled = fillIfWindowPseudoColumn(pFillInfo, pCol, pDst, index);
|
||||||
colDataAppend(pDst, index, (const char*)&pFillInfo->currentKey, false);
|
if (!filled) {
|
||||||
} else {
|
|
||||||
SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
|
SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
|
||||||
SGroupKeys* pKey = taosArrayGet(p, i);
|
SGroupKeys* pKey = taosArrayGet(p, i);
|
||||||
doSetVal(pDst, index, pKey);
|
doSetVal(pDst, index, pKey);
|
||||||
|
|
Loading…
Reference in New Issue