2 * contrib/btree_gist/btree_utils_num.h
4 #ifndef __BTREE_UTILS_NUM_H__
5 #define __BTREE_UTILS_NUM_H__
10 #include "access/gist.h"
11 #include "btree_gist.h"
13 typedef char GBT_NUMKEY
;
15 /* Better readable key */
18 const GBT_NUMKEY
*lower
,
31 /* type description */
38 enum gbtree_type t
; /* data type */
39 int32 size
; /* size of type, 0 means variable */
40 int32 indexsize
; /* size of datums stored in index */
44 bool (*f_gt
) (const void *, const void *, FmgrInfo
*); /* greater than */
45 bool (*f_ge
) (const void *, const void *, FmgrInfo
*); /* greater or equal */
46 bool (*f_eq
) (const void *, const void *, FmgrInfo
*); /* equal */
47 bool (*f_le
) (const void *, const void *, FmgrInfo
*); /* less or equal */
48 bool (*f_lt
) (const void *, const void *, FmgrInfo
*); /* less than */
49 int (*f_cmp
) (const void *, const void *, FmgrInfo
*); /* key compare function */
50 float8 (*f_dist
) (const void *, const void *, FmgrInfo
*); /* key distance function */
55 * Numeric btree functions
61 * Note: The factor 0.49 in following macro avoids floating point overflows
63 #define penalty_num(result,olower,oupper,nlower,nupper) do { \
66 if ( (nupper) > (oupper) ) \
67 tmp += ( ((double)nupper)*0.49F - ((double)oupper)*0.49F ); \
68 if ( (olower) > (nlower) ) \
69 tmp += ( ((double)olower)*0.49F - ((double)nlower)*0.49F ); \
72 (*(result)) += FLT_MIN; \
73 (*(result)) += (float) ( ((double)(tmp)) / ( (double)(tmp) + ( ((double)(oupper))*0.49F - ((double)(olower))*0.49F ) ) ); \
74 (*(result)) *= (FLT_MAX / (((GISTENTRY *) PG_GETARG_POINTER(0))->rel->rd_att->natts + 1)); \
80 * Convert an Interval to an approximate equivalent number of seconds
81 * (as a double). Here because we need it for time/timetz as well as
82 * interval. See interval_cmp_internal for comparison.
84 #define INTERVAL_TO_SEC(ivp) \
85 (((double) (ivp)->time) / ((double) USECS_PER_SEC) + \
86 (ivp)->day * (24.0 * SECS_PER_HOUR) + \
87 (ivp)->month * (30.0 * SECS_PER_DAY))
89 #define GET_FLOAT_DISTANCE(t, arg1, arg2) fabs( ((float8) *((const t *) (arg1))) - ((float8) *((const t *) (arg2))) )
92 extern Interval
*abs_interval(Interval
*a
);
94 extern bool gbt_num_consistent(const GBT_NUMKEY_R
*key
, const void *query
,
95 const StrategyNumber
*strategy
, bool is_leaf
,
96 const gbtree_ninfo
*tinfo
, FmgrInfo
*flinfo
);
98 extern float8
gbt_num_distance(const GBT_NUMKEY_R
*key
, const void *query
,
99 bool is_leaf
, const gbtree_ninfo
*tinfo
, FmgrInfo
*flinfo
);
101 extern GIST_SPLITVEC
*gbt_num_picksplit(const GistEntryVector
*entryvec
, GIST_SPLITVEC
*v
,
102 const gbtree_ninfo
*tinfo
, FmgrInfo
*flinfo
);
104 extern GISTENTRY
*gbt_num_compress(GISTENTRY
*entry
, const gbtree_ninfo
*tinfo
);
106 extern GISTENTRY
*gbt_num_fetch(GISTENTRY
*entry
, const gbtree_ninfo
*tinfo
);
108 extern void *gbt_num_union(GBT_NUMKEY
*out
, const GistEntryVector
*entryvec
,
109 const gbtree_ninfo
*tinfo
, FmgrInfo
*flinfo
);
111 extern bool gbt_num_same(const GBT_NUMKEY
*a
, const GBT_NUMKEY
*b
,
112 const gbtree_ninfo
*tinfo
, FmgrInfo
*flinfo
);
114 extern void gbt_num_bin_union(Datum
*u
, GBT_NUMKEY
*e
,
115 const gbtree_ninfo
*tinfo
, FmgrInfo
*flinfo
);