From 7eec493a439fa66cbd97f570aa2319aa58606341 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 28 Feb 2022 13:25:23 +0800 Subject: [PATCH] compare --- include/common/tcompare.h | 40 -------- include/common/ttypes.h | 5 - include/util/{compare.h => tcompare.h} | 10 +- include/util/types.h | 5 + source/common/src/tcompare.c | 111 ---------------------- source/common/src/tep.c | 2 +- source/libs/function/src/tpercentile.c | 5 +- source/libs/wal/inc/walInt.h | 2 +- source/libs/wal/src/walMgmt.c | 2 +- source/util/src/{compare.c => tcompare.c} | 98 ++++++++++++++++++- source/util/src/thashutil.c | 2 +- source/util/src/tskiplist.c | 2 +- 12 files changed, 118 insertions(+), 166 deletions(-) delete mode 100644 include/common/tcompare.h rename include/util/{compare.h => tcompare.h} (90%) delete mode 100644 source/common/src/tcompare.c rename source/util/src/{compare.c => tcompare.c} (81%) diff --git a/include/common/tcompare.h b/include/common/tcompare.h deleted file mode 100644 index 5dcbf37b90..0000000000 --- a/include/common/tcompare.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * This program is free software: you can use, redistribute, and/or modify - * it under the terms of the GNU Affero General Public License, version 3 - * or later ("AGPL"), as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -#ifndef _TD_TCOMPARE_H_ -#define _TD_TCOMPARE_H_ - -#include "compare.h" -#include "ttypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -int32_t compareStrPatternMatch(const void* pLeft, const void* pRight); -int32_t compareStrPatternNotMatch(const void* pLeft, const void* pRight); - -int32_t compareWStrPatternMatch(const void* pLeft, const void* pRight); -int32_t compareWStrPatternNotMatch(const void* pLeft, const void* pRight); - -__compar_fn_t getComparFunc(int32_t type, int32_t optr); -__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order); -int32_t doCompare(const char* a, const char* b, int32_t type, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif /*_TD_TCOMPARE_H_*/ diff --git a/include/common/ttypes.h b/include/common/ttypes.h index 39a5f0e2b8..00dc75e24e 100644 --- a/include/common/ttypes.h +++ b/include/common/ttypes.h @@ -15,11 +15,6 @@ typedef uint8_t TDRowValT; typedef uint16_t col_id_t; typedef int8_t col_type_t; -typedef struct tstr { - VarDataLenT len; - char data[]; -} tstr; - #pragma pack(push, 1) typedef struct { VarDataLenT len; diff --git a/include/util/compare.h b/include/util/tcompare.h similarity index 90% rename from include/util/compare.h rename to include/util/tcompare.h index ece8ffaf42..4c80eeb4f6 100644 --- a/include/util/compare.h +++ b/include/util/tcompare.h @@ -17,12 +17,12 @@ #define _TD_UTIL_COMPARE_H_ #include "os.h" +#include "taos.h" #ifdef __cplusplus extern "C" { #endif - #define TSDB_PATTERN_MATCH 0 #define TSDB_PATTERN_NOMATCH 1 #define TSDB_PATTERN_NOWILDCARDMATCH 2 @@ -99,7 +99,15 @@ int32_t compareUint64ValDesc(const void *pLeft, const void *pRight); int32_t compareLenPrefixedStrDesc(const void *pLeft, const void *pRight); int32_t compareLenPrefixedWStrDesc(const void *pLeft, const void *pRight); +int32_t compareStrPatternMatch(const void *pLeft, const void *pRight); +int32_t compareStrPatternNotMatch(const void *pLeft, const void *pRight); + +int32_t compareWStrPatternMatch(const void *pLeft, const void *pRight); +int32_t compareWStrPatternNotMatch(const void *pLeft, const void *pRight); + __compar_fn_t getComparFunc(int32_t type, int32_t optr); +__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order); +int32_t doCompare(const char *a, const char *b, int32_t type, size_t size); #ifdef __cplusplus } diff --git a/include/util/types.h b/include/util/types.h index 25688df56c..2e704bb256 100644 --- a/include/util/types.h +++ b/include/util/types.h @@ -81,6 +81,11 @@ typedef uint16_t VarDataLenT; // maxVarDataLen: 32767 typedef int32_t VarDataOffsetT; +typedef struct tstr { + VarDataLenT len; + char data[]; +} tstr; + #ifdef __cplusplus } #endif diff --git a/source/common/src/tcompare.c b/source/common/src/tcompare.c deleted file mode 100644 index ef441c97c7..0000000000 --- a/source/common/src/tcompare.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * This program is free software: you can use, redistribute, and/or modify - * it under the terms of the GNU Affero General Public License, version 3 - * or later ("AGPL"), as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -#include "tcompare.h" - - -__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order) { - __compar_fn_t comparFn = NULL; - - switch (keyType) { - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_BOOL: - comparFn = (order == TSDB_ORDER_ASC)? compareInt8Val:compareInt8ValDesc; - break; - case TSDB_DATA_TYPE_SMALLINT: - comparFn = (order == TSDB_ORDER_ASC)? compareInt16Val:compareInt16ValDesc; - break; - case TSDB_DATA_TYPE_INT: - comparFn = (order == TSDB_ORDER_ASC)? compareInt32Val:compareInt32ValDesc; - break; - case TSDB_DATA_TYPE_BIGINT: - case TSDB_DATA_TYPE_TIMESTAMP: - comparFn = (order == TSDB_ORDER_ASC)? compareInt64Val:compareInt64ValDesc; - break; - case TSDB_DATA_TYPE_FLOAT: - comparFn = (order == TSDB_ORDER_ASC)? compareFloatVal:compareFloatValDesc; - break; - case TSDB_DATA_TYPE_DOUBLE: - comparFn = (order == TSDB_ORDER_ASC)? compareDoubleVal:compareDoubleValDesc; - break; - case TSDB_DATA_TYPE_UTINYINT: - comparFn = (order == TSDB_ORDER_ASC)? compareUint8Val:compareUint8ValDesc; - break; - case TSDB_DATA_TYPE_USMALLINT: - comparFn = (order == TSDB_ORDER_ASC)? compareUint16Val:compareUint16ValDesc; - break; - case TSDB_DATA_TYPE_UINT: - comparFn = (order == TSDB_ORDER_ASC)? compareUint32Val:compareUint32ValDesc; - break; - case TSDB_DATA_TYPE_UBIGINT: - comparFn = (order == TSDB_ORDER_ASC)? compareUint64Val:compareUint64ValDesc; - break; - case TSDB_DATA_TYPE_BINARY: - comparFn = (order == TSDB_ORDER_ASC)? compareLenPrefixedStr:compareLenPrefixedStrDesc; - break; - case TSDB_DATA_TYPE_NCHAR: - comparFn = (order == TSDB_ORDER_ASC)? compareLenPrefixedWStr:compareLenPrefixedWStrDesc; - break; - default: - comparFn = (order == TSDB_ORDER_ASC)? compareInt32Val:compareInt32ValDesc; - break; - } - - return comparFn; -} - -int32_t doCompare(const char* f1, const char* f2, int32_t type, size_t size) { - switch (type) { - case TSDB_DATA_TYPE_INT: DEFAULT_COMP(GET_INT32_VAL(f1), GET_INT32_VAL(f2)); - case TSDB_DATA_TYPE_DOUBLE: DEFAULT_DOUBLE_COMP(GET_DOUBLE_VAL(f1), GET_DOUBLE_VAL(f2)); - case TSDB_DATA_TYPE_FLOAT: DEFAULT_FLOAT_COMP(GET_FLOAT_VAL(f1), GET_FLOAT_VAL(f2)); - case TSDB_DATA_TYPE_BIGINT: DEFAULT_COMP(GET_INT64_VAL(f1), GET_INT64_VAL(f2)); - case TSDB_DATA_TYPE_SMALLINT: DEFAULT_COMP(GET_INT16_VAL(f1), GET_INT16_VAL(f2)); - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_BOOL: DEFAULT_COMP(GET_INT8_VAL(f1), GET_INT8_VAL(f2)); - case TSDB_DATA_TYPE_UTINYINT: DEFAULT_COMP(GET_UINT8_VAL(f1), GET_UINT8_VAL(f2)); - case TSDB_DATA_TYPE_USMALLINT: DEFAULT_COMP(GET_UINT16_VAL(f1), GET_UINT16_VAL(f2)); - case TSDB_DATA_TYPE_UINT: DEFAULT_COMP(GET_UINT32_VAL(f1), GET_UINT32_VAL(f2)); - case TSDB_DATA_TYPE_UBIGINT: DEFAULT_COMP(GET_UINT64_VAL(f1), GET_UINT64_VAL(f2)); - case TSDB_DATA_TYPE_NCHAR: { - tstr* t1 = (tstr*) f1; - tstr* t2 = (tstr*) f2; - - if (t1->len != t2->len) { - return t1->len > t2->len? 1:-1; - } - int32_t ret = memcmp((wchar_t*) t1, (wchar_t*) t2, t2->len); - if (ret == 0) { - return ret; - } - return (ret < 0) ? -1 : 1; - } - default: { // todo refactor - tstr* t1 = (tstr*) f1; - tstr* t2 = (tstr*) f2; - - if (t1->len != t2->len) { - return t1->len > t2->len? 1:-1; - } else { - int32_t ret = strncmp(t1->data, t2->data, t1->len); - if (ret == 0) { - return 0; - } else { - return ret < 0? -1:1; - } - } - } - } -} diff --git a/source/common/src/tep.c b/source/common/src/tep.c index 970b6d954f..35aafe34c1 100644 --- a/source/common/src/tep.c +++ b/source/common/src/tep.c @@ -1,5 +1,5 @@ #include "tep.h" -#include +#include "tcompare.h" #include "common.h" #include "tglobal.h" #include "tlockfree.h" diff --git a/source/libs/function/src/tpercentile.c b/source/libs/function/src/tpercentile.c index 40731adc58..d700160ae4 100644 --- a/source/libs/function/src/tpercentile.c +++ b/source/libs/function/src/tpercentile.c @@ -12,8 +12,9 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -#include -#include "os.h" + +#include "tglobal.h" +#include "tcompare.h" #include "taosdef.h" #include "tcompare.h" diff --git a/source/libs/wal/inc/walInt.h b/source/libs/wal/inc/walInt.h index 4624e05f10..ca0c756141 100644 --- a/source/libs/wal/inc/walInt.h +++ b/source/libs/wal/inc/walInt.h @@ -16,7 +16,7 @@ #ifndef _TD_WAL_INT_H_ #define _TD_WAL_INT_H_ -#include "compare.h" +#include "tcompare.h" #include "taoserror.h" #include "tchecksum.h" #include "tcoding.h" diff --git a/source/libs/wal/src/walMgmt.c b/source/libs/wal/src/walMgmt.c index d3cd23f284..4f17bf436e 100644 --- a/source/libs/wal/src/walMgmt.c +++ b/source/libs/wal/src/walMgmt.c @@ -14,7 +14,7 @@ */ #define _DEFAULT_SOURCE -#include "compare.h" +#include "tcompare.h" #include "os.h" #include "taoserror.h" #include "tfile.h" diff --git a/source/util/src/compare.c b/source/util/src/tcompare.c similarity index 81% rename from source/util/src/compare.c rename to source/util/src/tcompare.c index b597eb32bf..1ea1d32055 100644 --- a/source/util/src/compare.c +++ b/source/util/src/tcompare.c @@ -16,9 +16,8 @@ #define _GNU_SOURCE #define _XOPEN_SOURCE #define _DEFAULT_SOURCE -#include "os.h" -#include "compare.h" +#include "tcompare.h" #include "regex.h" #include "thash.h" #include "types.h" @@ -574,3 +573,98 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) { } + +__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order) { + __compar_fn_t comparFn = NULL; + + switch (keyType) { + case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_BOOL: + comparFn = (order == TSDB_ORDER_ASC)? compareInt8Val:compareInt8ValDesc; + break; + case TSDB_DATA_TYPE_SMALLINT: + comparFn = (order == TSDB_ORDER_ASC)? compareInt16Val:compareInt16ValDesc; + break; + case TSDB_DATA_TYPE_INT: + comparFn = (order == TSDB_ORDER_ASC)? compareInt32Val:compareInt32ValDesc; + break; + case TSDB_DATA_TYPE_BIGINT: + case TSDB_DATA_TYPE_TIMESTAMP: + comparFn = (order == TSDB_ORDER_ASC)? compareInt64Val:compareInt64ValDesc; + break; + case TSDB_DATA_TYPE_FLOAT: + comparFn = (order == TSDB_ORDER_ASC)? compareFloatVal:compareFloatValDesc; + break; + case TSDB_DATA_TYPE_DOUBLE: + comparFn = (order == TSDB_ORDER_ASC)? compareDoubleVal:compareDoubleValDesc; + break; + case TSDB_DATA_TYPE_UTINYINT: + comparFn = (order == TSDB_ORDER_ASC)? compareUint8Val:compareUint8ValDesc; + break; + case TSDB_DATA_TYPE_USMALLINT: + comparFn = (order == TSDB_ORDER_ASC)? compareUint16Val:compareUint16ValDesc; + break; + case TSDB_DATA_TYPE_UINT: + comparFn = (order == TSDB_ORDER_ASC)? compareUint32Val:compareUint32ValDesc; + break; + case TSDB_DATA_TYPE_UBIGINT: + comparFn = (order == TSDB_ORDER_ASC)? compareUint64Val:compareUint64ValDesc; + break; + case TSDB_DATA_TYPE_BINARY: + comparFn = (order == TSDB_ORDER_ASC)? compareLenPrefixedStr:compareLenPrefixedStrDesc; + break; + case TSDB_DATA_TYPE_NCHAR: + comparFn = (order == TSDB_ORDER_ASC)? compareLenPrefixedWStr:compareLenPrefixedWStrDesc; + break; + default: + comparFn = (order == TSDB_ORDER_ASC)? compareInt32Val:compareInt32ValDesc; + break; + } + + return comparFn; +} + +int32_t doCompare(const char* f1, const char* f2, int32_t type, size_t size) { + switch (type) { + case TSDB_DATA_TYPE_INT: DEFAULT_COMP(GET_INT32_VAL(f1), GET_INT32_VAL(f2)); + case TSDB_DATA_TYPE_DOUBLE: DEFAULT_DOUBLE_COMP(GET_DOUBLE_VAL(f1), GET_DOUBLE_VAL(f2)); + case TSDB_DATA_TYPE_FLOAT: DEFAULT_FLOAT_COMP(GET_FLOAT_VAL(f1), GET_FLOAT_VAL(f2)); + case TSDB_DATA_TYPE_BIGINT: DEFAULT_COMP(GET_INT64_VAL(f1), GET_INT64_VAL(f2)); + case TSDB_DATA_TYPE_SMALLINT: DEFAULT_COMP(GET_INT16_VAL(f1), GET_INT16_VAL(f2)); + case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_BOOL: DEFAULT_COMP(GET_INT8_VAL(f1), GET_INT8_VAL(f2)); + case TSDB_DATA_TYPE_UTINYINT: DEFAULT_COMP(GET_UINT8_VAL(f1), GET_UINT8_VAL(f2)); + case TSDB_DATA_TYPE_USMALLINT: DEFAULT_COMP(GET_UINT16_VAL(f1), GET_UINT16_VAL(f2)); + case TSDB_DATA_TYPE_UINT: DEFAULT_COMP(GET_UINT32_VAL(f1), GET_UINT32_VAL(f2)); + case TSDB_DATA_TYPE_UBIGINT: DEFAULT_COMP(GET_UINT64_VAL(f1), GET_UINT64_VAL(f2)); + case TSDB_DATA_TYPE_NCHAR: { + tstr* t1 = (tstr*) f1; + tstr* t2 = (tstr*) f2; + + if (t1->len != t2->len) { + return t1->len > t2->len? 1:-1; + } + int32_t ret = memcmp((wchar_t*) t1, (wchar_t*) t2, t2->len); + if (ret == 0) { + return ret; + } + return (ret < 0) ? -1 : 1; + } + default: { // todo refactor + tstr* t1 = (tstr*) f1; + tstr* t2 = (tstr*) f2; + + if (t1->len != t2->len) { + return t1->len > t2->len? 1:-1; + } else { + int32_t ret = strncmp(t1->data, t2->data, t1->len); + if (ret == 0) { + return 0; + } else { + return ret < 0? -1:1; + } + } + } + } +} + diff --git a/source/util/src/thashutil.c b/source/util/src/thashutil.c index 2d7f8a5b03..9084c05d29 100644 --- a/source/util/src/thashutil.c +++ b/source/util/src/thashutil.c @@ -15,7 +15,7 @@ #include "os.h" #include "thash.h" -#include "compare.h" +#include "tcompare.h" #include "taos.h" #include "types.h" diff --git a/source/util/src/tskiplist.c b/source/util/src/tskiplist.c index 1c325ca0a8..7510750e34 100644 --- a/source/util/src/tskiplist.c +++ b/source/util/src/tskiplist.c @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -#include "compare.h" +#include "tcompare.h" #include "tskiplist.h" #include "tutil.h" #include "tlog.h" -- GitLab