@@ -13,6 +13,7 @@ create type vops_float4;
1313create type vops_float8 ;
1414create type vops_timestamp ;
1515create type vops_interval ;
16+ create type vops_text ;
1617
1718
1819create function vops_bool_input (cstring) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -35,6 +36,9 @@ create function vops_timestamp_input(cstring) returns vops_timestamp as 'MODULE_
3536create function vops_timestamp_output (vops_timestamp) returns cstringas ' MODULE_PATHNAME' ,' vops_int8_output' language C parallel safe immutable strict;
3637create function vops_interval_input (cstring) returns vops_intervalas ' MODULE_PATHNAME' ,' vops_int8_input' language C parallel safe immutable strict;
3738create function vops_interval_output (vops_interval) returns cstringas ' MODULE_PATHNAME' ,' vops_int8_output' language C parallel safe immutable strict;
39+ create function vops_text_input (cstring,oid ,integer ) returns vops_textas ' MODULE_PATHNAME' language C parallel safe immutable strict;
40+ create function vops_text_output (vops_text) returns cstringas ' MODULE_PATHNAME' language C parallel safe immutable strict;
41+ create function vops_text_typmod_in (cstring[]) returnsinteger as ' MODULE_PATHNAME' language C parallel safe immutable strict;
3842
3943create type vops_bool (
4044input= vops_bool_input,
@@ -110,6 +114,72 @@ create type vops_interval (
110114 internallength= 528 -- 16 + 64*8
111115);
112116
117+ create type vops_text (
118+ input= vops_text_input,
119+ output= vops_text_output,
120+ typmod_in= vops_text_typmod_in,
121+ alignment= double
122+ );
123+
124+ -- text tile
125+
126+ create function vops_text_const (opdtext , widthinteger ) returns vops_textas ' MODULE_PATHNAME' language C parallel safe immutable strict;
127+
128+ create function vops_text_concat (left vops_text, right vops_text) returns vops_int2as ' MODULE_PATHNAME' language C parallel safe immutable strict;
129+ create operator|| (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_concat);
130+
131+ create function vops_text_eq (left vops_text, right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
132+ create function vops_text_eq_rconst (left vops_text, righttext ) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
133+ create function vops_text_eq_lconst (lefttext , right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
134+ create operator= (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_eq, commutator= = );
135+ create operator= (leftarg= vops_text, rightarg= text , procedure= vops_text_eq_rconst, commutator= = );
136+ create operator= (leftarg= text , rightarg= vops_text, procedure= vops_text_eq_lconst, commutator= = );
137+
138+ create function vops_text_ne (left vops_text, right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
139+ create function vops_text_ne_rconst (left vops_text, righttext ) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
140+ create function vops_text_ne_lconst (lefttext , right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
141+ create operator<> (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_ne, commutator= <> );
142+ create operator<> (leftarg= vops_text, rightarg= text , procedure= vops_text_ne_rconst, commutator= <> );
143+ create operator<> (leftarg= text , rightarg= vops_text, procedure= vops_text_ne_lconst, commutator= <> );
144+
145+ create function vops_text_gt (left vops_text, right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
146+ create function vops_text_gt_rconst (left vops_text, righttext ) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
147+ create function vops_text_gt_lconst (lefttext , right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
148+ create operator> (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_gt, commutator= < );
149+ create operator> (leftarg= vops_text, rightarg= text , procedure= vops_text_gt_rconst, commutator= < );
150+ create operator> (leftarg= text , rightarg= vops_text, procedure= vops_text_gt_lconst, commutator= < );
151+
152+ create function vops_text_lt (left vops_text, right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
153+ create function vops_text_lt_rconst (left vops_text, righttext ) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
154+ create function vops_text_lt_lconst (lefttext , right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
155+ create operator< (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_lt, commutator= > );
156+ create operator< (leftarg= vops_text, rightarg= text , procedure= vops_text_lt_rconst, commutator= > );
157+ create operator< (leftarg= text , rightarg= vops_text, procedure= vops_text_lt_lconst, commutator= > );
158+
159+ create function vops_text_ge (left vops_text, right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
160+ create function vops_text_ge_rconst (left vops_text, righttext ) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
161+ create function vops_text_ge_lconst (lefttext , right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
162+ create operator>= (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_ge, commutator= <= );
163+ create operator>= (leftarg= vops_text, rightarg= text , procedure= vops_text_ge_rconst, commutator= <= );
164+ create operator>= (leftarg= text , rightarg= vops_text, procedure= vops_text_ge_lconst, commutator= <= );
165+
166+ create function vops_text_le (left vops_text, right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
167+ create function vops_text_le_rconst (left vops_text, righttext ) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
168+ create function vops_text_le_lconst (lefttext , right vops_text) returns vops_boolas ' MODULE_PATHNAME' language C parallel safe immutable strict;
169+ create operator<= (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_le, commutator= >= );
170+ create operator<= (leftarg= vops_text, rightarg= text , procedure= vops_text_le_rconst, commutator= >= );
171+ create operator<= (leftarg= text , rightarg= vops_text, procedure= vops_text_le_lconst, commutator= >= );
172+
173+ create function betwixt (opd vops_text, lowtext , hightext ) returns vops_boolas ' MODULE_PATHNAME' ,' vops_betwixt_text' language C parallel safe immutable strict;
174+
175+ create function ifnull (opd vops_text, substtext ) returns vops_textas ' MODULE_PATHNAME' ,' vops_ifnull_text' language C parallel safe immutable strict;
176+ create function ifnull (opd vops_text, subst vops_text) returns vops_textas ' MODULE_PATHNAME' ,' vops_coalesce_text' language C parallel safe immutable strict;
177+
178+ create function first (tile vops_text) returnstext as ' MODULE_PATHNAME' ,' vops_text_first' language C parallel safe immutable strict;
179+ create function last (tile vops_text) returnstext as ' MODULE_PATHNAME' ,' vops_text_last' language C parallel safe immutable strict;
180+ create function low (tile vops_text) returnstext as ' MODULE_PATHNAME' ,' vops_text_low' language C parallel safe immutable strict;
181+ create function high (tile vops_text) returnstext as ' MODULE_PATHNAME' ,' vops_text_high' language C parallel safe immutable strict;
182+
113183-- char tile
114184
115185create function vops_char_const (opd" char" ) returns vops_charas ' MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -442,10 +512,10 @@ CREATE AGGREGATE mcount(vops_char) (
442512PARALLEL= SAFE
443513);
444514
445- create function first (tile vops_char) returnschar as ' MODULE_PATHNAME' ,' vops_char_first' language C parallel safe immutable strict;
446- create function last (tile vops_char) returnschar as ' MODULE_PATHNAME' ,' vops_char_last' language C parallel safe immutable strict;
447- create function low (tile vops_char) returnschar as ' MODULE_PATHNAME' ,' vops_char_low' language C parallel safe immutable strict;
448- create function high (tile vops_char) returnschar as ' MODULE_PATHNAME' ,' vops_char_high' language C parallel safe immutable strict;
515+ create function first (tile vops_char) returns" char" as ' MODULE_PATHNAME' ,' vops_char_first' language C parallel safe immutable strict;
516+ create function last (tile vops_char) returns" char" as ' MODULE_PATHNAME' ,' vops_char_last' language C parallel safe immutable strict;
517+ create function low (tile vops_char) returns" char" as ' MODULE_PATHNAME' ,' vops_char_low' language C parallel safe immutable strict;
518+ create function high (tile vops_char) returns" char" as ' MODULE_PATHNAME' ,' vops_char_high' language C parallel safe immutable strict;
449519
450520-- int2 tile
451521
@@ -3031,6 +3101,8 @@ create cast (vops_bool as bool) with function filter(vops_bool) AS IMPLICIT;
30313101create function is_null (anyelement) returns vops_boolas ' MODULE_PATHNAME' ,' vops_is_null' language C parallel safe immutable;
30323102create function is_not_null (anyelement) returns vops_boolas ' MODULE_PATHNAME' ,' vops_is_not_null' language C parallel safe immutable;
30333103
3104+ -- VOPS FDW
3105+
30343106CREATE FUNCTION vops_fdw_handler ()
30353107RETURNS fdw_handler
30363108AS ' MODULE_PATHNAME'
@@ -3046,4 +3118,120 @@ CREATE FOREIGN DATA WRAPPER vops_fdw
30463118 VALIDATOR vops_fdw_validator;
30473119
30483120CREATE SERVER vops_server FOREIGN DATA WRAPPER vops_fdw;
3049-
3121+
3122+ -- Projection generator
3123+
3124+ create table vops_projections (projectiontext primary key , source_tableoid , vector_columnsinteger [], scalar_columnsinteger [], key_nametext );
3125+ create index on vops_projections(source_table);
3126+
3127+
3128+ create function drop_projection (projection_nametext ) returns voidas $drop$
3129+ begin
3130+ execute' drop table' || projection_name;
3131+ execute' drop function' || projection_name|| ' _refresh()' ;
3132+ delete from vops_projectionswhere projection= projection_name;
3133+ end;
3134+ $drop$ language plpgsql;
3135+
3136+
3137+ create function create_projection (projection_nametext , source_table regclass, vector_columnstext [], scalar_columnstext [] defaultnull , order_bytext defaultnull ) returns voidas $create$
3138+ declare
3139+ create_tabletext ;
3140+ create_functext ;
3141+ create_indextext ;
3142+ vector_attnointeger [];
3143+ scalar_attnointeger [];
3144+ att_numinteger ;
3145+ att_nametext ;
3146+ att_typnametext ;
3147+ att_typidinteger ;
3148+ septext := ' ' ;
3149+ key_typetext ;
3150+ min_valuetext ;
3151+ iinteger ;
3152+ att_typmodinteger ;
3153+ begin
3154+ create_table := ' create table' || projection_name|| ' (' ;
3155+ create_func := ' create function' || projection_name|| ' _refresh() returns bigint as $$ select populate(source:=' ' ' || source_table::text || ' ' ' ,destination:=' ' ' || projection_name|| ' ' ' ,sort:=' ' ' ;
3156+ if scalar_columnsis not null
3157+ then
3158+ create_index := ' create index on' || projection_name|| ' using brin(' ;
3159+ foreach att_nameIN ARRAY scalar_columns
3160+ loop
3161+ select atttypid,attnum,typname into att_typid,att_num,att_typnamefrom pg_attribute,pg_typewhere attrelid= source_table::oid and attname= att_nameand atttypid= pg_type .oid ;
3162+ if att_typid isnull
3163+ then
3164+ raise exception' No attribute % in table %' ,att_name,source_table;
3165+ end if;
3166+ scalar_attno := scalar_attno|| att_num;
3167+ if att_typname= ' char'
3168+ then
3169+ att_typname:= ' "char"' ;
3170+ end if;
3171+ create_table := create_table|| sep|| att_name|| ' ' || att_typname;
3172+ create_func := create_func|| sep|| att_name;
3173+ create_index := create_index|| sep|| att_name;
3174+ sep := ' ,' ;
3175+ end loop;
3176+ end if;
3177+
3178+ if order_byis not null
3179+ then
3180+ create_func := create_func|| sep|| order_by;
3181+ end if;
3182+ create_func := create_func|| ' ' ' ' ;-- end of sort list
3183+
3184+ foreach att_nameIN ARRAY vector_columns
3185+ loop
3186+ select atttypid,attnum,typname,atttypmod into att_typid,att_num,att_typname,att_typmodfrom pg_attribute,pg_typewhere attrelid= source_table::oid and attname= att_nameand atttypid= pg_type .oid ;
3187+ if att_typid isnull
3188+ then
3189+ raise exception' No attribute % in table %' ,att_name,source_table;
3190+ end if;
3191+ if att_typname= ' bpchar' or att_typname= ' varchar'
3192+ then
3193+ att_typname:= ' text(' || att_typmod|| ' )' ;
3194+ end if;
3195+ vector_attno := vector_attno|| att_num;
3196+ create_table := create_table|| sep|| att_name|| ' vops_' || att_typname;
3197+ sep := ' ,' ;
3198+ if att_name= order_by
3199+ then
3200+ key_type= typname;
3201+ end if;
3202+ end loop;
3203+
3204+ create_table := create_table|| ' )' ;
3205+ execute create_table;
3206+
3207+ if create_indexis not null
3208+ then
3209+ create_index := create_index|| ' )' ;
3210+ execute create_index;
3211+ end if;
3212+
3213+ if order_byis not null
3214+ then
3215+ if key_type isnull
3216+ then
3217+ raise exception' Invalid order column % for projection %' ,order_by,projection_name;
3218+ end if;
3219+ create_index := ' create index on' || projection_name|| ' using brin(first(' || order_by|| ' ))' ;
3220+ execute create_index;
3221+ create_index := ' create index on' || projection_name|| ' using brin(last(' || order_by|| ' ))' ;
3222+ execute create_index;
3223+ if key_type= ' timestamp' or key_type= ' date'
3224+ then
3225+ min_value := ' ' ' -infinity' ' ' ;
3226+ else
3227+ min_value := ' -1' ;-- assume that key have only non-negative values
3228+ end if;
3229+ create_func := create_func|| ' ,predicate:=' ' ' || order_by|| ' >(select coalesce(max(last(' || order_by|| ' )),' || min_value|| ' ) from' || projection_name|| ' )' ' ' ;
3230+ end if;
3231+ create_func := create_func|| ' ); $$ language sql' ;
3232+ execute create_func;
3233+
3234+ insert into vops_projectionsvalues (projection_name, source_table, vector_attno, scalar_attno, order_by);
3235+ end;
3236+ $create$ language plpgsql;
3237+