metaQuery.c 15.7 KB
Newer Older
H
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

H
Hongze Cheng 已提交
16
#include "meta.h"
H
Hongze Cheng 已提交
17

H
Hongze Cheng 已提交
18
void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags) {
H
Hongze Cheng 已提交
19 20
  memset(pReader, 0, sizeof(*pReader));
  pReader->flags = flags;
H
Hongze Cheng 已提交
21
  pReader->pMeta = pMeta;
H
Hongze Cheng 已提交
22
  metaRLock(pMeta);
H
Hongze Cheng 已提交
23
}
H
Hongze Cheng 已提交
24

H
Hongze Cheng 已提交
25
void metaReaderClear(SMetaReader *pReader) {
H
Hongze Cheng 已提交
26 27 28
  if (pReader->pMeta) {
    metaULock(pReader->pMeta);
  }
H
Hongze Cheng 已提交
29
  tDecoderClear(&pReader->coder);
H
Hongze Cheng 已提交
30
  tdbFree(pReader->pBuf);
H
Hongze Cheng 已提交
31 32
}

H
Hongze Cheng 已提交
33
int metaGetTableEntryByVersion(SMetaReader *pReader, int64_t version, tb_uid_t uid) {
H
Hongze Cheng 已提交
34
  SMeta   *pMeta = pReader->pMeta;
H
Hongze Cheng 已提交
35 36
  STbDbKey tbDbKey = {.version = version, .uid = uid};

H
Hongze Cheng 已提交
37
  // query table.db
H
Hongze Cheng 已提交
38
  if (tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pReader->pBuf, &pReader->szBuf) < 0) {
H
Hongze Cheng 已提交
39
    terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
H
Hongze Cheng 已提交
40 41 42 43
    goto _err;
  }

  // decode the entry
H
Hongze Cheng 已提交
44
  tDecoderInit(&pReader->coder, pReader->pBuf, pReader->szBuf);
H
Hongze Cheng 已提交
45 46 47 48 49 50 51 52 53 54 55

  if (metaDecodeEntry(&pReader->coder, &pReader->me) < 0) {
    goto _err;
  }

  return 0;

_err:
  return -1;
}

H
Hongze Cheng 已提交
56
int metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid) {
H
Hongze Cheng 已提交
57
  SMeta  *pMeta = pReader->pMeta;
H
Hongze Cheng 已提交
58 59 60
  int64_t version;

  // query uid.idx
H
Hongze Cheng 已提交
61
  if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pReader->pBuf, &pReader->szBuf) < 0) {
H
Hongze Cheng 已提交
62
    terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
H
Hongze Cheng 已提交
63 64 65 66
    return -1;
  }

  version = *(int64_t *)pReader->pBuf;
H
Hongze Cheng 已提交
67
  return metaGetTableEntryByVersion(pReader, version, uid);
H
Hongze Cheng 已提交
68 69
}

H
Hongze Cheng 已提交
70
int metaGetTableEntryByName(SMetaReader *pReader, const char *name) {
H
Hongze Cheng 已提交
71
  SMeta   *pMeta = pReader->pMeta;
H
Hongze Cheng 已提交
72 73 74
  tb_uid_t uid;

  // query name.idx
H
Hongze Cheng 已提交
75
  if (tdbTbGet(pMeta->pNameIdx, name, strlen(name) + 1, &pReader->pBuf, &pReader->szBuf) < 0) {
H
Hongze Cheng 已提交
76
    terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
H
Hongze Cheng 已提交
77 78 79 80
    return -1;
  }

  uid = *(tb_uid_t *)pReader->pBuf;
H
Hongze Cheng 已提交
81
  return metaGetTableEntryByUid(pReader, uid);
H
Hongze Cheng 已提交
82 83
}

H
Hongze Cheng 已提交
84
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name) {
H
Hongze Cheng 已提交
85
  void    *pData = NULL;
H
Hongze Cheng 已提交
86 87 88 89 90 91 92 93 94 95 96
  int      nData = 0;
  tb_uid_t uid = 0;

  if (tdbTbGet(pMeta->pNameIdx, name, strlen(name) + 1, &pData, &nData) == 0) {
    uid = *(tb_uid_t *)pData;
    tdbFree(pData);
  }

  return 0;
}

H
Hongze Cheng 已提交
97
int metaReadNext(SMetaReader *pReader) {
H
Hongze Cheng 已提交
98 99
  SMeta *pMeta = pReader->pMeta;

H
Hongze Cheng 已提交
100
  // TODO
H
Hongze Cheng 已提交
101

H
Hongze Cheng 已提交
102 103 104 105
  return 0;
}

#if 1  // ===================================================
H
Hongze Cheng 已提交
106 107 108 109 110 111 112 113
SMTbCursor *metaOpenTbCursor(SMeta *pMeta) {
  SMTbCursor *pTbCur = NULL;

  pTbCur = (SMTbCursor *)taosMemoryCalloc(1, sizeof(*pTbCur));
  if (pTbCur == NULL) {
    return NULL;
  }

H
Hongze Cheng 已提交
114
  metaReaderInit(&pTbCur->mr, pMeta, 0);
H
Hongze Cheng 已提交
115

H
Hongze Cheng 已提交
116
  tdbTbcOpen(pMeta->pUidIdx, &pTbCur->pDbc, NULL);
H
Hongze Cheng 已提交
117

H
Hongze Cheng 已提交
118
  tdbTbcMoveToFirst(pTbCur->pDbc);
H
Hongze Cheng 已提交
119

H
Hongze Cheng 已提交
120 121 122 123 124
  return pTbCur;
}

void metaCloseTbCursor(SMTbCursor *pTbCur) {
  if (pTbCur) {
H
Hongze Cheng 已提交
125 126
    tdbFree(pTbCur->pKey);
    tdbFree(pTbCur->pVal);
H
Hongze Cheng 已提交
127
    metaReaderClear(&pTbCur->mr);
H
Hongze Cheng 已提交
128
    if (pTbCur->pDbc) {
H
Hongze Cheng 已提交
129
      tdbTbcClose(pTbCur->pDbc);
H
Hongze Cheng 已提交
130 131 132 133 134
    }
    taosMemoryFree(pTbCur);
  }
}

H
Hongze Cheng 已提交
135
int metaTbCursorNext(SMTbCursor *pTbCur) {
H
Hongze Cheng 已提交
136
  int    ret;
H
Hongze Cheng 已提交
137
  void  *pBuf;
H
Hongze Cheng 已提交
138 139 140
  STbCfg tbCfg;

  for (;;) {
H
Hongze Cheng 已提交
141
    ret = tdbTbcNext(pTbCur->pDbc, &pTbCur->pKey, &pTbCur->kLen, &pTbCur->pVal, &pTbCur->vLen);
H
Hongze Cheng 已提交
142 143
    if (ret < 0) {
      return -1;
H
Hongze Cheng 已提交
144 145
    }

H
Hongze Cheng 已提交
146
    metaGetTableEntryByVersion(&pTbCur->mr, *(int64_t *)pTbCur->pVal, *(tb_uid_t *)pTbCur->pKey);
H
Hongze Cheng 已提交
147
    if (pTbCur->mr.me.type == TSDB_SUPER_TABLE) {
H
Hongze Cheng 已提交
148 149
      continue;
    }
H
Hongze Cheng 已提交
150 151

    break;
H
Hongze Cheng 已提交
152 153
  }

H
Hongze Cheng 已提交
154
  return 0;
H
Hongze Cheng 已提交
155 156
}

H
Hongze Cheng 已提交
157
SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, bool isinline) {
H
Hongze Cheng 已提交
158
  void           *pData = NULL;
H
Hongze Cheng 已提交
159 160 161 162 163 164
  int             nData = 0;
  int64_t         version;
  SSchemaWrapper  schema = {0};
  SSchemaWrapper *pSchema = NULL;
  SDecoder        dc = {0};

H
fix  
Hongze Cheng 已提交
165
  metaRLock(pMeta);
H
Hongze Cheng 已提交
166 167 168 169
_query:
  if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pData, &nData) < 0) {
    goto _err;
  }
H
Hongze Cheng 已提交
170

H
Hongze Cheng 已提交
171
  version = *(int64_t *)pData;
H
Hongze Cheng 已提交
172

