提交 a32dd76b 编写于 作者: H Hongze Cheng

feat: optimize tag

上级 e890ec69
...@@ -32,12 +32,14 @@ typedef struct { ...@@ -32,12 +32,14 @@ typedef struct {
#pragma pack(pop) #pragma pack(pop)
#pragma pack(push, 1) #pragma pack(push, 1)
#define TD_TAG_JSON ((int8_t)0x1)
#define TD_TAG_LARGE ((int8_t)0x2)
struct STag { struct STag {
int8_t isJson; int8_t flags;
int16_t len; int16_t len;
int16_t nTag; int16_t nTag;
int32_t ver; int32_t ver;
int16_t idx[]; int8_t idx[];
}; };
#pragma pack(pop) #pragma pack(pop)
...@@ -525,7 +527,6 @@ static int tTagValCmprFn(const void *p1, const void *p2) { ...@@ -525,7 +527,6 @@ static int tTagValCmprFn(const void *p1, const void *p2) {
return 1; return 1;
} }
ASSERT(0);
return 0; return 0;
} }
static int tTagValJsonCmprFn(const void *p1, const void *p2) { static int tTagValJsonCmprFn(const void *p1, const void *p2) {
...@@ -584,7 +585,8 @@ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) { ...@@ -584,7 +585,8 @@ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
uint8_t *p = NULL; uint8_t *p = NULL;
int16_t n = 0; int16_t n = 0;
int16_t nTag = taosArrayGetSize(pArray); int16_t nTag = taosArrayGetSize(pArray);
int32_t szTag = sizeof(STag) + sizeof(int16_t) * nTag; int32_t szTag = 0;
int8_t isLarge = 0;
// sort // sort
if (isJson) { if (isJson) {
...@@ -597,12 +599,14 @@ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) { ...@@ -597,12 +599,14 @@ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
for (int16_t iTag = 0; iTag < nTag; iTag++) { for (int16_t iTag = 0; iTag < nTag; iTag++) {
szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson); szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
} }
if (szTag <= INT8_MAX) {
szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
} else {
szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
isLarge = 1;
}
// TODO ASSERT(szTag <= INT16_MAX);
// if (szTag >= 16 * 1024) {
// code = TSDB_CODE_IVLD_TAG;
// goto _err;
// }
// build tag // build tag
(*ppTag) = (STag *)taosMemoryMalloc(szTag); (*ppTag) = (STag *)taosMemoryMalloc(szTag);
...@@ -610,15 +614,29 @@ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) { ...@@ -610,15 +614,29 @@ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
code = TSDB_CODE_OUT_OF_MEMORY; code = TSDB_CODE_OUT_OF_MEMORY;
goto _err; goto _err;
} }
(*ppTag)->isJson = isJson ? 1 : 0; (*ppTag)->flags = 0;
if (isJson) {
(*ppTag)->flags |= TD_TAG_JSON;
}
if (isLarge) {
(*ppTag)->flags |= TD_TAG_LARGE;
}
(*ppTag)->len = szTag; (*ppTag)->len = szTag;
(*ppTag)->nTag = nTag; (*ppTag)->nTag = nTag;
(*ppTag)->ver = version; (*ppTag)->ver = version;
p = (uint8_t *)&(*ppTag)->idx[nTag]; if (isLarge) {
p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
} else {
p = (uint8_t *)&(*ppTag)->idx[nTag];
}
n = 0; n = 0;
for (int16_t iTag = 0; iTag < nTag; iTag++) { for (int16_t iTag = 0; iTag < nTag; iTag++) {
(*ppTag)->idx[iTag] = n; if (isLarge) {
((int16_t *)(*ppTag)->idx)[iTag] = n;
} else {
(*ppTag)->idx[iTag] = n;
}
n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson); n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
} }
...@@ -636,18 +654,32 @@ void tTagGet(STag *pTag, STagVal *pTagVal) { ...@@ -636,18 +654,32 @@ void tTagGet(STag *pTag, STagVal *pTagVal) {
int16_t lidx = 0; int16_t lidx = 0;
int16_t ridx = pTag->nTag - 1; int16_t ridx = pTag->nTag - 1;
int16_t midx; int16_t midx;
uint8_t *p = (uint8_t *)&pTag->idx[pTag->nTag]; uint8_t *p;
int8_t isJson = pTag->flags & TD_TAG_JSON;
int8_t isLarge = pTag->flags & TD_TAG_LARGE;
int16_t offset;
STagVal tv; STagVal tv;
int c; int c;
if (isLarge) {
p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
} else {
p = (uint8_t *)&pTag->idx[pTag->nTag];
}
pTagVal->type = TSDB_DATA_TYPE_NULL; pTagVal->type = TSDB_DATA_TYPE_NULL;
pTagVal->pData = NULL; pTagVal->pData = NULL;
pTagVal->nData = 0; pTagVal->nData = 0;
while (lidx <= ridx) { while (lidx <= ridx) {
midx = (lidx + ridx) / 2; midx = (lidx + ridx) / 2;
if (isLarge) {
offset = ((int16_t *)pTag->idx)[midx];
} else {
offset = pTag->idx[midx];
}
tGetTagVal(p + pTag->idx[midx], &tv, pTag->isJson); tGetTagVal(p + offset, &tv, isJson);
if (pTag->isJson) { if (isJson) {
c = tTagValJsonCmprFn(pTagVal, &tv); c = tTagValJsonCmprFn(pTagVal, &tv);
} else { } else {
c = tTagValCmprFn(pTagVal, &tv); c = tTagValCmprFn(pTagVal, &tv);
...@@ -684,7 +716,7 @@ int32_t tTagToValArray(STag *pTag, SArray **ppArray) { ...@@ -684,7 +716,7 @@ int32_t tTagToValArray(STag *pTag, SArray **ppArray) {
} }
for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) { for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) {
tGetTagVal(p + pTag->idx[iTag], &tv, pTag->isJson); tGetTagVal(p + pTag->idx[iTag], &tv, pTag->flags & TD_TAG_JSON);
taosArrayPush(*ppArray, &tv); taosArrayPush(*ppArray, &tv);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册