586 lines
20 KiB
C++
586 lines
20 KiB
C++
/*
|
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <gtest/gtest.h>
|
|
#include <vnodeInt.h>
|
|
|
|
#include <taoserror.h>
|
|
#include <tglobal.h>
|
|
#include <iostream>
|
|
|
|
#include <tmsg.h>
|
|
#include <vnodeInt.h>
|
|
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
|
|
|
int main(int argc, char **argv) {
|
|
testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|
|
|
|
TEST(testCase, unionEncodeDecodeTest) {
|
|
typedef struct {
|
|
union {
|
|
uint8_t info;
|
|
struct {
|
|
uint8_t rollup : 1; // 1 means rollup sma
|
|
uint8_t type : 7;
|
|
};
|
|
};
|
|
col_id_t nBSmaCols;
|
|
col_id_t *pBSmaCols;
|
|
} SUnionTest;
|
|
|
|
SUnionTest sut = {0};
|
|
sut.rollup = 1;
|
|
sut.type = 1;
|
|
|
|
sut.nBSmaCols = 2;
|
|
sut.pBSmaCols = (col_id_t *)taosMemoryMalloc(sut.nBSmaCols * sizeof(col_id_t));
|
|
for (col_id_t i = 0; i < sut.nBSmaCols; ++i) {
|
|
sut.pBSmaCols[i] = i + 100;
|
|
}
|
|
|
|
void *buf = taosMemoryMalloc(1024);
|
|
void *pBuf = buf;
|
|
void *qBuf = buf;
|
|
int32_t tlen = 0;
|
|
tlen += taosEncodeFixedU8(&pBuf, sut.info);
|
|
tlen += taosEncodeFixedI16(&pBuf, sut.nBSmaCols);
|
|
for (col_id_t i = 0; i < sut.nBSmaCols; ++i) {
|
|
tlen += taosEncodeFixedI16(&pBuf, sut.pBSmaCols[i]);
|
|
}
|
|
|
|
SUnionTest dut = {0};
|
|
qBuf = taosDecodeFixedU8(qBuf, &dut.info);
|
|
qBuf = taosDecodeFixedI16(qBuf, &dut.nBSmaCols);
|
|
if (dut.nBSmaCols > 0) {
|
|
dut.pBSmaCols = (col_id_t *)taosMemoryMalloc(dut.nBSmaCols * sizeof(col_id_t));
|
|
for (col_id_t i = 0; i < dut.nBSmaCols; ++i) {
|
|
qBuf = taosDecodeFixedI16(qBuf, dut.pBSmaCols + i);
|
|
}
|
|
} else {
|
|
dut.pBSmaCols = NULL;
|
|
}
|
|
|
|
printf("sut.rollup=%" PRIu8 ", type=%" PRIu8 ", info=%" PRIu8 "\n", sut.rollup, sut.type, sut.info);
|
|
printf("dut.rollup=%" PRIu8 ", type=%" PRIu8 ", info=%" PRIu8 "\n", dut.rollup, dut.type, dut.info);
|
|
|
|
EXPECT_EQ(sut.rollup, dut.rollup);
|
|
EXPECT_EQ(sut.type, dut.type);
|
|
EXPECT_EQ(sut.nBSmaCols, dut.nBSmaCols);
|
|
for (col_id_t i = 0; i < sut.nBSmaCols; ++i) {
|
|
EXPECT_EQ(*(col_id_t *)(sut.pBSmaCols + i), sut.pBSmaCols[i]);
|
|
EXPECT_EQ(*(col_id_t *)(sut.pBSmaCols + i), dut.pBSmaCols[i]);
|
|
}
|
|
|
|
taosMemoryFreeClear(buf);
|
|
taosMemoryFreeClear(dut.pBSmaCols);
|
|
taosMemoryFreeClear(sut.pBSmaCols);
|
|
}
|
|
#if 1
|
|
TEST(testCase, tSma_Meta_Encode_Decode_Test) {
|
|
// encode
|
|
STSma tSma = {0};
|
|
tSma.version = 0;
|
|
tSma.intervalUnit = TIME_UNIT_DAY;
|
|
tSma.interval = 1;
|
|
tSma.slidingUnit = TIME_UNIT_HOUR;
|
|
tSma.sliding = 0;
|
|
tstrncpy(tSma.indexName, "sma_index_test", TSDB_INDEX_NAME_LEN);
|
|
tSma.timezoneInt = 8;
|
|
tSma.indexUid = 2345678910;
|
|
tSma.tableUid = 1234567890;
|
|
|
|
STSmaWrapper tSmaWrapper = {.number = 1, .tSma = &tSma};
|
|
uint32_t bufLen = tEncodeTSmaWrapper(NULL, &tSmaWrapper);
|
|
|
|
void *buf = taosMemoryCalloc(1, bufLen);
|
|
EXPECT_NE(buf, nullptr);
|
|
|
|
STSmaWrapper *pSW = (STSmaWrapper *)buf;
|
|
uint32_t len = tEncodeTSmaWrapper(&buf, &tSmaWrapper);
|
|
|
|
EXPECT_EQ(len, bufLen);
|
|
|
|
// decode
|
|
STSmaWrapper dstTSmaWrapper = {0};
|
|
void *result = tDecodeTSmaWrapper(pSW, &dstTSmaWrapper, false);
|
|
EXPECT_NE(result, nullptr);
|
|
|
|
EXPECT_EQ(tSmaWrapper.number, dstTSmaWrapper.number);
|
|
|
|
for (int i = 0; i < tSmaWrapper.number; ++i) {
|
|
STSma *pSma = tSmaWrapper.tSma + i;
|
|
STSma *qSma = dstTSmaWrapper.tSma + i;
|
|
|
|
EXPECT_EQ(pSma->version, qSma->version);
|
|
EXPECT_EQ(pSma->intervalUnit, qSma->intervalUnit);
|
|
EXPECT_EQ(pSma->slidingUnit, qSma->slidingUnit);
|
|
EXPECT_STRCASEEQ(pSma->indexName, qSma->indexName);
|
|
EXPECT_EQ(pSma->timezoneInt, qSma->timezoneInt);
|
|
EXPECT_EQ(pSma->indexUid, qSma->indexUid);
|
|
EXPECT_EQ(pSma->tableUid, qSma->tableUid);
|
|
EXPECT_EQ(pSma->interval, qSma->interval);
|
|
EXPECT_EQ(pSma->sliding, qSma->sliding);
|
|
EXPECT_EQ(pSma->exprLen, qSma->exprLen);
|
|
EXPECT_STRCASEEQ(pSma->expr, qSma->expr);
|
|
EXPECT_EQ(pSma->tagsFilterLen, qSma->tagsFilterLen);
|
|
EXPECT_STRCASEEQ(pSma->tagsFilter, qSma->tagsFilter);
|
|
}
|
|
|
|
// resource release
|
|
taosMemoryFreeClear(pSW);
|
|
tDestroyTSma(&tSma);
|
|
tDestroyTSmaWrapper(&dstTSmaWrapper);
|
|
}
|
|
#endif
|
|
|
|
#if 1
|
|
TEST(testCase, tSma_metaDB_Put_Get_Del_Test) {
|
|
const char *smaIndexName1 = "sma_index_test_1";
|
|
const char *smaIndexName2 = "sma_index_test_2";
|
|
int8_t timezone = 8;
|
|
const char *expr = "select count(a,b, top 20), from table interval 1d, sliding 1h;";
|
|
const char *tagsFilter = "I'm tags filter";
|
|
const char *smaTestDir = "./smaTest";
|
|
const tb_uid_t tbUid = 1234567890;
|
|
const int64_t indexUid1 = 2000000001;
|
|
const int64_t indexUid2 = 2000000002;
|
|
const uint32_t nCntTSma = 2;
|
|
// encode
|
|
STSma tSma = {0};
|
|
tSma.version = 0;
|
|
tSma.intervalUnit = TIME_UNIT_DAY;
|
|
tSma.interval = 1;
|
|
tSma.slidingUnit = TIME_UNIT_HOUR;
|
|
tSma.sliding = 0;
|
|
tSma.indexUid = indexUid1;
|
|
tstrncpy(tSma.indexName, smaIndexName1, TSDB_INDEX_NAME_LEN);
|
|
tSma.timezoneInt = 8;
|
|
tSma.tableUid = tbUid;
|
|
|
|
tSma.exprLen = strlen(expr);
|
|
tSma.expr = (char *)taosMemoryCalloc(1, tSma.exprLen + 1);
|
|
EXPECT_NE(tSma.expr, nullptr);
|
|
tstrncpy(tSma.expr, expr, tSma.exprLen + 1);
|
|
|
|
tSma.tagsFilterLen = strlen(tagsFilter);
|
|
tSma.tagsFilter = (char *)taosMemoryCalloc(tSma.tagsFilterLen + 1, 1);
|
|
EXPECT_NE(tSma.tagsFilter, nullptr);
|
|
tstrncpy(tSma.tagsFilter, tagsFilter, tSma.tagsFilterLen + 1);
|
|
|
|
SMeta *pMeta = NULL;
|
|
STSma *pSmaCfg = &tSma;
|
|
const SMetaCfg *pMetaCfg = &defaultMetaOptions;
|
|
|
|
taosRemoveDir(smaTestDir);
|
|
|
|
pMeta = metaOpen(smaTestDir, pMetaCfg, NULL);
|
|
assert(pMeta != NULL);
|
|
// save index 1
|
|
EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
|
|
|
|
pSmaCfg->indexUid = indexUid2;
|
|
tstrncpy(pSmaCfg->indexName, smaIndexName2, TSDB_INDEX_NAME_LEN);
|
|
pSmaCfg->version = 1;
|
|
pSmaCfg->intervalUnit = TIME_UNIT_HOUR;
|
|
pSmaCfg->interval = 1;
|
|
pSmaCfg->slidingUnit = TIME_UNIT_MINUTE;
|
|
pSmaCfg->sliding = 5;
|
|
|
|
// save index 2
|
|
EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
|
|
|
|
// get value by indexName
|
|
STSma *qSmaCfg = NULL;
|
|
qSmaCfg = metaGetSmaInfoByIndex(pMeta, indexUid1, true);
|
|
assert(qSmaCfg != NULL);
|
|
printf("name1 = %s\n", qSmaCfg->indexName);
|
|
printf("timezone1 = %" PRIi8 "\n", qSmaCfg->timezoneInt);
|
|
printf("expr1 = %s\n", qSmaCfg->expr != NULL ? qSmaCfg->expr : "");
|
|
printf("tagsFilter1 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
|
|
EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName1);
|
|
EXPECT_EQ(qSmaCfg->tableUid, tSma.tableUid);
|
|
tDestroyTSma(qSmaCfg);
|
|
taosMemoryFreeClear(qSmaCfg);
|
|
|
|
qSmaCfg = metaGetSmaInfoByIndex(pMeta, indexUid2, true);
|
|
assert(qSmaCfg != NULL);
|
|
printf("name2 = %s\n", qSmaCfg->indexName);
|
|
printf("timezone2 = %" PRIi8 "\n", qSmaCfg->timezoneInt);
|
|
printf("expr2 = %s\n", qSmaCfg->expr != NULL ? qSmaCfg->expr : "");
|
|
printf("tagsFilter2 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
|
|
EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName2);
|
|
EXPECT_EQ(qSmaCfg->interval, tSma.interval);
|
|
tDestroyTSma(qSmaCfg);
|
|
taosMemoryFreeClear(qSmaCfg);
|
|
|
|
// get index name by table uid
|
|
#if 0
|
|
SMSmaCursor *pSmaCur = metaOpenSmaCursor(pMeta, tbUid);
|
|
assert(pSmaCur != NULL);
|
|
uint32_t indexCnt = 0;
|
|
while (1) {
|
|
const char *indexName = (const char *)metaSmaCursorNext(pSmaCur);
|
|
if (indexName == NULL) {
|
|
break;
|
|
}
|
|
printf("indexName = %s\n", indexName);
|
|
++indexCnt;
|
|
}
|
|
EXPECT_EQ(indexCnt, nCntTSma);
|
|
metaCloseSmaCursor(pSmaCur);
|
|
#endif
|
|
// get wrapper by table uid
|
|
STSmaWrapper *pSW = metaGetSmaInfoByTable(pMeta, tbUid);
|
|
assert(pSW != NULL);
|
|
EXPECT_EQ(pSW->number, nCntTSma);
|
|
EXPECT_STRCASEEQ(pSW->tSma->indexName, smaIndexName1);
|
|
EXPECT_EQ(pSW->tSma->timezoneInt, timezone);
|
|
EXPECT_STRCASEEQ(pSW->tSma->expr, expr);
|
|
EXPECT_STRCASEEQ(pSW->tSma->tagsFilter, tagsFilter);
|
|
EXPECT_EQ(pSW->tSma->indexUid, indexUid1);
|
|
EXPECT_EQ(pSW->tSma->tableUid, tbUid);
|
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->indexName, smaIndexName2);
|
|
EXPECT_EQ((pSW->tSma + 1)->timezoneInt, timezone);
|
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->expr, expr);
|
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->tagsFilter, tagsFilter);
|
|
EXPECT_EQ((pSW->tSma + 1)->indexUid, indexUid2);
|
|
EXPECT_EQ((pSW->tSma + 1)->tableUid, tbUid);
|
|
|
|
tDestroyTSmaWrapper(pSW);
|
|
taosMemoryFreeClear(pSW);
|
|
|
|
// get all sma table uids
|
|
SArray *pUids = metaGetSmaTbUids(pMeta, false);
|
|
assert(pUids != NULL);
|
|
for (uint32_t i = 0; i < taosArrayGetSize(pUids); ++i) {
|
|
printf("metaGetSmaTbUids: uid[%" PRIu32 "] = %" PRIi64 "\n", i, *(tb_uid_t *)taosArrayGet(pUids, i));
|
|
// printf("metaGetSmaTbUids: index[%" PRIu32 "] = %s", i, (char *)taosArrayGet(pUids, i));
|
|
}
|
|
EXPECT_EQ(taosArrayGetSize(pUids), 1);
|
|
taosArrayDestroy(pUids);
|
|
|
|
// resource release
|
|
metaRemoveSmaFromDb(pMeta, indexUid1);
|
|
metaRemoveSmaFromDb(pMeta, indexUid2);
|
|
|
|
tDestroyTSma(&tSma);
|
|
metaClose(&pMeta);
|
|
}
|
|
#endif
|
|
|
|
#if 1
|
|
TEST(testCase, tSma_Data_Insert_Query_Test) {
|
|
// step 1: prepare meta
|
|
const char *smaIndexName1 = "sma_index_test_1";
|
|
const int8_t timezone = 8;
|
|
const char *expr = "select count(a,b, top 20), from table interval 1d, sliding 1h;";
|
|
const char *tagsFilter = "where tags.location='Beijing' and tags.district='ChaoYang'";
|
|
const char *smaTestDir = "./smaTest";
|
|
const tb_uid_t tbUid = 1234567890;
|
|
const int64_t indexUid1 = 2000000001;
|
|
const int64_t interval1 = 1;
|
|
const int8_t intervalUnit1 = TIME_UNIT_DAY;
|
|
const uint32_t nCntTSma = 2;
|
|
TSKEY skey1 = 1646987196;
|
|
const int64_t testSmaData1 = 100;
|
|
const int64_t testSmaData2 = 200;
|
|
// encode
|
|
STSma tSma = {0};
|
|
tSma.version = 0;
|
|
tSma.intervalUnit = TIME_UNIT_MINUTE;
|
|
tSma.interval = 1;
|
|
tSma.slidingUnit = TIME_UNIT_MINUTE;
|
|
tSma.sliding = 1; // sliding = interval when it's convert window
|
|
tSma.indexUid = indexUid1;
|
|
tstrncpy(tSma.indexName, smaIndexName1, TSDB_INDEX_NAME_LEN);
|
|
tSma.timezoneInt = timezone;
|
|
tSma.tableUid = tbUid;
|
|
|
|
tSma.exprLen = strlen(expr);
|
|
tSma.expr = (char *)taosMemoryCalloc(1, tSma.exprLen + 1);
|
|
EXPECT_NE(tSma.expr, nullptr);
|
|
tstrncpy(tSma.expr, expr, tSma.exprLen + 1);
|
|
|
|
tSma.tagsFilterLen = strlen(tagsFilter);
|
|
tSma.tagsFilter = (char *)taosMemoryCalloc(1, tSma.tagsFilterLen + 1);
|
|
EXPECT_NE(tSma.tagsFilter, nullptr);
|
|
tstrncpy(tSma.tagsFilter, tagsFilter, tSma.tagsFilterLen + 1);
|
|
|
|
SMeta *pMeta = NULL;
|
|
STSma *pSmaCfg = &tSma;
|
|
const SMetaCfg *pMetaCfg = &defaultMetaOptions;
|
|
|
|
taosRemoveDir(smaTestDir);
|
|
|
|
pMeta = metaOpen(smaTestDir, pMetaCfg, NULL);
|
|
assert(pMeta != NULL);
|
|
// save index 1
|
|
EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
|
|
|
|
// step 2: insert data
|
|
STsdb *pTsdb = (STsdb *)taosMemoryCalloc(1, sizeof(STsdb));
|
|
STsdbCfg *pCfg = &pTsdb->config;
|
|
|
|
pTsdb->pMeta = pMeta;
|
|
pTsdb->vgId = 2;
|
|
pTsdb->config.daysPerFile = 10; // default days is 10
|
|
pTsdb->config.keep1 = 30;
|
|
pTsdb->config.keep2 = 90;
|
|
pTsdb->config.keep = 365;
|
|
pTsdb->config.precision = TSDB_TIME_PRECISION_MILLI;
|
|
pTsdb->config.update = TD_ROW_OVERWRITE_UPDATE;
|
|
pTsdb->config.compression = TWO_STAGE_COMP;
|
|
|
|
switch (pTsdb->config.precision) {
|
|
case TSDB_TIME_PRECISION_MILLI:
|
|
skey1 *= 1e3;
|
|
break;
|
|
case TSDB_TIME_PRECISION_MICRO:
|
|
skey1 *= 1e6;
|
|
break;
|
|
case TSDB_TIME_PRECISION_NANO:
|
|
skey1 *= 1e9;
|
|
break;
|
|
default: // ms
|
|
skey1 *= 1e3;
|
|
break;
|
|
}
|
|
|
|
SDiskCfg pDisks = {0};
|
|
pDisks.level = 0;
|
|
pDisks.primary = 1;
|
|
strncpy(pDisks.dir, TD_DATA_DIR_PATH, TSDB_FILENAME_LEN);
|
|
int32_t numOfDisks = 1;
|
|
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
|
EXPECT_NE(pTsdb->pTfs, nullptr);
|
|
|
|
// generate SSubmitReq msg and update expire window
|
|
int16_t schemaVer = 0;
|
|
uint32_t mockRowLen = sizeof(STSRow);
|
|
uint32_t mockRowNum = 2;
|
|
uint32_t mockBlkNum = 2;
|
|
uint32_t msgLen = sizeof(SSubmitReq) + mockBlkNum * sizeof(SSubmitBlk) + mockBlkNum * mockRowNum * mockRowLen;
|
|
|
|
SSubmitReq *pMsg = (SSubmitReq *)taosMemoryCalloc(1, msgLen);
|
|
EXPECT_NE(pMsg, nullptr);
|
|
pMsg->version = htobe64(schemaVer);
|
|
pMsg->numOfBlocks = htonl(mockBlkNum);
|
|
pMsg->length = htonl(msgLen);
|
|
|
|
SSubmitBlk *pBlk = NULL;
|
|
STSRow *pRow = NULL;
|
|
TSKEY now = taosGetTimestamp(pTsdb->config.precision);
|
|
|
|
for (uint32_t b = 0; b < mockBlkNum; ++b) {
|
|
pBlk = (SSubmitBlk *)POINTER_SHIFT(pMsg, sizeof(SSubmitReq) + b * (sizeof(SSubmitBlk) + mockRowNum * mockRowLen));
|
|
pBlk->uid = htobe64(tbUid);
|
|
pBlk->suid = htobe64(tbUid);
|
|
pBlk->sversion = htonl(schemaVer);
|
|
pBlk->schemaLen = htonl(0);
|
|
pBlk->numOfRows = htonl(mockRowNum);
|
|
pBlk->dataLen = htonl(mockRowNum * mockRowLen);
|
|
for (uint32_t r = 0; r < mockRowNum; ++r) {
|
|
pRow = (STSRow *)POINTER_SHIFT(pBlk, sizeof(SSubmitBlk) + r * mockRowLen);
|
|
pRow->len = mockRowLen;
|
|
pRow->ts = now + b * 1000 + r * 1000;
|
|
pRow->sver = schemaVer;
|
|
}
|
|
}
|
|
|
|
// EXPECT_EQ(tdScanAndConvertSubmitMsg(pMsg), TSDB_CODE_SUCCESS);
|
|
|
|
EXPECT_EQ(tsdbUpdateSmaWindow(pTsdb, pMsg, 0), 0);
|
|
|
|
// init
|
|
const int32_t tSmaGroupSize = 4;
|
|
const int32_t tSmaNumOfTags = 2;
|
|
const int64_t tSmaGroupId = 12345670;
|
|
const col_id_t tSmaNumOfCols = 9; // binary/nchar/varbinary/varchar are only used for tags for group by conditions.
|
|
const int32_t tSmaNumOfRows = 2;
|
|
|
|
SArray *pDataBlocks = taosArrayInit(tSmaGroupSize, sizeof(SSDataBlock *));
|
|
EXPECT_NE(pDataBlocks, nullptr);
|
|
int32_t tSmaTypeArray[tSmaNumOfCols] = {TSDB_DATA_TYPE_TIMESTAMP, TSDB_DATA_TYPE_BOOL, TSDB_DATA_TYPE_INT,
|
|
TSDB_DATA_TYPE_UBIGINT, TSDB_DATA_TYPE_SMALLINT, TSDB_DATA_TYPE_FLOAT,
|
|
TSDB_DATA_TYPE_DOUBLE, TSDB_DATA_TYPE_VARCHAR, TSDB_DATA_TYPE_NCHAR};
|
|
// last 2 columns for group by tags
|
|
// int32_t tSmaTypeArray[tSmaNumOfCols] = {TSDB_DATA_TYPE_TIMESTAMP, TSDB_DATA_TYPE_BOOL};
|
|
const char *tSmaGroupbyTags[tSmaGroupSize * tSmaNumOfTags] = {"BeiJing", "HaiDian", "BeiJing", "ChaoYang",
|
|
"ShangHai", "PuDong", "ShangHai", "MinHang"};
|
|
TSKEY tSmaSKeyMs = (int64_t)1648535332 * 1000;
|
|
int64_t tSmaIntervalMs = tSma.interval * 60 * 1000;
|
|
int64_t tSmaInitVal = 0;
|
|
|
|
for (int32_t g = 0; g < tSmaGroupSize; ++g) {
|
|
SSDataBlock *pDataBlock = (SSDataBlock *)taosMemoryCalloc(1, sizeof(SSDataBlock));
|
|
EXPECT_NE(pDataBlock, nullptr);
|
|
pDataBlock->pBlockAgg = NULL;
|
|
taosArrayGetSize(pDataBlock->pDataBlock) = tSmaNumOfCols;
|
|
pDataBlock->info.rows = tSmaNumOfRows;
|
|
pDataBlock->info.id.groupId = tSmaGroupId + g;
|
|
|
|
pDataBlock->pDataBlock = taosArrayInit(tSmaNumOfCols, sizeof(SColumnInfoData *));
|
|
EXPECT_NE(pDataBlock->pDataBlock, nullptr);
|
|
for (int32_t c = 0; c < tSmaNumOfCols; ++c) {
|
|
SColumnInfoData *pColInfoData = (SColumnInfoData *)taosMemoryCalloc(1, sizeof(SColumnInfoData));
|
|
EXPECT_NE(pColInfoData, nullptr);
|
|
|
|
pColInfoData->info.type = tSmaTypeArray[c];
|
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
|
pColInfoData->info.bytes = 100; // update accordingly
|
|
} else {
|
|
pColInfoData->info.bytes = TYPE_BYTES[pColInfoData->info.type];
|
|
}
|
|
pColInfoData->pData = (char *)taosMemoryCalloc(1, tSmaNumOfRows * pColInfoData->info.bytes);
|
|
|
|
for (int32_t r = 0; r < tSmaNumOfRows; ++r) {
|
|
void *pCellData = pColInfoData->pData + r * pColInfoData->info.bytes;
|
|
switch (pColInfoData->info.type) {
|
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
*(TSKEY *)pCellData = tSmaSKeyMs + tSmaIntervalMs * r;
|
|
break;
|
|
case TSDB_DATA_TYPE_BOOL:
|
|
*(bool *)pCellData = (bool)tSmaInitVal++;
|
|
break;
|
|
case TSDB_DATA_TYPE_INT:
|
|
*(int *)pCellData = (int)tSmaInitVal++;
|
|
break;
|
|
case TSDB_DATA_TYPE_UBIGINT:
|
|
*(uint64_t *)pCellData = (uint64_t)tSmaInitVal++;
|
|
break;
|
|
case TSDB_DATA_TYPE_SMALLINT:
|
|
*(int16_t *)pCellData = (int16_t)tSmaInitVal++;
|
|
break;
|
|
case TSDB_DATA_TYPE_FLOAT:
|
|
*(float *)pCellData = (float)tSmaInitVal++;
|
|
break;
|
|
case TSDB_DATA_TYPE_DOUBLE:
|
|
*(double *)pCellData = (double)tSmaInitVal++;
|
|
break;
|
|
case TSDB_DATA_TYPE_VARCHAR: // city
|
|
varDataSetLen(pCellData, strlen(tSmaGroupbyTags[g * 2]));
|
|
memcpy(varDataVal(pCellData), tSmaGroupbyTags[g * 2], varDataLen(pCellData));
|
|
break;
|
|
case TSDB_DATA_TYPE_NCHAR: // district
|
|
varDataSetLen(pCellData, strlen(tSmaGroupbyTags[g * 2 + 1]));
|
|
memcpy(varDataVal(pCellData), tSmaGroupbyTags[g * 2 + 1], varDataLen(pCellData));
|
|
break;
|
|
default:
|
|
EXPECT_EQ(0, 1); // add definition
|
|
break;
|
|
}
|
|
}
|
|
// push SColumnInfoData
|
|
taosArrayPush(pDataBlock->pDataBlock, &pColInfoData);
|
|
}
|
|
// push SSDataBlock
|
|
taosArrayPush(pDataBlocks, &pDataBlock);
|
|
}
|
|
|
|
// execute
|
|
EXPECT_EQ(tsdbInsertTSmaData(pTsdb, tSma.indexUid, (const char *)pDataBlocks), TSDB_CODE_SUCCESS);
|
|
|
|
#if 0
|
|
STSmaDataWrapper *pSmaData = NULL;
|
|
pSmaData = (STSmaDataWrapper *)buf;
|
|
printf(">> allocate [%d] time to %d and addr is %p\n", ++allocCnt, bufSize, pSmaData);
|
|
pSmaData->skey = skey1;
|
|
pSmaData->interval = interval1;
|
|
pSmaData->intervalUnit = intervalUnit1;
|
|
pSmaData->indexUid = indexUid1;
|
|
|
|
int32_t len = sizeof(STSmaDataWrapper);
|
|
for (int32_t t = 0; t < numOfTables; ++t) {
|
|
STSmaTbData *pTbData = (STSmaTbData *)POINTER_SHIFT(pSmaData, len);
|
|
pTbData->tableUid = tbUid + t;
|
|
|
|
int32_t tableDataLen = sizeof(STSmaTbData);
|
|
for (col_id_t c = 0; c < numOfCols; ++c) {
|
|
if (bufSize - len - tableDataLen < buffer) {
|
|
EXPECT_EQ(tsdbMakeRoom(&buf, bufSize + allocStep), 0);
|
|
pSmaData = (STSmaDataWrapper *)buf;
|
|
pTbData = (STSmaTbData *)POINTER_SHIFT(pSmaData, len);
|
|
bufSize = taosTSizeof(buf);
|
|
printf(">> allocate [%d] time to %d and addr is %p\n", ++allocCnt, bufSize, pSmaData);
|
|
}
|
|
STSmaColData *pColData = (STSmaColData *)POINTER_SHIFT(pSmaData, len + tableDataLen);
|
|
pColData->colId = c + PRIMARYKEY_TIMESTAMP_COL_ID;
|
|
|
|
// TODO: fill col data
|
|
if ((c & 1) == 0) {
|
|
pColData->blockSize = 8;
|
|
memcpy(pColData->data, &testSmaData1, 8);
|
|
} else {
|
|
pColData->blockSize = 16;
|
|
memcpy(pColData->data, &testSmaData1, 8);
|
|
memcpy(POINTER_SHIFT(pColData->data, 8), &testSmaData2, 8);
|
|
}
|
|
|
|
tableDataLen += (sizeof(STSmaColData) + pColData->blockSize);
|
|
}
|
|
pTbData->dataLen = (tableDataLen - sizeof(STSmaTbData));
|
|
len += tableDataLen;
|
|
// printf("bufSize=%d, len=%d, len of table[%d]=%d\n", bufSize, len, t, tableDataLen);
|
|
}
|
|
pSmaData->dataLen = (len - sizeof(STSmaDataWrapper));
|
|
|
|
EXPECT_GE(bufSize, pSmaData->dataLen);
|
|
// execute
|
|
EXPECT_EQ(tsdbInsertTSmaData(pTsdb, (char *)pSmaData), TSDB_CODE_SUCCESS);
|
|
#endif
|
|
|
|
// step 3: query
|
|
uint32_t checkDataCnt = 0;
|
|
EXPECT_EQ(tsdbGetTSmaData(pTsdb, NULL, indexUid1, skey1, 1), TSDB_CODE_SUCCESS);
|
|
++checkDataCnt;
|
|
|
|
printf("%s:%d The sma data check count for insert and query is %" PRIu32 "\n", __FILE__, __LINE__, checkDataCnt);
|
|
|
|
// release data
|
|
taosMemoryFreeClear(pMsg);
|
|
|
|
for (int32_t i = 0; i < taosArrayGetSize(pDataBlocks); ++i) {
|
|
SSDataBlock *pDataBlock = *(SSDataBlock **)taosArrayGet(pDataBlocks, i);
|
|
int32_t numOfOutput = taosArrayGetSize(pDataBlock->pDataBlock);
|
|
for (int32_t j = 0; j < numOfOutput; ++j) {
|
|
SColumnInfoData *pColInfoData = *(SColumnInfoData **)taosArrayGet(pDataBlock->pDataBlock, j);
|
|
colDataDestroy(pColInfoData);
|
|
taosMemoryFreeClear(pColInfoData);
|
|
}
|
|
|
|
taosArrayDestroy(pDataBlock->pDataBlock);
|
|
taosMemoryFreeClear(pDataBlock->pBlockAgg);
|
|
taosMemoryFreeClear(pDataBlock);
|
|
}
|
|
taosArrayDestroy(pDataBlocks);
|
|
|
|
// release meta
|
|
tDestroyTSma(&tSma);
|
|
tfsClose(pTsdb->pTfs);
|
|
tsdbClose(pTsdb);
|
|
metaClose(&pMeta);
|
|
}
|
|
|
|
#endif
|
|
|
|
#pragma GCC diagnostic pop
|