コード例 #1
0
ファイル: btree_utils_var.c プロジェクト: GisKook/Gis
/*
 * The GiST consistent method
 */
bool
gbt_var_consistent(GBT_VARKEY_R *key,
				   const void *query,
				   StrategyNumber strategy,
				   Oid collation,
				   bool is_leaf,
				   const gbtree_vinfo *tinfo)
{
	bool		retval = FALSE;

	switch (strategy)
	{
		case BTLessEqualStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_ge) (query, key->lower, collation);
			else
				retval = (*tinfo->f_cmp) (query, key->lower, collation) >= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTLessStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_gt) (query, key->lower, collation);
			else
				retval = (*tinfo->f_cmp) (query, key->lower, collation) >= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTEqualStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_eq) (query, key->lower, collation);
			else
				retval =
					((*tinfo->f_cmp) (key->lower, query, collation) <= 0 &&
					 (*tinfo->f_cmp) (query, key->upper, collation) <= 0) ||
					gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTGreaterStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_lt) (query, key->upper, collation);
			else
				retval = (*tinfo->f_cmp) (query, key->upper, collation) <= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTGreaterEqualStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_le) (query, key->upper, collation);
			else
				retval = (*tinfo->f_cmp) (query, key->upper, collation) <= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BtreeGistNotEqualStrategyNumber:
			retval = !((*tinfo->f_eq) (query, key->lower, collation) &&
					   (*tinfo->f_eq) (query, key->upper, collation));
			break;
		default:
			retval = FALSE;
	}

	return retval;
}
コード例 #2
0
ファイル: btree_utils_var.c プロジェクト: cbbrowne/postgres
/*
 * The GiST consistent method
 */
bool
gbt_var_consistent(
				   GBT_VARKEY_R *key,
				   const void *query,
				   const StrategyNumber *strategy,
				   bool is_leaf,
				   const gbtree_vinfo *tinfo
)
{
	bool		retval = FALSE;

	switch (*strategy)
	{
		case BTLessEqualStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_ge) (query, (void *) key->lower);
			else
				retval = (*tinfo->f_cmp) ((bytea *) query, key->lower) >= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTLessStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_gt) (query, (void *) key->lower);
			else
				retval = (*tinfo->f_cmp) ((bytea *) query, key->lower) >= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTEqualStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_eq) (query, (void *) key->lower);
			else
				retval = (
						  (
						(*tinfo->f_cmp) (key->lower, (bytea *) query) <= 0 &&
				  (*tinfo->f_cmp) ((bytea *) query, (void *) key->upper) <= 0
						   ) || gbt_var_node_pf_match(key, query, tinfo)
					);
			break;
		case BTGreaterStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_lt) (query, (void *) key->upper);
			else
				retval = (*tinfo->f_cmp) ((bytea *) query, key->upper) <= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BTGreaterEqualStrategyNumber:
			if (is_leaf)
				retval = (*tinfo->f_le) (query, (void *) key->upper);
			else
				retval = (*tinfo->f_cmp) ((bytea *) query, key->upper) <= 0
					|| gbt_var_node_pf_match(key, query, tinfo);
			break;
		case BtreeGistNotEqualStrategyNumber:
			retval = ! ((*tinfo->f_eq) (query, key->lower) && (*tinfo->f_eq) (query, key->upper));
			break;
		default:
			retval = FALSE;
	}

	return (retval);
}