*/
#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))
}
+// 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
/**********************************************************************
* $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.
*
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
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'
AS '@MODULE_FILENAME@', 'LWGEOM_same'
LANGUAGE 'C' WITH (isstrict,iscachable);
+-- GEOMETRY operators
+
CREATE OPERATOR << (
LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_left,
COMMUTATOR = '>>',
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 &> (
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