refactor some codes
This commit is contained in:
parent
f4e29425fe
commit
62f1491608
|
@ -2237,7 +2237,7 @@ static int32_t applyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SBlockInfo *
|
||||||
// no qualified data in current block, do not update the lastKey value
|
// no qualified data in current block, do not update the lastKey value
|
||||||
assert(pQuery->ekey < pPrimaryColumn[pQuery->pos]);
|
assert(pQuery->ekey < pPrimaryColumn[pQuery->pos]);
|
||||||
} else {
|
} else {
|
||||||
pQuery->lastKey = pPrimaryColumn[pQuery->pos + (forwardStep - 1)] + step;
|
pQuery->lastKey = pQuery->ekey + step;//pPrimaryColumn[pQuery->pos + (forwardStep - 1)] + step;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -2255,7 +2255,7 @@ static int32_t applyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SBlockInfo *
|
||||||
// no qualified data in current block, do not update the lastKey value
|
// no qualified data in current block, do not update the lastKey value
|
||||||
assert(pQuery->ekey > pPrimaryColumn[pQuery->pos]);
|
assert(pQuery->ekey > pPrimaryColumn[pQuery->pos]);
|
||||||
} else {
|
} else {
|
||||||
pQuery->lastKey = pPrimaryColumn[pQuery->pos - (forwardStep - 1)] + step;
|
pQuery->lastKey = pQuery->ekey + step;//pPrimaryColumn[pQuery->pos - (forwardStep - 1)] + step;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
forwardStep = pQuery->pos + 1;
|
forwardStep = pQuery->pos + 1;
|
||||||
|
@ -7175,6 +7175,112 @@ static void doApplyIntervalQueryOnBlock(SMeterQuerySupportObj *pSupporter, SMete
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void doApplyIntervalQueryOnBlock_rv(SMeterQuerySupportObj *pSupporter, SMeterQueryInfo *pInfo,
|
||||||
|
SBlockInfo *pBlockInfo, int64_t *pPrimaryCol, SField *pFields,
|
||||||
|
__block_search_fn_t searchFn) {
|
||||||
|
SQueryRuntimeEnv *pRuntimeEnv = &pSupporter->runtimeEnv;
|
||||||
|
SQuery * pQuery = pRuntimeEnv->pQuery;
|
||||||
|
int32_t factor = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
|
||||||
|
|
||||||
|
int64_t nextKey = -1;
|
||||||
|
bool completed = false;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
int32_t numOfRes = 0;
|
||||||
|
int32_t steps = applyFunctionsOnBlock(pRuntimeEnv, pBlockInfo, pPrimaryCol, pFields, searchFn, &numOfRes);
|
||||||
|
assert(steps > 0);
|
||||||
|
|
||||||
|
// NOTE: in case of stable query, only ONE(or ZERO) row of result generated for each query range
|
||||||
|
if (pInfo->lastResRows == 0) {
|
||||||
|
pInfo->lastResRows = numOfRes;
|
||||||
|
} else {
|
||||||
|
assert(pInfo->lastResRows == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t pos = pQuery->pos + steps * factor;
|
||||||
|
|
||||||
|
// query does not reach the end of current block
|
||||||
|
if ((pos < pBlockInfo->size && QUERY_IS_ASC_QUERY(pQuery)) || (pos >= 0 && !QUERY_IS_ASC_QUERY(pQuery))) {
|
||||||
|
nextKey = pPrimaryCol[pos];
|
||||||
|
} else {
|
||||||
|
assert((pQuery->lastKey > pBlockInfo->keyLast && QUERY_IS_ASC_QUERY(pQuery)) ||
|
||||||
|
(pQuery->lastKey < pBlockInfo->keyFirst && !QUERY_IS_ASC_QUERY(pQuery)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// all data satisfy current query are checked, query completed
|
||||||
|
if (QUERY_IS_ASC_QUERY(pQuery)) {
|
||||||
|
completed = (pQuery->lastKey > pQuery->ekey);
|
||||||
|
} else {
|
||||||
|
completed = (pQuery->lastKey < pQuery->ekey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1. there may be more date that satisfy current query interval, other than
|
||||||
|
* current block, we need to try next data blocks
|
||||||
|
* 2. query completed, since reaches the upper bound of the main query range
|
||||||
|
*/
|
||||||
|
if (!completed) {
|
||||||
|
/*
|
||||||
|
* Data that satisfy current query range may locate in current block and blocks that are directly right
|
||||||
|
* next to current block. Therefore, we need to keep the query range(interval) unchanged until reaching
|
||||||
|
* the direct next data block, while only forwards the pQuery->lastKey.
|
||||||
|
*
|
||||||
|
* With the information of the directly next data block, whether locates in cache or disk,
|
||||||
|
* current interval query being completed or not can be decided.
|
||||||
|
*/
|
||||||
|
saveIntervalQueryRange(pRuntimeEnv, pInfo);
|
||||||
|
|
||||||
|
if (QUERY_IS_ASC_QUERY(pQuery)) {
|
||||||
|
assert(pQuery->lastKey > pBlockInfo->keyLast && pQuery->lastKey <= pQuery->ekey);
|
||||||
|
} else {
|
||||||
|
assert(pQuery->lastKey < pBlockInfo->keyFirst && pQuery->lastKey >= pQuery->ekey);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(completed);
|
||||||
|
|
||||||
|
if (pQuery->ekey == pSupporter->rawEKey) {
|
||||||
|
/* whole query completed, save result and abort */
|
||||||
|
saveResult(pSupporter, pInfo, pInfo->lastResRows);
|
||||||
|
|
||||||
|
// save the pQuery->lastKey for retrieve data in cache, actually, there will be no qualified data in cache.
|
||||||
|
saveIntervalQueryRange(pRuntimeEnv, pInfo);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else if ((QUERY_IS_ASC_QUERY(pQuery) && pQuery->ekey == pBlockInfo->keyLast) ||
|
||||||
|
(QUERY_IS_ASC_QUERY(pQuery) && pQuery->ekey == pBlockInfo->keyFirst)) {
|
||||||
|
// /* current interval query is completed, set the next query range on other data blocks if exist */
|
||||||
|
// int64_t prevEKey = pQuery->ekey;
|
||||||
|
//
|
||||||
|
// getAlignedIntervalQueryRange(pRuntimeEnv, pQuery->lastKey, pSupporter->rawSKey, pSupporter->rawEKey);
|
||||||
|
saveIntervalQueryRange(pRuntimeEnv, pInfo);
|
||||||
|
//
|
||||||
|
// assert(prevEKey < pQuery->skey);
|
||||||
|
// if (pInfo->lastResRows > 0) {
|
||||||
|
// saveResult(pSupporter, pInfo, pInfo->lastResRows);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
saveResult(pSupporter, pInfo, pInfo->lastResRows);
|
||||||
|
|
||||||
|
assert((nextKey >= pQuery->lastKey && QUERY_IS_ASC_QUERY(pQuery)) ||
|
||||||
|
(nextKey <= pQuery->lastKey && !QUERY_IS_ASC_QUERY(pQuery)));
|
||||||
|
|
||||||
|
/* still in the same block to query */
|
||||||
|
getAlignedIntervalQueryRange(pRuntimeEnv, nextKey, pSupporter->rawSKey, pSupporter->rawEKey);
|
||||||
|
saveIntervalQueryRange(pRuntimeEnv, pInfo);
|
||||||
|
|
||||||
|
int32_t newPos = searchFn((char *)pPrimaryCol, pBlockInfo->size, pQuery->skey, pQuery->order.order);
|
||||||
|
assert(newPos == pQuery->pos + steps * factor);
|
||||||
|
|
||||||
|
pQuery->pos = newPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
int64_t getNextAccessedKeyInData(SQuery *pQuery, int64_t *pPrimaryCol, SBlockInfo *pBlockInfo, int32_t blockStatus) {
|
int64_t getNextAccessedKeyInData(SQuery *pQuery, int64_t *pPrimaryCol, SBlockInfo *pBlockInfo, int32_t blockStatus) {
|
||||||
assert(pQuery->pos >= 0 && pQuery->pos <= pBlockInfo->size - 1);
|
assert(pQuery->pos >= 0 && pQuery->pos <= pBlockInfo->size - 1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue