/* ** GiST support function. Called from gserialized_gist_consistent below. */ static inline bool gserialized_gist_consistent_leaf_2d(BOX2DF *key, BOX2DF *query, StrategyNumber strategy) { bool retval; POSTGIS_DEBUGF(4, "[GIST] leaf consistent, strategy [%d], count[%i]", strategy, g2d_counter_leaf++); switch (strategy) { case RTOverlapStrategyNumber: retval = (bool) box2df_overlaps(key, query); break; case RTSameStrategyNumber: retval = (bool) box2df_equals(key, query); break; case RTContainsStrategyNumber: case RTOldContainsStrategyNumber: retval = (bool) box2df_contains(key, query); break; case RTContainedByStrategyNumber: case RTOldContainedByStrategyNumber: retval = (bool) box2df_contains(query, key); break; default: retval = FALSE; } return (retval); }
Datum spgist_geom_leaf_consistent(PG_FUNCTION_ARGS) { spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0); spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1); bool res; int i; BOX2DF datum; BOX2DF *datum_p = &datum; gserialized_datum_get_box2df_p(in->leafDatum, datum_p); /* all tests are exact */ out->recheck = false; /* leafDatum is what it is... */ out->leafValue = in->leafDatum; /* Perform the required comparison(s) */ res = true; for (i = 0; i < in->nkeys; i++) { BOX2DF query; BOX2DF *query_p = &query; gserialized_datum_get_box2df_p(in->scankeys[i].sk_argument, query_p); switch (in->scankeys[i].sk_strategy) { case RTLeftStrategyNumber: res = (bool) box2df_left(datum_p, query_p); break; case RTRightStrategyNumber: res = (bool) box2df_right(datum_p, query_p); break; case RTSameStrategyNumber: res = (bool) box2df_equals(datum_p, query_p); break; case RTBelowStrategyNumber: res = (bool) box2df_below(datum_p, query_p); break; case RTAboveStrategyNumber: res = (bool) box2df_above(datum_p, query_p); break; case RTContainedByStrategyNumber: res = (bool) box2df_contains(query_p, datum_p); break; default: elog(ERROR, "unrecognized strategy number: %d", in->scankeys[i].sk_strategy); break; } if (!res) break; } PG_RETURN_BOOL(res); }
static inline bool gserialized_gist_consistent_leaf_2d(BOX2DF *key, BOX2DF *query, StrategyNumber strategy) { bool retval; switch (strategy) { /* Basic overlaps */ case RTOverlapStrategyNumber: retval = (bool) box2df_overlaps(key, query); break; case RTSameStrategyNumber: retval = (bool) box2df_equals(key, query); break; case RTContainsStrategyNumber: case RTOldContainsStrategyNumber: retval = (bool) box2df_contains(key, query); break; case RTContainedByStrategyNumber: case RTOldContainedByStrategyNumber: retval = (bool) box2df_contains(query, key); break; /* To one side */ case RTAboveStrategyNumber: retval = (bool) box2df_above(key, query); break; case RTBelowStrategyNumber: retval = (bool) box2df_below(key, query); break; case RTRightStrategyNumber: retval = (bool) box2df_right(key, query); break; case RTLeftStrategyNumber: retval = (bool) box2df_left(key, query); break; /* Overlapping to one side */ case RTOverAboveStrategyNumber: retval = (bool) box2df_overabove(key, query); break; case RTOverBelowStrategyNumber: retval = (bool) box2df_overbelow(key, query); break; case RTOverRightStrategyNumber: retval = (bool) box2df_overright(key, query); break; case RTOverLeftStrategyNumber: retval = (bool) box2df_overleft(key, query); break; default: retval = FALSE; } return (retval); }
Datum gserialized_gist_same_2d(PG_FUNCTION_ARGS) { BOX2DF *b1 = (BOX2DF*)PG_GETARG_POINTER(0); BOX2DF *b2 = (BOX2DF*)PG_GETARG_POINTER(1); bool *result = (bool*)PG_GETARG_POINTER(2); POSTGIS_DEBUG(4, "[GIST] 'same' function called"); *result = box2df_equals(b1, b2); PG_RETURN_POINTER(result); }