示例#1
0
/*
 * 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;
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
/*
 * 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;
}