mirror of
https://github.com/typesense/typesense.git
synced 2025-05-16 19:55:21 +08:00
Fixed a major bug with NODE256 iteration for prefix "twili".
This commit is contained in:
parent
0d1eca8229
commit
50a125f7ea
@ -4,6 +4,8 @@
|
||||
#ifndef ART_H
|
||||
#define ART_H
|
||||
|
||||
#define IGNORE_PRINTF 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
37
src/art.c
37
src/art.c
@ -16,8 +16,6 @@
|
||||
|
||||
#define MIN3(a, b, c) ((a) < (b) ? ((a) < (c) ? (a) : (c)) : ((b) < (c) ? (b) : (c)))
|
||||
|
||||
//#define IGNORE_PRINTF 1
|
||||
|
||||
#ifdef IGNORE_PRINTF
|
||||
#define printf(fmt, ...) (0)
|
||||
#endif
|
||||
@ -951,18 +949,19 @@ int art_iter_prefix(art_tree *t, const unsigned char *key, int key_len, art_call
|
||||
new_current_row[0] = previous_row[0] + 1;\
|
||||
row_min = levenshtein_score(child_char, term, term_len, previous_row, new_current_row);\
|
||||
\
|
||||
int new_depth = (child_char != 0) ? depth+1 : depth;\
|
||||
printf("child cost: %d, depth: %d, term_len: %d \n", new_current_row[term_len], depth, term_len);\
|
||||
printf("child char: %c, cost: %d, depth: %d, term_len: %d \n", child_char, new_current_row[term_len], depth, term_len);\
|
||||
\
|
||||
if(new_depth == term_len) {\
|
||||
if(depth == term_len-1) {\
|
||||
/* if reach end of term, and cost is below threshold, print children of this node as matches*/\
|
||||
if(new_current_row[term_len] <= max_cost) {\
|
||||
return recursive_iter(n, cb, NULL);\
|
||||
printf("START RECURSIVE ITER\n");\
|
||||
return recursive_iter(child, cb, NULL);\
|
||||
}\
|
||||
return 0;\
|
||||
}\
|
||||
\
|
||||
if(row_min <= max_cost) {\
|
||||
int new_depth = (child_char != 0) ? depth+1 : depth;\
|
||||
art_iter_fuzzy_prefix_recurse(child, term, term_len, max_cost, new_depth, new_current_row, cb, data);\
|
||||
}\
|
||||
}\
|
||||
@ -1038,7 +1037,7 @@ static int art_iter_fuzzy_prefix_recurse(art_node *n, const unsigned char *term,
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("START PARTIAL\n");
|
||||
printf("START PARTIAL: %s\n", n->partial);
|
||||
|
||||
// internal node - first we check partial (via path compression) and then child index
|
||||
int partial_len = min(MAX_PREFIX_LEN, n->partial_len);
|
||||
@ -1053,10 +1052,16 @@ static int art_iter_fuzzy_prefix_recurse(art_node *n, const unsigned char *term,
|
||||
depth += 1;
|
||||
}
|
||||
|
||||
printf("CURRENT ROW PARTIAL:\n");
|
||||
print_row(current_row, term_len);
|
||||
|
||||
printf("PREVIOUS ROW PARTIAL:\n");
|
||||
print_row(previous_row, term_len);
|
||||
printf("\n");
|
||||
|
||||
if(depth == term_len) {
|
||||
if(current_row[term_len] <= max_cost) {
|
||||
printf("PARTIAL START RECURSIVE ITER\n");\
|
||||
return recursive_iter(n, cb, NULL);
|
||||
}
|
||||
|
||||
@ -1068,6 +1073,7 @@ static int art_iter_fuzzy_prefix_recurse(art_node *n, const unsigned char *term,
|
||||
|
||||
switch (n->type) {
|
||||
case NODE4:
|
||||
printf("NODE4\n");
|
||||
for (int i=0; i < n->num_children; i++) {
|
||||
char child_char = ((art_node4*)n)->keys[i];
|
||||
printf("!child_char: %c, depth: %d", child_char, depth);
|
||||
@ -1077,28 +1083,35 @@ static int art_iter_fuzzy_prefix_recurse(art_node *n, const unsigned char *term,
|
||||
break;
|
||||
|
||||
case NODE16:
|
||||
printf("NODE16\n");
|
||||
for (int i=0; i < n->num_children; i++) {
|
||||
char child_char = ((art_node16*)n)->keys[i];
|
||||
printf("!child_char: %c, depth: %d", child_char, depth);
|
||||
art_node* child = ((art_node16*)n)->children[i];
|
||||
fuzzy_recurse(child_char, term, term_len, depth, previous_row);
|
||||
}
|
||||
break;
|
||||
|
||||
case NODE48:
|
||||
for (int i=0; i < 256; i++) {
|
||||
printf("NODE48\n");
|
||||
for (int i=0; i < n->num_children; i++) {
|
||||
char ix = ((art_node48*)n)->keys[i];
|
||||
if (!ix) continue;
|
||||
char child_char = ((art_node48*)n)->keys[ix - 1];
|
||||
printf("!child_char: %c, depth: %d", child_char, depth);
|
||||
art_node* child = ((art_node48*)n)->children[ix - 1];
|
||||
fuzzy_recurse(child_char, term, term_len, depth, previous_row);
|
||||
}
|
||||
break;
|
||||
|
||||
case NODE256:
|
||||
printf("NODE256\n");
|
||||
for (int i=0; i < 256; i++) {
|
||||
if (!((art_node256*)n)->children[i]) continue;
|
||||
char child_char = (char) i;
|
||||
printf("!child_char: %c, depth: %d", child_char, depth);
|
||||
art_node* child = ((art_node256*)n)->children[i];
|
||||
if(row_min <= max_cost) art_iter_fuzzy_prefix_recurse(child, term, term_len, max_cost, depth, current_row, cb, data);
|
||||
fuzzy_recurse(child_char, term, term_len, depth, previous_row);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1125,11 +1138,11 @@ static int art_iter_fuzzy_prefix_recurse(art_node *n, const unsigned char *term,
|
||||
int art_iter_fuzzy_prefix(art_tree *t, const unsigned char *term, int term_len,
|
||||
int max_cost, art_callback cb, void *data) {
|
||||
|
||||
int current_row[term_len+1];
|
||||
int previous_row[term_len + 1];
|
||||
|
||||
for (int i = 0; i <= term_len; i++){
|
||||
current_row[i] = i;
|
||||
previous_row[i] = i;
|
||||
}
|
||||
|
||||
return art_iter_fuzzy_prefix_recurse(t->root, term, term_len, max_cost, 0, current_row, cb, data);
|
||||
return art_iter_fuzzy_prefix_recurse(t->root, term, term_len, max_cost, 0, previous_row, cb, data);
|
||||
}
|
@ -19,7 +19,7 @@ int main() {
|
||||
art_tree t;
|
||||
art_tree_init(&t);
|
||||
|
||||
std::ifstream infile("/Users/kishorenc/others/wreally/search/test/words.txt");
|
||||
std::ifstream infile("/usr/share/dict/words");
|
||||
|
||||
std::string line;
|
||||
uintptr_t num = 1;
|
||||
@ -30,7 +30,7 @@ int main() {
|
||||
num++;
|
||||
}
|
||||
|
||||
const unsigned char *prefix = (const unsigned char *) "enlig";
|
||||
const unsigned char *prefix = (const unsigned char *) "amzsign";
|
||||
art_iter_fuzzy_prefix(&t, prefix, strlen((const char *) prefix), 2, test_prefix_cb, NULL);
|
||||
// art_iter_prefix(&t, prefix, strlen((const char *) prefix), test_prefix_cb, NULL);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user