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 "postgres.h"
00029
00030 #include <float.h>
00031 #include <math.h>
00032
00033 #include "access/gist.h"
00034 #include "access/skey.h"
00035 #include "utils/builtins.h"
00036 #include "lib/stringinfo.h"
00037 #include "utils/array.h"
00038
00039 #include "tsdata.h"
00040
00041 #define FALSE 0
00042 #define TRUE 1
00043
00044
00045
00046
00047
00048
00049
00050
00051 bool ts_uoverlap(TS *a,TS *b){
00052 int i;
00053 int length = (a->length >= b->length) ? b->length : a->length;
00054
00055
00056 for(i=0;i<length;i++){
00057 if(b->data[i].lower > a->data[i].lower || a->data[i].lower > b->data[i].upper) return false;
00058 }
00059 return true;
00060 }
00061
00062 bool ts_loverlap(TS *a,TS *b){
00063 int i;
00064 int length = (a->length >= b->length) ? b->length : a->length;
00065 for(i=0;i<length;i++){
00066 if(b->data[i].upper < a->data[i].upper || a->data[i].upper < b->data[i].lower) return false;
00067 }
00068 return true;
00069
00070 }
00071
00072 bool ts_contained(TS *a,TS *b){
00073 return (ts_uoverlap(a,b) && ts_loverlap(a,b));
00074 }
00075
00076
00077 bool ts_contains(TS *a,TS *b){
00078 return (ts_contained(b,a));
00079 }
00080
00081 bool ts_intersect(TS *a,TS *b){
00082 return !(ts_greater(a,b) || ts_less(a,b));
00083 }
00084
00085
00086 bool ts_greater(TS *a,TS *b){
00087 int i;
00088 int length = (a->length >= b->length) ? b->length : a->length;
00089 for(i=0;i<length;i++){
00090 if(b->data[i].upper >= a->data[i].lower) return false;
00091 }
00092 return true;
00093
00094 }
00095
00096
00097 bool ts_less(TS *a,TS *b){
00098 int i;
00099 int length = (a->length >= b->length) ? b->length : a->length;
00100 for(i=0;i<length;i++){
00101 if(b->data[i].lower <= a->data[i].upper) return false;
00102 }
00103 return true;
00104
00105 }
00106
00107 bool ts_wcontained(TS *a,TS *b){
00108 int i,size,sax_len;
00109 SAX *as, *bs;
00110 bool result;
00111 sax_len=ceil((double)a->length/WEAK_CHAR_LENGTH);
00112 elog(NOTICE, "a_SAX length: '%x'", sax_len);
00113
00114 as= (SAX *) palloc0(size);
00115 SET_VARSIZE(as, size);
00116 i_ts_sax(a, sax_len,as);
00117
00118 sax_len=ceil((double)b->length/WEAK_CHAR_LENGTH);
00119 elog(NOTICE, "a_SAX length: '%x'", sax_len);
00120 bs= (SAX *) palloc0(size);
00121 SET_VARSIZE(bs, size);
00122 i_ts_sax(b, sax_len,bs);
00123 result=sax_contained(as,bs);
00124 pfree(as);
00125 pfree(bs);
00126 return result;
00127
00128 }
00129
00130 bool ts_wcontains(TS *a,TS *b){
00131 return (ts_wcontained(b,a));
00132 }
00133