Commit 2006b4c5 authored by serg@infomag.ape.relarn.ru's avatar serg@infomag.ape.relarn.ru
Browse files

Many MATCH'es per query now allowed (i.e. AND's and OR's now work, but

slow - full table scan); ORDER BY now works with MATCH (slow, full table
scan)
parent 8b865368
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -43,8 +43,9 @@ typedef struct st_ft_doclist {
int ft_init_stopwords(const char **);

FT_DOCLIST * ft_init_search(void *, uint, byte *, uint, my_bool);
double ft_read_next(FT_DOCLIST *, char *);
int          ft_read_next(FT_DOCLIST *, char *);
#define      ft_close_search(handler)    my_free(((gptr)(handler)),MYF(0))
#define      ft_get_relevance(handler)   ((handler)->doc[(handler)->curdoc].weight)

#ifdef  __cplusplus
}
+7 −6
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ int main(int argc,char *argv[])
  if (!silent)
    printf("- Reading rows with key\n");
  for(i=1;create_record(record,qf);i++) {
    FT_DOCLIST *result; double w; int t;
    FT_DOCLIST *result; double w; int t,err;

    result=ft_init_search(file,0,blob_record,(uint) strlen(blob_record),1);
    if(!result) {
@@ -91,11 +91,12 @@ int main(int argc,char *argv[])
    }
    if (!silent)
      printf("Query %d. Found: %d.\n",i,result->ndocs);
    for(j=0;(w=ft_read_next(result, read_record))>0;j++) {
    for(j=0;(err=ft_read_next(result, read_record))==0;j++) {
      t=uint2korr(read_record);
      w=ft_get_relevance(result);
      printf("%d %.*s %f\n",i,t,read_record+2,w);
    }
    if(w<0) {
    if(err != HA_ERR_KEY_NOT_FOUND) {
      printf("ft_read_next %d failed with errno %3d\n",j,my_errno);
      goto err;
    }
+9 −9
Original line number Diff line number Diff line
@@ -187,7 +187,7 @@ FT_DOCLIST * ft_init_search(void *info, uint keynr, byte *key,
    goto err;

  dlist->ndocs=aio.dtree.elements_in_tree;
  dlist->curdoc=0;
  dlist->curdoc=-1;
  dlist->info=aio.info;
  dptr=dlist->doc;

@@ -205,19 +205,19 @@ FT_DOCLIST * ft_init_search(void *info, uint keynr, byte *key,
  return dlist;
}

double ft_read_next(FT_DOCLIST *handler, char *record)
int ft_read_next(FT_DOCLIST *handler, char *record)
{
  MI_INFO *info=handler->info;

  if (handler->curdoc >= handler->ndocs)
    return 0;
  if (++handler->curdoc >= handler->ndocs)
    return HA_ERR_END_OF_FILE;

  info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);

  if (!(*info->read_record)(info,handler->doc[handler->curdoc].dpos,record))
  {
    info->update|= HA_STATE_AKTIV;		/* Record is read */
    return handler->doc[handler->curdoc++].weight;
    return 0;
  }
  return -my_errno;
  return my_errno;
}
+10 −9
Original line number Diff line number Diff line
@@ -145,15 +145,16 @@ static int run_test(const char *filename)
    }
    printf("Query %d: `%s'. Found: %d. Top five documents:\n",
	    i,query[i],result->ndocs);
    for(j=0;j<5;j++) { double w;
	w=ft_read_next(result, read_record);
	if(w<0) {
	    printf("ft_read_next %d failed with errno %3d\n",j,my_errno);
	    break;
	} else if (w==0) {
    for(j=0;j<5;j++) { double w; int err;
	err=ft_read_next(result, read_record);
	if(err==HA_ERR_KEY_NOT_FOUND) {
	    printf("No more matches!\n");
	    break;
	} else if (err) {
	    printf("ft_read_next %d failed with errno %3d\n",j,my_errno);
	    break;
	}
        w=ft_get_relevance(result);
	if(key_field == FIELD_VARCHAR) {
	    uint l;
	    char *p;
+27 −29
Original line number Diff line number Diff line
@@ -904,15 +904,13 @@ int ha_myisam::ft_read(byte * buf)
{
  int error;

  if (!ft_handler)
    return -1;

  thread_safe_increment(ha_read_next_count,&LOCK_status); // why ?
  if (ft_handler)
    ft_relevance=ft_read_next((FT_DOCLIST *) ft_handler,(char*) buf);
  else
    ft_relevance=0;

  error=((ft_relevance == 0) ? HA_ERR_END_OF_FILE :
	 (ft_relevance >  0) ? 0 :
	 (int) -ft_relevance);
  error=ft_read_next((FT_DOCLIST *) ft_handler,(char*) buf);

  table->status=error ? STATUS_NOT_FOUND: 0;
  return error;
}
Loading