support condition rewrite
This commit is contained in:
parent
014740decf
commit
69f25dbfc1
|
@ -5006,7 +5006,7 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
|
|||
goto _ret;
|
||||
}
|
||||
|
||||
ret = filterInitFromTree(p, &filter);
|
||||
ret = filterInitFromTree(p, &filter, FILTER_NO_REWRITE);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
goto _ret;
|
||||
}
|
||||
|
|
|
@ -82,6 +82,22 @@ int32_t converToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *le
|
|||
n = bufSize + 2;
|
||||
break;
|
||||
|
||||
case TSDB_DATA_TYPE_UTINYINT:
|
||||
n = sprintf(str, "%d", *(uint8_t*)buf);
|
||||
break;
|
||||
|
||||
case TSDB_DATA_TYPE_USMALLINT:
|
||||
n = sprintf(str, "%d", *(uint16_t*)buf);
|
||||
break;
|
||||
|
||||
case TSDB_DATA_TYPE_UINT:
|
||||
n = sprintf(str, "%u", *(uint32_t*)buf);
|
||||
break;
|
||||
|
||||
case TSDB_DATA_TYPE_UBIGINT:
|
||||
n = sprintf(str, "%" PRIu64, *(uint64_t*)buf);
|
||||
break;
|
||||
|
||||
default:
|
||||
tscError("unsupported type:%d", type);
|
||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||
|
|
|
@ -22,19 +22,24 @@ extern "C" {
|
|||
|
||||
#include "texpr.h"
|
||||
|
||||
#define FILTER_DEFAULT_GROUP_SIZE 4
|
||||
#define FILTER_DEFAULT_UNIT_SIZE 4
|
||||
#define FILTER_DEFAULT_FIELD_SIZE 4
|
||||
#define FILTER_DEFAULT_GROUP_UNIT_SIZE 2
|
||||
|
||||
enum {
|
||||
F_FIELD_COLUMN = 0,
|
||||
F_FIELD_VALUE,
|
||||
F_FIELD_MAX
|
||||
FLD_TYPE_COLUMN = 1,
|
||||
FLD_TYPE_VALUE = 2,
|
||||
FLD_TYPE_MAX = 3,
|
||||
FLD_DESC_NO_FREE = 4,
|
||||
FLD_DATA_NO_FREE = 8,
|
||||
};
|
||||
|
||||
enum {
|
||||
MR_ST_START = 1,
|
||||
MR_ST_FIN = 2,
|
||||
MR_ALL = 4,
|
||||
MR_NONE = 8,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -46,17 +51,17 @@ enum {
|
|||
RA_NULL = 2,
|
||||
};
|
||||
|
||||
enum {
|
||||
FILTER_ALL = 1,
|
||||
FILTER_NONE = 2,
|
||||
FILTER_NO_REWRITE = 4,
|
||||
};
|
||||
|
||||
typedef struct OptrStr {
|
||||
uint16_t optr;
|
||||
char *str;
|
||||
} OptrStr;
|
||||
|
||||
typedef struct SFilterColRange {
|
||||
uint16_t idx; //column field idx
|
||||
int64_t s;
|
||||
int64_t e;
|
||||
} SFilterColRange;
|
||||
|
||||
typedef struct SFilterRange {
|
||||
char sflag;
|
||||
char eflag;
|
||||
|
@ -64,6 +69,13 @@ typedef struct SFilterRange {
|
|||
int64_t e;
|
||||
} SFilterRange;
|
||||
|
||||
typedef struct SFilterColRange {
|
||||
uint16_t idx; //column field idx
|
||||
bool isNull;
|
||||
bool notNull;
|
||||
SFilterRange ra;
|
||||
} SFilterColRange;
|
||||
|
||||
|
||||
typedef struct SFilterRangeNode {
|
||||
struct SFilterRangeNode* prev;
|
||||
|
@ -81,7 +93,7 @@ typedef struct SFilterRMCtx {
|
|||
} SFilterRMCtx ;
|
||||
|
||||
typedef struct SFilterField {
|
||||
uint16_t type;
|
||||
uint16_t flag;
|
||||
void* desc;
|
||||
void* data;
|
||||
int64_t range[];
|
||||
|
@ -99,13 +111,21 @@ typedef struct SFilterFieldId {
|
|||
} SFilterFieldId;
|
||||
|
||||
typedef struct SFilterGroup {
|
||||
uint16_t unitSize;
|
||||
uint16_t unitNum;
|
||||
uint16_t *unitIdxs;
|
||||
uint8_t *unitFlags; // !unit result
|
||||
} SFilterGroup;
|
||||
|
||||
typedef struct SFilterGroupCtx {
|
||||
uint16_t num;
|
||||
int32_t *col;
|
||||
SArray *colRange;
|
||||
} SFilterGroupCtx;
|
||||
|
||||
typedef struct SFilterCompare {
|
||||
__compar_fn_t pCompareFunc;
|
||||
int32_t type;
|
||||
uint8_t optr;
|
||||
} SFilterCompare;
|
||||
|
||||
|
@ -116,10 +136,11 @@ typedef struct SFilterUnit {
|
|||
} SFilterUnit;
|
||||
|
||||
typedef struct SFilterInfo {
|
||||
uint32_t flags;
|
||||
uint16_t unitSize;
|
||||
uint16_t unitNum;
|
||||
uint16_t groupNum;
|
||||
SFilterFields fields[F_FIELD_MAX];
|
||||
SFilterFields fields[FLD_TYPE_MAX];
|
||||
SFilterGroup *groups;
|
||||
SFilterUnit *units;
|
||||
uint8_t *unitRes; // result
|
||||
|
@ -133,16 +154,24 @@ typedef struct SFilterInfo {
|
|||
|
||||
#define MR_EMPTY_RES(ctx) (ctx->rs == NULL)
|
||||
|
||||
#define MR_GET_FLAG(st, f) (st & f)
|
||||
#define MR_SET_FLAG(st, f) st |= (f)
|
||||
#define SET_OPTR(o) do {if (o == TSDB_RELATION_ISNULL) { isnull = true; } else if (o == TSDB_RELATION_NOTNULL) { notnull = true; } } while (0)
|
||||
#define CHK_OPTR() (isnull == true && notnull == true)
|
||||
|
||||
|
||||
#define FILTER_GET_FLAG(st, f) (st & f)
|
||||
#define FILTER_SET_FLAG(st, f) st |= (f)
|
||||
#define FILTER_CLR_FLAG(st, f) st &= (~f)
|
||||
|
||||
#define SIMPLE_COPY_VALUES(dst, src) *((int64_t *)dst) = *((int64_t *)src)
|
||||
|
||||
#define RESET_RANGE(ctx, r) do { r->next = ctx->rf; ctx->rf = r; } while (0)
|
||||
#define FREE_RANGE(ctx, r) do { if (r->prev) { r->prev->next = r->next; } else { ctx->rs = r->next;} if (r->next) { r->next->prev = r->prev; } RESET_RANGE(ctx, r); } while (0)
|
||||
#define FREE_FROM_RANGE(ctx, r) do { if (r->prev) { r->prev->next = NULL; } else { ctx->rs = NULL;} while (r) {SFilterRangeNode *n = r->next; RESET_RANGE(ctx, r); r = n; } } while (0)
|
||||
#define INSERT_RANGE(ctx, r, t, s, e) do { SFilterRangeNode *n = filterNewRange(ctx, t, s, e); n->prev = r->prev; if (r->prev) { r->prev->next = n; } else { ctx->rs = n; } r->prev = n; n->next = r; } while (0)
|
||||
#define APPEND_RANGE(ctx, r, t, s, e) do { SFilterRangeNode *n = filterNewRange(ctx, t, s, e); n->prev = r; if (r) { r->next = n; } else { ctx->rs = n; } } while (0)
|
||||
#define FILTER_GREATER(cr,sflag,eflag) ((cr > 0) || ((cr == 0) && (FILTER_GET_FLAG(sflag,RA_EXCLUDE) || FILTER_GET_FLAG(eflag,RA_EXCLUDE))))
|
||||
#define FILTER_COPY_RA(dst, src) do { (dst)->sflag = (src)->sflag; (dst)->eflag = (src)->eflag; (dst)->s = (src)->s; (dst)->e = (src)->e; } while (0)
|
||||
|
||||
#define RESET_RANGE(ctx, r) do { (r)->next = (ctx)->rf; (ctx)->rf = r; } while (0)
|
||||
#define FREE_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = (r)->next; } else { (ctx)->rs = (r)->next;} if ((r)->next) { (r)->next->prev = (r)->prev; } RESET_RANGE(ctx, r); } while (0)
|
||||
#define FREE_FROM_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = NULL; } else { (ctx)->rs = NULL;} while (r) {SFilterRangeNode *n = (r)->next; RESET_RANGE(ctx, r); r = n; } } while (0)
|
||||
#define INSERT_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r)->prev; if ((r)->prev) { (r)->prev->next = n; } else { (ctx)->rs = n; } (r)->prev = n; n->next = r; } while (0)
|
||||
#define APPEND_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r); if (r) { (r)->next = n; } else { (ctx)->rs = n; } } while (0)
|
||||
|
||||
#define ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { return _code; } } while (0)
|
||||
#define ERR_LRET(c,...) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { qError(__VA_ARGS__); return _code; } } while (0)
|
||||
|
@ -155,16 +184,21 @@ typedef struct SFilterInfo {
|
|||
#define CHK_LRET(c, r,...) do { if (c) { qError(__VA_ARGS__); return r; } } while (0)
|
||||
|
||||
#define FILTER_GET_FIELD(i, id) (&((i)->fields[(id).type].fields[(id).idx]))
|
||||
#define FILTER_GET_COL_FIELD(i, idx) (&((i)->fields[FLD_TYPE_COLUMN].fields[idx]))
|
||||
#define FILTER_GET_COL_FIELD_TYPE(fi) (((SSchema *)((fi)->desc))->type)
|
||||
#define FILTER_GET_COL_FIELD_DESC(fi) ((SSchema *)((fi)->desc))
|
||||
#define FILTER_GET_COL_FIELD_DATA(fi, ri) ((fi)->data + ((SSchema *)((fi)->desc))->bytes * (ri))
|
||||
#define FILTER_GET_VAL_FIELD_TYPE(fi) (((tVariant *)((fi)->desc))->nType)
|
||||
#define FILTER_GET_VAL_FIELD_DATA(fi) ((fi)->data)
|
||||
#define FILTER_GET_TYPE(fl) ((fl) & FLD_TYPE_MAX)
|
||||
|
||||
#define FILTER_GROUP_UNIT(i, g, uid) ((i)->units[(g)->unitIdxs[uid]])
|
||||
#define FILTER_GROUP_UNIT(i, g, uid) ((i)->units + (g)->unitIdxs[uid])
|
||||
#define FILTER_UNIT_LEFT_FIELD(i, u) FILTER_GET_FIELD(i, (u)->left)
|
||||
#define FILTER_UNIT_RIGHT_FIELD(i, u) FILTER_GET_FIELD(i, (u)->right)
|
||||
#define FILTER_UNIT_DATA_TYPE(i, u) FILTER_GET_COL_FIELD_TYPE(FILTER_UNIT_LEFT_FIELD(i, u))
|
||||
#define FILTER_UNIT_VAL(i, u) FILTER_GET_VAL_FIELD_DATA(FILTER_UNIT_RIGHT_FIELD(i, u))
|
||||
#define FILTER_UNIT_DATA_TYPE(u) ((u)->compare.type)
|
||||
#define FILTER_UNIT_COL_DESC(i, u) FILTER_GET_COL_FIELD_DESC(FILTER_UNIT_LEFT_FIELD(i, u))
|
||||
#define FILTER_UNIT_COL_DATA(i, u, ri) FILTER_GET_COL_FIELD_DATA(FILTER_UNIT_LEFT_FIELD(i, u), ri)
|
||||
#define FILTER_UNIT_VAL_DATA(i, u) FILTER_GET_VAL_FIELD_DATA(FILTER_UNIT_RIGHT_FIELD(i, u))
|
||||
#define FILTER_UNIT_COL_IDX(u) ((u)->left.idx)
|
||||
#define FILTER_UNIT_OPTR(u) ((u)->compare.optr)
|
||||
|
||||
|
@ -177,12 +211,12 @@ typedef struct SFilterInfo {
|
|||
typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
|
||||
|
||||
|
||||
extern int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo);
|
||||
extern int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t options);
|
||||
extern bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t* p);
|
||||
extern int32_t filterSetColFieldData(SFilterInfo *info, int16_t colId, void *data);
|
||||
extern void* filterInitMergeRange(int32_t type, int32_t options);
|
||||
extern int32_t filterGetMergeRangeNum(void* h, int32_t* num);
|
||||
extern int32_t filterGetMergeRangeRes(void* h, void *s, void* e);
|
||||
extern int32_t filterGetMergeRangeRes(void* h, SFilterRange *ra);
|
||||
extern int32_t filterFreeMergeRange(void* h);
|
||||
extern int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win);
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -6966,7 +6966,7 @@ int32_t createQueryFilter(char *data, uint16_t len, SFilterInfo** pFilters) {
|
|||
return TSDB_CODE_QRY_APP_ERROR;
|
||||
}
|
||||
|
||||
int32_t ret = filterInitFromTree(expr, pFilters);
|
||||
int32_t ret = filterInitFromTree(expr, pFilters, 0);
|
||||
tExprTreeDestroy(expr, NULL);
|
||||
|
||||
return ret;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -20,7 +20,7 @@ namespace {
|
|||
void intDataTest() {
|
||||
printf("running %s\n", __FUNCTION__);
|
||||
int32_t asize = 0;
|
||||
SFilterRange ra = {0};
|
||||
SFilterRange ra[10] = {0};
|
||||
int64_t *s =NULL;
|
||||
int64_t *e =NULL;
|
||||
int64_t s0[3] = {-100, 1, 3};
|
||||
|
@ -34,179 +34,191 @@ void intDataTest() {
|
|||
int64_t s4[2] = {10, 0};
|
||||
int64_t e4[2] = {20, 5};
|
||||
int64_t s5[3] = {0, 6 ,7};
|
||||
int64_t e5[5] = {4, 10,20};
|
||||
int64_t e5[3] = {4, 10,20};
|
||||
|
||||
int64_t rs[10];
|
||||
int64_t re[10];
|
||||
|
||||
int32_t num = 0;
|
||||
void *h = NULL;
|
||||
|
||||
s = s0;
|
||||
e = e0;
|
||||
asize = sizeof(s0)/sizeof(s[0]);
|
||||
void *h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_AND);
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 3);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], -100);
|
||||
ASSERT_EQ(re[0], 0);
|
||||
ASSERT_EQ(rs[1], 1);
|
||||
ASSERT_EQ(re[1], 2);
|
||||
ASSERT_EQ(rs[2], 3);
|
||||
ASSERT_EQ(re[2], 4);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, -100);
|
||||
ASSERT_EQ(ra[0].e, 0);
|
||||
ASSERT_EQ(ra[1].s, 1);
|
||||
ASSERT_EQ(ra[1].e, 2);
|
||||
ASSERT_EQ(ra[2].s, 3);
|
||||
ASSERT_EQ(ra[2].e, 4);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, MR_OPT_TS);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], -100);
|
||||
ASSERT_EQ(re[0], 4);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, -100);
|
||||
ASSERT_EQ(ra[0].e, 4);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
s = s1;
|
||||
e = e1;
|
||||
asize = sizeof(s1)/sizeof(s[0]);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_AND);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 3);
|
||||
ASSERT_EQ(re[0], 4);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 3);
|
||||
ASSERT_EQ(ra[0].e, 4);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], INT64_MIN);
|
||||
ASSERT_EQ(re[0], 100);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, INT64_MIN);
|
||||
ASSERT_EQ(ra[0].e, 100);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
|
||||
s = s2;
|
||||
e = e2;
|
||||
asize = sizeof(s2)/sizeof(s[0]);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_AND);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 1);
|
||||
ASSERT_EQ(re[0], 120);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 1);
|
||||
ASSERT_EQ(ra[0].e, 120);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, i % 2 ? TSDB_RELATION_OR : TSDB_RELATION_AND);
|
||||
filterAddMergeRange(h, ra, i % 2 ? TSDB_RELATION_OR : TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, i % 2 ? TSDB_RELATION_AND : TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, i % 2 ? TSDB_RELATION_AND : TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 70);
|
||||
ASSERT_EQ(re[0], 120);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 70);
|
||||
ASSERT_EQ(ra[0].e, 120);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
s = s3;
|
||||
e = e3;
|
||||
asize = sizeof(s3)/sizeof(s[0]);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_AND);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 1);
|
||||
ASSERT_EQ(re[0], 100);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 1);
|
||||
ASSERT_EQ(ra[0].e, 100);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
|
@ -215,82 +227,131 @@ void intDataTest() {
|
|||
s = s4;
|
||||
e = e4;
|
||||
asize = sizeof(s4)/sizeof(s[0]);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_AND);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 2);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 0);
|
||||
ASSERT_EQ(re[0], 5);
|
||||
ASSERT_EQ(rs[1], 10);
|
||||
ASSERT_EQ(re[1], 20);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 0);
|
||||
ASSERT_EQ(ra[0].e, 5);
|
||||
ASSERT_EQ(ra[1].s, 10);
|
||||
ASSERT_EQ(ra[1].e, 20);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
s = s5;
|
||||
e = e5;
|
||||
asize = sizeof(s5)/sizeof(s[0]);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_AND);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 2);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 0);
|
||||
ASSERT_EQ(re[0], 4);
|
||||
ASSERT_EQ(rs[1], 6);
|
||||
ASSERT_EQ(re[1], 20);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 0);
|
||||
ASSERT_EQ(ra[0].e, 4);
|
||||
ASSERT_EQ(ra[1].s, 6);
|
||||
ASSERT_EQ(ra[1].e, 20);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra.s = s[i];
|
||||
ra.e = e[i];
|
||||
ra[0].s = s[i];
|
||||
ra[0].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, &ra, (i == (asize -1)) ? TSDB_RELATION_AND : TSDB_RELATION_OR);
|
||||
filterAddMergeRange(h, ra, (i == (asize -1)) ? TSDB_RELATION_AND : TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 1);
|
||||
filterGetMergeRangeRes(h, rs, re);
|
||||
ASSERT_EQ(rs[0], 7);
|
||||
ASSERT_EQ(re[0], 10);
|
||||
filterGetMergeRangeRes(h, ra);
|
||||
ASSERT_EQ(ra[0].s, 7);
|
||||
ASSERT_EQ(ra[0].e, 10);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
|
||||
int64_t s6[2] = {0, 4};
|
||||
int64_t e6[2] = {4, 6};
|
||||
s = s6;
|
||||
e = e6;
|
||||
asize = sizeof(s6)/sizeof(s[0]);
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra[0].eflag = 1;
|
||||
ra[1].sflag = 4;
|
||||
|
||||
ra[i].s = s[i];
|
||||
ra[i].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, ra + i, TSDB_RELATION_AND);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 0);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
|
||||
|
||||
memset(ra, 0, sizeof(ra));
|
||||
h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0);
|
||||
for (int32_t i = 0; i < asize; ++i) {
|
||||
ra[0].eflag = 1;
|
||||
ra[1].sflag = 1;
|
||||
|
||||
ra[i].s = s[i];
|
||||
ra[i].e = e[i];
|
||||
|
||||
filterAddMergeRange(h, ra + i, TSDB_RELATION_OR);
|
||||
}
|
||||
filterGetMergeRangeNum(h, &num);
|
||||
ASSERT_EQ(num, 2);
|
||||
ASSERT_EQ(ra[0].s, 0);
|
||||
ASSERT_EQ(ra[0].e, 4);
|
||||
ASSERT_EQ(ra[0].eflag, 1);
|
||||
ASSERT_EQ(ra[1].s, 4);
|
||||
ASSERT_EQ(ra[1].e, 6);
|
||||
ASSERT_EQ(ra[1].sflag, 1);
|
||||
filterFreeMergeRange(h);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ typedef struct SHashNode {
|
|||
|
||||
#define GET_HASH_NODE_KEY(_n) ((char*)(_n) + sizeof(SHashNode) + (_n)->dataLen)
|
||||
#define GET_HASH_NODE_DATA(_n) ((char*)(_n) + sizeof(SHashNode))
|
||||
#define GET_HASH_PNODE(_n) ((char*)(_n) - sizeof(SHashNode));
|
||||
#define GET_HASH_PNODE(_n) ((SHashNode *)((char*)(_n) - sizeof(SHashNode)))
|
||||
|
||||
typedef enum SHashLockTypeE {
|
||||
HASH_NO_LOCK = 0,
|
||||
|
@ -161,6 +161,8 @@ void *taosHashIterate(SHashObj *pHashObj, void *p);
|
|||
|
||||
void taosHashCancelIterate(SHashObj *pHashObj, void *p);
|
||||
|
||||
void *taosHashGetDataKey(SHashObj *pHashObj, void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -695,6 +695,10 @@ size_t taosHashGetMemSize(const SHashObj *pHashObj) {
|
|||
return (pHashObj->capacity * (sizeof(SHashEntry) + POINTER_BYTES)) + sizeof(SHashNode) * taosHashGetSize(pHashObj) + sizeof(SHashObj);
|
||||
}
|
||||
|
||||
FORCE_INLINE void *taosHashGetDataKey(SHashObj *pHashObj, void *data) {
|
||||
return GET_HASH_NODE_KEY(GET_HASH_PNODE(data));
|
||||
}
|
||||
|
||||
// release the pNode, return next pNode, and lock the current entry
|
||||
static void *taosHashReleaseNode(SHashObj *pHashObj, void *p, int *slot) {
|
||||
|
||||
|
|
|
@ -64,21 +64,21 @@ int32_t compareInt8Val(const void *pLeft, const void *pRight) {
|
|||
}
|
||||
|
||||
int32_t compareUint32Val(const void *pLeft, const void *pRight) {
|
||||
int32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
|
||||
uint32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
|
||||
if (left > right) return 1;
|
||||
if (left < right) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t compareUint64Val(const void *pLeft, const void *pRight) {
|
||||
int64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
|
||||
uint64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
|
||||
if (left > right) return 1;
|
||||
if (left < right) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t compareUint16Val(const void *pLeft, const void *pRight) {
|
||||
int16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
|
||||
uint16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
|
||||
if (left > right) return 1;
|
||||
if (left < right) return -1;
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue