]> granicus.if.org Git - postgis/commitdiff
Crib index penalty tweak from pgsphere.
authorPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 14 Sep 2009 18:33:54 +0000 (18:33 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 14 Sep 2009 18:33:54 +0000 (18:33 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4497 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
postgis/geography_gist.c

index 86230b99fe7033e0840d087b9dc2e0a86880c217..b16609ab9f324fe6e262e569be61cad50c57be5c 100644 (file)
 #define INTEGRITY_CHECKS 1
 
 /*
- * Floating point comparitors.
- */
+** Floating point comparitors.
+*/
 #define FP_TOLERANCE 1e-12
+#define FP_ZERO(A) (fabs(A) <= FP_TOLERANCE)
 #define FP_MAX(A, B) (((A) > (B)) ? (A) : (B))
 #define FP_MIN(A, B) (((A) < (B)) ? (A) : (B))
-#define FP_EQUALS(A, B) (fabs((A)-(B)) < FP_TOLERANCE)
+#define FP_EQUALS(A, B) (fabs((A)-(B)) <= FP_TOLERANCE)
+#define FP_NEQUALS(A, B) (fabs((A)-(B)) > FP_TOLERANCE)
 #define FP_LT(A, B) (((A) + FP_TOLERANCE) < (B))
 #define FP_LTEQ(A, B) (((A) - FP_TOLERANCE) <= (B))
 #define FP_GT(A, B) (((A) - FP_TOLERANCE) > (B))
 #define FP_CONTAINS_INCL(A, X, B) (FP_LTEQ(A, X) && FP_LTEQ(X, B))
 #define FP_CONTAINS_EXCL(A, X, B) (FP_LT(A, X) && FP_LT(X, B))
 #define FP_CONTAINS(A, X, B) FP_CONTAINS_EXCL(A, X, B)
+
+/*
+** Utility true and false defines.
+*/
 #define LW_TRUE 1
 #define LW_FALSE 0
 
index 723329239adff3e9119d16c60d4e856e8040157b..2e764595a2196c64abcc399894cfd4aeb1c19220 100644 (file)
@@ -830,6 +830,16 @@ Datum geography_gist_penalty(PG_FUNCTION_ARGS)
        size_union = gidx_union_volume(gbox_index_orig, gbox_index_new);
        size_orig = gidx_volume(gbox_index_orig);
        *result = size_union - size_orig;
+
+       /* All things being equal, we prefer to expand small boxes rather than large boxes. */
+       if( FP_ZERO(*result) )
+               if( FP_ZERO(size_orig) )
+                       *result = 0.0;
+               else
+                       *result = 1.0 - (1.0/(1.0 + size_orig));
+       else
+               *result += 1;
+
        POSTGIS_DEBUGF(4, "[GIST] union size (%f), original size (%f), penalty (%f)", size_union, size_orig, *result);
        PG_RETURN_POINTER(result);
 }