tsdbSmaTest.cpp 9.5 KB
Newer Older
C
Cary Xu 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * 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 <taoserror.h>
#include <tglobal.h>
#include <iostream>

C
Cary Xu 已提交
21
#include <metaDef.h>
C
Cary Xu 已提交
22
#include <tmsg.h>
C
Cary Xu 已提交
23
#include <tsdbDef.h>
C
Cary Xu 已提交
24

C
Cary Xu 已提交
25 26 27 28 29 30
#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"

C
Cary Xu 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44
int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

TEST(testCase, tSmaEncodeDecodeTest) {
  // encode
  STSma tSma = {0};
  tSma.version = 0;
  tSma.intervalUnit = TD_TIME_UNIT_DAY;
  tSma.interval = 1;
  tSma.slidingUnit = TD_TIME_UNIT_HOUR;
  tSma.sliding = 0;
  tstrncpy(tSma.indexName, "sma_index_test", TSDB_INDEX_NAME_LEN);
C
Cary Xu 已提交
45
  tstrncpy(tSma.timezone, "Asia/Shanghai", TD_TIMEZONE_LEN);
C
Cary Xu 已提交
46
  tSma.indexUid = 2345678910;
C
Cary Xu 已提交
47
  tSma.tableUid = 1234567890;
C
Cary Xu 已提交
48

C
Cary Xu 已提交
49 50
  STSmaWrapper tSmaWrapper = {.number = 1, .tSma = &tSma};
  uint32_t     bufLen = tEncodeTSmaWrapper(NULL, &tSmaWrapper);
C
Cary Xu 已提交
51

C
Cary Xu 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
  void *buf = calloc(bufLen, 1);
  assert(buf != NULL);

  STSmaWrapper *pSW = (STSmaWrapper *)buf;
  uint32_t      len = tEncodeTSmaWrapper(&buf, &tSmaWrapper);

  EXPECT_EQ(len, bufLen);

  // decode
  STSmaWrapper dstTSmaWrapper = {0};
  void *       result = tDecodeTSmaWrapper(pSW, &dstTSmaWrapper);
  assert(result != NULL);

  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);
C
Cary Xu 已提交
75
    EXPECT_STRCASEEQ(pSma->timezone, qSma->timezone);
C
Cary Xu 已提交
76
    EXPECT_EQ(pSma->indexUid, qSma->indexUid);
C
Cary Xu 已提交
77 78 79
    EXPECT_EQ(pSma->tableUid, qSma->tableUid);
    EXPECT_EQ(pSma->interval, qSma->interval);
    EXPECT_EQ(pSma->sliding, qSma->sliding);
C
Cary Xu 已提交
80 81
    EXPECT_EQ(pSma->exprLen, qSma->exprLen);
    EXPECT_STRCASEEQ(pSma->expr, qSma->expr);
C
Cary Xu 已提交
82 83
    EXPECT_EQ(pSma->tagsFilterLen, qSma->tagsFilterLen);
    EXPECT_STRCASEEQ(pSma->tagsFilter, qSma->tagsFilter);
C
Cary Xu 已提交
84 85 86
  }

  // resource release
C
Cary Xu 已提交
87 88
  tdDestroyTSma(&tSma);
  tdDestroyTSmaWrapper(&dstTSmaWrapper);
C
Cary Xu 已提交
89
}
C
Cary Xu 已提交
90
#if 1
C
Cary Xu 已提交
91
TEST(testCase, tSma_DB_Put_Get_Del_Test) {
C
Cary Xu 已提交
92 93
  const char *   smaIndexName1 = "sma_index_test_1";
  const char *   smaIndexName2 = "sma_index_test_2";
C
Cary Xu 已提交
94 95
  const char *   timezone = "Asia/Shanghai";
  const char *   expr = "select count(a,b, top 20), from table interval 1d, sliding 1h;";
C
Cary Xu 已提交
96 97
  const char *   tagsFilter = "I'm tags filter";
  const char *   smaTestDir = "./smaTest";
C
Cary Xu 已提交
98 99 100
  const tb_uid_t tbUid = 1234567890;
  const int64_t  indexUid1 = 2000000001;
  const int64_t  indexUid2 = 2000000002;
C
Cary Xu 已提交
101
  const uint32_t nCntTSma = 2;
C
Cary Xu 已提交
102 103 104 105 106 107 108
  // encode
  STSma tSma = {0};
  tSma.version = 0;
  tSma.intervalUnit = TD_TIME_UNIT_DAY;
  tSma.interval = 1;
  tSma.slidingUnit = TD_TIME_UNIT_HOUR;
  tSma.sliding = 0;
C
Cary Xu 已提交
109
  tSma.indexUid = indexUid1;
C
Cary Xu 已提交
110
  tstrncpy(tSma.indexName, smaIndexName1, TSDB_INDEX_NAME_LEN);
C
Cary Xu 已提交
111
  tstrncpy(tSma.timezone, timezone, TD_TIMEZONE_LEN);
C
Cary Xu 已提交
112
  tSma.tableUid = tbUid;
C
Cary Xu 已提交
113 114 115 116 117

  tSma.exprLen = strlen(expr);
  tSma.expr = (char *)calloc(tSma.exprLen + 1, 1);
  tstrncpy(tSma.expr, expr, tSma.exprLen + 1);

C
Cary Xu 已提交
118 119 120
  tSma.tagsFilterLen = strlen(tagsFilter);
  tSma.tagsFilter = (char *)calloc(tSma.tagsFilterLen + 1, 1);
  tstrncpy(tSma.tagsFilter, tagsFilter, tSma.tagsFilterLen + 1);
C
Cary Xu 已提交
121 122

  SMeta *         pMeta = NULL;
C
Cary Xu 已提交
123
  STSma *         pSmaCfg = &tSma;
C
Cary Xu 已提交
124 125 126 127 128 129 130
  const SMetaCfg *pMetaCfg = &defaultMetaOptions;

  taosRemoveDir(smaTestDir);

  pMeta = metaOpen(smaTestDir, pMetaCfg, NULL);
  assert(pMeta != NULL);
  // save index 1
C
Cary Xu 已提交
131
  EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
C
Cary Xu 已提交
132

C
Cary Xu 已提交
133
  pSmaCfg->indexUid = indexUid2;
C
Cary Xu 已提交
134 135 136 137 138 139 140 141
  tstrncpy(pSmaCfg->indexName, smaIndexName2, TSDB_INDEX_NAME_LEN);
  pSmaCfg->version = 1;
  pSmaCfg->intervalUnit = TD_TIME_UNIT_HOUR;
  pSmaCfg->interval = 1;
  pSmaCfg->slidingUnit = TD_TIME_UNIT_MINUTE;
  pSmaCfg->sliding = 5;

  // save index 2
C
Cary Xu 已提交
142
  EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
C
Cary Xu 已提交
143 144

  // get value by indexName
C
Cary Xu 已提交
145
  STSma *qSmaCfg = NULL;
C
Cary Xu 已提交
146
  qSmaCfg = metaGetSmaInfoByIndex(pMeta, indexUid1);
C
Cary Xu 已提交
147 148
  assert(qSmaCfg != NULL);
  printf("name1 = %s\n", qSmaCfg->indexName);
C
Cary Xu 已提交
149
  printf("timezone1 = %s\n", qSmaCfg->timezone);
C
Cary Xu 已提交
150
  printf("expr1 = %s\n", qSmaCfg->expr != NULL ? qSmaCfg->expr : "");
C
Cary Xu 已提交
151
  printf("tagsFilter1 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
C
Cary Xu 已提交
152 153
  EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName1);
  EXPECT_EQ(qSmaCfg->tableUid, tSma.tableUid);
C
Cary Xu 已提交
154
  tdDestroyTSma(qSmaCfg);
C
Cary Xu 已提交
155
  tfree(qSmaCfg);
C
Cary Xu 已提交
156

C
Cary Xu 已提交
157
  qSmaCfg = metaGetSmaInfoByIndex(pMeta, indexUid2);
C
Cary Xu 已提交
158 159
  assert(qSmaCfg != NULL);
  printf("name2 = %s\n", qSmaCfg->indexName);
C
Cary Xu 已提交
160
  printf("timezone2 = %s\n", qSmaCfg->timezone);
C
Cary Xu 已提交
161
  printf("expr2 = %s\n", qSmaCfg->expr != NULL ? qSmaCfg->expr : "");
C
Cary Xu 已提交
162
  printf("tagsFilter2 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
C
Cary Xu 已提交
163 164
  EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName2);
  EXPECT_EQ(qSmaCfg->interval, tSma.interval);
C
Cary Xu 已提交
165
  tdDestroyTSma(qSmaCfg);
C
Cary Xu 已提交
166
  tfree(qSmaCfg);
C
Cary Xu 已提交
167

C
Cary Xu 已提交
168
  // get index name by table uid
C
Cary Xu 已提交
169 170 171 172
  SMSmaCursor *pSmaCur = metaOpenSmaCursor(pMeta, tbUid);
  assert(pSmaCur != NULL);
  uint32_t indexCnt = 0;
  while (1) {
C
Cary Xu 已提交
173
    const char *indexName = metaSmaCursorNext(pSmaCur);
C
Cary Xu 已提交
174 175 176 177 178 179
    if (indexName == NULL) {
      break;
    }
    printf("indexName = %s\n", indexName);
    ++indexCnt;
  }
C
Cary Xu 已提交
180
  EXPECT_EQ(indexCnt, nCntTSma);
C
Cary Xu 已提交
181 182
  metaCloseSmaCurosr(pSmaCur);

C
Cary Xu 已提交
183
  // get wrapper by table uid
C
Cary Xu 已提交
184
  STSmaWrapper *pSW = metaGetSmaInfoByTable(pMeta, tbUid);
C
Cary Xu 已提交
185
  assert(pSW != NULL);
C
Cary Xu 已提交
186
  EXPECT_EQ(pSW->number, nCntTSma);
C
Cary Xu 已提交
187
  EXPECT_STRCASEEQ(pSW->tSma->indexName, smaIndexName1);
C
Cary Xu 已提交
188 189
  EXPECT_STRCASEEQ(pSW->tSma->timezone, timezone);
  EXPECT_STRCASEEQ(pSW->tSma->expr, expr);
C
Cary Xu 已提交
190
  EXPECT_STRCASEEQ(pSW->tSma->tagsFilter, tagsFilter);
C
Cary Xu 已提交
191 192
  EXPECT_EQ(pSW->tSma->indexUid, indexUid1);
  EXPECT_EQ(pSW->tSma->tableUid, tbUid);
C
Cary Xu 已提交
193
  EXPECT_STRCASEEQ((pSW->tSma + 1)->indexName, smaIndexName2);
C
Cary Xu 已提交
194 195
  EXPECT_STRCASEEQ((pSW->tSma + 1)->timezone, timezone);
  EXPECT_STRCASEEQ((pSW->tSma + 1)->expr, expr);
C
Cary Xu 已提交
196
  EXPECT_STRCASEEQ((pSW->tSma + 1)->tagsFilter, tagsFilter);
C
Cary Xu 已提交
197 198
  EXPECT_EQ((pSW->tSma + 1)->indexUid, indexUid2);
  EXPECT_EQ((pSW->tSma + 1)->tableUid, tbUid);
C
Cary Xu 已提交
199

C
Cary Xu 已提交
200 201 202 203 204 205 206 207 208 209 210 211
  tdDestroyTSmaWrapper(pSW);
  tfree(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);
C
Cary Xu 已提交
212

C
Cary Xu 已提交
213 214 215 216
  // resource release
  metaRemoveSmaFromDb(pMeta, smaIndexName1);
  metaRemoveSmaFromDb(pMeta, smaIndexName2);

C
Cary Xu 已提交
217
  tdDestroyTSma(&tSma);
C
Cary Xu 已提交
218
  metaClose(pMeta);
C
Cary Xu 已提交
219
}
C
Cary Xu 已提交
220
#endif
C
Cary Xu 已提交
221

C
Cary Xu 已提交
222
#if 1
C
Cary Xu 已提交
223
TEST(testCase, tSmaInsertTest) {
C
Cary Xu 已提交
224 225 226 227 228 229
  const int64_t     indexUid = 2000000002;
  STSmaDataWrapper *pSmaData = NULL;
  STsdb             tsdb = {0};
  STsdbCfg *        pCfg = &tsdb.config;

  pCfg->daysPerFile = 1;
C
Cary Xu 已提交
230 231

  // init
C
Cary Xu 已提交
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
  int32_t allocCnt = 0;
  int32_t allocStep = 40960;
  int32_t buffer = 4096;
  void *  buf = NULL;
  EXPECT_EQ(tsdbMakeRoom(&buf, allocStep), 0);
  int32_t  bufSize = taosTSizeof(buf);
  int32_t  numOfTables = 25;
  col_id_t numOfCols = 4096;
  EXPECT_GT(numOfCols, 0);

  pSmaData = (STSmaDataWrapper *)buf;
  printf(">> allocate [%d] time to %d and addr is %p\n", ++allocCnt, bufSize, pSmaData);
  pSmaData->skey = 1646987196;
  pSmaData->interval = 10;
  pSmaData->intervalUnit = TD_TIME_UNIT_MINUTE;
  pSmaData->indexUid = indexUid;

  int32_t len = sizeof(STSmaDataWrapper);
  for (int32_t t = 0; t < numOfTables; ++t) {
    STSmaTbData *pTbData = (STSmaTbData *)POINTER_SHIFT(pSmaData, len);
    pTbData->tableUid = 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;
      pColData->blockSize = ((c & 1) == 0) ? 8 : 16;
      // TODO: fill col data
      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);
C
Cary Xu 已提交
272
  }
C
Cary Xu 已提交
273 274 275
  pSmaData->dataLen = (len - sizeof(STSmaDataWrapper));

  EXPECT_GE(bufSize, pSmaData->dataLen);
C
Cary Xu 已提交
276 277

  // execute
C
Cary Xu 已提交
278
  EXPECT_EQ(tsdbInsertTSmaData(&tsdb, (char *)pSmaData), TSDB_CODE_SUCCESS);
C
Cary Xu 已提交
279 280

  // release
C
Cary Xu 已提交
281
  taosTZfree(buf);
C
Cary Xu 已提交
282 283 284 285
}
#endif

#pragma GCC diagnostic pop