Below is the list of changes that have just been committed into a local
5.0-fulltext repository of svoj. When svoj does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2032 05/11/09 20:43:27 svoj@stripped +5 -0
WL#2575 - Fulltext: Parser plugin for FTS
Call init/deinit parser function if specified.
myisam/ftdefs.h
1.34 05/11/09 20:43:16 svoj@stripped +4 -2
ft_parse and _mi_ft_parse accept MYSQL_FTPARSER_PARAM as an argument now.
myisam/ft_update.c
1.40 05/11/09 20:43:16 svoj@stripped +16 -4
Call init/deinit parser function in document mode.
myisam/ft_parser.c
1.54 05/11/09 20:43:16 svoj@stripped +10 -11
ft_parse accepts MYSQL_FTPARSER_PARAM as an argument now.
myisam/ft_nlq_search.c
1.40 05/11/09 20:43:16 svoj@stripped +9 -2
Call init/deinit parser function in NL mode.
myisam/ft_boolean_search.c
1.96 05/11/09 20:43:16 svoj@stripped +38 -36
Call init/deinit parser function in boolean mode.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: svoj
# Host: svoj-laptop.mysql.com
# Root: /home/svoj/devel/mysql/CNET/mysql-5.0
--- 1.53/myisam/ft_parser.c 2005-10-27 23:33:39 +05:00
+++ 1.54/myisam/ft_parser.c 2005-11-09 20:43:16 +04:00
@@ -280,22 +280,21 @@
int ft_parse(TREE *wtree, byte *doc, int doclen, my_bool with_alloc,
- struct st_mysql_ftparser *parser)
+ struct st_mysql_ftparser *parser,
+ MYSQL_FTPARSER_PARAM *param)
{
- MYSQL_FTPARSER_PARAM param;
MY_FT_PARSER_PARAM my_param;
DBUG_ENTER("ft_parse");
DBUG_ASSERT(parser);
my_param.wtree= wtree;
my_param.with_alloc= with_alloc;
- param.mysql_parse= ft_parse_internal;
- param.mysql_add_word= ft_add_word;
- param.ftparser_state= 0;
- param.mysql_ftparam= &my_param;
- param.cs= wtree->custom_arg;
- param.doc= doc;
- param.length= doclen;
- param.mode= MYSQL_FTPARSER_SIMPLE_MODE;
- DBUG_RETURN(parser->parse(¶m));
+ param->mysql_parse= ft_parse_internal;
+ param->mysql_add_word= ft_add_word;
+ param->mysql_ftparam= &my_param;
+ param->cs= wtree->custom_arg;
+ param->doc= doc;
+ param->length= doclen;
+ param->mode= MYSQL_FTPARSER_SIMPLE_MODE;
+ DBUG_RETURN(parser->parse(param));
}
--- 1.39/myisam/ft_update.c 2005-09-01 22:22:47 +05:00
+++ 1.40/myisam/ft_update.c 2005-11-09 20:43:16 +04:00
@@ -96,7 +96,8 @@
/* parses a document i.e. calls ft_parse for every keyseg */
uint _mi_ft_parse(TREE *parsed, MI_INFO *info, uint keynr,
- const byte *record, my_bool with_alloc)
+ const byte *record, my_bool with_alloc,
+ MYSQL_FTPARSER_PARAM *param)
{
FT_SEG_ITERATOR ftsi;
struct st_mysql_ftparser *parser;
@@ -109,7 +110,8 @@
while (_mi_ft_segiterator(&ftsi))
{
if (ftsi.pos)
- if (ft_parse(parsed, (byte *)ftsi.pos, ftsi.len, with_alloc, parser))
+ if (ft_parse(parsed, (byte *)ftsi.pos, ftsi.len, with_alloc, parser,
+ param))
DBUG_RETURN(1);
}
DBUG_RETURN(0);
@@ -118,12 +120,22 @@
FT_WORD * _mi_ft_parserecord(MI_INFO *info, uint keynr, const byte *record)
{
TREE ptree;
+ MYSQL_FTPARSER_PARAM ftparser_param;
+ struct st_mysql_ftparser *parser;
DBUG_ENTER("_mi_ft_parserecord");
bzero((char*) &ptree, sizeof(ptree));
- if (_mi_ft_parse(&ptree, info, keynr, record,0))
+ parser= info->s->keyinfo[keynr].parser;
+ if (parser->init && parser->init(&ftparser_param))
DBUG_RETURN(NULL);
-
+ if (_mi_ft_parse(&ptree, info, keynr, record, 0, &ftparser_param))
+ {
+ if (parser->deinit)
+ parser->deinit(&ftparser_param);
+ DBUG_RETURN(NULL);
+ }
+ if (parser->deinit)
+ parser->deinit(&ftparser_param);
DBUG_RETURN(ft_linearize(&ptree));
}
--- 1.33/myisam/ftdefs.h 2005-09-12 16:41:46 +05:00
+++ 1.34/myisam/ftdefs.h 2005-11-09 20:43:16 +04:00
@@ -119,10 +119,12 @@
uint _mi_ft_segiterator(FT_SEG_ITERATOR *);
void ft_parse_init(TREE *, CHARSET_INFO *);
-int ft_parse(TREE *, byte *, int, my_bool, struct st_mysql_ftparser *parser);
+int ft_parse(TREE *, byte *, int, my_bool, struct st_mysql_ftparser *parser,
+ MYSQL_FTPARSER_PARAM *param);
FT_WORD * ft_linearize(TREE *);
FT_WORD * _mi_ft_parserecord(MI_INFO *, uint, const byte *);
-uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool);
+uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool,
+ MYSQL_FTPARSER_PARAM *param);
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, uint, byte *);
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, CHARSET_INFO *);
--- 1.95/myisam/ft_boolean_search.c 2005-10-27 23:33:38 +05:00
+++ 1.96/myisam/ft_boolean_search.c 2005-11-09 20:43:16 +04:00
@@ -98,6 +98,7 @@
CHARSET_INFO *charset;
FTB_EXPR *root;
FTB_WORD **list;
+ MYSQL_FTPARSER_PARAM ftparser_param;
MEM_ROOT mem_root;
QUEUE queue;
TREE no_dupes;
@@ -257,7 +258,6 @@
static void _ftb_parse_query(FTB *ftb, byte *query, uint len,
struct st_mysql_ftparser *parser)
{
- MYSQL_FTPARSER_PARAM param;
MY_FTB_PARAM ftb_param;
DBUG_ENTER("_ftb_parse_query");
DBUG_ASSERT(parser);
@@ -270,15 +270,14 @@
ftb_param.ftbe= ftb->root;
ftb_param.up_quot= 0;
- param.mysql_parse= ftb_parse_query_internal;
- param.mysql_add_word= ftb_query_add_word;
- param.ftparser_state= 0;
- param.mysql_ftparam= (void *)&ftb_param;
- param.cs= ftb->charset;
- param.doc= query;
- param.length= len;
- param.mode= MYSQL_FTPARSER_FULL_BOOLEAN_INFO;
- parser->parse(¶m);
+ ftb->ftparser_param.mysql_parse= ftb_parse_query_internal;
+ ftb->ftparser_param.mysql_add_word= ftb_query_add_word;
+ ftb->ftparser_param.mysql_ftparam= (void *)&ftb_param;
+ ftb->ftparser_param.cs= ftb->charset;
+ ftb->ftparser_param.doc= query;
+ ftb->ftparser_param.length= len;
+ ftb->ftparser_param.mode= MYSQL_FTPARSER_FULL_BOOLEAN_INFO;
+ parser->parse(&ftb->ftparser_param);
DBUG_VOID_RETURN;
}
@@ -468,6 +467,9 @@
FTB *ftb;
FTB_EXPR *ftbe;
uint res;
+ struct st_mysql_ftparser *parser= keynr == NO_SUCH_KEY ?
+ &ft_default_parser :
+ info->s->keyinfo[keynr].parser;
if (!(ftb=(FTB *)my_malloc(sizeof(FTB), MYF(MY_WME))))
return 0;
@@ -504,9 +506,9 @@
ftbe->phrase= NULL;
ftbe->document= 0;
ftb->root=ftbe;
- _ftb_parse_query(ftb, query, query_len, keynr == NO_SUCH_KEY ?
- &ft_default_parser :
- info->s->keyinfo[keynr].parser);
+ if (parser->init && parser->init(&ftb->ftparser_param))
+ goto err;
+ _ftb_parse_query(ftb, query, query_len, parser);
ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root,
sizeof(FTB_WORD *)*ftb->queue.elements);
memcpy(ftb->list, ftb->queue.root+1, sizeof(FTB_WORD *)*ftb->queue.elements);
@@ -592,12 +594,11 @@
1 is returned if phrase found, 0 else.
*/
-static int _ftb_check_phrase(const byte *document, uint len,
+static int _ftb_check_phrase(FTB *ftb, const byte *document, uint len,
FTB_EXPR *ftbe, CHARSET_INFO *cs,
struct st_mysql_ftparser *parser)
{
MY_FTB_PHRASE_PARAM ftb_param;
- MYSQL_FTPARSER_PARAM param;
DBUG_ENTER("_ftb_check_phrase");
DBUG_ASSERT(parser);
ftb_param.phrase= ftbe->phrase;
@@ -607,15 +608,14 @@
ftb_param.document_length= 1;
ftb_param.match= 0;
- param.mysql_parse= ftb_check_phrase_internal;
- param.mysql_add_word= ftb_phrase_add_word;
- param.ftparser_state= 0;
- param.mysql_ftparam= (void *)&ftb_param;
- param.cs= cs;
- param.doc= (byte *)document;
- param.length= len;
- param.mode= MYSQL_FTPARSER_WITH_STOPWORDS;
- parser->parse(¶m);
+ ftb->ftparser_param.mysql_parse= ftb_check_phrase_internal;
+ ftb->ftparser_param.mysql_add_word= ftb_phrase_add_word;
+ ftb->ftparser_param.mysql_ftparam= (void *)&ftb_param;
+ ftb->ftparser_param.cs= cs;
+ ftb->ftparser_param.doc= (byte *)document;
+ ftb->ftparser_param.length= len;
+ ftb->ftparser_param.mode= MYSQL_FTPARSER_WITH_STOPWORDS;
+ parser->parse(&ftb->ftparser_param);
DBUG_RETURN(ftb_param.match ? 1 : 0);
}
@@ -659,7 +659,7 @@
{
if (!ftsi.pos)
continue;
- not_found = ! _ftb_check_phrase(ftsi.pos, ftsi.len,
+ not_found = ! _ftb_check_phrase(ftb, ftsi.pos, ftsi.len,
ftbe, ftb->charset, parser);
}
if (not_found) break;
@@ -824,7 +824,6 @@
FT_SEG_ITERATOR ftsi, ftsi2;
my_off_t docid=ftb->info->lastpos;
MY_FTB_FIND_PARAM ftb_param;
- MYSQL_FTPARSER_PARAM param;
struct st_mysql_ftparser *parser= ftb->keynr == NO_SUCH_KEY ?
&ft_default_parser :
ftb->info->s->keyinfo[ftb->keynr].parser;
@@ -857,20 +856,18 @@
ftb_param.ftb= ftb;
ftb_param.ftsi= &ftsi2;
- param.mysql_parse= ftb_find_relevance_parse;
- param.mysql_add_word= ftb_find_relevance_add_word;
- param.ftparser_state= 0;
- param.mysql_ftparam= (void *)&ftb_param;
- param.cs= ftb->charset;
- param.mode= MYSQL_FTPARSER_SIMPLE_MODE;
while (_mi_ft_segiterator(&ftsi))
{
if (!ftsi.pos)
continue;
-
- param.doc= (byte *)ftsi.pos;
- param.length= ftsi.len;
- parser->parse(¶m);
+ ftb->ftparser_param.mysql_parse= ftb_find_relevance_parse;
+ ftb->ftparser_param.mysql_add_word= ftb_find_relevance_add_word;
+ ftb->ftparser_param.mysql_ftparam= (void *)&ftb_param;
+ ftb->ftparser_param.cs= ftb->charset;
+ ftb->ftparser_param.mode= MYSQL_FTPARSER_SIMPLE_MODE;
+ ftb->ftparser_param.doc= (byte *)ftsi.pos;
+ ftb->ftparser_param.length= ftsi.len;
+ parser->parse(&ftb->ftparser_param);
}
ftbe=ftb->root;
if (ftbe->docid[1]==docid && ftbe->cur_weight>0 &&
@@ -887,6 +884,11 @@
void ft_boolean_close_search(FT_INFO *ftb)
{
+ struct st_mysql_ftparser *parser= ftb->keynr == NO_SUCH_KEY ?
+ &ft_default_parser :
+ ftb->info->s->keyinfo[ftb->keynr].parser;
+ if (parser->deinit)
+ parser->deinit(&ftb->ftparser_param);
if (is_tree_inited(& ftb->no_dupes))
{
delete_tree(& ftb->no_dupes);
--- 1.39/myisam/ft_nlq_search.c 2005-08-31 02:53:10 +05:00
+++ 1.40/myisam/ft_nlq_search.c 2005-11-09 20:43:16 +04:00
@@ -210,6 +210,8 @@
FT_DOC *dptr;
FT_INFO *dlist=NULL;
my_off_t saved_lastpos=info->lastpos;
+ struct st_mysql_ftparser *parser;
+ MYSQL_FTPARSER_PARAM ftparser_param;
DBUG_ENTER("ft_init_nlq_search");
/* black magic ON */
@@ -223,6 +225,9 @@
aio.keynr=keynr;
aio.charset=info->s->keyinfo[keynr].seg->charset;
aio.keybuff=info->lastkey+info->s->base.max_key_length;
+ parser= info->s->keyinfo[keynr].parser;
+ if (parser->init && parser->init(&ftparser_param))
+ goto err;
bzero(&wtree,sizeof(wtree));
@@ -230,7 +235,7 @@
NULL, NULL);
ft_parse_init(&wtree, aio.charset);
- if (ft_parse(&wtree, query, query_len, 0, info->s->keyinfo[keynr].parser))
+ if (ft_parse(&wtree, query, query_len, 0, parser, &ftparser_param))
goto err;
if (tree_walk(&wtree, (tree_walk_action)&walk_and_match, &aio,
@@ -250,7 +255,7 @@
if (!(*info->read_record)(info,docid,record))
{
info->update|= HA_STATE_AKTIV;
- _mi_ft_parse(&wtree, info, keynr, record,1);
+ _mi_ft_parse(&wtree, info, keynr, record, 1, &ftparser_param);
}
}
delete_queue(&best);
@@ -284,6 +289,8 @@
qsort2(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort2_cmp)&FT_DOC_cmp, 0);
err:
+ if (parser->deinit)
+ parser->deinit(&ftparser_param);
delete_tree(&aio.dtree);
delete_tree(&wtree);
info->lastpos=saved_lastpos;
| Thread |
|---|
| • bk commit into 5.0-fulltext tree (svoj:1.2032) | svoj | 9 Nov |