19
19
#include "ftdefs.h"
21
/* queries isam and returns list of documents matched */
23
typedef struct st_all_in_one {
32
typedef struct st_ft_superdoc {
38
static int FT_SUPERDOC_cmp(FT_SUPERDOC *p1, FT_SUPERDOC *p2)
40
if (p1->doc.dpos < p2->doc.dpos)
42
if (p1->doc.dpos == p2->doc.dpos)
47
static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
49
uint keylen, r, doc_cnt;
52
double sum, sum2, suml;
54
FT_SUPERDOC sdoc, *sptr;
56
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
62
word->weight=LWS_FOR_QUERY;
64
keylen=_ft_make_key(aio->info,aio->keynr,(char*) aio->keybuff,word,0);
76
r=_mi_search(aio->info, aio->keyinfo, aio->keybuff, keylen,
77
SEARCH_FIND | SEARCH_PREFIX, aio->key_root);
81
if (_mi_compare_text(default_charset_info,
82
aio->info->lastkey,keylen,
83
aio->keybuff,keylen,0)) break;
85
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
87
mi_float4get(tmp_weight,aio->info->lastkey+keylen+1);
89
mi_float4get(tmp_weight,aio->info->lastkey+keylen);
94
if(tmp_weight==0) return doc_cnt; /* stopword, doc_cnt should be 0 */
97
cnt=*(byte *)(aio->info->lastkey+keylen);
100
sdoc.doc.dpos=aio->info->lastpos;
102
/* saving document matched into dtree */
103
if(!(selem=tree_insert(&aio->dtree, &sdoc, 0))) return 1;
105
sptr=(FT_SUPERDOC *)ELEMENT_KEY((&aio->dtree), selem);
107
if(selem->count==1) /* document's first match */
110
sptr->doc.weight+=sptr->tmp_weight*sptr->word_ptr->weight;
113
sptr->tmp_weight=tmp_weight;
120
#endif /* EVAL_RUN */
122
if (_mi_test_if_changed(aio->info) == 0)
123
r=_mi_search_next(aio->info, aio->keyinfo, aio->info->lastkey,
124
aio->info->lastkey_length, SEARCH_BIGGER,
127
r=_mi_search(aio->info, aio->keyinfo, aio->info->lastkey,
128
aio->info->lastkey_length, SEARCH_BIGGER,
132
word->weight*=GWS_IN_USE;
133
if(word->weight < 0) word->weight=0;
139
static int walk_and_copy(FT_SUPERDOC *from,
140
uint32 count __attribute__((unused)), FT_DOC **to)
142
from->doc.weight+=from->tmp_weight*from->word_ptr->weight;
143
(*to)->dpos=from->doc.dpos;
144
(*to)->weight=from->doc.weight;
21
/* queries myisam and returns list of documents matched */
149
23
static int FT_DOC_cmp(FT_DOC *a, FT_DOC *b)
151
25
return sgn(b->weight - a->weight);
154
FT_DOCLIST * ft_init_search(void *info, uint keynr, byte *key,
155
uint key_len, my_bool presort)
28
FT_DOCLIST *ft_init_search(void *info, uint keynr, byte *query,
29
uint query_len, my_bool presort)
159
31
FT_DOCLIST *dlist;
161
32
my_off_t saved_lastpos=((MI_INFO *)info)->lastpos;
163
34
/* black magic ON */
168
39
/* black magic OFF */
171
aio.info=(MI_INFO *)info;
173
aio.keybuff=aio.info->lastkey+aio.info->s->base.max_key_length;
174
aio.keyinfo=aio.info->s->keyinfo+keynr;
175
aio.key_root=aio.info->s->state.key_root[keynr];
177
if (!(wtree=ft_parse(NULL,key,key_len))) return NULL;
179
init_tree(&aio.dtree,0,sizeof(FT_SUPERDOC),(qsort_cmp)&FT_SUPERDOC_cmp,0,
182
if (tree_walk(wtree, (tree_walk_action)&walk_and_match, &aio,
186
dlist=(FT_DOCLIST *) my_malloc(sizeof(FT_DOCLIST)+sizeof(FT_DOC)*
187
(aio.dtree.elements_in_tree-1),MYF(0));
191
dlist->ndocs=aio.dtree.elements_in_tree;
193
dlist->info=aio.info;
196
tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, &dptr,
41
if (is_boolean(query, query_len))
42
dlist=ft_boolean_search(info,keynr,query,query_len);
44
dlist=ft_nlq_search(info,keynr,query,query_len);
201
48
qsort(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort_cmp)&FT_DOC_cmp);
205
delete_tree(&aio.dtree);
207
my_free((char*) wtree,MYF(0));
208
51
((MI_INFO *)info)->lastpos=saved_lastpos;