Commit 5a9a3e91 authored by serg@serg.mysql.com's avatar serg@serg.mysql.com
Browse files

get rid of ft_search. Now there're two sets of ft_ functions, ft_nlq_* and ft_boolean_*

parent 57e4c8ef
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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
}
+1 −1
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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;

@@ -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
  {
+4 −4
Original line number Diff line number Diff line
@@ -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;
+53 −11
Original line number Diff line number Diff line
@@ -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;
@@ -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