Commit a910daca authored by serg@serg.mysql.com's avatar serg@serg.mysql.com

rewrote ft_boolean_find_relevance() to use ft_segiterator

parent e9595dee
......@@ -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)
......
......@@ -55,12 +55,9 @@ void _mi_ft_segiterator_dummy_init(const byte *record, uint len,
uint _mi_ft_segiterator(register FT_SEG_ITERATOR *ftsi)
{
if(!ftsi->num)
return 0;
if (!ftsi->seg)
return 1;
if (!ftsi->num) return 0; else ftsi->num--;
if (!ftsi->seg) return 1; else ftsi->seg--;
ftsi->seg--; ftsi->num--;
if (ftsi->seg->null_bit &&
(ftsi->rec[ftsi->seg->null_pos] & ftsi->seg->null_bit))
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment