From 16b9e5fa8c8dfd360252c07a63a1c3df03996232 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 13 Dec 2004 14:03:07 +0000 Subject: [PATCH] Initial skeleton on join selectivity estimator. Current estimators application for box2d && box2d operator. git-svn-id: http://svn.osgeo.org/postgis/trunk@1138 b70326c6-7e19-0410-871a-916f4a2858ee --- lwgeom/lwgeom_estimate.c | 21 ++++++++ lwgeom/lwpostgis.sql.in | 111 ++++++++++++++++++++++----------------- 2 files changed, 84 insertions(+), 48 deletions(-) diff --git a/lwgeom/lwgeom_estimate.c b/lwgeom/lwgeom_estimate.c index 25364c9d0..ab380a4de 100644 --- a/lwgeom/lwgeom_estimate.c +++ b/lwgeom/lwgeom_estimate.c @@ -86,6 +86,11 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS); */ #define DEFAULT_GEOMETRY_SEL 0.000005 +/* + * Default geometry join selectivity factor + */ +#define DEFAULT_GEOMETRY_JOINSEL 0.000005 + #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -1306,6 +1311,18 @@ Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS) } +// JOIN selectivity in the GiST && operator +PG_FUNCTION_INFO_V1(LWGEOM_gist_joinsel); +Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) +{ +#if DEBUG_GEOMETRY_STATS + elog(NOTICE, "LWGEOM_gist_joinsel called (returning %f)", + DEFAULT_GEOMETRY_JOINSEL); +#endif + PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL); +} + + /* * This function is called by the analyze function iff * the geometry_analyze() function give it its pointer @@ -2006,6 +2023,10 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS) /********************************************************************** * $Log$ + * Revision 1.15 2004/12/13 14:03:07 strk + * Initial skeleton on join selectivity estimator. + * Current estimators application for box2d && box2d operator. + * * Revision 1.14 2004/12/13 12:25:27 strk * Removed obsoleted function and fixed some warnings. * diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index 604ec5eb4..f92dfa14f 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -302,53 +302,6 @@ CREATEFUNCTION box2d_intersects(box2d, box2d) AS '@MODULE_FILENAME@', 'BOX2D_intersects' LANGUAGE 'C' WITH (isstrict,iscachable); -CREATE OPERATOR << ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_left, - COMMUTATOR = '>>', - RESTRICT = positionsel, JOIN = positionjoinsel -); - -CREATE OPERATOR &< ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_overleft, - COMMUTATOR = '&>', - RESTRICT = positionsel, JOIN = positionjoinsel -); - -CREATE OPERATOR && ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_overlap, - COMMUTATOR = '&&', - RESTRICT = areasel, JOIN = positionjoinsel -); - -CREATE OPERATOR &> ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_overright, - COMMUTATOR = '&<', - RESTRICT = positionsel, JOIN = positionjoinsel -); - -CREATE OPERATOR >> ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_right, - COMMUTATOR = '<<', - RESTRICT = positionsel, JOIN = positionjoinsel -); - -CREATE OPERATOR ~= ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_same, - COMMUTATOR = '~=', - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR @ ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_contained, - COMMUTATOR = '~', - RESTRICT = contsel, JOIN = contjoinsel -); - -CREATE OPERATOR ~ ( - LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_contain, - COMMUTATOR = '@', - RESTRICT = contsel, JOIN = contjoinsel -); CREATEFUNCTION xmin(box2d) RETURNS FLOAT4 @@ -467,6 +420,17 @@ CREATEFUNCTION postgis_gist_sel (internal, oid, internal, int4) AS '@MODULE_FILENAME@', 'LWGEOM_gist_sel' LANGUAGE 'C'; +#if USE_VERSION == 71 +CREATEFUNCTION postgis_gist_joinsel(oid, oid, int2, opaque, smallint) +#elif USE_VERSION == 72 +CREATEFUNCTION postgis_gist_joinsel(opaque, oid, opaque, smallint) +#else +CREATEFUNCTION postgis_gist_joinsel(internal, oid, internal, smallint) +#endif + RETURNS float8 + AS '@MODULE_FILENAME@', 'LWGEOM_gist_joinsel' + LANGUAGE 'C'; + CREATEFUNCTION geometry_overleft(geometry, geometry) RETURNS bool AS '@MODULE_FILENAME@', 'LWGEOM_overleft' @@ -507,6 +471,8 @@ CREATEFUNCTION geometry_same(geometry, geometry) AS '@MODULE_FILENAME@', 'LWGEOM_same' LANGUAGE 'C' WITH (isstrict,iscachable); +-- GEOMETRY operators + CREATE OPERATOR << ( LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_left, COMMUTATOR = '>>', @@ -522,7 +488,7 @@ CREATE OPERATOR &< ( CREATE OPERATOR && ( LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlap, COMMUTATOR = '&&', - RESTRICT = postgis_gist_sel, JOIN = positionjoinsel + RESTRICT = postgis_gist_sel, JOIN = postgis_gist_joinsel ); CREATE OPERATOR &> ( @@ -555,6 +521,55 @@ CREATE OPERATOR ~ ( RESTRICT = contsel, JOIN = contjoinsel ); +-- BOX2D operators + +CREATE OPERATOR << ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_left, + COMMUTATOR = '>>', + RESTRICT = positionsel, JOIN = positionjoinsel +); + +CREATE OPERATOR &< ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_overleft, + COMMUTATOR = '&>', + RESTRICT = positionsel, JOIN = positionjoinsel +); + +CREATE OPERATOR && ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_overlap, + COMMUTATOR = '&&', + RESTRICT = postgis_gist_sel, JOIN = postgis_gist_joinsel +); + +CREATE OPERATOR &> ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_overright, + COMMUTATOR = '&<', + RESTRICT = positionsel, JOIN = positionjoinsel +); + +CREATE OPERATOR >> ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_right, + COMMUTATOR = '<<', + RESTRICT = positionsel, JOIN = positionjoinsel +); + +CREATE OPERATOR ~= ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_same, + COMMUTATOR = '~=', + RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR @ ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_contained, + COMMUTATOR = '~', + RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR ~ ( + LEFTARG = box2d, RIGHTARG = box2d, PROCEDURE = box2d_contain, + COMMUTATOR = '@', + RESTRICT = contsel, JOIN = contjoinsel +); -- gist support functions -- 2.40.0