|
| 1 | +use strict; |
| 2 | +use warnings; |
| 3 | + |
| 4 | +my $func_base_template=<<EOT; |
| 5 | +CREATE FUNCTION rum_TYPEIDENT_extract_value(TYPENAME, internal) |
| 6 | +RETURNS internal |
| 7 | +AS 'MODULE_PATHNAME' |
| 8 | +LANGUAGE C STRICT IMMUTABLE; |
| 9 | +
|
| 10 | +CREATE FUNCTION rum_TYPEIDENT_compare_prefix(TYPENAME, TYPENAME, int2, internal) |
| 11 | +RETURNS int4 |
| 12 | +AS 'MODULE_PATHNAME' |
| 13 | +LANGUAGE C STRICT IMMUTABLE; |
| 14 | +
|
| 15 | +CREATE FUNCTION rum_TYPEIDENT_extract_query(TYPENAME, internal, int2, internal, internal) |
| 16 | +RETURNS internal |
| 17 | +AS 'MODULE_PATHNAME' |
| 18 | +LANGUAGE C STRICT IMMUTABLE; |
| 19 | +
|
| 20 | +EOT |
| 21 | + |
| 22 | +my $func_distance_template=<<EOT; |
| 23 | +$func_base_template |
| 24 | +
|
| 25 | +CREATE FUNCTION rum_TYPEIDENT_distance(TYPENAME, TYPENAME) |
| 26 | +RETURNS float8 |
| 27 | +AS 'MODULE_PATHNAME' |
| 28 | +LANGUAGE C IMMUTABLE STRICT; |
| 29 | +
|
| 30 | +CREATE OPERATOR <=> ( |
| 31 | + PROCEDURE = rum_TYPEIDENT_distance, |
| 32 | + LEFTARG = TYPENAME, |
| 33 | + RIGHTARG = TYPENAME, |
| 34 | + COMMUTATOR = <=> |
| 35 | +); |
| 36 | +
|
| 37 | +CREATE FUNCTION rum_TYPEIDENT_left_distance(TYPENAME, TYPENAME) |
| 38 | +RETURNS float8 |
| 39 | +AS 'MODULE_PATHNAME' |
| 40 | +LANGUAGE C IMMUTABLE STRICT; |
| 41 | +
|
| 42 | +CREATE OPERATOR <=| ( |
| 43 | + PROCEDURE = rum_TYPEIDENT_left_distance, |
| 44 | + LEFTARG = TYPENAME, |
| 45 | + RIGHTARG = TYPENAME, |
| 46 | + COMMUTATOR = |=> |
| 47 | +); |
| 48 | +
|
| 49 | +CREATE FUNCTION rum_TYPEIDENT_right_distance(TYPENAME, TYPENAME) |
| 50 | +RETURNS float8 |
| 51 | +AS 'MODULE_PATHNAME' |
| 52 | +LANGUAGE C IMMUTABLE STRICT; |
| 53 | +
|
| 54 | +CREATE OPERATOR |=> ( |
| 55 | + PROCEDURE = rum_TYPEIDENT_right_distance, |
| 56 | + LEFTARG = TYPENAME, |
| 57 | + RIGHTARG = TYPENAME, |
| 58 | + COMMUTATOR = <=| |
| 59 | +); |
| 60 | +
|
| 61 | +CREATE FUNCTION rum_TYPEIDENT_outer_distance(TYPENAME, TYPENAME, smallint) |
| 62 | +RETURNS float8 |
| 63 | +AS 'MODULE_PATHNAME' |
| 64 | +LANGUAGE C STRICT IMMUTABLE; |
| 65 | +
|
| 66 | +CREATE FUNCTION rum_TYPEIDENT_config(internal) |
| 67 | +RETURNS void |
| 68 | +AS 'MODULE_PATHNAME' |
| 69 | +LANGUAGE C IMMUTABLE STRICT; |
| 70 | +
|
| 71 | +
|
| 72 | +EOT |
| 73 | + |
| 74 | +my $opclass_base_template=<<EOT; |
| 75 | +
|
| 76 | +CREATE OPERATOR CLASS rum_TYPEIDENT_ops |
| 77 | +DEFAULT FOR TYPE TYPENAME USING rum |
| 78 | +AS |
| 79 | + OPERATOR 1 < TYPESOPARG, |
| 80 | + OPERATOR 2 <= TYPESOPARG, |
| 81 | + OPERATOR 3 = TYPESOPARG, |
| 82 | + OPERATOR 4 >= TYPESOPARG, |
| 83 | + OPERATOR 5 > TYPESOPARG, |
| 84 | + FUNCTION 1 TYPECMPFUNC(TYPECMPTYPE,TYPECMPTYPE), |
| 85 | + FUNCTION 2 rum_TYPESUBIDENT_extract_value(TYPESUBNAME, internal), |
| 86 | + FUNCTION 3 rum_TYPESUBIDENT_extract_query(TYPESUBNAME, internal, int2, internal, internal), |
| 87 | + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), |
| 88 | + FUNCTION 5 rum_TYPESUBIDENT_compare_prefix(TYPESUBNAME,TYPESUBNAME,int2, internal), |
| 89 | +STORAGE TYPENAME; |
| 90 | +
|
| 91 | +EOT |
| 92 | + |
| 93 | +my $opclass_distance_template=<<EOT; |
| 94 | +
|
| 95 | +CREATE OPERATOR CLASS rum_TYPEIDENT_ops |
| 96 | +DEFAULT FOR TYPE TYPENAME USING rum |
| 97 | +AS |
| 98 | + OPERATOR 1 < TYPESOPARG, |
| 99 | + OPERATOR 2 <= TYPESOPARG, |
| 100 | + OPERATOR 3 = TYPESOPARG, |
| 101 | + OPERATOR 4 >= TYPESOPARG, |
| 102 | + OPERATOR 5 > TYPESOPARG, |
| 103 | + OPERATOR 20 <=> (TYPENAME,TYPENAME) FOR ORDER BY pg_catalog.float_ops, |
| 104 | + OPERATOR 21 <=| (TYPENAME,TYPENAME) FOR ORDER BY pg_catalog.float_ops, |
| 105 | + OPERATOR 22 |=> (TYPENAME,TYPENAME) FOR ORDER BY pg_catalog.float_ops, |
| 106 | + FUNCTION 1 TYPECMPFUNC(TYPECMPTYPE,TYPECMPTYPE), |
| 107 | + FUNCTION 2 rum_TYPESUBIDENT_extract_value(TYPESUBNAME, internal), |
| 108 | + FUNCTION 3 rum_TYPESUBIDENT_extract_query(TYPESUBNAME, internal, int2, internal, internal), |
| 109 | + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), |
| 110 | + FUNCTION 5 rum_TYPESUBIDENT_compare_prefix(TYPESUBNAME,TYPESUBNAME,int2, internal), |
| 111 | + -- support to TYPEIDENT distance in rum_tsvector_addon_ops |
| 112 | + FUNCTION 6 rum_TYPEIDENT_config(internal), |
| 113 | + FUNCTION 9 rum_TYPEIDENT_outer_distance(TYPENAME, TYPENAME, smallint), |
| 114 | +STORAGE TYPENAME; |
| 115 | +
|
| 116 | +EOT |
| 117 | + |
| 118 | +my @opinfo = map { |
| 119 | + $_->{TYPEIDENT} = $_->{TYPENAME} if ! exists $_->{TYPEIDENT}; |
| 120 | + $_->{TYPECMPTYPE} = $_->{TYPENAME} if !exists $_->{TYPECMPTYPE}; |
| 121 | + $_->{TYPESUBNAME} = $_->{TYPENAME} if !exists $_->{TYPESUBNAME}; |
| 122 | + $_->{TYPESUBIDENT}= $_->{TYPEIDENT} if ! exists $_->{TYPESUBIDENT}; |
| 123 | + $_->{TYPESOPARG}= '' if ! exists $_->{TYPESOPARG}; |
| 124 | + $_ |
| 125 | + } ( |
| 126 | + # timestamp/tz aren't here: they are in rum--1.0.sql |
| 127 | +); |
| 128 | + |
| 129 | +##############Generate!!! |
| 130 | + |
| 131 | +print <<EOT; |
| 132 | +CREATE OPERATOR CLASS rum_anyarray_ops |
| 133 | +DEFAULT FOR TYPE anyarray USING rum |
| 134 | +AS |
| 135 | + OPERATOR 1 && (anyarray, anyarray), |
| 136 | + OPERATOR 2 @> (anyarray, anyarray), |
| 137 | + OPERATOR 3 <@ (anyarray, anyarray), |
| 138 | + OPERATOR 4 = (anyarray, anyarray), |
| 139 | + --dispatch function 1 for concrete type |
| 140 | + FUNCTION 2 ginarrayextract(anyarray,internal,internal), |
| 141 | + FUNCTION 3 ginqueryarrayextract(anyarray,internal,smallint,internal,internal,internal,internal), |
| 142 | + FUNCTION 4 ginarrayconsistent(internal,smallint,anyarray,integer,internal,internal,internal,internal), |
| 143 | + STORAGE anyelement; |
| 144 | +
|
| 145 | +EOT |
| 146 | + |
| 147 | +foreach my $t (@opinfo) |
| 148 | +{ |
| 149 | + print "/*--------------------$t->{TYPENAME}-----------------------*/\n\n"; |
| 150 | + |
| 151 | + for my $v (qw(func_tmpl opclass_tmpl)) |
| 152 | + { |
| 153 | + next if !exists $t->{$v}; |
| 154 | + |
| 155 | + my $x = ${$t->{$v}}; |
| 156 | + |
| 157 | + for my $k (grep {uc($_) eq $_} keys %$t) |
| 158 | + { |
| 159 | + $x=~s/$k/$t->{$k}/g; |
| 160 | + } |
| 161 | + |
| 162 | + print $x; |
| 163 | + } |
| 164 | +} |
| 165 | + |
| 166 | +# Drop doesn't work |
| 167 | +#print <<EOT; |
| 168 | +#ALTER OPERATOR FAMILY rum_timestamp_ops USING rum DROP FUNCTION 4 |
| 169 | +# (timestamp, timestamp); -- strange definition |
| 170 | +#ALTER OPERATOR FAMILY rum_timestamp_ops USING rum ADD FUNCTION 4 |
| 171 | +# rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal); |
| 172 | +#EOT |
0 commit comments