metaQuery.c 15.4 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) {
dengyihao's avatar
dengyihao 已提交
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) {
dengyihao's avatar
dengyihao 已提交
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) {
dengyihao's avatar
dengyihao 已提交
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) {
dengyihao's avatar
dengyihao 已提交
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;
dengyihao's avatar
dengyihao 已提交
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) {
dengyihao's avatar
dengyihao 已提交
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
  if (sver < 0) {
    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
    tdbTbGet(pMeta->pTbDb, &(STbDbKey){.uid = uid, .version = version}, sizeof(STbDbKey), &pData, &nData);
H
Hongze Cheng 已提交
174

H
Hongze Cheng 已提交
175 176 177 178 179 180
    SMetaEntry me = {0};
    tDecoderInit(&dc, pData, nData);
    metaDecodeEntry(&dc, &me);
    if (me.type == TSDB_SUPER_TABLE) {
      pSchema = tCloneSSchemaWrapper(&me.stbEntry.schemaRow);
    } else if (me.type == TSDB_NORMAL_TABLE) {
H
Hongze Cheng 已提交
181
      pSchema = tCloneSSchemaWrapper(&me.ntbEntry.schemaRow);
H
Hongze Cheng 已提交
182 183 184 185 186 187 188 189
    } else {
      ASSERT(0);
    }
    tDecoderClear(&dc);
  } else {
    if (tdbTbGet(pMeta->pSkmDb, &(SSkmDbKey){.uid = uid, .sver = sver}, sizeof(SSkmDbKey), &pData, &nData) < 0) {
      goto _err;
    }
H
Hongze Cheng 已提交
190

H
Hongze Cheng 已提交
191 192 193 194 195
    tDecoderInit(&dc, pData, nData);
    tDecodeSSchemaWrapper(&dc, &schema);
    pSchema = tCloneSSchemaWrapper(&schema);
    tDecoderClear(&dc);
  }
H
Hongze Cheng 已提交
196

H
Hongze Cheng 已提交
197 198 199
  metaULock(pMeta);
  tdbFree(pData);
  return pSchema;
H
Hongze Cheng 已提交
200

H
Hongze Cheng 已提交
201 202 203 204
_err:
  metaULock(pMeta);
  tdbFree(pData);
  return NULL;
H
Hongze Cheng 已提交
205 206
}

H
Hongze Cheng 已提交
207
struct SMCtbCursor {
dengyihao's avatar
dengyihao 已提交
208 209
  SMeta *  pMeta;
  TBC *    pCur;
H
Hongze Cheng 已提交
210
  tb_uid_t suid;
dengyihao's avatar
dengyihao 已提交
211 212
  void *   pKey;
  void *   pVal;
H
Hongze Cheng 已提交
213 214 215 216
  int      kLen;
  int      vLen;
};

H
Hongze Cheng 已提交
217 218
SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid) {
  SMCtbCursor *pCtbCur = NULL;
H
Hongze Cheng 已提交
219
  SCtbIdxKey   ctbIdxKey;
H
Hongze Cheng 已提交
220
  int          ret;
H
Hongze Cheng 已提交
221
  int          c;
H
Hongze Cheng 已提交
222

H
Hongze Cheng 已提交
223 224 225 226
  pCtbCur = (SMCtbCursor *)taosMemoryCalloc(1, sizeof(*pCtbCur));
  if (pCtbCur == NULL) {
    return NULL;
  }
H
Hongze Cheng 已提交
227

H
fix  
Hongze Cheng 已提交
228
  pCtbCur->pMeta = pMeta;
H
Hongze Cheng 已提交
229
  pCtbCur->suid = uid;
H
fix  
Hongze Cheng 已提交
230 231
  metaRLock(pMeta);

H
Hongze Cheng 已提交
232
  ret = tdbTbcOpen(pMeta->pCtbIdx, &pCtbCur->pCur, NULL);
H
Hongze Cheng 已提交
233
  if (ret < 0) {
H
fix  
Hongze Cheng 已提交
234
    metaULock(pMeta);
H
Hongze Cheng 已提交
235 236 237
    taosMemoryFree(pCtbCur);
    return NULL;
  }
H
Hongze Cheng 已提交
238

H
Hongze Cheng 已提交
239 240 241
  // move to the suid
  ctbIdxKey.suid = uid;
  ctbIdxKey.uid = INT64_MIN;
H
Hongze Cheng 已提交
242
  tdbTbcMoveTo(pCtbCur->pCur, &ctbIdxKey, sizeof(ctbIdxKey), &c);
H
Hongze Cheng 已提交
243
  if (c > 0) {
H
Hongze Cheng 已提交
244
    tdbTbcMoveToNext(pCtbCur->pCur);
H
Hongze Cheng 已提交
245 246
  }

H
Hongze Cheng 已提交
247 248 249
  return pCtbCur;
}

C
Cary Xu 已提交
250
void metaCloseCtbCursor(SMCtbCursor *pCtbCur) {
H
Hongze Cheng 已提交
251
  if (pCtbCur) {
H
fix  
Hongze Cheng 已提交
252
    if (pCtbCur->pMeta) metaULock(pCtbCur->pMeta);
H
Hongze Cheng 已提交
253
    if (pCtbCur->pCur) {
H
Hongze Cheng 已提交
254
      tdbTbcClose(pCtbCur->pCur);
H
Hongze Cheng 已提交
255

H
Hongze Cheng 已提交
256 257
      tdbFree(pCtbCur->pKey);
      tdbFree(pCtbCur->pVal);
H
Hongze Cheng 已提交
258
    }
H
Hongze Cheng 已提交
259

H
Hongze Cheng 已提交
260 261
    taosMemoryFree(pCtbCur);
  }
H
Hongze Cheng 已提交
262 263 264
}

tb_uid_t metaCtbCursorNext(SMCtbCursor *pCtbCur) {
H
Hongze Cheng 已提交
265 266
  int         ret;
  SCtbIdxKey *pCtbIdxKey;
H
Hongze Cheng 已提交
267

H
Hongze Cheng 已提交
268
  ret = tdbTbcNext(pCtbCur->pCur, &pCtbCur->pKey, &pCtbCur->kLen, &pCtbCur->pVal, &pCtbCur->vLen);
H
Hongze Cheng 已提交
269 270 271
  if (ret < 0) {
    return 0;
  }
H
Hongze Cheng 已提交
272

H
Hongze Cheng 已提交
273
  pCtbIdxKey = pCtbCur->pKey;
H
Hongze Cheng 已提交
274 275 276
  if (pCtbIdxKey->suid > pCtbCur->suid) {
    return 0;
  }
H
Hongze Cheng 已提交
277

H
Hongze Cheng 已提交
278
  return pCtbIdxKey->uid;
H
Hongze Cheng 已提交
279 280 281 282
}

STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver) {
  tb_uid_t        quid;
H
Hongze Cheng 已提交
283
  SMetaReader     mr = {0};
dengyihao's avatar
dengyihao 已提交
284
  STSchema *      pTSchema = NULL;
H
Hongze Cheng 已提交
285 286
  SSchemaWrapper *pSW = NULL;
  STSchemaBuilder sb = {0};
dengyihao's avatar
dengyihao 已提交
287
  SSchema *       pSchema;
H
Hongze Cheng 已提交
288

H
Hongze Cheng 已提交
289
  metaReaderInit(&mr, pMeta, 0);
H
Hongze Cheng 已提交
290 291 292 293
  metaGetTableEntryByUid(&mr, uid);

  if (mr.me.type == TSDB_CHILD_TABLE) {
    quid = mr.me.ctbEntry.suid;
H
Hongze Cheng 已提交
294 295 296 297
  } else {
    quid = uid;
  }

H
Hongze Cheng 已提交
298
  metaReaderClear(&mr);
H
Hongze Cheng 已提交
299

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

303
  tdInitTSchemaBuilder(&sb, pSW->version);
H
Hongze Cheng 已提交
304 305 306 307 308
  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 已提交
309

H
Hongze Cheng 已提交
310 311
  tdDestroyTSchemaBuilder(&sb);

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

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

C
Cary Xu 已提交
323
typedef struct {
dengyihao's avatar
dengyihao 已提交
324 325
  SMeta *  pMeta;
  TBC *    pCur;
C
Cary Xu 已提交
326
  tb_uid_t uid;
dengyihao's avatar
dengyihao 已提交
327 328
  void *   pKey;
  void *   pVal;
C
Cary Xu 已提交
329 330 331 332 333 334 335 336 337 338 339 340 341
  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 已提交
342 343 344
    return NULL;
  }

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

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

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

C
Cary Xu 已提交
364 365
  return pSmaCur;
}
H
Hongze Cheng 已提交
366

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

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

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

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

H
Hongze Cheng 已提交
385
  ret = tdbTbcNext(pSmaCur->pCur, &pSmaCur->pKey, &pSmaCur->kLen, &pSmaCur->pVal, &pSmaCur->vLen);
C
Cary Xu 已提交
386 387 388 389 390 391 392 393 394 395 396 397 398 399
  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;
dengyihao's avatar
dengyihao 已提交
400
  SArray *      pSmaIds = NULL;
C
Cary Xu 已提交
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423

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

C
Cary Xu 已提交
455
    ++smaIdx;
H
Hongze Cheng 已提交
456 457
  }

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

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

C
Cary Xu 已提交
471
STSma *metaGetSmaInfoByIndex(SMeta *pMeta, int64_t indexUid) {
dengyihao's avatar
dengyihao 已提交
472
  STSma *     pTSma = NULL;
C
Cary Xu 已提交
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
  SMetaReader mr = {0};
  metaReaderInit(&mr, pMeta, 0);
  if (metaGetTableEntryByUid(&mr, indexUid) < 0) {
    metaWarn("vgId:%d failed to get table entry for smaId: %" PRIi64, TD_VID(pMeta->pVnode), indexUid);
    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 已提交
491 492
}

C
Cary Xu 已提交
493
SArray *metaGetSmaIdsByTable(SMeta *pMeta, tb_uid_t uid) {
dengyihao's avatar
dengyihao 已提交
494
  SArray *    pUids = NULL;
C
Cary Xu 已提交
495
  SSmaIdxKey *pSmaIdxKey = NULL;
H
Hongze Cheng 已提交
496

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

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

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

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

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

  metaCloseSmaCursor(pCur);
  return pUids;
}

C
Cary Xu 已提交
531
SArray *metaGetSmaTbUids(SMeta *pMeta) {
dengyihao's avatar
dengyihao 已提交
532
  SArray *    pUids = NULL;
C
Cary Xu 已提交
533 534 535 536 537
  SSmaIdxKey *pSmaIdxKey = NULL;
  tb_uid_t    lastUid = 0;

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

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

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

C
Cary Xu 已提交
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
    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 已提交
568 569
  }

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

L
Liu Jicong 已提交
574
#endif
H
Hongze Cheng 已提交
575

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

  if(!find){
    return NULL;
  }
  return val;
dengyihao's avatar
dengyihao 已提交
591
}
wmmhello's avatar
wmmhello 已提交
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673

typedef struct {
  SMeta *  pMeta;
  TBC *    pCur;
  tb_uid_t suid;
  int16_t  cid;
  int16_t  type;
  void *   pKey;
  void *   pVal;
  int32_t  kLen;
  int32_t  vLen;
} SIdxCursor;

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

  char *tagData = param->val;

  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;
  if(IS_VAR_DATA_TYPE(param->type)){
    nTagData = strlen(param->val);
  }else{
    nTagData = tDataTypes[param->type].bytes
  }
  ret = metaCreateTagIdxKey(pCursor->suid, pCursor->cid, param->val, nTagData, pCursor->type,
                            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;
  }
  void *  entryKey = NULL, *entryVal = NULL;
  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
        tb_uid_t tuid = *(tb_uid_t *)(p->data + tDataTypes[pCursor->type].bytes);
        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;
}