H
Hongze Cheng 已提交
173 174 175 176 177 178
  tdbTbGet(pMeta->pTbDb, &(STbDbKey){.uid = uid, .version = version}, sizeof(STbDbKey), &pData, &nData);
  SMetaEntry me = {0};
  tDecoderInit(&dc, pData, nData);
  metaDecodeEntry(&dc, &me);
  if (me.type == TSDB_SUPER_TABLE) {
    if (sver == -1 || sver == me.stbEntry.schemaRow.version) {
H
Hongze Cheng 已提交
179
      pSchema = tCloneSSchemaWrapper(&me.stbEntry.schemaRow);
H
Hongze Cheng 已提交
180 181
      tDecoderClear(&dc);
      goto _exit;
H
Hongze Cheng 已提交
182
    }
H
Hongze Cheng 已提交
183 184
  } else if (me.type == TSDB_CHILD_TABLE) {
    uid = me.ctbEntry.suid;
H
Hongze Cheng 已提交
185
    tDecoderClear(&dc);
H
Hongze Cheng 已提交
186
    goto _query;
H
Hongze Cheng 已提交
187
  } else {
H
Hongze Cheng 已提交
188 189 190 191
    if (sver == -1 || sver == me.ntbEntry.schemaRow.version) {
      pSchema = tCloneSSchemaWrapper(&me.ntbEntry.schemaRow);
      tDecoderClear(&dc);
      goto _exit;
H
Hongze Cheng 已提交
192
    }
H
Hongze Cheng 已提交
193 194
  }
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
195

H
Hongze Cheng 已提交
196 197 198
  // query from skm db
  if (tdbTbGet(pMeta->pSkmDb, &(SSkmDbKey){.uid = uid, .sver = sver}, sizeof(SSkmDbKey), &pData, &nData) < 0) {
    goto _err;
H
Hongze Cheng 已提交
199
  }
H
Hongze Cheng 已提交
200

H
Hongze Cheng 已提交
201 202 203 204 205 206
  tDecoderInit(&dc, pData, nData);
  tDecodeSSchemaWrapper(&dc, &schema);
  pSchema = tCloneSSchemaWrapper(&schema);
  tDecoderClear(&dc);

_exit:
H
Hongze Cheng 已提交
207 208 209
  metaULock(pMeta);
  tdbFree(pData);
  return pSchema;
H
Hongze Cheng 已提交
210

H
Hongze Cheng 已提交
211 212 213 214
_err:
  metaULock(pMeta);
  tdbFree(pData);
  return NULL;
H
Hongze Cheng 已提交
215 216
}

H
Hongze Cheng 已提交
217
struct SMCtbCursor {
H
Hongze Cheng 已提交
218 219
  SMeta   *pMeta;
  TBC     *pCur;
H
Hongze Cheng 已提交
220
  tb_uid_t suid;
H
Hongze Cheng 已提交
221 222
  void    *pKey;
  void    *pVal;
H
Hongze Cheng 已提交
223 224 225 226
  int      kLen;
  int      vLen;
};

H
Hongze Cheng 已提交
227 228
SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid) {
  SMCtbCursor *pCtbCur = NULL;
H
Hongze Cheng 已提交
229
  SCtbIdxKey   ctbIdxKey;
H
Hongze Cheng 已提交
230
  int          ret;
H
Hongze Cheng 已提交
231
  int          c;
H
Hongze Cheng 已提交
232

H
Hongze Cheng 已提交
233 234 235 236
  pCtbCur = (SMCtbCursor *)taosMemoryCalloc(1, sizeof(*pCtbCur));
  if (pCtbCur == NULL) {
    return NULL;
  }
H
Hongze Cheng 已提交
237

H
fix  
Hongze Cheng 已提交
238
  pCtbCur->pMeta = pMeta;
H
Hongze Cheng 已提交
239
  pCtbCur->suid = uid;
H
fix  
Hongze Cheng 已提交
240 241
  metaRLock(pMeta);

H
Hongze Cheng 已提交
242
  ret = tdbTbcOpen(pMeta->pCtbIdx, &pCtbCur->pCur, NULL);
H
Hongze Cheng 已提交
243
  if (ret < 0) {
H
fix  
Hongze Cheng 已提交
244
    metaULock(pMeta);
H
Hongze Cheng 已提交
245 246 247
    taosMemoryFree(pCtbCur);
    return NULL;
  }
H
Hongze Cheng 已提交
248

H
Hongze Cheng 已提交
249 250 251
  // move to the suid
  ctbIdxKey.suid = uid;
  ctbIdxKey.uid = INT64_MIN;
H
Hongze Cheng 已提交
252
  tdbTbcMoveTo(pCtbCur->pCur, &ctbIdxKey, sizeof(ctbIdxKey), &c);
H
Hongze Cheng 已提交
253
  if (c > 0) {
H
Hongze Cheng 已提交
254
    tdbTbcMoveToNext(pCtbCur->pCur);
H
Hongze Cheng 已提交
255 256
  }

H
Hongze Cheng 已提交
257 258 259
  return pCtbCur;
}

