tsdbRead.c 3.5 KB
Newer Older
H
hjxilinx 已提交
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 "tsdb.h"
H
Hongze Cheng 已提交
17

H
Hongze Cheng 已提交
18 19 20
struct STsdbReader {
  STsdb *pTsdb;
};
H
Hongze Cheng 已提交
21

H
Hongze Cheng 已提交
22 23 24
typedef struct {
  TSKEY   ts;
  int64_t version;
H
Hongze Cheng 已提交
25
} SSkyline;
H
Hongze Cheng 已提交
26

H
Hongze Cheng 已提交
27
// =================== STATIC METHODS =====================
H
Hongze Cheng 已提交
28
static int32_t tsdbMergeSkyline(SArray *aSkyline1, SArray *aSkyline2, SArray *aSkyline) {
H
Hongze Cheng 已提交
29 30 31 32 33 34 35 36 37 38
  int32_t   code = 0;
  int32_t   i1 = 0;
  int32_t   n1 = taosArrayGetSize(aSkyline1);
  int32_t   i2 = 0;
  int32_t   n2 = taosArrayGetSize(aSkyline2);
  SSkyline *pSkyline1;
  SSkyline *pSkyline2;
  SSkyline  item;
  int64_t   version1 = 0;
  int64_t   version2 = 0;
H
Hongze Cheng 已提交
39 40 41 42 43 44

  ASSERT(n1 > 0 && n2 > 0);

  taosArrayClear(aSkyline);

  while (i1 < n1 && i2 < n2) {
H
Hongze Cheng 已提交
45 46
    pSkyline1 = (SSkyline *)taosArrayGet(aSkyline1, i1);
    pSkyline2 = (SSkyline *)taosArrayGet(aSkyline2, i2);
H
Hongze Cheng 已提交
47

H
Hongze Cheng 已提交
48 49
    if (pSkyline1->ts < pSkyline2->ts) {
      version1 = pSkyline1->version;
H
Hongze Cheng 已提交
50
      i1++;
H
Hongze Cheng 已提交
51 52
    } else if (pSkyline1->ts > pSkyline2->ts) {
      version2 = pSkyline2->version;
H
Hongze Cheng 已提交
53 54
      i2++;
    } else {
H
Hongze Cheng 已提交
55 56
      version1 = pSkyline1->version;
      version2 = pSkyline2->version;
H
Hongze Cheng 已提交
57 58 59 60
      i1++;
      i2++;
    }

H
Hongze Cheng 已提交
61 62
    item.ts = TMIN(pSkyline1->ts, pSkyline2->ts);
    item.version = TMAX(version1, version2);
H
Hongze Cheng 已提交
63 64 65 66 67 68 69
    if (taosArrayPush(aSkyline, &item) == NULL) {
      code = TSDB_CODE_OUT_OF_MEMORY;
      goto _exit;
    }
  }

  while (i1 < n1) {
H
Hongze Cheng 已提交
70 71 72 73
    pSkyline1 = (SSkyline *)taosArrayGet(aSkyline1, i1);
    item.ts = pSkyline1->ts;
    item.version = pSkyline1->version;
    if (taosArrayPush(aSkyline, &item) == NULL) {
H
Hongze Cheng 已提交
74 75 76 77 78 79 80
      code = TSDB_CODE_OUT_OF_MEMORY;
      goto _exit;
    }
    i1++;
  }

  while (i2 < n2) {
H
Hongze Cheng 已提交
81 82 83 84
    pSkyline2 = (SSkyline *)taosArrayGet(aSkyline2, i2);
    item.ts = pSkyline2->ts;
    item.version = pSkyline2->version;
    if (taosArrayPush(aSkyline, &item) == NULL) {
H
Hongze Cheng 已提交
85 86 87 88 89 90 91 92 93
      code = TSDB_CODE_OUT_OF_MEMORY;
      goto _exit;
    }
    i2++;
  }

_exit:
  return code;
}
H
Hongze Cheng 已提交
94 95 96 97
static int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline) {
  int32_t   code = 0;
  SDelData *pDelData;
  int32_t   midx;
H
Hongze Cheng 已提交
98

H
Hongze Cheng 已提交
99 100 101 102 103 104 105 106
  taosArrayClear(aSkyline);
  if (sidx == eidx) {
    pDelData = (SDelData *)taosArrayGet(aDelData, sidx);
    taosArrayPush(aSkyline, &(SSkyline){.ts = pDelData->sKey, .version = pDelData->version});
    taosArrayPush(aSkyline, &(SSkyline){.ts = pDelData->eKey, .version = 0});
  } else {
    SArray *aSkyline1 = NULL;
    SArray *aSkyline2 = NULL;
H
Hongze Cheng 已提交
107

H
Hongze Cheng 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
    aSkyline1 = taosArrayInit(0, sizeof(SSkyline));
    aSkyline2 = taosArrayInit(0, sizeof(SSkyline));
    if (aSkyline1 == NULL || aSkyline2 == NULL) {
      code = TSDB_CODE_OUT_OF_MEMORY;
      goto _clear;
    }

    midx = (sidx + eidx) / 2;

    code = tsdbBuildDeleteSkyline(aDelData, sidx, midx, aSkyline1);
    if (code) goto _clear;

    code = tsdbBuildDeleteSkyline(aDelData, midx + 1, eidx, aSkyline2);
    if (code) goto _clear;

    code = tsdbMergeSkyline(aSkyline1, aSkyline2, aSkyline);

  _clear:
    taosArrayDestroy(aSkyline1);
    taosArrayDestroy(aSkyline2);
  }
H
Hongze Cheng 已提交
129

H
Hongze Cheng 已提交
130 131
  return code;
}