Loading include/ft_global.h +6 −6 Original line number Diff line number Diff line Loading @@ -50,12 +50,12 @@ extern uint ft_max_word_len_for_sort; int ft_init_stopwords(const char **); void ft_free_stopwords(void); FT_DOCLIST * ft_init_search(void *, uint, byte *, uint, my_bool); int ft_read_next(FT_DOCLIST *, char *); #define ft_close_search(handler) my_free(((gptr)(handler)),MYF(0)) #define ft_get_relevance(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].weight) #define ft_get_docid(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].dpos) #define ft_reinit_search(handler) (((FT_DOCLIST *)(handler))->curdoc=-1) FT_DOCLIST * ft_nlq_init_search(void *, uint, byte *, uint, my_bool); int ft_nlq_read_next(FT_DOCLIST *, char *); #define ft_nlq_close_search(handler) my_free(((gptr)(handler)),MYF(0)) #define ft_nlq_get_relevance(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].weight) #define ft_nlq_get_docid(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].dpos) #define ft_nlq_reinit_search(handler) (((FT_DOCLIST *)(handler))->curdoc=-1) #ifdef __cplusplus } Loading myisam/Makefile.am +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ libmyisam_a_SOURCES = mi_open.c mi_extra.c mi_info.c mi_rkey.c \ mi_range.c mi_dbug.c mi_checksum.c mi_log.c \ mi_changed.c mi_static.c mi_delete_all.c \ mi_delete_table.c mi_rename.c mi_check.c \ ft_parser.c ft_search.c ft_stopwords.c ft_static.c \ ft_parser.c ft_stopwords.c ft_static.c \ ft_update.c ft_boolean_search.c ft_nlq_search.c sort.c CLEANFILES = test?.MY? FT?.MY? isam.log mi_test_all DEFS = -DMAP_TO_USE_RAID Loading myisam/ft_dump.c +2 −2 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ int main(int argc,char *argv[]) ft_init_stopwords(ft_precompiled_stopwords); result=ft_init_search(info,inx,query,strlen(query),1); result=ft_nlq_init_search(info,inx,query,strlen(query),1); if(!result) goto err; Loading @@ -87,7 +87,7 @@ int main(int argc,char *argv[]) for(i=0 ; i<result->ndocs ; i++) printf("%9qx %20.7f\n",result->doc[i].dpos,result->doc[i].weight); ft_close_search(result); ft_nlq_close_search(result); } else { Loading myisam/ft_eval.c +4 −4 Original line number Diff line number Diff line Loading @@ -83,23 +83,23 @@ int main(int argc,char *argv[]) for(i=1;create_record(record,qf);i++) { FT_DOCLIST *result; double w; int t,err; result=ft_init_search(file,0,blob_record,(uint) strlen(blob_record),1); result=ft_nlq_init_search(file,0,blob_record,(uint) strlen(blob_record),1); if(!result) { printf("Query %d failed with errno %3d\n",i,my_errno); goto err; } if (!silent) printf("Query %d. Found: %d.\n",i,result->ndocs); for(j=0;(err=ft_read_next(result, read_record))==0;j++) { for(j=0;(err=ft_nlq_read_next(result, read_record))==0;j++) { t=uint2korr(read_record); w=ft_get_relevance(result); w=ft_nlq_get_relevance(result); printf("%d %.*s %f\n",i,t,read_record+2,w); } if(err != HA_ERR_END_OF_FILE) { printf("ft_read_next %d failed with errno %3d\n",j,my_errno); goto err; } ft_close_search(result); ft_nlq_close_search(result); } if (mi_close(file)) goto err; Loading myisam/ft_nlq_search.c +53 −11 Original line number Diff line number Diff line Loading @@ -147,15 +147,28 @@ static int walk_and_copy(FT_SUPERDOC *from, return 0; } FT_DOCLIST *ft_nlq_search(MI_INFO *info, uint keynr, byte *query, uint query_len) static int FT_DOC_cmp(FT_DOC *a, FT_DOC *b) { return sgn(b->weight - a->weight); } FT_DOCLIST *ft_nlq_init_search(void *info, uint keynr, byte *query, uint query_len, my_bool presort) { TREE *wtree, allocated_wtree; ALL_IN_ONE aio; FT_DOC *dptr; FT_DOCLIST *dlist=NULL; my_off_t saved_lastpos=((MI_INFO *)info)->lastpos; aio.info=info; /* black magic ON */ if ((int) (keynr = _mi_check_index((MI_INFO *)info,keynr)) < 0) return NULL; if (_mi_readinfo((MI_INFO *)info,F_RDLCK,1)) return NULL; /* black magic OFF */ aio.info=(MI_INFO *)info; aio.keynr=keynr; aio.keybuff=aio.info->lastkey+aio.info->s->base.max_key_length; aio.keyinfo=aio.info->s->keyinfo+keynr; Loading @@ -167,26 +180,55 @@ FT_DOCLIST *ft_nlq_search(MI_INFO *info, uint keynr, byte *query, NULL, NULL); if(!(wtree=ft_parse(&allocated_wtree,query,query_len))) return NULL; goto err; if(tree_walk(wtree, (tree_walk_action)&walk_and_match, &aio, left_root_right)) goto err; goto err2; dlist=(FT_DOCLIST *)my_malloc(sizeof(FT_DOCLIST)+sizeof(FT_DOC)*(aio.dtree.elements_in_tree-1),MYF(0)); dlist=(FT_DOCLIST *)my_malloc(sizeof(FT_DOCLIST)+ sizeof(FT_DOC)*(aio.dtree.elements_in_tree-1),MYF(0)); if(!dlist) goto err; goto err2; dlist->ndocs=aio.dtree.elements_in_tree; dlist->curdoc=-1; dlist->info=aio.info; dptr=dlist->doc; tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, &dptr, left_root_right); tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, &dptr, left_root_right); err: if(presort) qsort(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort_cmp)&FT_DOC_cmp); err2: delete_tree(wtree); delete_tree(&aio.dtree); err: ((MI_INFO *)info)->lastpos=saved_lastpos; return dlist; } int ft_nlq_read_next(FT_DOCLIST *handler, char *record) { MI_INFO *info= (MI_INFO *) handler->info; if (++handler->curdoc >= handler->ndocs) { --handler->curdoc; return HA_ERR_END_OF_FILE; } info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); info->lastpos=handler->doc[handler->curdoc].dpos; if (!(*info->read_record)(info,info->lastpos,record)) { info->update|= HA_STATE_AKTIV; /* Record is read */ return 0; } return my_errno; } Loading
include/ft_global.h +6 −6 Original line number Diff line number Diff line Loading @@ -50,12 +50,12 @@ extern uint ft_max_word_len_for_sort; int ft_init_stopwords(const char **); void ft_free_stopwords(void); FT_DOCLIST * ft_init_search(void *, uint, byte *, uint, my_bool); int ft_read_next(FT_DOCLIST *, char *); #define ft_close_search(handler) my_free(((gptr)(handler)),MYF(0)) #define ft_get_relevance(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].weight) #define ft_get_docid(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].dpos) #define ft_reinit_search(handler) (((FT_DOCLIST *)(handler))->curdoc=-1) FT_DOCLIST * ft_nlq_init_search(void *, uint, byte *, uint, my_bool); int ft_nlq_read_next(FT_DOCLIST *, char *); #define ft_nlq_close_search(handler) my_free(((gptr)(handler)),MYF(0)) #define ft_nlq_get_relevance(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].weight) #define ft_nlq_get_docid(handler) (((FT_DOCLIST *)(handler))->doc[((FT_DOCLIST *)(handler))->curdoc].dpos) #define ft_nlq_reinit_search(handler) (((FT_DOCLIST *)(handler))->curdoc=-1) #ifdef __cplusplus } Loading
myisam/Makefile.am +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ libmyisam_a_SOURCES = mi_open.c mi_extra.c mi_info.c mi_rkey.c \ mi_range.c mi_dbug.c mi_checksum.c mi_log.c \ mi_changed.c mi_static.c mi_delete_all.c \ mi_delete_table.c mi_rename.c mi_check.c \ ft_parser.c ft_search.c ft_stopwords.c ft_static.c \ ft_parser.c ft_stopwords.c ft_static.c \ ft_update.c ft_boolean_search.c ft_nlq_search.c sort.c CLEANFILES = test?.MY? FT?.MY? isam.log mi_test_all DEFS = -DMAP_TO_USE_RAID Loading
myisam/ft_dump.c +2 −2 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ int main(int argc,char *argv[]) ft_init_stopwords(ft_precompiled_stopwords); result=ft_init_search(info,inx,query,strlen(query),1); result=ft_nlq_init_search(info,inx,query,strlen(query),1); if(!result) goto err; Loading @@ -87,7 +87,7 @@ int main(int argc,char *argv[]) for(i=0 ; i<result->ndocs ; i++) printf("%9qx %20.7f\n",result->doc[i].dpos,result->doc[i].weight); ft_close_search(result); ft_nlq_close_search(result); } else { Loading
myisam/ft_eval.c +4 −4 Original line number Diff line number Diff line Loading @@ -83,23 +83,23 @@ int main(int argc,char *argv[]) for(i=1;create_record(record,qf);i++) { FT_DOCLIST *result; double w; int t,err; result=ft_init_search(file,0,blob_record,(uint) strlen(blob_record),1); result=ft_nlq_init_search(file,0,blob_record,(uint) strlen(blob_record),1); if(!result) { printf("Query %d failed with errno %3d\n",i,my_errno); goto err; } if (!silent) printf("Query %d. Found: %d.\n",i,result->ndocs); for(j=0;(err=ft_read_next(result, read_record))==0;j++) { for(j=0;(err=ft_nlq_read_next(result, read_record))==0;j++) { t=uint2korr(read_record); w=ft_get_relevance(result); w=ft_nlq_get_relevance(result); printf("%d %.*s %f\n",i,t,read_record+2,w); } if(err != HA_ERR_END_OF_FILE) { printf("ft_read_next %d failed with errno %3d\n",j,my_errno); goto err; } ft_close_search(result); ft_nlq_close_search(result); } if (mi_close(file)) goto err; Loading
myisam/ft_nlq_search.c +53 −11 Original line number Diff line number Diff line Loading @@ -147,15 +147,28 @@ static int walk_and_copy(FT_SUPERDOC *from, return 0; } FT_DOCLIST *ft_nlq_search(MI_INFO *info, uint keynr, byte *query, uint query_len) static int FT_DOC_cmp(FT_DOC *a, FT_DOC *b) { return sgn(b->weight - a->weight); } FT_DOCLIST *ft_nlq_init_search(void *info, uint keynr, byte *query, uint query_len, my_bool presort) { TREE *wtree, allocated_wtree; ALL_IN_ONE aio; FT_DOC *dptr; FT_DOCLIST *dlist=NULL; my_off_t saved_lastpos=((MI_INFO *)info)->lastpos; aio.info=info; /* black magic ON */ if ((int) (keynr = _mi_check_index((MI_INFO *)info,keynr)) < 0) return NULL; if (_mi_readinfo((MI_INFO *)info,F_RDLCK,1)) return NULL; /* black magic OFF */ aio.info=(MI_INFO *)info; aio.keynr=keynr; aio.keybuff=aio.info->lastkey+aio.info->s->base.max_key_length; aio.keyinfo=aio.info->s->keyinfo+keynr; Loading @@ -167,26 +180,55 @@ FT_DOCLIST *ft_nlq_search(MI_INFO *info, uint keynr, byte *query, NULL, NULL); if(!(wtree=ft_parse(&allocated_wtree,query,query_len))) return NULL; goto err; if(tree_walk(wtree, (tree_walk_action)&walk_and_match, &aio, left_root_right)) goto err; goto err2; dlist=(FT_DOCLIST *)my_malloc(sizeof(FT_DOCLIST)+sizeof(FT_DOC)*(aio.dtree.elements_in_tree-1),MYF(0)); dlist=(FT_DOCLIST *)my_malloc(sizeof(FT_DOCLIST)+ sizeof(FT_DOC)*(aio.dtree.elements_in_tree-1),MYF(0)); if(!dlist) goto err; goto err2; dlist->ndocs=aio.dtree.elements_in_tree; dlist->curdoc=-1; dlist->info=aio.info; dptr=dlist->doc; tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, &dptr, left_root_right); tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, &dptr, left_root_right); err: if(presort) qsort(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort_cmp)&FT_DOC_cmp); err2: delete_tree(wtree); delete_tree(&aio.dtree); err: ((MI_INFO *)info)->lastpos=saved_lastpos; return dlist; } int ft_nlq_read_next(FT_DOCLIST *handler, char *record) { MI_INFO *info= (MI_INFO *) handler->info; if (++handler->curdoc >= handler->ndocs) { --handler->curdoc; return HA_ERR_END_OF_FILE; } info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); info->lastpos=handler->doc[handler->curdoc].dpos; if (!(*info->read_record)(info,info->lastpos,record)) { info->update|= HA_STATE_AKTIV; /* Record is read */ return 0; } return my_errno; }