diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 9c2ac34aea..4d272d5eac 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -19,6 +19,7 @@ #include "os.h" #include "talgo.h" #include "tarray.h" +#include "tbuffer.h" #include "tencode.h" #include "ttypes.h" #include "tutil.h" @@ -27,18 +28,19 @@ extern "C" { #endif -typedef struct SSchema SSchema; -typedef struct SSchema2 SSchema2; -typedef struct STColumn STColumn; -typedef struct STSchema STSchema; -typedef struct SValue SValue; -typedef struct SColVal SColVal; -typedef struct SRow SRow; -typedef struct SRowIter SRowIter; -typedef struct STagVal STagVal; -typedef struct STag STag; -typedef struct SColData SColData; -typedef struct SRowKey SRowKey; +typedef struct SSchema SSchema; +typedef struct SSchema2 SSchema2; +typedef struct STColumn STColumn; +typedef struct STSchema STSchema; +typedef struct SValue SValue; +typedef struct SColVal SColVal; +typedef struct SRow SRow; +typedef struct SRowIter SRowIter; +typedef struct STagVal STagVal; +typedef struct STag STag; +typedef struct SColData SColData; +typedef struct SRowKey SRowKey; +typedef struct SValueColumn SValueColumn; #define HAS_NONE ((uint8_t)0x1) #define HAS_NULL ((uint8_t)0x2) @@ -54,9 +56,9 @@ const static uint8_t BIT2_MAP[4] = {0b11111100, 0b11110011, 0b11001111, 0b001111 #define ONE ((uint8_t)1) #define THREE ((uint8_t)3) #define DIV_8(i) ((i) >> 3) -#define MOD_8(i) ((i)&7) +#define MOD_8(i) ((i) & 7) #define DIV_4(i) ((i) >> 2) -#define MOD_4(i) ((i)&3) +#define MOD_4(i) ((i) & 3) #define MOD_4_TIME_2(i) (MOD_4(i) << 1) #define BIT1_SIZE(n) (DIV_8((n)-1) + 1) #define BIT2_SIZE(n) (DIV_4((n)-1) + 1) @@ -92,6 +94,15 @@ const static uint8_t BIT2_MAP[4] = {0b11111100, 0b11110011, 0b11001111, 0b001111 #define COL_VAL_IS_NULL(CV) ((CV)->flag == CV_FLAG_NULL) #define COL_VAL_IS_VALUE(CV) ((CV)->flag == CV_FLAG_VALUE) +// SValueColumn ================================ +int32_t tValueColumnInit(SValueColumn *valCol, int8_t type); +int32_t tValueColumnDestroy(SValueColumn *valCol); +int32_t tValueColumnClear(SValueColumn *valCol); +int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value); +int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value); +int32_t tValueColumnCompress(SValueColumn *valCol, SBuffer *buffer); +int32_t tValueColumnDecompress(SBuffer *buffer, SValueColumn *valCol); + // SRow ================================ int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow); int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal); @@ -123,16 +134,16 @@ int32_t parseJsontoTagData(const char *json, SArray *pTagVals, STag **ppTag, voi // SColData ================================ typedef void *(*xMallocFn)(void *, int32_t); -void tColDataDestroy(void *ph); -void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag); -void tColDataClear(SColData *pColData); -void tColDataDeepClear(SColData *pColData); -int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal); -int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward); -void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal); -uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal); -int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg); -extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull); +void tColDataDestroy(void *ph); +void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag); +void tColDataClear(SColData *pColData); +void tColDataDeepClear(SColData *pColData); +int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal); +int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward); +void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal); +uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal); +int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg); +extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull); // for stmt bind int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen); diff --git a/include/util/tbuffer.h b/include/util/tbuffer.h index daa6c23bc8..47db881bad 100644 --- a/include/util/tbuffer.h +++ b/include/util/tbuffer.h @@ -35,7 +35,7 @@ static int32_t tBufferEnsureCapacity(SBuffer *buffer, uint32_t capacity); static int32_t tBufferAppend(SBuffer *buffer, const void *data, uint32_t size); #define tBufferGetSize(buffer) ((buffer)->size) #define tBufferGetCapacity(buffer) ((buffer)->capacity) -#define tBufferGetData(buffer) ((const void *)(buffer)->data) +#define tBufferGetData(buffer) ((buffer)->data) // SBufferWriter #define BUFFER_WRITER_INITIALIZER(forward, offset, buffer) ((SBufferWriter){forward, offset, buffer}) diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 2db969ec99..2662fd7251 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -3784,3 +3784,90 @@ void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_ NULL, // TSDB_DATA_TYPE_MEDIUMBLOB tColDataCalcSMAVarType // TSDB_DATA_TYPE_GEOMETRY }; + +// SValueColumn ================================ +struct SValueColumn { + int8_t type; + uint32_t numOfValues; + SBuffer data; + SBuffer offsets; +}; + +int32_t tValueColumnInit(SValueColumn *valCol, int8_t type) { + valCol->type = type; + valCol->numOfValues = 0; + tBufferInit(&valCol->data); + tBufferInit(&valCol->offsets); + return 0; +} + +int32_t tValueColumnDestroy(SValueColumn *valCol) { + valCol->type = TSDB_DATA_TYPE_NULL; + valCol->numOfValues = 0; + tBufferDestroy(&valCol->data); + tBufferDestroy(&valCol->offsets); + return 0; +} + +int32_t tValueColumnClear(SValueColumn *valCol) { + valCol->numOfValues = 0; + tBufferClear(&valCol->data); + tBufferClear(&valCol->offsets); + return 0; +} + +int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) { + int32_t code; + + ASSERT(value->type == valCol->type); + if (IS_VAR_DATA_TYPE(value->type)) { + int32_t offset = tBufferGetSize(&valCol->data); + if ((code = tBufferAppend(&valCol->offsets, &offset, sizeof(offset)))) { + return code; + } + if ((code = tBufferAppend(&valCol->data, value->pData, value->nData))) { + return code; + } + } else { + return tBufferAppend(&valCol->data, &value->val, tDataTypes[value->type].bytes); + } + valCol->numOfValues++; + + return 0; +} + +int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) { + if (idx < 0 || idx >= valCol->numOfValues) { + return TSDB_CODE_OUT_OF_RANGE; + } + + value->type = valCol->type; + if (IS_VAR_DATA_TYPE(value->type)) { + int32_t offset, nextOffset; + + memcpy(&offset, tBufferGetData(&valCol->data) + idx * sizeof(offset), sizeof(offset)); + if (idx == valCol->numOfValues - 1) { + nextOffset = tBufferGetSize(&valCol->data); + } else { + memcpy(&nextOffset, tBufferGetData(&valCol->data) + (idx + 1) * sizeof(offset), sizeof(nextOffset)); + } + value->nData = nextOffset - offset; + value->pData = (uint8_t *)((char *)tBufferGetData(&valCol->data) + offset); + } else { + memcpy(&value->val, (char *)tBufferGetData(&valCol->data) + idx * tDataTypes[value->type].bytes, + tDataTypes[value->type].bytes); + } + return 0; +} + +int32_t tValueColumnCompress(SValueColumn *valCol, SBuffer *buffer) { + // TODO + ASSERT(0); + return 0; +} + +int32_t tValueColumnDecompress(SBuffer *buffer, SValueColumn *valCol) { + ASSERT(0); + // TODO + return 0; +}