提交 c00ff3ff 编写于 作者: W wpan

improve performance

上级 d86f582a
...@@ -181,7 +181,7 @@ typedef struct SFilterColCtx { ...@@ -181,7 +181,7 @@ typedef struct SFilterColCtx {
} SFilterColCtx; } SFilterColCtx;
typedef struct SFilterCompare { typedef struct SFilterCompare {
int32_t type; uint8_t type;
uint8_t optr; uint8_t optr;
uint8_t optr2; uint8_t optr2;
} SFilterCompare; } SFilterCompare;
...@@ -194,14 +194,14 @@ typedef struct SFilterUnit { ...@@ -194,14 +194,14 @@ typedef struct SFilterUnit {
} SFilterUnit; } SFilterUnit;
typedef struct SFilterComUnit { typedef struct SFilterComUnit {
__compar_fn_t func;
rangeCompFunc rfunc;
void *colData; void *colData;
void *valData; void *valData;
void *valData2; void *valData2;
int32_t dataType;
uint16_t dataSize; uint16_t dataSize;
uint16_t optr; uint8_t dataType;
uint8_t optr;
int8_t func;
int8_t rfunc;
} SFilterComUnit; } SFilterComUnit;
typedef struct SFilterPCtx { typedef struct SFilterPCtx {
......
...@@ -114,41 +114,123 @@ rangeCompFunc filterGetRangeCompFunc(char sflag, char eflag) { ...@@ -114,41 +114,123 @@ rangeCompFunc filterGetRangeCompFunc(char sflag, char eflag) {
return filterRangeCompii; return filterRangeCompii;
} }
rangeCompFunc filterGetRangeCompFuncFromOptrs(uint8_t optr, uint8_t optr2) { rangeCompFunc gRangeCompare[] = {filterRangeCompee, filterRangeCompei, filterRangeCompie, filterRangeCompii, filterRangeCompGe,
filterRangeCompGi, filterRangeCompLe, filterRangeCompLi};
int8_t filterGetRangeCompFuncFromOptrs(uint8_t optr, uint8_t optr2) {
if (optr2) { if (optr2) {
assert(optr2 == TSDB_RELATION_LESS || optr2 == TSDB_RELATION_LESS_EQUAL); assert(optr2 == TSDB_RELATION_LESS || optr2 == TSDB_RELATION_LESS_EQUAL);
if (optr == TSDB_RELATION_GREATER) { if (optr == TSDB_RELATION_GREATER) {
if (optr2 == TSDB_RELATION_LESS) { if (optr2 == TSDB_RELATION_LESS) {
return filterRangeCompee; return 0;
} }
return filterRangeCompei; return 1;
} }
if (optr2 == TSDB_RELATION_LESS) { if (optr2 == TSDB_RELATION_LESS) {
return filterRangeCompie; return 2;
} }
return filterRangeCompii; return 3;
} else { } else {
switch (optr) { switch (optr) {
case TSDB_RELATION_GREATER: case TSDB_RELATION_GREATER:
return filterRangeCompGe; return 4;
case TSDB_RELATION_GREATER_EQUAL: case TSDB_RELATION_GREATER_EQUAL:
return filterRangeCompGi; return 5;
case TSDB_RELATION_LESS: case TSDB_RELATION_LESS:
return filterRangeCompLe; return 6;
case TSDB_RELATION_LESS_EQUAL: case TSDB_RELATION_LESS_EQUAL:
return filterRangeCompLi; return 7;
default: default:
break; break;
} }
} }
return NULL; return -1;
} }
__compar_fn_t gDataCompare[] = {compareInt32Val, compareInt8Val, compareInt16Val, compareInt64Val, compareFloatVal,
compareDoubleVal, compareLenPrefixedStr, compareStrPatternComp, compareFindItemInSet, compareWStrPatternComp,
compareLenPrefixedWStr, compareUint8Val, compareUint16Val, compareUint32Val, compareUint64Val,
setCompareBytes1, setCompareBytes2, setCompareBytes4, setCompareBytes8
};
int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) {
int8_t comparFn = 0;
if (optr == TSDB_RELATION_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) {
switch (type) {
case TSDB_DATA_TYPE_BOOL:
case TSDB_DATA_TYPE_TINYINT:
case TSDB_DATA_TYPE_UTINYINT:
return 15;
case TSDB_DATA_TYPE_SMALLINT:
case TSDB_DATA_TYPE_USMALLINT:
return 16;
case TSDB_DATA_TYPE_INT:
case TSDB_DATA_TYPE_UINT:
case TSDB_DATA_TYPE_FLOAT:
return 17;
case TSDB_DATA_TYPE_BIGINT:
case TSDB_DATA_TYPE_UBIGINT:
case TSDB_DATA_TYPE_DOUBLE:
case TSDB_DATA_TYPE_TIMESTAMP:
return 18;
default:
assert(0);
}
}
switch (type) {
case TSDB_DATA_TYPE_BOOL:
case TSDB_DATA_TYPE_TINYINT: comparFn = 1; break;
case TSDB_DATA_TYPE_SMALLINT: comparFn = 2; break;
case TSDB_DATA_TYPE_INT: comparFn = 0; break;
case TSDB_DATA_TYPE_BIGINT:
case TSDB_DATA_TYPE_TIMESTAMP: comparFn = 3; break;
case TSDB_DATA_TYPE_FLOAT: comparFn = 4; break;
case TSDB_DATA_TYPE_DOUBLE: comparFn = 5; break;
case TSDB_DATA_TYPE_BINARY: {
if (optr == TSDB_RELATION_LIKE) { /* wildcard query using like operator */
comparFn = 7;
} else if (optr == TSDB_RELATION_IN) {
comparFn = 8;
} else { /* normal relational comparFn */
comparFn = 6;
}
break;
}
case TSDB_DATA_TYPE_NCHAR: {
if (optr == TSDB_RELATION_LIKE) {
comparFn = 9;
} else if (optr == TSDB_RELATION_IN) {
comparFn = 8;
} else {
comparFn = 10;
}
break;
}
case TSDB_DATA_TYPE_UTINYINT: comparFn = 11; break;
case TSDB_DATA_TYPE_USMALLINT: comparFn = 12;break;
case TSDB_DATA_TYPE_UINT: comparFn = 13;break;
case TSDB_DATA_TYPE_UBIGINT: comparFn = 14;break;
default:
comparFn = 0;
break;
}
return comparFn;
}
static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) { static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) {
SFilterGroupCtx *left = *((SFilterGroupCtx**)pLeft), *right = *((SFilterGroupCtx**)pRight); SFilterGroupCtx *left = *((SFilterGroupCtx**)pLeft), *right = *((SFilterGroupCtx**)pRight);
if (left->colNum > right->colNum) return 1; if (left->colNum > right->colNum) return 1;
...@@ -1392,6 +1474,7 @@ _return: ...@@ -1392,6 +1474,7 @@ _return:
return code; return code;
} }
#if 0
int32_t filterInitUnitFunc(SFilterInfo *info) { int32_t filterInitUnitFunc(SFilterInfo *info) {
for (uint16_t i = 0; i < info->unitNum; ++i) { for (uint16_t i = 0; i < info->unitNum; ++i) {
SFilterUnit* unit = &info->units[i]; SFilterUnit* unit = &info->units[i];
...@@ -1401,7 +1484,7 @@ int32_t filterInitUnitFunc(SFilterInfo *info) { ...@@ -1401,7 +1484,7 @@ int32_t filterInitUnitFunc(SFilterInfo *info) {
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
#endif
void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options) { void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options) {
...@@ -2406,7 +2489,7 @@ int32_t filterGenerateComInfo(SFilterInfo *info) { ...@@ -2406,7 +2489,7 @@ int32_t filterGenerateComInfo(SFilterInfo *info) {
for (uint16_t i = 0; i < info->unitNum; ++i) { for (uint16_t i = 0; i < info->unitNum; ++i) {
SFilterUnit *unit = &info->units[i]; SFilterUnit *unit = &info->units[i];
info->cunits[i].func = getComparFunc(FILTER_UNIT_DATA_TYPE(unit), unit->compare.optr); info->cunits[i].func = filterGetCompFuncIdx(FILTER_UNIT_DATA_TYPE(unit), unit->compare.optr);
info->cunits[i].rfunc = filterGetRangeCompFuncFromOptrs(unit->compare.optr, unit->compare.optr2); info->cunits[i].rfunc = filterGetRangeCompFuncFromOptrs(unit->compare.optr, unit->compare.optr2);
info->cunits[i].optr = FILTER_UNIT_OPTR(unit); info->cunits[i].optr = FILTER_UNIT_OPTR(unit);
info->cunits[i].colData = NULL; info->cunits[i].colData = NULL;
...@@ -2500,10 +2583,10 @@ bool filterExecuteImplRange(void *pinfo, int32_t numOfRows, int8_t* p) { ...@@ -2500,10 +2583,10 @@ bool filterExecuteImplRange(void *pinfo, int32_t numOfRows, int8_t* p) {
bool all = true; bool all = true;
uint16_t dataSize = info->cunits[0].dataSize; uint16_t dataSize = info->cunits[0].dataSize;
char *colData = (char *)info->cunits[0].colData; char *colData = (char *)info->cunits[0].colData;
rangeCompFunc rfunc = info->cunits[0].rfunc; rangeCompFunc rfunc = gRangeCompare[info->cunits[0].rfunc];
void *valData = info->cunits[0].valData; void *valData = info->cunits[0].valData;
void *valData2 = info->cunits[0].valData2; void *valData2 = info->cunits[0].valData2;
__compar_fn_t func = info->cunits[0].func; __compar_fn_t func = gDataCompare[info->cunits[0].func];
for (int32_t i = 0; i < numOfRows; ++i) { for (int32_t i = 0; i < numOfRows; ++i) {
if (isNull(colData, info->cunits[0].dataType)) { if (isNull(colData, info->cunits[0].dataType)) {
...@@ -2536,7 +2619,7 @@ bool filterExecuteImplMisc(void *pinfo, int32_t numOfRows, int8_t* p) { ...@@ -2536,7 +2619,7 @@ bool filterExecuteImplMisc(void *pinfo, int32_t numOfRows, int8_t* p) {
continue; continue;
} }
p[i] = filterDoCompare(info->cunits[uidx].func, info->cunits[uidx].optr, colData, info->cunits[uidx].valData); p[i] = filterDoCompare(gDataCompare[info->cunits[uidx].func], info->cunits[uidx].optr, colData, info->cunits[uidx].valData);
if (p[i] == 0) { if (p[i] == 0) {
all = false; all = false;
...@@ -2573,10 +2656,10 @@ bool filterExecuteImpl(void *pinfo, int32_t numOfRows, int8_t* p) { ...@@ -2573,10 +2656,10 @@ bool filterExecuteImpl(void *pinfo, int32_t numOfRows, int8_t* p) {
p[i] = 1; p[i] = 1;
} else if (optr == TSDB_RELATION_ISNULL) { } else if (optr == TSDB_RELATION_ISNULL) {
p[i] = 0; p[i] = 0;
} else if (cunit->rfunc) { } else if (cunit->rfunc >= 0) {
p[i] = (*cunit->rfunc)(colData, colData, cunit->valData, cunit->valData2, cunit->func); p[i] = (*gRangeCompare[cunit->rfunc])(colData, colData, cunit->valData, cunit->valData2, gDataCompare[cunit->func]);
} else { } else {
p[i] = filterDoCompare(cunit->func, cunit->optr, colData, cunit->valData); p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, colData, cunit->valData);
} }
//FILTER_UNIT_SET_R(info, uidx, p[i]); //FILTER_UNIT_SET_R(info, uidx, p[i]);
...@@ -2631,7 +2714,7 @@ int32_t filterSetExecFunc(SFilterInfo *info) { ...@@ -2631,7 +2714,7 @@ int32_t filterSetExecFunc(SFilterInfo *info) {
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
if (info->cunits[0].rfunc) { if (info->cunits[0].rfunc >= 0) {
info->func = filterExecuteImplRange; info->func = filterExecuteImplRange;
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
...@@ -2746,7 +2829,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option ...@@ -2746,7 +2829,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option
return code; return code;
} }
ERR_JRET(filterInitUnitFunc(info)); //ERR_JRET(filterInitUnitFunc(info));
} }
info->unitRes = malloc(info->unitNum * sizeof(*info->unitRes)); info->unitRes = malloc(info->unitNum * sizeof(*info->unitRes));
......
...@@ -53,6 +53,38 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr); ...@@ -53,6 +53,38 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr);
int32_t taosArrayCompareString(const void* a, const void* b); int32_t taosArrayCompareString(const void* a, const void* b);
int32_t setCompareBytes1(const void *pLeft, const void *pRight);
int32_t setCompareBytes2(const void *pLeft, const void *pRight);
int32_t setCompareBytes4(const void *pLeft, const void *pRight);
int32_t setCompareBytes8(const void *pLeft, const void *pRight);
int32_t compareInt32Val(const void *pLeft, const void *pRight);
int32_t compareInt64Val(const void *pLeft, const void *pRight);
int32_t compareInt16Val(const void *pLeft, const void *pRight);
int32_t compareInt8Val(const void *pLeft, const void *pRight);
int32_t compareUint32Val(const void *pLeft, const void *pRight);
int32_t compareUint64Val(const void *pLeft, const void *pRight);
int32_t compareUint16Val(const void *pLeft, const void *pRight);
int32_t compareUint8Val(const void* pLeft, const void* pRight);
int32_t compareFloatVal(const void *pLeft, const void *pRight);
int32_t compareDoubleVal(const void *pLeft, const void *pRight);
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight);
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight);
int32_t compareStrPatternComp(const void* pLeft, const void* pRight);
int32_t compareFindItemInSet(const void *pLeft, const void* pRight);
int32_t compareWStrPatternComp(const void* pLeft, const void* pRight);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -278,7 +278,7 @@ int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, c ...@@ -278,7 +278,7 @@ int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, c
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH; return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
} }
static int32_t compareStrPatternComp(const void* pLeft, const void* pRight) { int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
SPatternCompareInfo pInfo = {'%', '_'}; SPatternCompareInfo pInfo = {'%', '_'};
char pattern[128] = {0}; char pattern[128] = {0};
...@@ -306,11 +306,11 @@ int32_t taosArrayCompareString(const void* a, const void* b) { ...@@ -306,11 +306,11 @@ int32_t taosArrayCompareString(const void* a, const void* b) {
// const SArray* arr = (const SArray*) pRight; // const SArray* arr = (const SArray*) pRight;
// return taosArraySearchString(arr, pLeft, taosArrayCompareString, TD_EQ) == NULL ? 0 : 1; // return taosArraySearchString(arr, pLeft, taosArrayCompareString, TD_EQ) == NULL ? 0 : 1;
//} //}
static int32_t compareFindItemInSet(const void *pLeft, const void* pRight) { int32_t compareFindItemInSet(const void *pLeft, const void* pRight) {
return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0; return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0;
} }
static int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) { int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
SPatternCompareInfo pInfo = {'%', '_'}; SPatternCompareInfo pInfo = {'%', '_'};
wchar_t pattern[128] = {0}; wchar_t pattern[128] = {0};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册