Merge pull request #10393 from taosdata/feature/indexUpdate
add multi tag query
This commit is contained in:
commit
c9c75bdf79
|
@ -54,7 +54,7 @@ extern "C" {
|
|||
* output:[4, 5]
|
||||
*/
|
||||
void iIntersection(SArray *interResults, SArray *finalResult);
|
||||
|
||||
void iUnion(SArray *interResults, SArray *finalResult);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -382,12 +382,8 @@ static int indexMergeFinalResults(SArray* interResults, EIndexOperatorType oType
|
|||
|
||||
if (oType == MUST) {
|
||||
iIntersection(interResults, fResults);
|
||||
// just one column index, enhance later
|
||||
// taosArrayAddAll(fResults, interResults);
|
||||
} else if (oType == SHOULD) {
|
||||
// just one column index, enhance later
|
||||
taosArrayAddAll(fResults, interResults);
|
||||
// tag1 condistion || tag2 condition
|
||||
iUnion(interResults, fResults);
|
||||
} else if (oType == NOT) {
|
||||
// just one column index, enhance later
|
||||
taosArrayAddAll(fResults, interResults);
|
||||
|
|
|
@ -42,7 +42,6 @@ void iIntersection(SArray *inters, SArray *final) {
|
|||
MergeIndex *mi = calloc(sz, sizeof(MergeIndex));
|
||||
for (int i = 0; i < sz; i++) {
|
||||
SArray *t = taosArrayGetP(inters, i);
|
||||
|
||||
mi[i].len = taosArrayGetSize(t);
|
||||
mi[i].idx = 0;
|
||||
}
|
||||
|
@ -68,3 +67,45 @@ void iIntersection(SArray *inters, SArray *final) {
|
|||
}
|
||||
tfree(mi);
|
||||
}
|
||||
void iUnion(SArray *inters, SArray *final) {
|
||||
int32_t sz = taosArrayGetSize(inters);
|
||||
if (sz <= 0) {
|
||||
return;
|
||||
}
|
||||
MergeIndex *mi = calloc(sz, sizeof(MergeIndex));
|
||||
for (int i = 0; i < sz; i++) {
|
||||
SArray *t = taosArrayGetP(inters, i);
|
||||
mi[i].len = taosArrayGetSize(t);
|
||||
mi[i].idx = 0;
|
||||
}
|
||||
while (1) {
|
||||
uint64_t mVal = UINT_MAX;
|
||||
int mIdx = -1;
|
||||
|
||||
for (int j = 0; j < sz; j++) {
|
||||
SArray *t = taosArrayGetP(inters, j);
|
||||
if (mi[j].idx >= mi[j].len) {
|
||||
continue;
|
||||
}
|
||||
uint64_t cVal = *(uint64_t *)taosArrayGet(t, mi[j].idx);
|
||||
if (cVal < mVal) {
|
||||
mVal = cVal;
|
||||
mIdx = j;
|
||||
}
|
||||
}
|
||||
if (mIdx != -1) {
|
||||
mi[mIdx].idx++;
|
||||
if (taosArrayGetSize(final) > 0) {
|
||||
uint64_t lVal = *(uint64_t *)taosArrayGetLast(final);
|
||||
if (lVal == mVal) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
taosArrayPush(final, &mVal);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tfree(mi);
|
||||
}
|
||||
|
|
|
@ -147,3 +147,57 @@ TEST_F(UtilEnv, intersect02) {
|
|||
iIntersection(src, rslt);
|
||||
assert(taosArrayGetSize(rslt) == 0);
|
||||
}
|
||||
TEST_F(UtilEnv, 01union) {
|
||||
clearSourceArray(src);
|
||||
clearFinalArray(rslt);
|
||||
|
||||
uint64_t arr1[] = {13, 14, 15};
|
||||
SArray * f = (SArray *)taosArrayGetP(src, 0);
|
||||
for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) {
|
||||
taosArrayPush(f, &arr1[i]);
|
||||
}
|
||||
iUnion(src, rslt);
|
||||
assert(taosArrayGetSize(rslt) == 3);
|
||||
}
|
||||
TEST_F(UtilEnv, 02union) {
|
||||
clearSourceArray(src);
|
||||
clearFinalArray(rslt);
|
||||
|
||||
uint64_t arr1[] = {13, 14, 15};
|
||||
SArray * f = (SArray *)taosArrayGetP(src, 0);
|
||||
for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) {
|
||||
taosArrayPush(f, &arr1[i]);
|
||||
}
|
||||
|
||||
uint64_t arr2[] = {13, 14, 15};
|
||||
f = (SArray *)taosArrayGetP(src, 1);
|
||||
for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++) {
|
||||
taosArrayPush(f, &arr2[i]);
|
||||
}
|
||||
iUnion(src, rslt);
|
||||
assert(taosArrayGetSize(rslt) == 3);
|
||||
}
|
||||
TEST_F(UtilEnv, 03union) {
|
||||
clearSourceArray(src);
|
||||
clearFinalArray(rslt);
|
||||
|
||||
uint64_t arr1[] = {13, 16, 18, 20};
|
||||
SArray * f = (SArray *)taosArrayGetP(src, 0);
|
||||
for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) {
|
||||
taosArrayPush(f, &arr1[i]);
|
||||
}
|
||||
|
||||
uint64_t arr2[] = {0, 12, 13, 20, 23};
|
||||
f = (SArray *)taosArrayGetP(src, 1);
|
||||
for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++) {
|
||||
taosArrayPush(f, &arr2[i]);
|
||||
}
|
||||
|
||||
uint64_t arr3[] = {1, 12, 13, 16, 17};
|
||||
f = (SArray *)taosArrayGetP(src, 2);
|
||||
for (int i = 0; i < sizeof(arr3) / sizeof(arr3[0]); i++) {
|
||||
taosArrayPush(f, &arr3[i]);
|
||||
}
|
||||
iUnion(src, rslt);
|
||||
assert(taosArrayGetSize(rslt) == 9);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue