summaryrefslogtreecommitdiff
path: root/myisam/ft_boolean_search.c
diff options
context:
space:
mode:
authorserg@serg.mysql.com <>2001-12-11 19:58:41 +0100
committerserg@serg.mysql.com <>2001-12-11 19:58:41 +0100
commita910dacaba343c42888fbab169e4c9706b5671df (patch)
treea223e5361f898c3e855958b7e4a3c0397a88be3a /myisam/ft_boolean_search.c
parente9595dee5301c08036ee4416686a2e6a760bc89f (diff)
downloadmariadb-git-a910dacaba343c42888fbab169e4c9706b5671df.tar.gz
rewrote ft_boolean_find_relevance() to use ft_segiterator
Diffstat (limited to 'myisam/ft_boolean_search.c')
-rw-r--r--myisam/ft_boolean_search.c59
1 files changed, 35 insertions, 24 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index 4acce93e3ab..1b71337cc3b 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -359,10 +359,11 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
{
- TREE ptree;
- FT_WORD word;
+ FT_WORD word;
FTB_WORD *ftbw;
FTB_EXPR *ftbe;
+ FT_SEG_ITERATOR ftsi;
+ const byte *end;
uint i;
my_off_t docid=ftb->info->lastpos;
@@ -393,33 +394,43 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
else if (ftb->state != SCAN)
return -3.0;
- bzero(&ptree, sizeof(ptree));
- if ((ftb->keynr==NO_SUCH_KEY)
- ? ft_parse(& ptree, record, length)
- : _mi_ft_parse(& ptree, ftb->info, ftb->keynr, record))
- return -4.0;
+ if (ftb->keynr==NO_SUCH_KEY)
+ _mi_ft_segiterator_dummy_init(record, length, &ftsi);
+ else
+ _mi_ft_segiterator_init(ftb->info, ftb->keynr, record, &ftsi);
- for (i=1; i<=ftb->queue.elements; i++)
+ while (_mi_ft_segiterator(&ftsi))
{
- ftbw=(FTB_WORD *)(ftb->queue.root[i]);
- ftbw->docid=docid;
- ptree.custom_arg=(void *)(ftbw->trunc);
- word.pos=ftbw->word+1;
- word.len=ftbw->len-1;
- if (tree_search(& ptree, & word))
- { /* found! */
- _ftb_climb_the_tree(ftbw);
- }
- else
- { /* not found! */
- if (ftbw->yesno>0 && ftbw->up->up==0)
- { /* but this word MUST BE present in every document matched,
- so we can stop the search right now */
- break;
+ if (!ftsi.pos)
+ continue;
+
+ end=ftsi.pos+ftsi.len;
+ while (ft_simple_get_word((byte **)&ftsi.pos,(byte *)end,&word))
+ {
+ uint a, b, c;
+ for (a=1, b=ftb->queue.elements+1, c=(a+b)/2; b-a>1; c=(a+b)/2)
+ {
+ ftbw=(FTB_WORD *)(ftb->queue.root[c]);
+ if (_mi_compare_text(default_charset_info, word.pos,word.len,
+ (uchar*) ftbw->word+1,ftbw->len-1,ftbw->trunc) >0)
+ b=c;
+ else
+ a=c;
+ }
+ for (; c; c--)
+ {
+ ftbw=(FTB_WORD *)(ftb->queue.root[c]);
+ if (_mi_compare_text(default_charset_info, word.pos,word.len,
+ (uchar*) ftbw->word+1,ftbw->len-1,ftbw->trunc))
+ break;
+ if (ftbw->docid == docid)
+ continue;
+ ftbw->docid=docid;
+ _ftb_climb_the_tree(ftbw);
}
}
}
- delete_tree(& ptree);
+
ftbe=ftb->root;
if (ftbe->docid==docid && ftbe->cur_weight>0 &&
ftbe->yesses>=ftbe->ythresh && !ftbe->nos)