mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
fixes for ft-boolean and range optimizer
This commit is contained in:
@ -339,7 +339,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
|
|||||||
/* curdoc matched ! */
|
/* curdoc matched ! */
|
||||||
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */
|
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */
|
||||||
|
|
||||||
/* info->lastpos=curdoc; */ /* do I need this ? */
|
info->lastpos=curdoc;
|
||||||
if (!(*info->read_record)(info,curdoc,record))
|
if (!(*info->read_record)(info,curdoc,record))
|
||||||
{
|
{
|
||||||
info->update|= HA_STATE_AKTIV; /* Record is read */
|
info->update|= HA_STATE_AKTIV; /* Record is read */
|
||||||
@ -348,6 +348,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
|
|||||||
return my_errno;
|
return my_errno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ftb->state=INDEX_DONE;
|
||||||
return my_errno=HA_ERR_END_OF_FILE;
|
return my_errno=HA_ERR_END_OF_FILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,17 +360,33 @@ float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid, byte *record)
|
|||||||
FTB_EXPR *ftbe;
|
FTB_EXPR *ftbe;
|
||||||
uint i;
|
uint i;
|
||||||
|
|
||||||
if (ftb->state == READY)
|
if (ftb->state == READY || ftb->state == INDEX_DONE)
|
||||||
{
|
{
|
||||||
|
for (i=1; i<=ftb->queue.elements; i++)
|
||||||
|
{
|
||||||
|
ftbw=(FTB_WORD *)(ftb->queue.root[i]);
|
||||||
|
ftbw->docid=HA_POS_ERROR;
|
||||||
|
for (ftbe=ftbw->up; ftbe; ftbe=ftbe->up)
|
||||||
|
{
|
||||||
|
if (ftbe->docid != HA_POS_ERROR)
|
||||||
|
{
|
||||||
|
ftbe->cur_weight=ftbe->yesses=ftbe->nos=0;
|
||||||
|
ftbe->docid=HA_POS_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
queue_fix(& ftb->queue);
|
queue_fix(& ftb->queue);
|
||||||
ftb->state=SCAN;
|
ftb->state=SCAN;
|
||||||
}
|
}
|
||||||
else if (ftb->state != SCAN)
|
else if (ftb->state != SCAN)
|
||||||
return -1.0;
|
return -2.0;
|
||||||
|
|
||||||
bzero(&ptree, sizeof(ptree));
|
bzero(&ptree, sizeof(ptree));
|
||||||
if (_mi_ft_parse(& ptree, ftb->info, ftb->keynr, record))
|
if (_mi_ft_parse(& ptree, ftb->info, ftb->keynr, record))
|
||||||
return -1.0;
|
return -3.0;
|
||||||
|
|
||||||
for (i=1; i<=ftb->queue.elements; i++)
|
for (i=1; i<=ftb->queue.elements; i++)
|
||||||
{
|
{
|
||||||
|
@ -11,17 +11,40 @@ SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINS
|
|||||||
a MATCH (message) AGAINST ('steve')
|
a MATCH (message) AGAINST ('steve')
|
||||||
4 0.90587323904037
|
4 0.90587323904037
|
||||||
7 0.89568990468979
|
7 0.89568990468979
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve');
|
||||||
|
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
|
||||||
|
4 1
|
||||||
|
7 1
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
|
||||||
|
a MATCH (message) AGAINST ('steve')
|
||||||
|
4 0.90587323904037
|
||||||
|
7 0.89568990468979
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
|
||||||
|
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
|
||||||
|
4 1
|
||||||
|
7 1
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a;
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a;
|
||||||
a MATCH (message) AGAINST ('steve')
|
a MATCH (message) AGAINST ('steve')
|
||||||
4 0.90587323904037
|
4 0.90587323904037
|
||||||
7 0.89568990468979
|
7 0.89568990468979
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a;
|
||||||
|
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
|
||||||
|
4 1
|
||||||
|
7 1
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC;
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC;
|
||||||
a MATCH (message) AGAINST ('steve')
|
a MATCH (message) AGAINST ('steve')
|
||||||
7 0.89568990468979
|
7 0.89568990468979
|
||||||
4 0.90587323904037
|
4 0.90587323904037
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a DESC;
|
||||||
|
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
|
||||||
|
7 1
|
||||||
|
4 1
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1;
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1;
|
||||||
a MATCH (message) AGAINST ('steve')
|
a MATCH (message) AGAINST ('steve')
|
||||||
7 0.89568990468979
|
7 0.89568990468979
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY 1;
|
||||||
|
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
|
||||||
|
7 1
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel;
|
SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel;
|
||||||
a rel
|
a rel
|
||||||
1 0
|
1 0
|
||||||
@ -31,4 +54,13 @@ a rel
|
|||||||
6 0
|
6 0
|
||||||
7 0.89568990468979
|
7 0.89568990468979
|
||||||
4 0.90587323904037
|
4 0.90587323904037
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel;
|
||||||
|
a rel
|
||||||
|
1 0
|
||||||
|
2 0
|
||||||
|
3 0
|
||||||
|
5 0
|
||||||
|
6 0
|
||||||
|
4 1
|
||||||
|
7 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -9,17 +9,24 @@ INSERT INTO t1 (message) VALUES ("Testing"),("table"),("testbug"),
|
|||||||
("steve"),("is"),("cool"),("steve is cool");
|
("steve"),("is"),("cool"),("steve is cool");
|
||||||
# basic MATCH
|
# basic MATCH
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve');
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve');
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve');
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
|
||||||
|
|
||||||
# MATCH + ORDER BY (with ft-ranges)
|
# MATCH + ORDER BY (with ft-ranges)
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a;
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a;
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a;
|
||||||
|
|
||||||
# MATCH + ORDER BY (with normal ranges) + UNIQUE
|
# MATCH + ORDER BY (with normal ranges) + UNIQUE
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC;
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC;
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a DESC;
|
||||||
|
|
||||||
# MATCH + ORDER BY + UNIQUE (const_table)
|
# MATCH + ORDER BY + UNIQUE (const_table)
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1;
|
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1;
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY 1;
|
||||||
|
|
||||||
# ORDER BY MATCH
|
# ORDER BY MATCH
|
||||||
SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel;
|
SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel;
|
||||||
|
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel;
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -29,7 +29,7 @@ public:
|
|||||||
TABLE_REF *ref;
|
TABLE_REF *ref;
|
||||||
|
|
||||||
FT_SELECT(TABLE *table, TABLE_REF *tref) :
|
FT_SELECT(TABLE *table, TABLE_REF *tref) :
|
||||||
QUICK_SELECT (table,tref->key,1), ref(tref) {}
|
QUICK_SELECT (table,tref->key,1), ref(tref) { init(); }
|
||||||
|
|
||||||
int init() { return error=file->ft_init(); }
|
int init() { return error=file->ft_init(); }
|
||||||
int get_next() { return error=file->ft_read(record); }
|
int get_next() { return error=file->ft_read(record); }
|
||||||
|
@ -407,11 +407,6 @@ QUICK_SELECT::~QUICK_SELECT()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int QUICK_SELECT::init()
|
|
||||||
{
|
|
||||||
return error=file->index_init(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
QUICK_RANGE::QUICK_RANGE()
|
QUICK_RANGE::QUICK_RANGE()
|
||||||
:min_key(0),max_key(0),min_length(0),max_length(0),
|
:min_key(0),max_key(0),min_length(0),max_length(0),
|
||||||
flag(NO_MIN_RANGE | NO_MAX_RANGE)
|
flag(NO_MIN_RANGE | NO_MAX_RANGE)
|
||||||
|
@ -75,7 +75,7 @@ public:
|
|||||||
QUICK_SELECT(TABLE *table,uint index_arg,bool no_alloc=0);
|
QUICK_SELECT(TABLE *table,uint index_arg,bool no_alloc=0);
|
||||||
virtual ~QUICK_SELECT();
|
virtual ~QUICK_SELECT();
|
||||||
void reset(void) { next=0; it.rewind(); }
|
void reset(void) { next=0; it.rewind(); }
|
||||||
virtual int init();
|
int init() { return error=file->index_init(index); }
|
||||||
virtual int get_next();
|
virtual int get_next();
|
||||||
int cmp_next(QUICK_RANGE *range);
|
int cmp_next(QUICK_RANGE *range);
|
||||||
bool unique_key_range();
|
bool unique_key_range();
|
||||||
|
Reference in New Issue
Block a user