Commit 61366a95 authored by Teodor Sigaev's avatar Teodor Sigaev

More accuracy works with stopwords in queries

parent d1031cde
...@@ -569,6 +569,30 @@ select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC '); ...@@ -569,6 +569,30 @@ select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC ');
'wether':CD & 'sky':BC 'wether':CD & 'sky':BC
(1 row) (1 row)
select to_tsquery('asd&(and|fghj)');
to_tsquery
----------------
'asd' & 'fghj'
(1 row)
select to_tsquery('(asd&and)|fghj');
to_tsquery
----------------
'asd' | 'fghj'
(1 row)
select to_tsquery('(asd&!and)|fghj');
to_tsquery
----------------
'asd' | 'fghj'
(1 row)
select to_tsquery('(the|and&(i&1))&fghj');
to_tsquery
--------------
'1' & 'fghj'
(1 row)
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca'; select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca';
?column? ?column?
---------- ----------
......
...@@ -52,15 +52,6 @@ Datum to_tsquery_name(PG_FUNCTION_ARGS); ...@@ -52,15 +52,6 @@ Datum to_tsquery_name(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(to_tsquery_current); PG_FUNCTION_INFO_V1(to_tsquery_current);
Datum to_tsquery_current(PG_FUNCTION_ARGS); Datum to_tsquery_current(PG_FUNCTION_ARGS);
#define END 0
#define ERR 1
#define VAL 2
#define OPR 3
#define OPEN 4
#define CLOSE 5
#define VALTRUE 6 /* for stop words */
#define VALFALSE 7
/* parser's states */ /* parser's states */
#define WAITOPERAND 1 #define WAITOPERAND 1
#define WAITOPERATOR 2 #define WAITOPERATOR 2
...@@ -293,7 +284,7 @@ pushval_morph(QPRS_STATE * state, int typeval, char *strval, int lenval, int2 we ...@@ -293,7 +284,7 @@ pushval_morph(QPRS_STATE * state, int typeval, char *strval, int lenval, int2 we
/* XXX */ /* XXX */
if (prs.curwords == 0) if (prs.curwords == 0)
pushval_asis(state, VALTRUE, 0, 0, 0); pushval_asis(state, VALSTOP, 0, 0, 0);
} }
#define STACKDEPTH 32 #define STACKDEPTH 32
...@@ -526,7 +517,7 @@ findoprnd(ITEM * ptr, int4 *pos) ...@@ -526,7 +517,7 @@ findoprnd(ITEM * ptr, int4 *pos)
elog(DEBUG3, (ptr[*pos].type == OPR) ? elog(DEBUG3, (ptr[*pos].type == OPR) ?
"%d %c" : "%d %d", *pos, ptr[*pos].val); "%d %c" : "%d %d", *pos, ptr[*pos].val);
#endif #endif
if (ptr[*pos].type == VAL || ptr[*pos].type == VALTRUE) if (ptr[*pos].type == VAL || ptr[*pos].type == VALSTOP)
{ {
ptr[*pos].left = 0; ptr[*pos].left = 0;
(*pos)++; (*pos)++;
......
...@@ -46,8 +46,7 @@ typedef struct ...@@ -46,8 +46,7 @@ typedef struct
#define OPR 3 #define OPR 3
#define OPEN 4 #define OPEN 4
#define CLOSE 5 #define CLOSE 5
#define VALTRUE 6 /* for stop words */ #define VALSTOP 6 /* for stop words */
#define VALFALSE 7
bool TS_execute(ITEM * curitem, void *checkval, bool TS_execute(ITEM * curitem, void *checkval,
bool calcnot, bool (*chkcond) (void *checkval, ITEM * val)); bool calcnot, bool (*chkcond) (void *checkval, ITEM * val));
......
...@@ -177,6 +177,7 @@ clean_NOT_v2(ITEM * ptr, int4 *len) ...@@ -177,6 +177,7 @@ clean_NOT_v2(ITEM * ptr, int4 *len)
#define V_UNKNOWN 0 #define V_UNKNOWN 0
#define V_TRUE 1 #define V_TRUE 1
#define V_FALSE 2 #define V_FALSE 2
#define V_STOP 3
/* /*
* Clean query tree from values which is always in * Clean query tree from values which is always in
...@@ -190,10 +191,10 @@ clean_fakeval_intree(NODE * node, char *result) ...@@ -190,10 +191,10 @@ clean_fakeval_intree(NODE * node, char *result)
if (node->valnode->type == VAL) if (node->valnode->type == VAL)
return node; return node;
else if (node->valnode->type == VALTRUE) else if (node->valnode->type == VALSTOP)
{ {
pfree(node); pfree(node);
*result = V_TRUE; *result = V_STOP;
return NULL; return NULL;
} }
...@@ -203,65 +204,29 @@ clean_fakeval_intree(NODE * node, char *result) ...@@ -203,65 +204,29 @@ clean_fakeval_intree(NODE * node, char *result)
node->right = clean_fakeval_intree(node->right, &rresult); node->right = clean_fakeval_intree(node->right, &rresult);
if (!node->right) if (!node->right)
{ {
*result = (rresult == V_TRUE) ? V_FALSE : V_TRUE; *result = V_STOP;
freetree(node); freetree(node);
return NULL; return NULL;
} }
} }
else if (node->valnode->val == (int4) '|')
{
NODE *res = node;
node->left = clean_fakeval_intree(node->left, &lresult);
node->right = clean_fakeval_intree(node->right, &rresult);
if (lresult == V_TRUE || rresult == V_TRUE)
{
freetree(node);
*result = V_TRUE;
return NULL;
}
else if (lresult == V_FALSE && rresult == V_FALSE)
{
freetree(node);
*result = V_FALSE;
return NULL;
}
else if (lresult == V_FALSE)
{
res = node->right;
pfree(node);
}
else if (rresult == V_FALSE)
{
res = node->left;
pfree(node);
}
return res;
}
else else
{ {
NODE *res = node; NODE *res = node;
node->left = clean_fakeval_intree(node->left, &lresult); node->left = clean_fakeval_intree(node->left, &lresult);
node->right = clean_fakeval_intree(node->right, &rresult); node->right = clean_fakeval_intree(node->right, &rresult);
if (lresult == V_FALSE || rresult == V_FALSE) if (lresult == V_STOP && rresult == V_STOP)
{
freetree(node);
*result = V_FALSE;
return NULL;
}
else if (lresult == V_TRUE && rresult == V_TRUE)
{ {
freetree(node); freetree(node);
*result = V_TRUE; *result = V_STOP;
return NULL; return NULL;
} }
else if (lresult == V_TRUE) else if (lresult == V_STOP)
{ {
res = node->right; res = node->right;
pfree(node); pfree(node);
} }
else if (rresult == V_TRUE) else if (rresult == V_STOP)
{ {
res = node->left; res = node->left;
pfree(node); pfree(node);
......
...@@ -87,6 +87,10 @@ SELECT length(to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://ae ...@@ -87,6 +87,10 @@ SELECT length(to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://ae
select to_tsquery('default', 'qwe & sKies '); select to_tsquery('default', 'qwe & sKies ');
select to_tsquery('simple', 'qwe & sKies '); select to_tsquery('simple', 'qwe & sKies ');
select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC '); select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC ');
select to_tsquery('asd&(and|fghj)');
select to_tsquery('(asd&and)|fghj');
select to_tsquery('(asd&!and)|fghj');
select to_tsquery('(the|and&(i&1))&fghj');
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca'; select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca';
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:B'; select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:B';
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:A'; select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:A';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment