00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "lib/stringinfo.h"
00029
00030 typedef struct TS_ELEMENT {
00031 float lower;
00032 float upper;
00033 } TS_ELEMENT;
00034
00035 typedef struct SAX_ELEMENT {
00036 unsigned char lower;
00037 unsigned char upper;
00038 unsigned char cardinality;
00039 } SAX_ELEMENT;
00040
00041
00042 typedef struct TS
00043 {
00044 int32 vl_len_;
00045 int32 length;
00046 float4 duration;
00047 TS_ELEMENT data[1];
00048 } TS;
00049
00050 typedef struct SAX
00051 {
00052 int32 vl_len_;
00053 int32 length;
00054 float4 points_per_letter;
00055 SAX_ELEMENT data[1];
00056 } SAX;
00057
00058 #undef SAX_DEBUG
00059 #undef GIST_DEBUG
00060
00061
00062 #define DEFAULT_CARDINALITY 8
00063 #define DatumGetTS(x) ((TS*)DatumGetPointer(x))
00064 #define DatumGetSAX(x) ((SAX*)DatumGetPointer(x))
00065 #define PG_GETARG_TS(x) DatumGetTS( PG_DETOAST_DATUM(PG_GETARG_DATUM(x)) )
00066 #define PG_GETARG_SAX(x) DatumGetSAX( PG_DETOAST_DATUM(PG_GETARG_DATUM(x)) )
00067 #define PG_RETURN_TS(x) PG_RETURN_POINTER(x)
00068 #define PG_RETURN_SAX(x) PG_RETURN_POINTER(x)
00069 #define SIZE_OF_SAX(len) (offsetof(SAX, data[0]) + sizeof(SAX_ELEMENT) * len)
00070 #define SIZE_OF_TS(len) (offsetof(SAX, data[0]) + sizeof(TS_ELEMENT) * len)
00071
00072 #define SCAN_HEX(str, valp) if ( sax_util_htoi((str), (valp)) != 1 ) { \
00073 ereport(ERROR, \
00074 (errcode(ERRCODE_SYNTAX_ERROR), \
00075 errmsg("bad sax representation"), \
00076 errdetail("couldn't scan '%s'", (str)))); \
00077 YYABORT; \
00078 }
00079
00080 #define NONE_IS_NULL(r1,r2,i) (!(sax_isNull(&(r1->data[i])) || sax_isNull(&(r2->data[i]))))
00081 #define NEITHER_ELEMENT_NULL(r1,r2) (!(sax_isNull(r1) || sax_isNull(r2)))
00082 static float bp256[] ={ -2.66006747, -2.41755902, -2.26622681, -2.15387469, -2.06352790, -1.98742789, -1.92135077, -1.86273187, -1.80989224, -1.76167041, -1.71722812, -1.67593972, -1.63732538, -1.60100866, -1.56668859, -1.53412054, -1.50310294, -1.47346758, -1.44507258, -1.41779714, -1.39153749, -1.36620382, -1.34171784, -1.31801090, -1.29502241, -1.27269864, -1.25099172, -1.22985876, -1.20926123, -1.18916435, -1.16953661, -1.15034938, -1.13157656, -1.11319428, -1.09518065, -1.07751557, -1.06018048, -1.04315826, -1.02643306, -1.00999017, -0.99381591, -0.97789754, -0.96222320, -0.94678176, -0.93156283, -0.91655667, -0.90175411, -0.88714656, -0.87272589, -0.85848447, -0.84441508, -0.83051088, -0.81676542, -0.80317257, -0.78972652, -0.77642176, -0.76325304, -0.75021538, -0.73730400, -0.72451438, -0.71184220, -0.69928330, -0.68683375, -0.67448975, -0.66224768, -0.65010407, -0.63805558, -0.62609901, -0.61423129, -0.60244945, -0.59075066, -0.57913216, -0.56759132, -0.55612559, -0.54473251, -0.53340971, -0.52215488, -0.51096581, -0.49984034, -0.48877641, -0.47777199, -0.46682512, -0.45593392, -0.44509652, -0.43431116, -0.42357608, -0.41288960, -0.40225007, -0.39165587, -0.38110545, -0.37059729, -0.36012989, -0.34970180, -0.33931161, -0.32895791, -0.31863936, -0.30835463, -0.29810241, -0.28788143, -0.27769044, -0.26752821, -0.25739353, -0.24728522, -0.23720211, -0.22714306, -0.21710695, -0.20709265, -0.19709908, -0.18712516, -0.17716982, -0.16723201, -0.15731068, -0.14740482, -0.13751340, -0.12763542, -0.11776987, -0.10791578, -0.09807215, -0.08823802, -0.07841241, -0.06859437, -0.05878294, -0.04897716, -0.03917609, -0.02937878, -0.01958429, -0.00979167, 0.00000000, 0.00979167, 0.01958429, 0.02937878, 0.03917609, 0.04897716, 0.05878294, 0.06859437, 0.07841241, 0.08823802, 0.09807215, 0.10791578, 0.11776987, 0.12763542, 0.13751340, 0.14740482, 0.15731068, 0.16723201, 0.17716982, 0.18712516, 0.19709908, 0.20709265, 0.21710695, 0.22714306, 0.23720211, 0.24728522, 0.25739353, 0.26752821, 0.27769044, 0.28788143, 0.29810241, 0.30835463, 0.31863936, 0.32895791, 0.33931161, 0.34970180, 0.36012989, 0.37059729, 0.38110545, 0.39165587, 0.40225007, 0.41288960, 0.42357608, 0.43431116, 0.44509652, 0.45593392, 0.46682512, 0.47777199, 0.48877641, 0.49984034, 0.51096581, 0.52215488, 0.53340971, 0.54473251, 0.55612559, 0.56759132, 0.57913216, 0.59075066, 0.60244945, 0.61423129, 0.62609901, 0.63805558, 0.65010407, 0.66224768, 0.67448975, 0.68683375, 0.69928330, 0.71184220, 0.72451438, 0.73730400, 0.75021538, 0.76325304, 0.77642176, 0.78972652, 0.80317257, 0.81676542, 0.83051088, 0.84441508, 0.85848447, 0.87272589, 0.88714656, 0.90175411, 0.91655667, 0.93156283, 0.94678176, 0.96222320, 0.97789754, 0.99381591, 1.00999017, 1.02643306, 1.04315826, 1.06018048, 1.07751557, 1.09518065, 1.11319428, 1.13157656, 1.15034938, 1.16953661, 1.18916435, 1.20926123, 1.22985876, 1.25099172, 1.27269864, 1.29502241, 1.31801090, 1.34171784, 1.36620382, 1.39153749, 1.41779714, 1.44507258, 1.47346758, 1.50310294, 1.53412054, 1.56668859, 1.60100866, 1.63732538, 1.67593972, 1.71722812, 1.76167041, 1.80989224, 1.86273187, 1.92135077, 1.98742789, 2.06352790, 2.15387469, 2.26622681, 2.41755902, 2.66006747, 100.0};
00083
00084 unsigned char promoteLetter(unsigned char let, unsigned char ref, unsigned char oldA, unsigned char newA) ;
00085 unsigned char downgradeLetter(unsigned char let, unsigned char oldA, unsigned char newA) ;
00086
00087
00088
00089
00090
00091
00092
00093 #define WEAK_CHAR_LENGTH 3.0
00094
00095 #define MAX_DIST (4.0*bp256[0]*bp256[0])
00096
00099 bool ts_uoverlap(TS *a,TS *b);
00100
00104 bool ts_loverlap(TS *a,TS *b);
00105
00110 bool ts_contained(TS *a,TS *b);
00111
00115 bool ts_contains(TS *a,TS *b);
00116 bool ts_wcontained(TS *a,TS *b);
00117 bool ts_wcontains(TS *a,TS *b);
00118
00123 bool ts_greater(TS *a,TS *b);
00124
00128 bool ts_less(TS *a,TS *b);
00129
00133 bool ts_intersect(TS *a,TS *b);
00134
00138 bool sax_uoverlap(SAX *a,SAX *b);
00139
00143 bool sax_loverlap(SAX *a,SAX *b);
00144
00149 bool sax_contained(SAX *a,SAX *b);
00150
00154 bool sax_contains(SAX *a,SAX *b);
00155
00160 bool sax_greater(SAX *a,SAX *b);
00161
00165 bool sax_less(SAX *a,SAX *b);
00166
00170 bool sax_intersect(SAX *a,SAX *b);
00171
00181 Datum ts_subset(PG_FUNCTION_ARGS);
00182
00192 Datum sax_subset(PG_FUNCTION_ARGS);
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 unsigned char unify_cardinality_up(SAX_ELEMENT* a,
00205 SAX_ELEMENT* b,
00206 unsigned char *al,
00207 unsigned char *au,
00208 unsigned char *bl,
00209 unsigned char *bu);
00210
00211 unsigned char unify_cardinality_down(SAX_ELEMENT* a,
00212 SAX_ELEMENT* b,
00213 unsigned char *al,
00214 unsigned char *au,
00215 unsigned char *bl,
00216 unsigned char *bu);
00217
00218 float dist(unsigned char a,unsigned char b, unsigned char c);
00219
00220 SAX* i_sax_upper(SAX* sax);
00221 SAX* i_sax_lower(SAX* sax);
00222 StringInfo i_sax_string(SAX* sax);
00223 SAX* i_sax_in(char* str);