/* * Clean query tree from values which is always in * text (stopword) */ static NODE * clean_fakeval_intree(NODE *node, char *result) { char lresult = V_UNKNOWN, rresult = V_UNKNOWN; /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (node->valnode->type == QI_VAL) return node; else if (node->valnode->type == QI_VALSTOP) { pfree(node); *result = V_STOP; return NULL; } Assert(node->valnode->type == QI_OPR); if (node->valnode->qoperator.oper == OP_NOT) { node->right = clean_fakeval_intree(node->right, &rresult); if (!node->right) { *result = V_STOP; freetree(node); return NULL; } } else { NODE *res = node; node->left = clean_fakeval_intree(node->left, &lresult); node->right = clean_fakeval_intree(node->right, &rresult); if (lresult == V_STOP && rresult == V_STOP) { freetree(node); *result = V_STOP; return NULL; } else if (lresult == V_STOP) { res = node->right; pfree(node); } else if (rresult == V_STOP) { res = node->left; pfree(node); } return res; } return node; }
ITEM * clean_fakeval(ITEM * ptr, int4 *len) { NODE *root = maketree(ptr); char result = V_UNKNOWN; NODE *resroot; resroot = clean_fakeval_intree(root, &result); if (result != V_UNKNOWN) { elog(NOTICE, "query contains only stopword(s) or doesn't contain lexeme(s), ignored"); *len = 0; return NULL; } return plaintree(resroot, len); }
QueryItem * clean_fakeval(QueryItem *ptr, int *len) { NODE *root = maketree(ptr); char result = V_UNKNOWN; NODE *resroot; resroot = clean_fakeval_intree(root, &result); if (result != V_UNKNOWN) { ereport(NOTICE, (errmsg("text-search query contains only stop words or doesn't contain lexemes, ignored"))); *len = 0; return NULL; } return plaintree(resroot, len); }
/* * Clean query tree from values which is always in * text (stopword) */ static NODE * clean_fakeval_intree(NODE * node, char *result) { char lresult = V_UNKNOWN, rresult = V_UNKNOWN; if (node->valnode->type == VAL) return node; else if (node->valnode->type == VALTRUE) { pfree(node); *result = V_TRUE; return NULL; } if (node->valnode->val == (int4) '!') { node->right = clean_fakeval_intree(node->right, &rresult); if (!node->right) { *result = (rresult == V_TRUE) ? V_FALSE : V_TRUE; freetree(node); 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 { NODE *res = node; node->left = clean_fakeval_intree(node->left, &lresult); node->right = clean_fakeval_intree(node->right, &rresult); if (lresult == V_FALSE || rresult == V_FALSE) { freetree(node); *result = V_FALSE; return NULL; } else if (lresult == V_TRUE && rresult == V_TRUE) { freetree(node); *result = V_TRUE; return NULL; } else if (lresult == V_TRUE) { res = node->right; pfree(node); } else if (rresult == V_TRUE) { res = node->left; pfree(node); } return res; } return node; }