Commit 6d187f8d authored by unknown's avatar unknown

rewrote ft_boolean_find_relevance() to use ft_segiterator


myisam/ft_update.c:
  bugfix
parent a3bbc574
...@@ -359,10 +359,11 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) ...@@ -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) float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
{ {
TREE ptree; FT_WORD word;
FT_WORD word;
FTB_WORD *ftbw; FTB_WORD *ftbw;
FTB_EXPR *ftbe; FTB_EXPR *ftbe;
FT_SEG_ITERATOR ftsi;
const byte *end;
uint i; uint i;
my_off_t docid=ftb->info->lastpos; my_off_t docid=ftb->info->lastpos;
...@@ -393,33 +394,43 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) ...@@ -393,33 +394,43 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
else if (ftb->state != SCAN) else if (ftb->state != SCAN)
return -3.0; return -3.0;
bzero(&ptree, sizeof(ptree)); if (ftb->keynr==NO_SUCH_KEY)
if ((ftb->keynr==NO_SUCH_KEY) _mi_ft_segiterator_dummy_init(record, length, &ftsi);
? ft_parse(& ptree, record, length) else
: _mi_ft_parse(& ptree, ftb->info, ftb->keynr, record)) _mi_ft_segiterator_init(ftb->info, ftb->keynr, record, &ftsi);
return -4.0;
for (i=1; i<=ftb->queue.elements; i++) while (_mi_ft_segiterator(&ftsi))
{ {
ftbw=(FTB_WORD *)(ftb->queue.root[i]); if (!ftsi.pos)
ftbw->docid=docid; continue;
ptree.custom_arg=(void *)(ftbw->trunc);
word.pos=ftbw->word+1; end=ftsi.pos+ftsi.len;
word.len=ftbw->len-1; while (ft_simple_get_word((byte **)&ftsi.pos,(byte *)end,&word))
if (tree_search(& ptree, & word)) {
{ /* found! */ uint a, b, c;
_ftb_climb_the_tree(ftbw); for (a=1, b=ftb->queue.elements+1, c=(a+b)/2; b-a>1; c=(a+b)/2)
} {
else ftbw=(FTB_WORD *)(ftb->queue.root[c]);
{ /* not found! */ if (_mi_compare_text(default_charset_info, word.pos,word.len,
if (ftbw->yesno>0 && ftbw->up->up==0) (uchar*) ftbw->word+1,ftbw->len-1,ftbw->trunc) >0)
{ /* but this word MUST BE present in every document matched, b=c;
so we can stop the search right now */ else
break; 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; ftbe=ftb->root;
if (ftbe->docid==docid && ftbe->cur_weight>0 && if (ftbe->docid==docid && ftbe->cur_weight>0 &&
ftbe->yesses>=ftbe->ythresh && !ftbe->nos) ftbe->yesses>=ftbe->ythresh && !ftbe->nos)
......
...@@ -55,12 +55,9 @@ void _mi_ft_segiterator_dummy_init(const byte *record, uint len, ...@@ -55,12 +55,9 @@ void _mi_ft_segiterator_dummy_init(const byte *record, uint len,
uint _mi_ft_segiterator(register FT_SEG_ITERATOR *ftsi) uint _mi_ft_segiterator(register FT_SEG_ITERATOR *ftsi)
{ {
if(!ftsi->num) if (!ftsi->num) return 0; else ftsi->num--;
return 0; if (!ftsi->seg) return 1; else ftsi->seg--;
if (!ftsi->seg)
return 1;
ftsi->seg--; ftsi->num--;
if (ftsi->seg->null_bit && if (ftsi->seg->null_bit &&
(ftsi->rec[ftsi->seg->null_pos] & 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