From 551cfd5c35b50899bae7f9c86022021b57ff4c21 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 23 Oct 2021 16:12:36 +0800 Subject: [PATCH] add index test example --- include/libs/index/index.h | 11 ++++---- source/libs/index/src/index.c | 39 ++++++++++++++++++++------- source/libs/index/test/indexTests.cpp | 25 +++++++++++++---- 3 files changed, 55 insertions(+), 20 deletions(-) diff --git a/include/libs/index/index.h b/include/libs/index/index.h index 346214e0c8..1b74928568 100644 --- a/include/libs/index/index.h +++ b/include/libs/index/index.h @@ -27,12 +27,9 @@ typedef struct SIndex SIndex; typedef struct SIndexOpts SIndexOpts; typedef struct SIndexMultiTermQuery SIndexMultiTermQuery; typedef struct SArray SIndexMultiTerm; -//typedef struct SIndexMultiTerm SIndexMultiTerm; typedef enum { MUST = 0, SHOULD = 1, NOT = 2 } EIndexOperatorType; -typedef enum { QUERY_POINT = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2,QUERY_REGEX = 3} EIndexQueryType; - - +typedef enum { QUERY_TERM = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2,QUERY_REGEX = 3} EIndexQueryType; /* * @param: oper * @@ -40,7 +37,6 @@ typedef enum { QUERY_POINT = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2,QUERY_REGEX SIndexMultiTermQuery *indexMultiTermQueryCreate(EIndexOperatorType oper); void indexMultiTermQueryDestroy(SIndexMultiTermQuery *pQuery); int indexMultiTermQueryAdd(SIndexMultiTermQuery *pQuery, const char *field, int32_t nFields, const char *value, int32_t nValue, EIndexQueryType type); - /* * @param: * @param: @@ -51,7 +47,10 @@ int indexPut(SIndex *index, SIndexMultiTerm *terms, int uid); int indexDelete(SIndex *index, SIndexMultiTermQuery *query); int indexSearch(SIndex *index, SIndexMultiTermQuery *query, SArray *result); int indexRebuild(SIndex *index, SIndexOpts *opt); - +/* + * @param + * @param + */ SIndexMultiTerm *indexMultiTermCreate(); int indexMultiTermAdd(SIndexMultiTerm *terms, const char *field, int32_t nFields, const char *value, int32_t nValue); void indexMultiTermDestroy(SIndexMultiTerm *terms); diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c index e4b2a4acc4..91cfcb5cdf 100644 --- a/source/libs/index/src/index.c +++ b/source/libs/index/src/index.c @@ -68,18 +68,39 @@ int indexPut(SIndex *index, SArray* field_vals, int uid) { } int indexSearch(SIndex *index, SIndexMultiTermQuery *multiQuerys, SArray *result) { #ifdef USE_LUCENE - for (int i = 0; i < taosArrayGetSize(multiQuerys->query); i++) { + EIndexOperatorType opera = multiQuerys->opera; + + int nQuery = taosArrayGetSize(multiQuerys->query); + char **fields = malloc(sizeof(char *) * nQuery); + char **keys = malloc(sizeof(char *) * nQuery); + int *types = malloc(sizeof(int) * nQuery); + + for (int i = 0; i < nQuery; i++) { SIndexTermQuery *p = taosArrayGet(multiQuerys->query, i); SIndexTerm *term = p->field_value; - EIndexQueryType qType = p->type; - int *tResult = NULL; - int32_t tsz = 0; - index_search(index->index, term->key, term->nKey, term->val, term->nVal, qType, &tResult, &tsz); - for (int i = 0; i < tsz; i++) { - taosArrayPush(result, &(tResult[i])); - } - + + fields[i] = calloc(1, term->nKey + 1); + keys[i] = calloc(1, term->nVal + 1); + + memcpy(fields[i], term->key, term->nKey); + memcpy(keys[i], term->val, term->nVal); + types[i] = (int)(p->type); } + int *tResult = NULL; + int tsz= 0; + index_multi_search(index->index, (const char **)fields, (const char **)keys, types, nQuery, opera, &tResult, &tsz); + + for (int i = 0; i < tsz; i++) { + taosArrayPush(result, &tResult[i]); + } + + for (int i = 0; i < nQuery; i++) { + free(fields[i]); + free(keys[i]); + } + free(fields); + free(keys); + free(types); #endif return 1; } diff --git a/source/libs/index/test/indexTests.cpp b/source/libs/index/test/indexTests.cpp index efa7f37a60..763a6a54d3 100644 --- a/source/libs/index/test/indexTests.cpp +++ b/source/libs/index/test/indexTests.cpp @@ -15,17 +15,32 @@ TEST(IndexTest, index_create_test) { } - SArray* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, "tag1", strlen("tag1"), "field", strlen("field")); - for (int i = 0; i < 10; i++) { - indexPut(index, terms, i); + + // write + for (int i = 0; i < 100000; i++) { + SIndexMultiTerm* terms = indexMultiTermCreate(); + std::string val = "field"; + + indexMultiTermAdd(terms, "tag1", strlen("tag1"), val.c_str(), val.size()); + + val.append(std::to_string(i)); + indexMultiTermAdd(terms, "tag2", strlen("tag2"), val.c_str(), val.size()); + + val.insert(0, std::to_string(i)); + indexMultiTermAdd(terms, "tag3", strlen("tag3"), val.c_str(), val.size()); + + val.append("const"); + indexMultiTermAdd(terms, "tag4", strlen("tag4"), val.c_str(), val.size()); + + indexPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); // query SIndexMultiTermQuery *multiQuery = indexMultiTermQueryCreate(MUST); indexMultiTermQueryAdd(multiQuery, "tag1", strlen("tag1"), "field", strlen("field"), QUERY_PREFIX); + indexMultiTermQueryAdd(multiQuery, "tag3", strlen("tag3"), "0field0", strlen("0field0"), QUERY_TERM); SArray *result = (SArray *)taosArrayInit(10, sizeof(int)); indexSearch(index, multiQuery, result); -- GitLab