C
Cary Xu 已提交
260
void metaCloseCtbCursor(SMCtbCursor *pCtbCur) {
H
Hongze Cheng 已提交
261
  if (pCtbCur) {
H
fix  
Hongze Cheng 已提交
262
    if (pCtbCur->pMeta) metaULock(pCtbCur->pMeta);
H
Hongze Cheng 已提交
263
    if (pCtbCur->pCur) {
H
Hongze Cheng 已提交
264
      tdbTbcClose(pCtbCur->pCur);
H
Hongze Cheng 已提交
265

H
Hongze Cheng 已提交
266 267
      tdbFree(pCtbCur->pKey);
      tdbFree(pCtbCur->pVal);
H
Hongze Cheng 已提交
268
    }
H
Hongze Cheng 已提交
269

H
Hongze Cheng 已提交
270 271
    taosMemoryFree(pCtbCur);
  }
H
Hongze Cheng 已提交
272 273 274
}

tb_uid_t metaCtbCursorNext(SMCtbCursor *pCtbCur) {
H
Hongze Cheng 已提交
275 276
  int         ret;
  SCtbIdxKey *pCtbIdxKey;
H
Hongze Cheng 已提交
277

H
Hongze Cheng 已提交
278
  ret = tdbTbcNext(pCtbCur->pCur, &pCtbCur->pKey, &pCtbCur->kLen, &pCtbCur->pVal, &pCtbCur->vLen);
H
Hongze Cheng 已提交
279 280 281
  if (ret < 0) {
    return 0;
  }
H
Hongze Cheng 已提交
282

H
Hongze Cheng 已提交
283
  pCtbIdxKey = pCtbCur->pKey;
H
Hongze Cheng 已提交
284 285 286
  if (pCtbIdxKey->suid > pCtbCur->suid) {
    return 0;
  }
H
Hongze Cheng 已提交
287

H
Hongze Cheng 已提交
288
  return pCtbIdxKey->uid;
H
Hongze Cheng 已提交
289 290 291
}

STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver) {
H
Hongze Cheng 已提交
292 293
  // SMetaReader     mr = {0};
  STSchema       *pTSchema = NULL;
H
Hongze Cheng 已提交
294 295
  SSchemaWrapper *pSW = NULL;
  STSchemaBuilder sb = {0};
H
Hongze Cheng 已提交
296
  SSchema        *pSchema;
H
Hongze Cheng 已提交
297

H
Hongze Cheng 已提交
298
  pSW = metaGetTableSchema(pMeta, uid, sver, 0);
C
Cary Xu 已提交
299
  if (!pSW) return NULL;
H
fix  
Hongze Cheng 已提交
300

301
  tdInitTSchemaBuilder(&sb, pSW->version);
H
Hongze Cheng 已提交
302 303 304 305 306
  for (int i = 0; i < pSW->nCols; i++) {
    pSchema = pSW->pSchema + i;
    tdAddColToSchema(&sb, pSchema->type, pSchema->flags, pSchema->colId, pSchema->bytes);
  }
  pTSchema = tdGetSchemaFromBuilder(&sb);
C
Cary Xu 已提交
307

H
Hongze Cheng 已提交
308 309
  tdDestroyTSchemaBuilder(&sb);

H
Hongze Cheng 已提交
310 311
  taosMemoryFree(pSW->pSchema);
  taosMemoryFree(pSW);
H
Hongze Cheng 已提交
312 313 314
  return pTSchema;
}

C
Cary Xu 已提交
315 316 317 318 319
int metaGetTbNum(SMeta *pMeta) {
  // TODO
  // ASSERT(0);
  return 0;
}
H
Hongze Cheng 已提交
320

C
Cary Xu 已提交
321
typedef struct {
H
Hongze Cheng 已提交
322 323
  SMeta   *pMeta;
  TBC     *pCur;
C
Cary Xu 已提交
324
  tb_uid_t uid;
H
Hongze Cheng 已提交
325 326
  void    *pKey;
  void    *pVal;
C
Cary Xu 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339
  int      kLen;
  int      vLen;
} SMSmaCursor;

SMSmaCursor *metaOpenSmaCursor(SMeta *pMeta, tb_uid_t uid) {
  SMSmaCursor *pSmaCur = NULL;
  SSmaIdxKey   smaIdxKey;
  int          ret;
  int          c;

  pSmaCur = (SMSmaCursor *)taosMemoryCalloc(1, sizeof(*pSmaCur));
  if (pSmaCur == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
340 341 342
    return NULL;
  }

C
Cary Xu 已提交
343 344 345 346
  pSmaCur->pMeta = pMeta;
  pSmaCur->uid = uid;
  metaRLock(pMeta);

H
Hongze Cheng 已提交
347
  ret = tdbTbcOpen(pMeta->pSmaIdx, &pSmaCur->pCur, NULL);
C
Cary Xu 已提交
348 349 350
  if (ret < 0) {
    metaULock(pMeta);
    taosMemoryFree(pSmaCur);
H
Hongze Cheng 已提交
351 352 353
    return NULL;
  }

C
Cary Xu 已提交
354 355 356
  // move to the suid
  smaIdxKey.uid = uid;
  smaIdxKey.smaUid = INT64_MIN;
H
Hongze Cheng 已提交
357
  tdbTbcMoveTo(pSmaCur->pCur, &smaIdxKey, sizeof(smaIdxKey), &c);
C
Cary Xu 已提交
358
  if (c > 0) {
H
Hongze Cheng 已提交
359
    tdbTbcMoveToNext(pSmaCur->pCur);
C
Cary Xu 已提交
360
  }
H
Hongze Cheng 已提交
361

C
Cary Xu 已提交
362 363
  return pSmaCur;
}
H
Hongze Cheng 已提交
364

C
Cary Xu 已提交
365 366 367 368
void metaCloseSmaCursor(SMSmaCursor *pSmaCur) {
  if (pSmaCur) {
    if (pSmaCur->pMeta) metaULock(pSmaCur->pMeta);
    if (pSmaCur->pCur) {
H
Hongze Cheng 已提交
369
      tdbTbcClose(pSmaCur->pCur);
H
Hongze Cheng 已提交
370

C
Cary Xu 已提交
371 372 373
      tdbFree(pSmaCur->pKey);
      tdbFree(pSmaCur->pVal);
    }
H
Hongze Cheng 已提交
374

C
Cary Xu 已提交
375 376 377 378 379 380 381 382
    taosMemoryFree(pSmaCur);
  }
}

tb_uid_t metaSmaCursorNext(SMSmaCursor *pSmaCur) {
  int         ret;
  SSmaIdxKey *pSmaIdxKey;

H
Hongze Cheng 已提交
383
  ret = tdbTbcNext(pSmaCur->pCur, &pSmaCur->pKey, &pSmaCur->kLen, &pSmaCur->pVal, &pSmaCur->vLen);
C
Cary Xu 已提交
384 385 386 387 388 389 390 391 392 393 394 395 396 397
  if (ret < 0) {
    return 0;
  }

  pSmaIdxKey = pSmaCur->pKey;
  if (pSmaIdxKey->uid > pSmaCur->uid) {
    return 0;
  }

  return pSmaIdxKey->uid;
}

STSmaWrapper *metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid, bool deepCopy) {
  STSmaWrapper *pSW = NULL;
H
Hongze Cheng 已提交
398
  SArray       *pSmaIds = NULL;
C
Cary Xu 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421

  if (!(pSmaIds = metaGetSmaIdsByTable(pMeta, uid))) {
    return NULL;
  }

  pSW = taosMemoryCalloc(1, sizeof(*pSW));
  if (!pSW) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    goto _err;
  }

  pSW->number = taosArrayGetSize(pSmaIds);
  pSW->tSma = taosMemoryCalloc(pSW->number, sizeof(STSma));

  if (!pSW->tSma) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    goto _err;
  }

  SMetaReader mr = {0};
  metaReaderInit(&mr, pMeta, 0);
  int64_t smaId;
  int     smaIdx = 0;
H
Hongze Cheng 已提交
422
  STSma  *pTSma = NULL;
C
Cary Xu 已提交
423 424 425
  for (int i = 0; i < pSW->number; ++i) {
    smaId = *(tb_uid_t *)taosArrayGet(pSmaIds, i);
    if (metaGetTableEntryByUid(&mr, smaId) < 0) {
S
Shengliang Guan 已提交
426
      metaWarn("vgId:%d, no entry for tbId: %" PRIi64 ", smaId: %" PRIi64, TD_VID(pMeta->pVnode), uid, smaId);
C
Cary Xu 已提交
427 428 429 430 431 432 433 434 435 436
      continue;
    }
    pTSma = pSW->tSma + smaIdx;
    memcpy(pTSma, mr.me.smaEntry.tsma, sizeof(STSma));
    if (deepCopy) {
      if (pTSma->exprLen > 0) {
        if (!(pTSma->expr = taosMemoryCalloc(1, pTSma->exprLen))) {
          terrno = TSDB_CODE_OUT_OF_MEMORY;
          goto _err;
        }
H
Hongze Cheng 已提交
437
        memcpy((void *)pTSma->expr, mr.me.smaEntry.tsma->expr, pTSma->exprLen);
H
Hongze Cheng 已提交
438
      }
C
Cary Xu 已提交
439 440 441 442 443
      if (pTSma->tagsFilterLen > 0) {
        if (!(pTSma->tagsFilter = taosMemoryCalloc(1, pTSma->tagsFilterLen))) {
          terrno = TSDB_CODE_OUT_OF_MEMORY;
          goto _err;
        }
H
Hongze Cheng 已提交
444
      }
H
Hongze Cheng 已提交
445
      memcpy((void *)pTSma->tagsFilter, mr.me.smaEntry.tsma->tagsFilter, pTSma->tagsFilterLen);
C
Cary Xu 已提交
446 447 448 449 450
    } else {
      pTSma->exprLen = 0;
      pTSma->expr = NULL;
      pTSma->tagsFilterLen = 0;
      pTSma->tagsFilter = NULL;
H
Hongze Cheng 已提交
451
    }
H
Hongze Cheng 已提交
452

C
Cary Xu 已提交
453
    ++smaIdx;
H
Hongze Cheng 已提交
454 455
  }

C
Cary Xu 已提交
456 457
  if (smaIdx <= 0) goto _err;
  pSW->number = smaIdx;
H
Hongze Cheng 已提交
458

C
Cary Xu 已提交
459 460
  metaReaderClear(&mr);
  taosArrayDestroy(pSmaIds);
H
Hongze Cheng 已提交
461
  return pSW;
C
Cary Xu 已提交
462 463 464
_err:
  metaReaderClear(&mr);
  taosArrayDestroy(pSmaIds);
C
Cary Xu 已提交
465
  tFreeTSmaWrapper(pSW, deepCopy);
H
Hongze Cheng 已提交
466 467 468
  return NULL;
}

C
Cary Xu 已提交
469
STSma *metaGetSmaInfoByIndex(SMeta *pMeta, int64_t indexUid) {
H
Hongze Cheng 已提交
470
  STSma      *pTSma = NULL;
C
Cary Xu 已提交
471 472 473
  SMetaReader mr = {0};
  metaReaderInit(&mr, pMeta, 0);
  if (metaGetTableEntryByUid(&mr, indexUid) < 0) {
S
Shengliang Guan 已提交
474
    metaWarn("vgId:%d, failed to get table entry for smaId: %" PRIi64, TD_VID(pMeta->pVnode), indexUid);
C
Cary Xu 已提交
475 476 477 478 479 480 481 482 483 484 485 486 487 488
    metaReaderClear(&mr);
    return NULL;
  }
  pTSma = (STSma *)taosMemoryMalloc(sizeof(STSma));
  if (!pTSma) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    metaReaderClear(&mr);
    return NULL;
  }

  memcpy(pTSma, mr.me.smaEntry.tsma, sizeof(STSma));

  metaReaderClear(&mr);
  return pTSma;
H
Hongze Cheng 已提交
489 490
}

C
Cary Xu 已提交
491
SArray *metaGetSmaIdsByTable(SMeta *pMeta, tb_uid_t uid) {
H
Hongze Cheng 已提交
492
  SArray     *pUids = NULL;
C
Cary Xu 已提交
493
  SSmaIdxKey *pSmaIdxKey = NULL;
H
Hongze Cheng 已提交
494

C
Cary Xu 已提交
495 496
  SMSmaCursor *pCur = metaOpenSmaCursor(pMeta, uid);
  if (!pCur) {
H
Hongze Cheng 已提交
497 498 499
    return NULL;
  }

C
Cary Xu 已提交
500 501 502 503 504
  while (1) {
    tb_uid_t id = metaSmaCursorNext(pCur);
    if (id == 0) {
      break;
    }
H
Hongze Cheng 已提交
505

C
Cary Xu 已提交
506 507
    if (!pUids) {
      pUids = taosArrayInit(16, sizeof(tb_uid_t));
H
Hongze Cheng 已提交
508
      if (!pUids) {
C
Cary Xu 已提交
509 510 511
        terrno = TSDB_CODE_OUT_OF_MEMORY;
        metaCloseSmaCursor(pCur);
        return NULL;
H
Hongze Cheng 已提交
512
      }
C
Cary Xu 已提交
513
    }
H
Hongze Cheng 已提交
514

C
Cary Xu 已提交
515
    pSmaIdxKey = (SSmaIdxKey *)pCur->pKey;
H
Hongze Cheng 已提交
516

C
Cary Xu 已提交
517 518 519 520 521
    if (taosArrayPush(pUids, &pSmaIdxKey->smaUid) < 0) {
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      metaCloseSmaCursor(pCur);
      taosArrayDestroy(pUids);
      return NULL;
H
Hongze Cheng 已提交
522 523 524 525 526 527 528
    }
  }

  metaCloseSmaCursor(pCur);
  return pUids;
}

C
Cary Xu 已提交
529
SArray *metaGetSmaTbUids(SMeta *pMeta) {
H
Hongze Cheng 已提交
530
  SArray     *pUids = NULL;
C
Cary Xu 已提交
531 532 533 534 535
  SSmaIdxKey *pSmaIdxKey = NULL;
  tb_uid_t    lastUid = 0;

  SMSmaCursor *pCur = metaOpenSmaCursor(pMeta, 0);
  if (!pCur) {
H
Hongze Cheng 已提交
536 537 538
    return NULL;
  }

C
Cary Xu 已提交
539 540 541 542 543
  while (1) {
    tb_uid_t uid = metaSmaCursorNext(pCur);
    if (uid == 0) {
      break;
    }
H
Hongze Cheng 已提交
544

C
Cary Xu 已提交
545 546 547
    if (lastUid == uid) {
      continue;
    }
H
Hongze Cheng 已提交
548

C
Cary Xu 已提交
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
    lastUid = uid;

    if (!pUids) {
      pUids = taosArrayInit(16, sizeof(tb_uid_t));
      if (!pUids) {
        terrno = TSDB_CODE_OUT_OF_MEMORY;
        metaCloseSmaCursor(pCur);
        return NULL;
      }
    }

    if (taosArrayPush(pUids, &uid) < 0) {
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      metaCloseSmaCursor(pCur);
      taosArrayDestroy(pUids);
      return NULL;
    }
H
Hongze Cheng 已提交
566 567
  }

C
Cary Xu 已提交
568 569
  metaCloseSmaCursor(pCur);
  return pUids;
H
Hongze Cheng 已提交
570 571
}

L
Liu Jicong 已提交
572
#endif
H
Hongze Cheng 已提交
573

wmmhello's avatar
wmmhello 已提交
574
const void *metaGetTableTagVal(SMetaEntry *pEntry, int16_t type, STagVal *val) {
H
Hongze Cheng 已提交
575
  ASSERT(pEntry->type == TSDB_CHILD_TABLE);
wmmhello's avatar
wmmhello 已提交
576
  STag *tag = (STag *)pEntry->ctbEntry.pTags;
dengyihao's avatar
dengyihao 已提交
577 578
  if (type == TSDB_DATA_TYPE_JSON) {
    if (tag->nTag == 0) {
wmmhello's avatar
wmmhello 已提交
579 580
      return NULL;
    }
wmmhello's avatar
wmmhello 已提交
581 582
    return tag;
  }
wmmhello's avatar
wmmhello 已提交
583 584
  bool find = tTagGet(tag, val);

dengyihao's avatar
dengyihao 已提交
585
  if (!find) {
wmmhello's avatar
wmmhello 已提交
586 587 588
    return NULL;
  }
  return val;
dengyihao's avatar
dengyihao 已提交
589
}
wmmhello's avatar
wmmhello 已提交
590 591

typedef struct {
H
Hongze Cheng 已提交
592 593
  SMeta   *pMeta;
  TBC     *pCur;
wmmhello's avatar
wmmhello 已提交
594 595 596
  tb_uid_t suid;
  int16_t  cid;
  int16_t  type;
H
Hongze Cheng 已提交
597 598
  void    *pKey;
  void    *pVal;
wmmhello's avatar
wmmhello 已提交
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
  int32_t  kLen;
  int32_t  vLen;
} SIdxCursor;

int32_t metaFilteTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) {
  SIdxCursor *pCursor = NULL;

  int32_t ret = 0, valid = 0;
  pCursor = (SIdxCursor *)taosMemoryCalloc(1, sizeof(SIdxCursor));
  pCursor->pMeta = pMeta;
  pCursor->suid = param->suid;
  pCursor->cid = param->cid;
  pCursor->type = param->type;

  metaRLock(pMeta);
  ret = tdbTbcOpen(pMeta->pTagIdx, &pCursor->pCur, NULL);
  if (ret < 0) {
    goto END;
  }
  STagIdxKey *pKey = NULL;
  int32_t     nKey = 0;

  int32_t nTagData = 0;
H
Hongze Cheng 已提交
622
  void   *tagData = NULL;
dengyihao's avatar
dengyihao 已提交
623 624 625 626 627 628

  if (IS_VAR_DATA_TYPE(param->type)) {
    tagData = varDataVal(param->val);
    nTagData = varDataLen(param->val);
  } else {
    tagData = param->val;
wmmhello's avatar
wmmhello 已提交
629
    nTagData = tDataTypes[param->type].bytes;
wmmhello's avatar
wmmhello 已提交
630
  }
dengyihao's avatar
dengyihao 已提交
631
  ret = metaCreateTagIdxKey(pCursor->suid, pCursor->cid, tagData, nTagData, pCursor->type,
wmmhello's avatar
wmmhello 已提交
632 633 634 635 636 637 638 639
                            param->reverse ? INT64_MAX : INT64_MIN, &pKey, &nKey);
  if (ret != 0) {
    goto END;
  }
  int cmp = 0;
  if (tdbTbcMoveTo(pCursor->pCur, pKey, nKey, &cmp) < 0) {
    goto END;
  }
dengyihao's avatar
dengyihao 已提交
640

H
Hongze Cheng 已提交
641
  void   *entryKey = NULL, *entryVal = NULL;
wmmhello's avatar
wmmhello 已提交
642 643 644 645 646 647 648 649 650 651 652
  int32_t nEntryKey, nEntryVal;
  while (1) {
    valid = tdbTbcGet(pCursor->pCur, (const void **)&entryKey, &nEntryKey, (const void **)&entryVal, &nEntryVal);
    if (valid < 0) {
      break;
    }
    STagIdxKey *p = entryKey;
    if (p != NULL) {
      int32_t cmp = (*param->filterFunc)(p->data, pKey->data, pKey->type);
      if (cmp == 0) {
        // match
dengyihao's avatar
dengyihao 已提交
653 654 655 656 657 658
        tb_uid_t tuid = 0;
        if (IS_VAR_DATA_TYPE(pKey->type)) {
          tuid = *(tb_uid_t *)(p->data + varDataTLen(p->data));
        } else {
          tuid = *(tb_uid_t *)(p->data + tDataTypes[pCursor->type].bytes);
        }
wmmhello's avatar
wmmhello 已提交
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678
        taosArrayPush(pUids, &tuid);
      } else if (cmp == 1) {
        // not match but should continue to iter
      } else {
        // not match and no more result
        break;
      }
    }
    valid = param->reverse ? tdbTbcMoveToPrev(pCursor->pCur) : tdbTbcMoveToNext(pCursor->pCur);
    if (valid < 0) {
      break;
    }
  }
END:
  if (pCursor->pMeta) metaULock(pCursor->pMeta);
  if (pCursor->pCur) tdbTbcClose(pCursor->pCur);

  taosMemoryFree(pCursor);

  return ret;
dengyihao's avatar
dengyihao 已提交
679
}