1.0 version
authorTeodor Sigaev <teodor@sigaev.ru>
Wed, 25 Apr 2012 16:23:49 +0000 (20:23 +0400)
committerTeodor Sigaev <teodor@sigaev.ru>
Wed, 25 Apr 2012 16:23:49 +0000 (20:23 +0400)
85 files changed:
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
expected/bit.out [new file with mode: 0644]
expected/bytea.out [new file with mode: 0644]
expected/char.out [new file with mode: 0644]
expected/cidr.out [new file with mode: 0644]
expected/composite_int4.out [new file with mode: 0644]
expected/composite_text.out [new file with mode: 0644]
expected/date.out [new file with mode: 0644]
expected/float4.out [new file with mode: 0644]
expected/float8.out [new file with mode: 0644]
expected/inet.out [new file with mode: 0644]
expected/int2.out [new file with mode: 0644]
expected/int4.out [new file with mode: 0644]
expected/int4g.out [new file with mode: 0644]
expected/int4i.out [new file with mode: 0644]
expected/int8.out [new file with mode: 0644]
expected/int8g.out [new file with mode: 0644]
expected/int8i.out [new file with mode: 0644]
expected/interval.out [new file with mode: 0644]
expected/intervalg.out [new file with mode: 0644]
expected/intervali.out [new file with mode: 0644]
expected/macaddr.out [new file with mode: 0644]
expected/money.out [new file with mode: 0644]
expected/numeric.out [new file with mode: 0644]
expected/oid.out [new file with mode: 0644]
expected/smlar.out [new file with mode: 0644]
expected/text.out [new file with mode: 0644]
expected/textg.out [new file with mode: 0644]
expected/texti.out [new file with mode: 0644]
expected/time.out [new file with mode: 0644]
expected/timestamp.out [new file with mode: 0644]
expected/timestamptz.out [new file with mode: 0644]
expected/timetz.out [new file with mode: 0644]
expected/varbit.out [new file with mode: 0644]
expected/varchar.out [new file with mode: 0644]
smlar--1.0.sql [new file with mode: 0644]
smlar--unpackaged--1.0.sql [new file with mode: 0644]
smlar.c [new file with mode: 0644]
smlar.control [new file with mode: 0644]
smlar.h [new file with mode: 0644]
smlar.sql.in.in [new file with mode: 0644]
smlar_cache.c [new file with mode: 0644]
smlar_gin.c [new file with mode: 0644]
smlar_gist.c [new file with mode: 0644]
smlar_guc.c [new file with mode: 0644]
smlar_stat.c [new file with mode: 0644]
sql/bit.sql [new file with mode: 0644]
sql/bytea.sql [new file with mode: 0644]
sql/char.sql [new file with mode: 0644]
sql/cidr.sql [new file with mode: 0644]
sql/composite_int4.sql [new file with mode: 0644]
sql/composite_text.sql [new file with mode: 0644]
sql/date.sql [new file with mode: 0644]
sql/float4.sql [new file with mode: 0644]
sql/float8.sql [new file with mode: 0644]
sql/inet.sql [new file with mode: 0644]
sql/int2.sql [new file with mode: 0644]
sql/int4.sql [new file with mode: 0644]
sql/int4g.sql [new file with mode: 0644]
sql/int4i.sql [new file with mode: 0644]
sql/int8.sql [new file with mode: 0644]
sql/int8g.sql [new file with mode: 0644]
sql/int8i.sql [new file with mode: 0644]
sql/int8n.sql [new file with mode: 0644]
sql/interval.sql [new file with mode: 0644]
sql/intervalg.sql [new file with mode: 0644]
sql/intervali.sql [new file with mode: 0644]
sql/intervaln.sql [new file with mode: 0644]
sql/macaddr.sql [new file with mode: 0644]
sql/money.sql [new file with mode: 0644]
sql/numeric.sql [new file with mode: 0644]
sql/oid.sql [new file with mode: 0644]
sql/smlar.sql [new file with mode: 0644]
sql/text.sql [new file with mode: 0644]
sql/textg.sql [new file with mode: 0644]
sql/texti.sql [new file with mode: 0644]
sql/textn.sql [new file with mode: 0644]
sql/time.sql [new file with mode: 0644]
sql/timestamp.sql [new file with mode: 0644]
sql/timestamptz.sql [new file with mode: 0644]
sql/timetz.sql [new file with mode: 0644]
sql/varbit.sql [new file with mode: 0644]
sql/varchar.sql [new file with mode: 0644]
tsarr.c [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..20d5541
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,26 @@
+
+MODULE_big = smlar
+OBJS = smlar.o smlar_gist.o smlar_gin.o smlar_cache.o \
+               tsarr.o smlar_guc.o smlar_stat.o 
+
+EXTENSION = smlar
+DATA = smlar--1.0.sql  smlar--unpackaged--1.0.sql
+REGRESS = smlar int2 int4 int8 float4 float8 money oid \
+               timestamp timestamptz time timetz date interval \
+               macaddr inet cidr \
+               text varchar char bytea bit varbit numeric \
+               int4g int8g intervalg textg \
+               int4i int8i intervali texti \
+               composite_int4 composite_text
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = contrib/smlar
+top_builddir = ../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..8fa81c5
--- /dev/null
+++ b/README
@@ -0,0 +1,116 @@
+float4 smlar(anyarray, anyarray)
+       - computes similary of two arrays. Arrays should be the same type.
+
+float4 smlar(anyarray, anyarray, bool useIntersect)
+       -  computes similary of two arrays of composite types. Composite type looks like:
+               CREATE TYPE type_name AS (element_name anytype, weight_name FLOAT4);
+          useIntersect option points to use only intersected elements in denominator
+          see an exmaples in sql/composite_int4.sql or sql/composite_text.sql
+
+float4 smlar( anyarray a, anyarray b, text formula );
+       - computes similary of two arrays by given formula, arrays should 
+       be the same type. 
+       Predefined variables in formula:
+         N.i   - number of common elements in both array (intersection)
+         N.a   - number of uniqueelements in first array
+         N.b   - number of uniqueelements in second array
+       Example:
+       smlar('{1,4,6}'::int[], '{5,4,6}' )
+       smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / sqrt(N.a * N.b)' )
+       That calls are equivalent.
+
+anyarray % anyarray
+       - returns true if similarity of that arrays is greater than limit
+
+float4 show_smlar_limit()  - deprecated
+       - shows the limit for % operation
+
+float4 set_smlar_limit(float4) - deprecated
+       - sets the limit for % operation
+
+Use instead of show_smlar_limit/set_smlar_limit GUC variable 
+smlar.threshold (see below)
+
+
+text[] tsvector2textarray(tsvector)
+       - transforms tsvector type to text array
+
+anyarray array_unique(anyarray)
+       - sort and unique array
+
+float4 inarray(anyarray, anyelement)
+       - returns zero if second argument does not present in a first one
+         and 1.0 in opposite case
+
+float4 inarray(anyarray, anyelement, float4, float4)
+       - returns fourth argument if second argument does not present in 
+         a first one and third argument in opposite case
+
+GUC configuration variables:
+
+smlar.threshold  FLOAT
+       Array's with similarity lower than threshold are not similar 
+       by % operation
+
+smlar.persistent_cache BOOL
+       Cache of global stat is stored in transaction-independent memory
+
+smlar.type  STRING
+       Type of similarity formula: cosine(default), tfidf, overlap
+
+smlar.stattable        STRING
+       Name of table stored set-wide statistic. Table should be 
+       defined as
+       CREATE TABLE table_name (
+               value   data_type UNIQUE,
+               ndoc    int4 (or bigint)  NOT NULL CHECK (ndoc>0)
+       );
+       And row with null value means total number of documents.
+       See an examples in sql/*g.sql files
+       Note: used on for smlar.type = 'tfidf'
+
+smlar.tf_method STRING
+       Calculation method for term frequency. Values:
+               "n"     - simple counting of entries (default)
+               "log"   - 1 + log(n)
+               "const" - TF is equal to 1
+       Note: used on for smlar.type = 'tfidf'
+
+smlar.idf_plus_one BOOL
+       If false (default), calculate idf as log(d/df),
+       if true - as log(1+d/df)
+       Note: used on for smlar.type = 'tfidf'
+
+Module provides several GUC variables smlar.threshold, it's highly
+recommended to add to postgesql.conf:
+custom_variable_classes = 'smlar'       # list of custom variable class names
+smlar.threshold = 0.6  #or any other value > 0 and < 1
+and other smlar.* variables
+
+GiST/GIN support for % and  && operations for:
+  Array Type   |  GIN operator class  | GiST operator class  
+---------------+----------------------+----------------------
+ bit[]         | _bit_sml_ops         | 
+ bytea[]       | _bytea_sml_ops       | _bytea_sml_ops
+ char[]        | _char_sml_ops        | _char_sml_ops
+ cidr[]        | _cidr_sml_ops        | _cidr_sml_ops
+ date[]        | _date_sml_ops        | _date_sml_ops
+ float4[]      | _float4_sml_ops      | _float4_sml_ops
+ float8[]      | _float8_sml_ops      | _float8_sml_ops
+ inet[]        | _inet_sml_ops        | _inet_sml_ops
+ int2[]        | _int2_sml_ops        | _int2_sml_ops
+ int4[]        | _int4_sml_ops        | _int4_sml_ops
+ int8[]        | _int8_sml_ops        | _int8_sml_ops
+ interval[]    | _interval_sml_ops    | _interval_sml_ops
+ macaddr[]     | _macaddr_sml_ops     | _macaddr_sml_ops
+ money[]       | _money_sml_ops       | 
+ numeric[]     | _numeric_sml_ops     | _numeric_sml_ops
+ oid[]         | _oid_sml_ops         | _oid_sml_ops
+ text[]        | _text_sml_ops        | _text_sml_ops
+ time[]        | _time_sml_ops        | _time_sml_ops
+ timestamp[]   | _timestamp_sml_ops   | _timestamp_sml_ops
+ timestamptz[] | _timestamptz_sml_ops | _timestamptz_sml_ops
+ timetz[]      | _timetz_sml_ops      | _timetz_sml_ops
+ varbit[]      | _varbit_sml_ops      | 
+ varchar[]     | _varchar_sml_ops     | _varchar_sml_ops
+
diff --git a/expected/bit.out b/expected/bit.out
new file mode 100644 (file)
index 0000000..980cbaf
--- /dev/null
@@ -0,0 +1,104 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::int4::bit(10)
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_bit
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[]) AS s FROM test_bit WHERE v % '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[]) AS s FROM test_bit WHERE v % '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_bit ON test_bit USING gin (v _bit_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[]) AS s FROM test_bit WHERE v % '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[]) AS s FROM test_bit WHERE v % '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/bytea.out b/expected/bytea.out
new file mode 100644 (file)
index 0000000..6e98885
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::text::bytea
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_bytea
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_bytea WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_bytea WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_bytea ON test_bytea USING gist (v _bytea_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_bytea WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_bytea WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_bytea;
+CREATE INDEX idx_test_bytea ON test_bytea USING gin (v _bytea_sml_ops);
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_bytea WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_bytea WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/char.out b/expected/char.out
new file mode 100644 (file)
index 0000000..b754250
--- /dev/null
@@ -0,0 +1,58 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::varchar(1)::"char"
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_char
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{3,2,1}') AS s FROM test_char WHERE v % '{3,2,1}' ORDER BY s DESC, t;
+ t |    s     
+---+----------
+ 3 |        1
+ 4 | 0.866025
+ 2 | 0.816497
+ 5 | 0.774597
+ 6 | 0.707107
+ 7 | 0.654654
+ 8 | 0.612372
+(7 rows)
+
+CREATE INDEX idx_test_char ON test_char USING gist (v _char_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{3,2,1}') AS s FROM test_char WHERE v % '{3,2,1}' ORDER BY s DESC, t;
+ t |    s     
+---+----------
+ 3 |        1
+ 4 | 0.866025
+ 2 | 0.816497
+ 5 | 0.774597
+ 6 | 0.707107
+ 7 | 0.654654
+ 8 | 0.612372
+(7 rows)
+
+DROP INDEX idx_test_char;
+CREATE INDEX idx_test_char ON test_char USING gin (v _char_sml_ops);
+SELECT  t, smlar(v, '{3,2,1}') AS s FROM test_char WHERE v % '{3,2,1}' ORDER BY s DESC, t;
+ t |    s     
+---+----------
+ 3 |        1
+ 4 | 0.866025
+ 2 | 0.816497
+ 5 | 0.774597
+ 6 | 0.707107
+ 7 | 0.654654
+ 8 | 0.612372
+(7 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/cidr.out b/expected/cidr.out
new file mode 100644 (file)
index 0000000..38d1ad4
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       ( '192.168.1.' || (v % 256) )::cidr
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_cidr
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}') AS s FROM test_cidr WHERE v % '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}') AS s FROM test_cidr WHERE v % '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_cidr ON test_cidr USING gist (v _cidr_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}') AS s FROM test_cidr WHERE v % '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}') AS s FROM test_cidr WHERE v % '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_cidr;
+CREATE INDEX idx_test_cidr ON test_cidr USING gin (v _cidr_sml_ops);
+SELECT t, smlar(v, '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}') AS s FROM test_cidr WHERE v % '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}') AS s FROM test_cidr WHERE v % '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/composite_int4.out b/expected/composite_int4.out
new file mode 100644 (file)
index 0000000..fc1d243
--- /dev/null
@@ -0,0 +1,541 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+CREATE TYPE cint AS (id int, w float4);
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       (ROW(v::int4, v::float4))::cint
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_composite_int4
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[]) AS s 
+       FROM test_composite_int4 
+       WHERE v % '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[] AS s 
+       FROM test_composite_int4 
+       WHERE v % '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[]) ORDER BY s DESC, t;
+ERROR:  syntax error at or near "AS"
+LINE 1: ..."(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[] AS s 
+                                                                  ^
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[]) AS s 
+       FROM test_composite_int4 
+       WHERE smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[]) > 0.6 ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[]) AS s 
+       FROM test_composite_int4 
+       WHERE smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[]) > 0.6 ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[], false) AS s 
+       FROM test_composite_int4 
+       WHERE smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[], false) > 0.6 ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 | 0.886405
+  9 | 0.842927
+  8 | 0.797053
+ 11 | 0.773192
+  7 | 0.748331
+  6 | 0.696143
+ 12 | 0.682191
+  5 | 0.639602
+ 13 | 0.607744
+(9 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[], false) AS s 
+       FROM test_composite_int4 
+       WHERE smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[], false) > 0.6 ORDER BY s DESC, t;
+ t |    s     
+---+----------
+ 8 | 0.730632
+ 7 | 0.668153
+ 9 | 0.618147
+(3 rows)
+
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[], true) AS s 
+       FROM test_composite_int4 
+       WHERE smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::cint[], true) > 0.6 ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   1 |        1
+   2 | 0.948683
+   3 |  0.92582
+   4 | 0.912871
+   5 | 0.904534
+   6 | 0.898717
+   7 | 0.894427
+   8 | 0.891133
+   9 | 0.888523
+  10 | 0.886405
+  11 | 0.886405
+  12 | 0.886405
+  13 | 0.886405
+  14 | 0.886405
+  15 | 0.886405
+  16 | 0.886405
+  17 | 0.886405
+  18 | 0.886405
+  19 | 0.886405
+  20 | 0.886405
+  21 | 0.886405
+  22 | 0.886405
+  23 | 0.886405
+  24 | 0.886405
+  25 | 0.886405
+  26 | 0.886405
+  27 | 0.886405
+  28 | 0.886405
+  29 | 0.886405
+  30 | 0.886405
+  31 | 0.886405
+  32 | 0.886405
+  33 | 0.886405
+  34 | 0.886405
+  35 | 0.886405
+  36 | 0.886405
+  37 | 0.886405
+  38 | 0.886405
+  39 | 0.886405
+  40 | 0.886405
+  41 | 0.886405
+  42 | 0.886405
+  43 | 0.886405
+  44 | 0.886405
+  45 | 0.886405
+  46 | 0.886405
+  47 | 0.886405
+  48 | 0.886405
+  49 | 0.886405
+  50 | 0.886405
+  51 | 0.886405
+  52 | 0.886405
+  53 | 0.886405
+  54 | 0.886405
+  55 | 0.886405
+  56 | 0.886405
+  57 | 0.886405
+  58 | 0.886405
+  59 | 0.886405
+  60 | 0.886405
+  61 | 0.886405
+  62 | 0.886405
+  63 | 0.886405
+  64 | 0.886405
+  65 | 0.886405
+  66 | 0.886405
+  67 | 0.886405
+  68 | 0.886405
+  69 | 0.886405
+  70 | 0.886405
+  71 | 0.886405
+  72 | 0.886405
+  73 | 0.886405
+  74 | 0.886405
+  75 | 0.886405
+  76 | 0.886405
+  77 | 0.886405
+  78 | 0.886405
+  79 | 0.886405
+  80 | 0.886405
+  81 | 0.886405
+  82 | 0.886405
+  83 | 0.886405
+  84 | 0.886405
+  85 | 0.886405
+  86 | 0.886405
+  87 | 0.886405
+  88 | 0.886405
+  89 | 0.886405
+  90 | 0.886405
+  91 | 0.886405
+  92 | 0.886405
+  93 | 0.886405
+  94 | 0.886405
+  95 | 0.886405
+  96 | 0.886405
+  97 | 0.886405
+  98 | 0.886405
+  99 | 0.886405
+ 100 | 0.886405
+ 101 | 0.886405
+ 102 | 0.886405
+ 103 | 0.886405
+ 104 | 0.886405
+ 105 | 0.886405
+ 106 | 0.886405
+ 107 | 0.886405
+ 108 | 0.886405
+ 109 | 0.886405
+ 110 | 0.886405
+ 111 | 0.886405
+ 112 | 0.886405
+ 113 | 0.886405
+ 114 | 0.886405
+ 115 | 0.886405
+ 116 | 0.886405
+ 117 | 0.886405
+ 118 | 0.886405
+ 119 | 0.886405
+ 120 | 0.886405
+ 121 | 0.886405
+ 122 | 0.886405
+ 123 | 0.886405
+ 124 | 0.886405
+ 125 | 0.886405
+ 126 | 0.886405
+ 127 | 0.886405
+ 128 | 0.886405
+ 129 | 0.886405
+ 130 | 0.886405
+ 131 | 0.886405
+ 132 | 0.886405
+ 133 | 0.886405
+ 134 | 0.886405
+ 135 | 0.886405
+ 136 | 0.886405
+ 137 | 0.886405
+ 138 | 0.886405
+ 139 | 0.886405
+ 140 | 0.886405
+ 141 | 0.886405
+ 142 | 0.886405
+ 143 | 0.886405
+ 144 | 0.886405
+ 145 | 0.886405
+ 146 | 0.886405
+ 147 | 0.886405
+ 148 | 0.886405
+ 149 | 0.886405
+ 150 | 0.886405
+ 151 | 0.886405
+ 152 | 0.886405
+ 153 | 0.886405
+ 154 | 0.886405
+ 155 | 0.886405
+ 156 | 0.886405
+ 157 | 0.886405
+ 158 | 0.886405
+ 159 | 0.886405
+ 160 | 0.886405
+ 161 | 0.886405
+ 162 | 0.886405
+ 163 | 0.886405
+ 164 | 0.886405
+ 165 | 0.886405
+ 166 | 0.886405
+ 167 | 0.886405
+ 168 | 0.886405
+ 169 | 0.886405
+ 170 | 0.886405
+ 171 | 0.886405
+ 172 | 0.886405
+ 173 | 0.886405
+ 174 | 0.886405
+ 175 | 0.886405
+ 176 | 0.886405
+ 177 | 0.886405
+ 178 | 0.886405
+ 179 | 0.886405
+ 180 | 0.886405
+ 181 | 0.886405
+ 182 | 0.886405
+ 183 | 0.886405
+ 184 | 0.886405
+ 185 | 0.886405
+ 186 | 0.886405
+ 187 | 0.886405
+ 188 | 0.886405
+ 189 | 0.886405
+ 190 | 0.886405
+ 191 | 0.886405
+ 192 | 0.886405
+ 193 | 0.886405
+ 194 | 0.886405
+ 195 | 0.886405
+ 196 | 0.886405
+ 197 | 0.886405
+ 198 | 0.886405
+ 199 | 0.886405
+ 200 | 0.886405
+(200 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[], true) AS s 
+       FROM test_composite_int4 
+       WHERE smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::cint[], true) > 0.6 ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   1 |        1
+   2 | 0.948683
+   3 | 0.948683
+   8 | 0.893198
+   9 | 0.893198
+  10 | 0.893198
+  11 | 0.893198
+  12 | 0.893198
+  13 | 0.893198
+  14 | 0.893198
+  15 | 0.893198
+  16 | 0.893198
+  17 | 0.893198
+  18 | 0.893198
+  19 | 0.893198
+  20 | 0.893198
+  21 | 0.893198
+  22 | 0.893198
+  23 | 0.893198
+  24 | 0.893198
+  25 | 0.893198
+  26 | 0.893198
+  27 | 0.893198
+  28 | 0.893198
+  29 | 0.893198
+  30 | 0.893198
+  31 | 0.893198
+  32 | 0.893198
+   7 |  0.89172
+   6 | 0.888957
+   5 | 0.884652
+   4 | 0.881917
+  50 | 0.663459
+  51 | 0.663459
+  52 | 0.663459
+  53 | 0.663459
+  54 | 0.663459
+  55 | 0.663459
+  56 | 0.663459
+  57 | 0.663459
+  58 | 0.663459
+  59 | 0.663459
+  60 | 0.663459
+  61 | 0.663459
+  62 | 0.663459
+  63 | 0.663459
+  64 | 0.663459
+  65 | 0.663459
+  66 | 0.663459
+  67 | 0.663459
+  68 | 0.663459
+  69 | 0.663459
+  70 | 0.663459
+  71 | 0.663459
+  72 | 0.663459
+  73 | 0.663459
+  74 | 0.663459
+  75 | 0.663459
+  76 | 0.663459
+  77 | 0.663459
+  78 | 0.663459
+  79 | 0.663459
+  80 | 0.663459
+  81 | 0.663459
+  82 | 0.663459
+  83 | 0.663459
+  84 | 0.663459
+  85 | 0.663459
+  86 | 0.663459
+  87 | 0.663459
+  88 | 0.663459
+  89 | 0.663459
+  90 | 0.663459
+  91 | 0.663459
+  92 | 0.663459
+  93 | 0.663459
+  94 | 0.663459
+  95 | 0.663459
+  96 | 0.663459
+  97 | 0.663459
+  98 | 0.663459
+  99 | 0.663459
+ 100 | 0.663459
+ 101 | 0.663459
+ 102 | 0.663459
+ 103 | 0.663459
+ 104 | 0.663459
+ 105 | 0.663459
+ 106 | 0.663459
+ 107 | 0.663459
+ 108 | 0.663459
+ 109 | 0.663459
+ 110 | 0.663459
+ 111 | 0.663459
+ 112 | 0.663459
+ 113 | 0.663459
+ 114 | 0.663459
+ 115 | 0.663459
+ 116 | 0.663459
+ 117 | 0.663459
+ 118 | 0.663459
+ 119 | 0.663459
+ 120 | 0.663459
+ 121 | 0.663459
+ 122 | 0.663459
+ 123 | 0.663459
+ 124 | 0.663459
+ 125 | 0.663459
+ 126 | 0.663459
+ 127 | 0.663459
+ 128 | 0.663459
+ 129 | 0.663459
+ 130 | 0.663459
+ 131 | 0.663459
+ 132 | 0.663459
+ 133 | 0.663459
+ 134 | 0.663459
+ 135 | 0.663459
+ 136 | 0.663459
+ 137 | 0.663459
+ 138 | 0.663459
+ 139 | 0.663459
+ 140 | 0.663459
+ 141 | 0.663459
+ 142 | 0.663459
+ 143 | 0.663459
+ 144 | 0.663459
+ 145 | 0.663459
+ 146 | 0.663459
+ 147 | 0.663459
+ 148 | 0.663459
+ 149 | 0.663459
+ 150 | 0.663459
+ 151 | 0.663459
+ 152 | 0.663459
+ 153 | 0.663459
+ 154 | 0.663459
+ 155 | 0.663459
+ 156 | 0.663459
+ 157 | 0.663459
+ 158 | 0.663459
+ 159 | 0.663459
+ 160 | 0.663459
+ 161 | 0.663459
+ 162 | 0.663459
+ 163 | 0.663459
+ 164 | 0.663459
+ 165 | 0.663459
+ 166 | 0.663459
+ 167 | 0.663459
+ 168 | 0.663459
+ 169 | 0.663459
+ 170 | 0.663459
+ 171 | 0.663459
+ 172 | 0.663459
+ 173 | 0.663459
+ 174 | 0.663459
+ 175 | 0.663459
+ 176 | 0.663459
+ 177 | 0.663459
+ 178 | 0.663459
+ 179 | 0.663459
+ 180 | 0.663459
+ 181 | 0.663459
+ 182 | 0.663459
+ 183 | 0.663459
+ 184 | 0.663459
+ 185 | 0.663459
+ 186 | 0.663459
+ 187 | 0.663459
+ 188 | 0.663459
+ 189 | 0.663459
+ 190 | 0.663459
+ 191 | 0.663459
+ 192 | 0.663459
+ 193 | 0.663459
+ 194 | 0.663459
+ 195 | 0.663459
+ 196 | 0.663459
+ 197 | 0.663459
+ 198 | 0.663459
+ 199 | 0.663459
+ 200 | 0.663459
+  33 | 0.651203
+  34 | 0.651203
+  35 | 0.651203
+  36 | 0.651203
+  37 | 0.651203
+  38 | 0.651203
+  39 | 0.651203
+  40 | 0.651203
+  41 | 0.651203
+  42 | 0.651203
+  43 | 0.651203
+  44 | 0.651203
+  45 | 0.651203
+  46 | 0.651203
+  47 | 0.651203
+  48 | 0.651203
+  49 | 0.631477
+(200 rows)
+
diff --git a/expected/composite_text.out b/expected/composite_text.out
new file mode 100644 (file)
index 0000000..0b77edc
--- /dev/null
@@ -0,0 +1,550 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+CREATE TYPE ctext AS (id text, w float4);
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       (ROW(v::text, v::float4))::ctext
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_composite_text
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[]) AS s 
+       FROM test_composite_text 
+       WHERE v % '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[]) AS s 
+       FROM test_composite_text 
+       WHERE v % '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[]) AS s 
+       FROM test_composite_text 
+       WHERE smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[]) > 0.6 ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[]) AS s 
+       FROM test_composite_text 
+       WHERE smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[]) > 0.6 ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[], false) AS s 
+       FROM test_composite_text 
+       WHERE smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[], false) > 0.6 ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 | 0.886405
+  9 | 0.842927
+  8 | 0.797053
+ 11 | 0.773192
+  7 | 0.748331
+  6 | 0.696143
+ 12 | 0.682191
+  5 | 0.639602
+ 13 | 0.607744
+(9 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[], false) AS s 
+       FROM test_composite_text 
+       WHERE smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[], false) > 0.6 ORDER BY s DESC, t;
+ t |    s     
+---+----------
+ 8 | 0.730632
+ 7 | 0.668153
+ 9 | 0.618147
+(3 rows)
+
+SELECT t, smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[], true) AS s 
+       FROM test_composite_text 
+       WHERE smlar(v, '{"(10,1)", "(9,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(3,1)", "(2,1)", "(1,1)"}'::ctext[], true) > 0.6 ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   1 |        1
+   2 | 0.948683
+   3 |  0.92582
+   4 | 0.912871
+   5 | 0.904534
+   6 | 0.898717
+   7 | 0.894427
+   8 | 0.891133
+   9 | 0.888523
+  10 | 0.886405
+  11 | 0.886405
+  12 | 0.886405
+  13 | 0.886405
+  14 | 0.886405
+  15 | 0.886405
+  16 | 0.886405
+  17 | 0.886405
+  18 | 0.886405
+  19 | 0.886405
+  20 | 0.886405
+  21 | 0.886405
+  22 | 0.886405
+  23 | 0.886405
+  24 | 0.886405
+  25 | 0.886405
+  26 | 0.886405
+  27 | 0.886405
+  28 | 0.886405
+  29 | 0.886405
+  30 | 0.886405
+  31 | 0.886405
+  32 | 0.886405
+  33 | 0.886405
+  34 | 0.886405
+  35 | 0.886405
+  36 | 0.886405
+  37 | 0.886405
+  38 | 0.886405
+  39 | 0.886405
+  40 | 0.886405
+  41 | 0.886405
+  42 | 0.886405
+  43 | 0.886405
+  44 | 0.886405
+  45 | 0.886405
+  46 | 0.886405
+  47 | 0.886405
+  48 | 0.886405
+  49 | 0.886405
+  50 | 0.886405
+  51 | 0.886405
+  52 | 0.886405
+  53 | 0.886405
+  54 | 0.886405
+  55 | 0.886405
+  56 | 0.886405
+  57 | 0.886405
+  58 | 0.886405
+  59 | 0.886405
+  60 | 0.886405
+  61 | 0.886405
+  62 | 0.886405
+  63 | 0.886405
+  64 | 0.886405
+  65 | 0.886405
+  66 | 0.886405
+  67 | 0.886405
+  68 | 0.886405
+  69 | 0.886405
+  70 | 0.886405
+  71 | 0.886405
+  72 | 0.886405
+  73 | 0.886405
+  74 | 0.886405
+  75 | 0.886405
+  76 | 0.886405
+  77 | 0.886405
+  78 | 0.886405
+  79 | 0.886405
+  80 | 0.886405
+  81 | 0.886405
+  82 | 0.886405
+  83 | 0.886405
+  84 | 0.886405
+  85 | 0.886405
+  86 | 0.886405
+  87 | 0.886405
+  88 | 0.886405
+  89 | 0.886405
+  90 | 0.886405
+  91 | 0.886405
+  92 | 0.886405
+  93 | 0.886405
+  94 | 0.886405
+  95 | 0.886405
+  96 | 0.886405
+  97 | 0.886405
+  98 | 0.886405
+  99 | 0.886405
+ 100 | 0.886405
+ 101 | 0.886405
+ 102 | 0.886405
+ 103 | 0.886405
+ 104 | 0.886405
+ 105 | 0.886405
+ 106 | 0.886405
+ 107 | 0.886405
+ 108 | 0.886405
+ 109 | 0.886405
+ 110 | 0.886405
+ 111 | 0.886405
+ 112 | 0.886405
+ 113 | 0.886405
+ 114 | 0.886405
+ 115 | 0.886405
+ 116 | 0.886405
+ 117 | 0.886405
+ 118 | 0.886405
+ 119 | 0.886405
+ 120 | 0.886405
+ 121 | 0.886405
+ 122 | 0.886405
+ 123 | 0.886405
+ 124 | 0.886405
+ 125 | 0.886405
+ 126 | 0.886405
+ 127 | 0.886405
+ 128 | 0.886405
+ 129 | 0.886405
+ 130 | 0.886405
+ 131 | 0.886405
+ 132 | 0.886405
+ 133 | 0.886405
+ 134 | 0.886405
+ 135 | 0.886405
+ 136 | 0.886405
+ 137 | 0.886405
+ 138 | 0.886405
+ 139 | 0.886405
+ 140 | 0.886405
+ 141 | 0.886405
+ 142 | 0.886405
+ 143 | 0.886405
+ 144 | 0.886405
+ 145 | 0.886405
+ 146 | 0.886405
+ 147 | 0.886405
+ 148 | 0.886405
+ 149 | 0.886405
+ 150 | 0.886405
+ 151 | 0.886405
+ 152 | 0.886405
+ 153 | 0.886405
+ 154 | 0.886405
+ 155 | 0.886405
+ 156 | 0.886405
+ 157 | 0.886405
+ 158 | 0.886405
+ 159 | 0.886405
+ 160 | 0.886405
+ 161 | 0.886405
+ 162 | 0.886405
+ 163 | 0.886405
+ 164 | 0.886405
+ 165 | 0.886405
+ 166 | 0.886405
+ 167 | 0.886405
+ 168 | 0.886405
+ 169 | 0.886405
+ 170 | 0.886405
+ 171 | 0.886405
+ 172 | 0.886405
+ 173 | 0.886405
+ 174 | 0.886405
+ 175 | 0.886405
+ 176 | 0.886405
+ 177 | 0.886405
+ 178 | 0.886405
+ 179 | 0.886405
+ 180 | 0.886405
+ 181 | 0.886405
+ 182 | 0.886405
+ 183 | 0.886405
+ 184 | 0.886405
+ 185 | 0.886405
+ 186 | 0.886405
+ 187 | 0.886405
+ 188 | 0.886405
+ 189 | 0.886405
+ 190 | 0.886405
+ 191 | 0.886405
+ 192 | 0.886405
+ 193 | 0.886405
+ 194 | 0.886405
+ 195 | 0.886405
+ 196 | 0.886405
+ 197 | 0.886405
+ 198 | 0.886405
+ 199 | 0.886405
+ 200 | 0.886405
+(200 rows)
+
+SELECT t, smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[], true) AS s 
+       FROM test_composite_text 
+       WHERE smlar(v, '{"(50,1)", "(49,1)", "(8,1)", "(7,1)", "(6,1)", "(5,1)", "(4,1)", "(33,1)", "(2,1)", "(1,1)"}'::ctext[], true) > 0.6 ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   1 |        1
+   2 | 0.948683
+   3 | 0.948683
+   8 | 0.893198
+   9 | 0.893198
+  10 | 0.893198
+  11 | 0.893198
+  12 | 0.893198
+  13 | 0.893198
+  14 | 0.893198
+  15 | 0.893198
+  16 | 0.893198
+  17 | 0.893198
+  18 | 0.893198
+  19 | 0.893198
+  20 | 0.893198
+  21 | 0.893198
+  22 | 0.893198
+  23 | 0.893198
+  24 | 0.893198
+  25 | 0.893198
+  26 | 0.893198
+  27 | 0.893198
+  28 | 0.893198
+  29 | 0.893198
+  30 | 0.893198
+  31 | 0.893198
+  32 | 0.893198
+   7 |  0.89172
+   6 | 0.888957
+   5 | 0.884652
+   4 | 0.881917
+  50 | 0.663459
+  51 | 0.663459
+  52 | 0.663459
+  53 | 0.663459
+  54 | 0.663459
+  55 | 0.663459
+  56 | 0.663459
+  57 | 0.663459
+  58 | 0.663459
+  59 | 0.663459
+  60 | 0.663459
+  61 | 0.663459
+  62 | 0.663459
+  63 | 0.663459
+  64 | 0.663459
+  65 | 0.663459
+  66 | 0.663459
+  67 | 0.663459
+  68 | 0.663459
+  69 | 0.663459
+  70 | 0.663459
+  71 | 0.663459
+  72 | 0.663459
+  73 | 0.663459
+  74 | 0.663459
+  75 | 0.663459
+  76 | 0.663459
+  77 | 0.663459
+  78 | 0.663459
+  79 | 0.663459
+  80 | 0.663459
+  81 | 0.663459
+  82 | 0.663459
+  83 | 0.663459
+  84 | 0.663459
+  85 | 0.663459
+  86 | 0.663459
+  87 | 0.663459
+  88 | 0.663459
+  89 | 0.663459
+  90 | 0.663459
+  91 | 0.663459
+  92 | 0.663459
+  93 | 0.663459
+  94 | 0.663459
+  95 | 0.663459
+  96 | 0.663459
+  97 | 0.663459
+  98 | 0.663459
+  99 | 0.663459
+ 100 | 0.663459
+ 101 | 0.663459
+ 102 | 0.663459
+ 103 | 0.663459
+ 104 | 0.663459
+ 105 | 0.663459
+ 106 | 0.663459
+ 107 | 0.663459
+ 108 | 0.663459
+ 109 | 0.663459
+ 110 | 0.663459
+ 111 | 0.663459
+ 112 | 0.663459
+ 113 | 0.663459
+ 114 | 0.663459
+ 115 | 0.663459
+ 116 | 0.663459
+ 117 | 0.663459
+ 118 | 0.663459
+ 119 | 0.663459
+ 120 | 0.663459
+ 121 | 0.663459
+ 122 | 0.663459
+ 123 | 0.663459
+ 124 | 0.663459
+ 125 | 0.663459
+ 126 | 0.663459
+ 127 | 0.663459
+ 128 | 0.663459
+ 129 | 0.663459
+ 130 | 0.663459
+ 131 | 0.663459
+ 132 | 0.663459
+ 133 | 0.663459
+ 134 | 0.663459
+ 135 | 0.663459
+ 136 | 0.663459
+ 137 | 0.663459
+ 138 | 0.663459
+ 139 | 0.663459
+ 140 | 0.663459
+ 141 | 0.663459
+ 142 | 0.663459
+ 143 | 0.663459
+ 144 | 0.663459
+ 145 | 0.663459
+ 146 | 0.663459
+ 147 | 0.663459
+ 148 | 0.663459
+ 149 | 0.663459
+ 150 | 0.663459
+ 151 | 0.663459
+ 152 | 0.663459
+ 153 | 0.663459
+ 154 | 0.663459
+ 155 | 0.663459
+ 156 | 0.663459
+ 157 | 0.663459
+ 158 | 0.663459
+ 159 | 0.663459
+ 160 | 0.663459
+ 161 | 0.663459
+ 162 | 0.663459
+ 163 | 0.663459
+ 164 | 0.663459
+ 165 | 0.663459
+ 166 | 0.663459
+ 167 | 0.663459
+ 168 | 0.663459
+ 169 | 0.663459
+ 170 | 0.663459
+ 171 | 0.663459
+ 172 | 0.663459
+ 173 | 0.663459
+ 174 | 0.663459
+ 175 | 0.663459
+ 176 | 0.663459
+ 177 | 0.663459
+ 178 | 0.663459
+ 179 | 0.663459
+ 180 | 0.663459
+ 181 | 0.663459
+ 182 | 0.663459
+ 183 | 0.663459
+ 184 | 0.663459
+ 185 | 0.663459
+ 186 | 0.663459
+ 187 | 0.663459
+ 188 | 0.663459
+ 189 | 0.663459
+ 190 | 0.663459
+ 191 | 0.663459
+ 192 | 0.663459
+ 193 | 0.663459
+ 194 | 0.663459
+ 195 | 0.663459
+ 196 | 0.663459
+ 197 | 0.663459
+ 198 | 0.663459
+ 199 | 0.663459
+ 200 | 0.663459
+  33 | 0.651203
+  34 | 0.651203
+  35 | 0.651203
+  36 | 0.651203
+  37 | 0.651203
+  38 | 0.651203
+  39 | 0.651203
+  40 | 0.651203
+  41 | 0.651203
+  42 | 0.651203
+  43 | 0.651203
+  44 | 0.651203
+  45 | 0.651203
+  46 | 0.651203
+  47 | 0.651203
+  48 | 0.651203
+  49 | 0.631477
+(200 rows)
+
diff --git a/expected/date.out b/expected/date.out
new file mode 100644 (file)
index 0000000..10b7fe3
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       epoch2timestamp(v)::date
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_date
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::date[]) AS s FROM test_date WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::date[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::date[]) AS s FROM test_date WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::date[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_date ON test_date USING gist (v _date_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::date[]) AS s FROM test_date WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::date[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::date[]) AS s FROM test_date WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::date[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_date;
+CREATE INDEX idx_test_date ON test_date USING gin (v _date_sml_ops);
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::date[]) AS s FROM test_date WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::date[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::date[]) AS s FROM test_date WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::date[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/float4.out b/expected/float4.out
new file mode 100644 (file)
index 0000000..70eb507
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::float4
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_float4
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_float4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_float4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_float4 ON test_float4 USING gist (v _float4_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_float4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_float4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_float4;
+CREATE INDEX idx_test_float4 ON test_float4 USING gin (v _float4_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_float4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_float4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/float8.out b/expected/float8.out
new file mode 100644 (file)
index 0000000..4a9286f
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::float8
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_float8
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_float8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_float8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_float8 ON test_float8 USING gist (v _float8_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_float8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_float8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_float8;
+CREATE INDEX idx_test_float8 ON test_float8 USING gin (v _float8_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_float8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_float8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/inet.out b/expected/inet.out
new file mode 100644 (file)
index 0000000..7bde3d8
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       ( '192.168.1.' || (v % 256) )::inet
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_inet
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}') AS s FROM test_inet WHERE v % '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}') AS s FROM test_inet WHERE v % '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_inet ON test_inet USING gist (v _inet_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}') AS s FROM test_inet WHERE v % '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}') AS s FROM test_inet WHERE v % '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_inet;
+CREATE INDEX idx_test_inet ON test_inet USING gin (v _inet_sml_ops);
+SELECT t, smlar(v, '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}') AS s FROM test_inet WHERE v % '{192.168.1.10,192.168.1.9,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.3,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}') AS s FROM test_inet WHERE v % '{192.168.1.50,192.168.1.49,192.168.1.8,192.168.1.7,192.168.1.6,192.168.1.5,192.168.1.4,192.168.1.33,192.168.1.2,192.168.1.1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/int2.out b/expected/int2.out
new file mode 100644 (file)
index 0000000..8c43891
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::int2
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_int2
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int2 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int2 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_int2 ON test_int2 USING gist (v _int2_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int2 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int2 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_int2;
+CREATE INDEX idx_test_int2 ON test_int2 USING gin (v _int2_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int2 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int2 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/int4.out b/expected/int4.out
new file mode 100644 (file)
index 0000000..1f69657
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::int4
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_int4
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_int4 ON test_int4 USING gist (v _int4_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_int4;
+CREATE INDEX idx_test_int4 ON test_int4 USING gin (v _int4_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/int4g.out b/expected/int4g.out
new file mode 100644 (file)
index 0000000..dfa75f6
--- /dev/null
@@ -0,0 +1,1633 @@
+SELECT set_smlar_limit(0.3);
+ set_smlar_limit 
+-----------------
+             0.3
+(1 row)
+
+SET smlar.type = "tfidf";
+SET smlar.stattable = "int4_stat";
+UPDATE test_int4 SET v = v || '{50,50,50}'::int4[] WHERE t >=50 AND t < 60;
+INSERT INTO test_int4 VALUES(201, '{50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50}'); 
+CREATE TABLE int4_stat (
+    value   int4 UNIQUE,
+       ndoc    int4 NOT NULL CHECK (ndoc>0)
+);
+NOTICE:  CREATE TABLE / UNIQUE will create implicit index "int4_stat_value_key" for table "int4_stat"
+INSERT INTO int4_stat (
+    SELECT
+               q.w,
+               count(*)
+       FROM
+               (SELECT array_to_col(v) AS w FROM test_int4 WHERE v IS NOT NULL)  AS q
+       GROUP BY w
+);
+INSERT INTO int4_stat VALUES (NULL, (SELECT count(*) FROM test_int4));
+DROP INDEX idx_test_int4;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+CREATE INDEX idx_test_int4 ON test_int4 USING gist (v _int4_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+DROP INDEX idx_test_int4;
+CREATE INDEX idx_test_int4 ON test_int4 USING gin (v _int4_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int4 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int4 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+RESET enable_seqscan;
diff --git a/expected/int4i.out b/expected/int4i.out
new file mode 100644 (file)
index 0000000..81e8284
--- /dev/null
@@ -0,0 +1,41 @@
+SELECT set_smlar_limit(5.0);
+ set_smlar_limit 
+-----------------
+               5
+(1 row)
+
+SET smlar.type='overlap';
+DROP INDEX idx_test_int4;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int4[]);
+ smlar 
+-------
+     2
+(1 row)
+
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_int4 WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+CREATE INDEX idx_test_int4 ON test_int4 USING gin (v _int4_sml_ops);
+SET enable_seqscan = off;
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_int4 WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+RESET enable_seqscan;
diff --git a/expected/int8.out b/expected/int8.out
new file mode 100644 (file)
index 0000000..ee943d2
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::int8
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_int8
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_int8 ON test_int8 USING gist (v _int8_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_int8;
+CREATE INDEX idx_test_int8 ON test_int8 USING gin (v _int8_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/int8g.out b/expected/int8g.out
new file mode 100644 (file)
index 0000000..c77879d
--- /dev/null
@@ -0,0 +1,1633 @@
+SELECT set_smlar_limit(0.3);
+ set_smlar_limit 
+-----------------
+             0.3
+(1 row)
+
+SET smlar.type = "tfidf";
+SET smlar.stattable = "int8_stat";
+UPDATE test_int8 SET v = v || '{50,50,50}'::int8[] WHERE t >=50 AND t < 60;
+INSERT INTO test_int8 VALUES(201, '{50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50}'); 
+CREATE TABLE int8_stat (
+    value   int8 UNIQUE,
+       ndoc    int4 NOT NULL CHECK (ndoc>0)
+);
+NOTICE:  CREATE TABLE / UNIQUE will create implicit index "int8_stat_value_key" for table "int8_stat"
+INSERT INTO int8_stat (
+    SELECT
+               q.w,
+               count(*)
+       FROM
+               (SELECT array_to_col(v) AS w FROM test_int8 WHERE v IS NOT NULL)  AS q
+       GROUP BY w
+);
+INSERT INTO int8_stat VALUES (NULL, (SELECT count(*) FROM test_int8));
+DROP INDEX idx_test_int8;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+CREATE INDEX idx_test_int8 ON test_int8 USING gist (v _int8_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+DROP INDEX idx_test_int8;
+CREATE INDEX idx_test_int8 ON test_int8 USING gin (v _int8_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_int8 WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_int8 WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+RESET enable_seqscan;
diff --git a/expected/int8i.out b/expected/int8i.out
new file mode 100644 (file)
index 0000000..9ffcc4d
--- /dev/null
@@ -0,0 +1,41 @@
+SELECT set_smlar_limit(5.0);
+ set_smlar_limit 
+-----------------
+               5
+(1 row)
+
+SET smlar.type='overlap';
+DROP INDEX idx_test_int8;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::int8[]);
+ smlar 
+-------
+     2
+(1 row)
+
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_int8 WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+CREATE INDEX idx_test_int8 ON test_int8 USING gin (v _int8_sml_ops);
+SET enable_seqscan = off;
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_int8 WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+RESET enable_seqscan;
diff --git a/expected/interval.out b/expected/interval.out
new file mode 100644 (file)
index 0000000..a8bd2bd
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::text::interval
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_interval
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_interval ON test_interval USING gist (v _interval_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_interval;
+CREATE INDEX idx_test_interval ON test_interval USING gin (v _interval_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/intervalg.out b/expected/intervalg.out
new file mode 100644 (file)
index 0000000..9b963de
--- /dev/null
@@ -0,0 +1,1633 @@
+SELECT set_smlar_limit(0.3);
+ set_smlar_limit 
+-----------------
+             0.3
+(1 row)
+
+SET smlar.type = "tfidf";
+SET smlar.stattable = "interval_stat";
+UPDATE test_interval SET v = v || '{50,50,50}'::interval[] WHERE t >=50 AND t < 60;
+INSERT INTO test_interval VALUES(201, '{50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50}'); 
+CREATE TABLE interval_stat (
+    value   interval UNIQUE,
+       ndoc    int4 NOT NULL CHECK (ndoc>0)
+);
+NOTICE:  CREATE TABLE / UNIQUE will create implicit index "interval_stat_value_key" for table "interval_stat"
+INSERT INTO interval_stat (
+    SELECT
+               q.w,
+               count(*)
+       FROM
+               (SELECT array_to_col(v) AS w FROM test_interval WHERE v IS NOT NULL)  AS q
+       GROUP BY w
+);
+INSERT INTO interval_stat VALUES (NULL, (SELECT count(*) FROM test_interval));
+DROP INDEX idx_test_interval;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+CREATE INDEX idx_test_interval ON test_interval USING gist (v _interval_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+DROP INDEX idx_test_interval;
+CREATE INDEX idx_test_interval ON test_interval USING gin (v _interval_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_interval WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_interval WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+RESET enable_seqscan;
diff --git a/expected/intervali.out b/expected/intervali.out
new file mode 100644 (file)
index 0000000..9d34998
--- /dev/null
@@ -0,0 +1,41 @@
+SELECT set_smlar_limit(5.0);
+ set_smlar_limit 
+-----------------
+               5
+(1 row)
+
+SET smlar.type='overlap';
+DROP INDEX idx_test_interval;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::interval[]);
+ smlar 
+-------
+     2
+(1 row)
+
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_interval WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+CREATE INDEX idx_test_interval ON test_interval USING gin (v _interval_sml_ops);
+SET enable_seqscan = off;
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_interval WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+RESET enable_seqscan;
diff --git a/expected/macaddr.out b/expected/macaddr.out
new file mode 100644 (file)
index 0000000..9397042
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       ('01:01:01:01:01:' || (v % 100))::macaddr
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_macaddr
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{01:01:01:01:01:10,01:01:01:01:01:9,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:3,01:01:01:01:01:2,01:01:01:01:01:1}') AS s FROM test_macaddr WHERE v % '{01:01:01:01:01:10,01:01:01:01:01:9,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:3,01:01:01:01:01:2,01:01:01:01:01:1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{01:01:01:01:01:50,01:01:01:01:01:49,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:33,01:01:01:01:01:2,01:01:01:01:01:1}') AS s FROM test_macaddr WHERE v % '{01:01:01:01:01:50,01:01:01:01:01:49,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:33,01:01:01:01:01:2,01:01:01:01:01:1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_macaddr ON test_macaddr USING gist (v _macaddr_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{01:01:01:01:01:10,01:01:01:01:01:9,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:3,01:01:01:01:01:2,01:01:01:01:01:1}') AS s FROM test_macaddr WHERE v % '{01:01:01:01:01:10,01:01:01:01:01:9,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:3,01:01:01:01:01:2,01:01:01:01:01:1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{01:01:01:01:01:50,01:01:01:01:01:49,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:33,01:01:01:01:01:2,01:01:01:01:01:1}') AS s FROM test_macaddr WHERE v % '{01:01:01:01:01:50,01:01:01:01:01:49,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:33,01:01:01:01:01:2,01:01:01:01:01:1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_macaddr;
+CREATE INDEX idx_test_macaddr ON test_macaddr USING gin (v _macaddr_sml_ops);
+SELECT t, smlar(v, '{01:01:01:01:01:10,01:01:01:01:01:9,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:3,01:01:01:01:01:2,01:01:01:01:01:1}') AS s FROM test_macaddr WHERE v % '{01:01:01:01:01:10,01:01:01:01:01:9,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:3,01:01:01:01:01:2,01:01:01:01:01:1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{01:01:01:01:01:50,01:01:01:01:01:49,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:33,01:01:01:01:01:2,01:01:01:01:01:1}') AS s FROM test_macaddr WHERE v % '{01:01:01:01:01:50,01:01:01:01:01:49,01:01:01:01:01:8,01:01:01:01:01:7,01:01:01:01:01:6,01:01:01:01:01:5,01:01:01:01:01:4,01:01:01:01:01:33,01:01:01:01:01:2,01:01:01:01:01:1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/money.out b/expected/money.out
new file mode 100644 (file)
index 0000000..c04d690
--- /dev/null
@@ -0,0 +1,104 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::text::money
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_money
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_money WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_money WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_money ON test_money USING gin (v _money_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_money WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_money WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/numeric.out b/expected/numeric.out
new file mode 100644 (file)
index 0000000..84eb7ee
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::numeric
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_numeric
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_numeric WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_numeric WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_numeric ON test_numeric USING gist (v _numeric_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_numeric WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_numeric WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_numeric;
+CREATE INDEX idx_test_numeric ON test_numeric USING gin (v _numeric_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_numeric WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_numeric WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/oid.out b/expected/oid.out
new file mode 100644 (file)
index 0000000..c76ce6f
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::oid
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_oid
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_oid WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_oid WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_oid ON test_oid USING gist (v _oid_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_oid WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_oid WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_oid;
+CREATE INDEX idx_test_oid ON test_oid USING gin (v _oid_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_oid WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_oid WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/smlar.out b/expected/smlar.out
new file mode 100644 (file)
index 0000000..2a34641
--- /dev/null
@@ -0,0 +1,354 @@
+CREATE EXTENSION smlar;
+--sanity check
+SELECT 
+       opc.opcname, 
+       t.typname, 
+       opc.opcdefault  
+FROM 
+       pg_opclass opc, 
+       pg_am am, 
+       pg_type t, 
+       pg_type k 
+WHERE 
+       opc.opcmethod = am.oid AND 
+       am.amname='gist' AND 
+       opc.opcintype = t.oid AND 
+       opc.opckeytype = k.oid AND 
+       k.typname='gsmlsign'
+ORDER BY opc.opcname;
+       opcname        |   typname    | opcdefault 
+----------------------+--------------+------------
+ _bytea_sml_ops       | _bytea       | f
+ _char_sml_ops        | _char        | f
+ _cidr_sml_ops        | _cidr        | f
+ _date_sml_ops        | _date        | f
+ _float4_sml_ops      | _float4      | f
+ _float8_sml_ops      | _float8      | f
+ _inet_sml_ops        | _inet        | f
+ _int2_sml_ops        | _int2        | f
+ _int4_sml_ops        | _int4        | f
+ _int8_sml_ops        | _int8        | f
+ _interval_sml_ops    | _interval    | f
+ _macaddr_sml_ops     | _macaddr     | f
+ _numeric_sml_ops     | _numeric     | f
+ _oid_sml_ops         | _oid         | f
+ _text_sml_ops        | _text        | f
+ _time_sml_ops        | _time        | f
+ _timestamp_sml_ops   | _timestamp   | f
+ _timestamptz_sml_ops | _timestamptz | f
+ _timetz_sml_ops      | _timetz      | f
+ _varchar_sml_ops     | _varchar     | f
+(20 rows)
+
+SELECT 
+       opc.opcname, 
+       t.typname, 
+       opc.opcdefault  
+FROM 
+       pg_opclass opc, 
+       pg_am am, 
+       pg_type t
+WHERE 
+       opc.opcmethod = am.oid AND 
+       am.amname='gin' AND 
+       opc.opcintype = t.oid AND 
+       opc.opcname ~ '_sml_ops$'
+ORDER BY opc.opcname;
+       opcname        |   typname    | opcdefault 
+----------------------+--------------+------------
+ _bit_sml_ops         | _bit         | f
+ _bytea_sml_ops       | _bytea       | f
+ _char_sml_ops        | _char        | f
+ _cidr_sml_ops        | _cidr        | f
+ _date_sml_ops        | _date        | f
+ _float4_sml_ops      | _float4      | f
+ _float8_sml_ops      | _float8      | f
+ _inet_sml_ops        | _inet        | f
+ _int2_sml_ops        | _int2        | f
+ _int4_sml_ops        | _int4        | f
+ _int8_sml_ops        | _int8        | f
+ _interval_sml_ops    | _interval    | f
+ _macaddr_sml_ops     | _macaddr     | f
+ _money_sml_ops       | _money       | f
+ _numeric_sml_ops     | _numeric     | f
+ _oid_sml_ops         | _oid         | f
+ _text_sml_ops        | _text        | f
+ _time_sml_ops        | _time        | f
+ _timestamp_sml_ops   | _timestamp   | f
+ _timestamptz_sml_ops | _timestamptz | f
+ _timetz_sml_ops      | _timetz      | f
+ _varbit_sml_ops      | _varbit      | f
+ _varchar_sml_ops     | _varchar     | f
+(23 rows)
+
+SELECT 
+    trim( leading '_'  from t.typname ) || '[]' AS "Array Type",
+    gin.opcname AS "GIN operator class",
+    gist.opcname AS "GiST operator class"
+FROM
+    (
+        SELECT *
+        FROM
+            pg_catalog.pg_opclass,
+            pg_catalog.pg_am
+        WHERE
+            pg_opclass.opcmethod = pg_am.oid AND
+            pg_am.amname = 'gin' AND
+            pg_opclass.opcname ~ '_sml_ops$'
+    ) AS gin
+    FULL OUTER JOIN
+        (
+            SELECT *
+            FROM
+                pg_catalog.pg_opclass,
+                pg_catalog.pg_am
+            WHERE
+                pg_opclass.opcmethod = pg_am.oid AND
+                pg_am.amname = 'gist' AND
+                pg_opclass.opcname ~ '_sml_ops$'
+        ) AS gist
+        ON (
+            gist.opcname = gin.opcname AND 
+            gist.opcintype = gin.opcintype 
+        ),
+    pg_catalog.pg_type t
+WHERE
+    t.oid = COALESCE(gist.opcintype, gin.opcintype) AND
+    t.typarray = 0
+ORDER BY
+    "Array Type" ASC 
+;
+  Array Type   |  GIN operator class  | GiST operator class  
+---------------+----------------------+----------------------
+ bit[]         | _bit_sml_ops         | 
+ bytea[]       | _bytea_sml_ops       | _bytea_sml_ops
+ char[]        | _char_sml_ops        | _char_sml_ops
+ cidr[]        | _cidr_sml_ops        | _cidr_sml_ops
+ date[]        | _date_sml_ops        | _date_sml_ops
+ float4[]      | _float4_sml_ops      | _float4_sml_ops
+ float8[]      | _float8_sml_ops      | _float8_sml_ops
+ inet[]        | _inet_sml_ops        | _inet_sml_ops
+ int2[]        | _int2_sml_ops        | _int2_sml_ops
+ int4[]        | _int4_sml_ops        | _int4_sml_ops
+ int8[]        | _int8_sml_ops        | _int8_sml_ops
+ interval[]    | _interval_sml_ops    | _interval_sml_ops
+ macaddr[]     | _macaddr_sml_ops     | _macaddr_sml_ops
+ money[]       | _money_sml_ops       | 
+ numeric[]     | _numeric_sml_ops     | _numeric_sml_ops
+ oid[]         | _oid_sml_ops         | _oid_sml_ops
+ text[]        | _text_sml_ops        | _text_sml_ops
+ time[]        | _time_sml_ops        | _time_sml_ops
+ timestamp[]   | _timestamp_sml_ops   | _timestamp_sml_ops
+ timestamptz[] | _timestamptz_sml_ops | _timestamptz_sml_ops
+ timetz[]      | _timetz_sml_ops      | _timetz_sml_ops
+ varbit[]      | _varbit_sml_ops      | 
+ varchar[]     | _varchar_sml_ops     | _varchar_sml_ops
+(23 rows)
+
+SELECT set_smlar_limit(0.1);
+ set_smlar_limit 
+-----------------
+             0.1
+(1 row)
+
+SET smlar.threshold = 0.6;
+--First checks
+SELECT smlar('{3,2}'::int[], '{3,2,1}');
+  smlar   
+----------
+ 0.816497
+(1 row)
+
+SELECT smlar('{2,1}'::int[], '{3,2,1}');
+  smlar   
+----------
+ 0.816497
+(1 row)
+
+SELECT smlar('{}'::int[], '{3,2,1}');
+ smlar 
+-------
+     0
+(1 row)
+
+SELECT smlar('{12,10}'::int[], '{3,2,1}');
+ smlar 
+-------
+     0
+(1 row)
+
+SELECT smlar('{123}'::int[], '{}');
+ smlar 
+-------
+     0
+(1 row)
+
+SELECT smlar('{1,4,6}'::int[], '{1,4,6}');
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT smlar('{1,4,6}'::int[], '{6,4,1}');
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT smlar('{1,4,6}'::int[], '{5,4,6}');
+  smlar   
+----------
+ 0.666667
+(1 row)
+
+SELECT smlar('{1,4,6}'::int[], '{5,4,6}');
+  smlar   
+----------
+ 0.666667
+(1 row)
+
+SELECT smlar('{1,2}'::int[], '{2,2,2,2,2,1}');
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT smlar('{1,2}'::int[], '{1,2,2,2,2,2}');
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT smlar('{}'::int[], '{3}');
+ smlar 
+-------
+     0
+(1 row)
+
+SELECT smlar('{3}'::int[], '{3}');
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT smlar('{2}'::int[], '{3}');
+ smlar 
+-------
+     0
+(1 row)
+
+SELECT smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / (N.a + N.b)' );
+  smlar   
+----------
+ 0.333333
+(1 row)
+
+SELECT smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / sqrt(N.a * N.b)' );
+  smlar   
+----------
+ 0.666667
+(1 row)
+
+SELECT tsvector2textarray('qwe:12 asd:45');
+ tsvector2textarray 
+--------------------
+ {asd,qwe}
+(1 row)
+
+SELECT array_unique('{12,12,1,4,1,16}'::int4[]);
+ array_unique 
+--------------
+ {1,4,12,16}
+(1 row)
+
+SELECT array_unique('{12,12,1,4,1,16}'::bigint[]);
+ array_unique 
+--------------
+ {1,4,12,16}
+(1 row)
+
+SELECT array_unique('{12,12,1,4,1,16}'::smallint[]);
+ array_unique 
+--------------
+ {1,4,12,16}
+(1 row)
+
+SELECT array_unique('{12,12,1,4,1,16}'::text[]);
+ array_unique 
+--------------
+ {1,12,16,4}
+(1 row)
+
+SELECT array_unique('{12,12,1,4,1,16}'::varchar[]);
+ array_unique 
+--------------
+ {1,12,16,4}
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::int[], 13::int);
+ inarray 
+---------
+       0
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::int[], 12::int);
+ inarray 
+---------
+       1
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::text[], 13::text);
+ inarray 
+---------
+       0
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::text[], 12::text);
+ inarray 
+---------
+       1
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::int[], 13::int, 0.9, 0.1);
+ inarray 
+---------
+     0.1
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::int[], 12::int, 0.9, 0.1);
+ inarray 
+---------
+     0.9
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::text[], 13::text, 0.9, 0.1);
+ inarray 
+---------
+     0.1
+(1 row)
+
+SELECT inarray('{12,12,1,4,1,16}'::text[], 12::text, 0.9, 0.1);
+ inarray 
+---------
+     0.9
+(1 row)
+
+--testing function
+CREATE OR REPLACE FUNCTION epoch2timestamp(int4)
+RETURNS timestamp AS $$
+    SELECT ('1970-01-01 00:00:00'::timestamp +   ( ($1*3600*24 + $1) ::text || ' seconds' )::interval)::timestamp;
+       $$ LANGUAGE SQL RETURNS NULL ON NULL INPUT IMMUTABLE;
+CREATE OR REPLACE FUNCTION to_tsp_array(_int4)
+RETURNS _timestamp AS $$
+       SELECT ARRAY( 
+               SELECT 
+                       epoch2timestamp( $1[n] )
+               FROM
+                       generate_series( 1, array_upper( $1, 1) - array_lower( $1, 1 ) + 1 ) AS n
+       );
+       $$ LANGUAGE SQL RETURNS NULL ON NULL INPUT IMMUTABLE;
+CREATE OR REPLACE FUNCTION array_to_col(anyarray)
+RETURNS SETOF anyelement AS
+$$
+    SELECT $1[n] FROM generate_series( 1, array_upper( $1, 1) - array_lower( $1, 1 ) + 1 ) AS n;
+$$ LANGUAGE SQL RETURNS NULL ON NULL INPUT IMMUTABLE;
diff --git a/expected/text.out b/expected/text.out
new file mode 100644 (file)
index 0000000..622a89e
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::text
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_text
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_text ON test_text USING gist (v _text_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_text;
+CREATE INDEX idx_test_text ON test_text USING gin (v _text_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/textg.out b/expected/textg.out
new file mode 100644 (file)
index 0000000..3b94270
--- /dev/null
@@ -0,0 +1,1633 @@
+SELECT set_smlar_limit(0.3);
+ set_smlar_limit 
+-----------------
+             0.3
+(1 row)
+
+SET smlar.type = "tfidf";
+SET smlar.stattable = "text_stat";
+UPDATE test_text SET v = v || '{50,50,50}'::text[] WHERE t >=50 AND t < 60;
+INSERT INTO test_text VALUES(201, '{50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50}'); 
+CREATE TABLE text_stat (
+    value   text UNIQUE,
+       ndoc    int4 NOT NULL CHECK (ndoc>0)
+);
+NOTICE:  CREATE TABLE / UNIQUE will create implicit index "text_stat_value_key" for table "text_stat"
+INSERT INTO text_stat (
+    SELECT
+               q.w,
+               count(*)
+       FROM
+               (SELECT array_to_col(v) AS w FROM test_text WHERE v IS NOT NULL)  AS q
+       GROUP BY w
+);
+INSERT INTO text_stat VALUES (NULL, (SELECT count(*) FROM test_text));
+DROP INDEX idx_test_text;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+CREATE INDEX idx_test_text ON test_text USING gist (v _text_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306753
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.398379
+ 51 | 0.394635
+ 52 | 0.390962
+ 53 | 0.387358
+ 54 |  0.38382
+ 55 | 0.380346
+ 56 | 0.376933
+ 57 | 0.373581
+ 58 | 0.370286
+ 60 | 0.369012
+ 59 | 0.367048
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  50 | 0.510326
+  51 |  0.50553
+  52 | 0.500825
+  18 | 0.496591
+  53 | 0.496208
+  54 | 0.491676
+  55 | 0.487225
+  56 | 0.482854
+  19 | 0.482412
+  57 |  0.47856
+  58 |  0.47434
+  59 | 0.470191
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306662
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 50 | 0.419425
+ 49 | 0.417358
+ 51 |  0.41482
+ 52 | 0.410324
+ 53 | 0.405932
+ 54 |  0.40164
+ 55 | 0.397443
+ 56 | 0.393339
+ 57 | 0.389323
+ 58 | 0.385391
+ 59 | 0.381541
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  50 | 0.481241
+  51 | 0.475957
+  52 | 0.470799
+  20 | 0.469285
+  53 | 0.465759
+  54 | 0.460835
+  21 | 0.457083
+  55 |  0.45602
+   4 |  0.45545
+  56 |  0.45131
+  57 | 0.446702
+  22 |   0.4457
+  58 | 0.442191
+  59 | 0.437774
+  23 | 0.435047
+   2 | 0.428355
+  24 | 0.425047
+  33 | 0.419273
+  25 | 0.415635
+  34 |  0.41221
+  26 | 0.406753
+  35 | 0.405439
+  36 | 0.398938
+  27 | 0.398352
+  37 | 0.392689
+  28 | 0.390389
+  49 | 0.390116
+  38 | 0.386675
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+DROP INDEX idx_test_text;
+CREATE INDEX idx_test_text ON test_text USING gin (v _text_sml_ops);
+SET enable_seqscan = off;
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "n";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+  smlar   
+----------
+ 0.997241
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "log";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+  smlar   
+----------
+ 0.999075
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ERROR:  GIN supports only smlar.tf_method = "const"
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = off;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.870583
+  9 | 0.858716
+ 12 | 0.766621
+  8 | 0.725108
+ 13 | 0.681623
+ 14 | 0.611081
+  7 | 0.599535
+ 15 | 0.551777
+ 16 | 0.501358
+  6 | 0.482432
+ 17 | 0.458069
+ 18 | 0.420577
+ 19 | 0.387851
+  5 | 0.374337
+ 20 | 0.359086
+ 21 | 0.333644
+ 22 | 0.311011
+(18 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 50 | 0.306545
+ 49 | 0.306482
+(2 rows)
+
+SET smlar.tf_method = "const";
+SET smlar.idf_plus_one = on;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     1
+(1 row)
+
+SELECT  t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_text WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.951679
+  9 | 0.946916
+ 12 | 0.909452
+  8 | 0.891104
+ 13 | 0.872126
+ 14 |  0.83881
+  7 |  0.83201
+ 15 | 0.808827
+ 16 | 0.781649
+  6 | 0.768873
+ 17 | 0.756858
+ 18 | 0.734118
+ 19 | 0.713158
+  5 | 0.700594
+ 20 | 0.693752
+ 21 | 0.675714
+ 22 | 0.658886
+ 23 | 0.643138
+ 24 | 0.628355
+  4 | 0.625485
+ 25 |  0.61444
+ 26 |  0.60131
+ 27 |  0.58889
+ 28 | 0.577119
+ 29 | 0.565939
+ 30 |   0.5553
+ 31 |  0.54516
+  3 |   0.5407
+ 32 | 0.535479
+ 33 | 0.526223
+ 34 | 0.517359
+ 35 |  0.50886
+ 36 |   0.5007
+ 37 | 0.492857
+ 38 |  0.48531
+ 39 | 0.478039
+ 40 | 0.471027
+ 41 | 0.464259
+ 42 |  0.45772
+ 43 | 0.451396
+ 44 | 0.445276
+  2 | 0.440679
+ 45 | 0.439348
+ 46 | 0.433601
+ 47 | 0.428026
+ 48 | 0.422615
+ 49 | 0.417358
+ 50 | 0.413885
+ 51 | 0.408856
+ 52 | 0.403962
+ 53 | 0.399199
+ 54 | 0.394558
+ 55 | 0.390035
+ 56 | 0.385625
+ 57 | 0.381322
+ 58 | 0.377121
+ 59 | 0.373019
+ 60 | 0.369012
+ 61 | 0.365094
+ 62 | 0.361263
+ 63 | 0.357515
+ 64 | 0.353847
+ 65 | 0.350256
+ 66 | 0.346738
+ 67 | 0.343291
+ 68 | 0.339913
+ 69 | 0.336601
+ 70 | 0.333351
+ 71 | 0.330163
+ 72 | 0.327034
+ 73 | 0.323962
+ 74 | 0.320945
+ 75 | 0.317981
+ 76 | 0.315068
+ 77 | 0.312205
+  1 | 0.311044
+ 78 |  0.30939
+ 79 | 0.306621
+ 80 | 0.303897
+ 81 | 0.301217
+(81 rows)
+
+SELECT  t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_text WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+  t  |    s     
+-----+----------
+   8 | 0.759109
+   9 | 0.714367
+   7 | 0.694063
+  10 | 0.676445
+  11 | 0.643758
+   6 | 0.623275
+  12 | 0.615194
+  13 | 0.589945
+  14 | 0.567409
+  15 | 0.547127
+   5 | 0.544812
+  16 | 0.528742
+  17 | 0.511973
+  18 | 0.496591
+  19 | 0.482412
+  20 | 0.469285
+  21 | 0.457083
+   4 |  0.45545
+  22 |   0.4457
+  23 | 0.435047
+   2 | 0.428355
+  50 | 0.425793
+  24 | 0.425047
+  51 | 0.420619
+  33 | 0.419273
+  25 | 0.415635
+  52 | 0.415585
+  34 |  0.41221
+  53 | 0.410684
+  26 | 0.406753
+  54 |  0.40591
+  35 | 0.405439
+  55 | 0.401257
+  36 | 0.398938
+  27 | 0.398352
+  56 |  0.39672
+  37 | 0.392689
+  57 | 0.392293
+  28 | 0.390389
+  49 | 0.390116
+  58 | 0.387972
+  38 | 0.386675
+  59 | 0.383752
+  29 | 0.382826
+  39 | 0.380882
+  60 | 0.379628
+  30 |  0.37563
+  61 | 0.375598
+  40 | 0.375295
+  62 | 0.371657
+  41 | 0.369903
+  31 | 0.368771
+  63 | 0.367801
+  42 | 0.364692
+  64 | 0.364028
+  32 | 0.362222
+  65 | 0.360333
+  43 | 0.359654
+  66 | 0.356714
+  44 | 0.354778
+  67 | 0.353168
+  45 | 0.350054
+  68 | 0.349693
+   3 | 0.349116
+  69 | 0.346285
+  46 | 0.345476
+  70 | 0.342942
+  47 | 0.341034
+  71 | 0.339663
+  48 | 0.336722
+  72 | 0.336444
+  73 | 0.333283
+  74 | 0.330179
+  75 |  0.32713
+  76 | 0.324133
+  77 | 0.321188
+  78 | 0.318291
+  79 | 0.315443
+  80 | 0.312641
+  81 | 0.309883
+  82 | 0.307169
+  83 | 0.304497
+   1 | 0.302346
+ 201 | 0.302346
+  84 | 0.301866
+(85 rows)
+
+RESET enable_seqscan;
diff --git a/expected/texti.out b/expected/texti.out
new file mode 100644 (file)
index 0000000..751d140
--- /dev/null
@@ -0,0 +1,41 @@
+SELECT set_smlar_limit(5.0);
+ set_smlar_limit 
+-----------------
+               5
+(1 row)
+
+SET smlar.type='overlap';
+DROP INDEX idx_test_text;
+SELECT smlar('{199,199,199,199,1}', '{199,1}'::text[]);
+ smlar 
+-------
+     2
+(1 row)
+
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_text WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+CREATE INDEX idx_test_text ON test_text USING gin (v _text_sml_ops);
+SET enable_seqscan = off;
+SELECT  t, smlar(v, '{199,198,197,196,195,194,193,192,191,190}') AS s FROM test_text WHERE v % '{199,198,197,196,195,194,193,192,191,190}' ORDER BY s DESC, t;
+  t  | s  
+-----+----
+ 199 | 10
+ 200 | 10
+ 198 |  9
+ 197 |  8
+ 196 |  7
+ 195 |  6
+ 194 |  5
+(7 rows)
+
+RESET enable_seqscan;
diff --git a/expected/time.out b/expected/time.out
new file mode 100644 (file)
index 0000000..2fe47ed
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       epoch2timestamp(v)::time
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_time
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::time[]) AS s FROM test_time WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::time[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::time[]) AS s FROM test_time WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::time[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_time ON test_time USING gist (v _time_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::time[]) AS s FROM test_time WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::time[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::time[]) AS s FROM test_time WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::time[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_time;
+CREATE INDEX idx_test_time ON test_time USING gin (v _time_sml_ops);
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::time[]) AS s FROM test_time WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::time[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::time[]) AS s FROM test_time WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::time[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/timestamp.out b/expected/timestamp.out
new file mode 100644 (file)
index 0000000..72ab686
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       epoch2timestamp(v)::timestamp
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_timestamp
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')) AS s FROM test_timestamp WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}') ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')) AS s FROM test_timestamp WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}') ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_timestamp ON test_timestamp USING gist (v _timestamp_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')) AS s FROM test_timestamp WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}') ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')) AS s FROM test_timestamp WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}') ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_timestamp;
+CREATE INDEX idx_test_timestamp ON test_timestamp USING gin (v _timestamp_sml_ops);
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')) AS s FROM test_timestamp WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}') ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')) AS s FROM test_timestamp WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}') ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/timestamptz.out b/expected/timestamptz.out
new file mode 100644 (file)
index 0000000..a73c451
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       epoch2timestamp(v)::timestamptz
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_timestamptz
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]) AS s FROM test_timestamptz WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]) AS s FROM test_timestamptz WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_timestamptz ON test_timestamptz USING gist (v _timestamptz_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]) AS s FROM test_timestamptz WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]) AS s FROM test_timestamptz WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_timestamptz;
+CREATE INDEX idx_test_timestamptz ON test_timestamptz USING gin (v _timestamptz_sml_ops);
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]) AS s FROM test_timestamptz WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]) AS s FROM test_timestamptz WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/timetz.out b/expected/timetz.out
new file mode 100644 (file)
index 0000000..cd5191d
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       epoch2timestamp(v)::timestamptz::timetz
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_timetz
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]::timetz[]) AS s FROM test_timetz WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]::timetz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]::timetz[]) AS s FROM test_timetz WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]::timetz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_timetz ON test_timetz USING gist (v _timetz_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]::timetz[]) AS s FROM test_timetz WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]::timetz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]::timetz[]) AS s FROM test_timetz WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]::timetz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_timetz;
+CREATE INDEX idx_test_timetz ON test_timetz USING gin (v _timetz_sml_ops);
+SELECT t, smlar(v, to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]::timetz[]) AS s FROM test_timetz WHERE v % to_tsp_array('{10,9,8,7,6,5,4,3,2,1}')::timestamptz[]::timetz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]::timetz[]) AS s FROM test_timetz WHERE v % to_tsp_array('{50,49,8,7,6,5,4,33,2,1}')::timestamptz[]::timetz[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/varbit.out b/expected/varbit.out
new file mode 100644 (file)
index 0000000..06332ab
--- /dev/null
@@ -0,0 +1,104 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::bit(10)::varbit
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_varbit
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[]::varbit[]) AS s FROM test_varbit WHERE v % '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[]::varbit[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[]::varbit[]) AS s FROM test_varbit WHERE v % '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[]::varbit[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_varbit ON test_varbit USING gin (v _varbit_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[]::varbit[]) AS s FROM test_varbit WHERE v % '{10,9,8,7,6,5,4,3,2,1}'::int4[]::bit(10)[]::varbit[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[]::varbit[]) AS s FROM test_varbit WHERE v % '{50,49,8,7,6,5,4,33,2,1}'::int4[]::bit(10)[]::varbit[] ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/expected/varchar.out b/expected/varchar.out
new file mode 100644 (file)
index 0000000..9fab6c4
--- /dev/null
@@ -0,0 +1,148 @@
+SELECT set_smlar_limit(0.6);
+ set_smlar_limit 
+-----------------
+             0.6
+(1 row)
+
+SELECT 
+       t,
+       ARRAY(
+               SELECT 
+                       v::varchar
+               FROM
+                       generate_series(1, t) as v
+       ) AS v
+       INTO test_varchar
+FROM
+       generate_series(1, 200) as t;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_varchar WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_varchar WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+CREATE INDEX idx_test_varchar ON test_varchar USING gist (v _varchar_sml_ops);
+SET enable_seqscan=off;
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_varchar WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_varchar WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+DROP INDEX idx_test_varchar;
+CREATE INDEX idx_test_varchar ON test_varchar USING gin (v _varchar_sml_ops);
+SELECT t, smlar(v, '{10,9,8,7,6,5,4,3,2,1}') AS s FROM test_varchar WHERE v % '{10,9,8,7,6,5,4,3,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+ 10 |        1
+ 11 | 0.953463
+  9 | 0.948683
+ 12 | 0.912871
+  8 | 0.894427
+ 13 | 0.877058
+ 14 | 0.845154
+  7 |  0.83666
+ 15 | 0.816497
+ 16 | 0.790569
+  6 | 0.774597
+ 17 | 0.766965
+ 18 | 0.745356
+ 19 | 0.725476
+  5 | 0.707107
+ 20 | 0.707107
+ 21 | 0.690066
+ 22 |   0.6742
+ 23 |  0.65938
+ 24 | 0.645497
+  4 | 0.632456
+ 25 | 0.632456
+ 26 | 0.620174
+ 27 | 0.608581
+(24 rows)
+
+SELECT t, smlar(v, '{50,49,8,7,6,5,4,33,2,1}') AS s FROM test_varchar WHERE v % '{50,49,8,7,6,5,4,33,2,1}' ORDER BY s DESC, t;
+ t  |    s     
+----+----------
+  8 | 0.782624
+  9 | 0.737865
+  7 | 0.717137
+ 10 |      0.7
+ 11 | 0.667424
+  6 | 0.645497
+ 12 |  0.63901
+ 13 | 0.613941
+(8 rows)
+
+SET enable_seqscan=on;
diff --git a/smlar--1.0.sql b/smlar--1.0.sql
new file mode 100644 (file)
index 0000000..db361c0
--- /dev/null
@@ -0,0 +1,714 @@
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION smlar" to load this file. \quit
+
+CREATE OR REPLACE FUNCTION smlar(anyarray, anyarray)
+       RETURNS float4
+       AS      'MODULE_PATHNAME', 'arraysml'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION smlar(anyarray, anyarray, bool)
+       RETURNS float4
+       AS      'MODULE_PATHNAME', 'arraysmlw'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION smlar(anyarray, anyarray, text)
+    RETURNS float4
+       AS  'MODULE_PATHNAME', 'arraysml_func'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION set_smlar_limit(float4)
+       RETURNS float4
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C STRICT VOLATILE;
+
+CREATE OR REPLACE FUNCTION show_smlar_limit()
+       RETURNS float4
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C STRICT STABLE;
+
+CREATE OR REPLACE FUNCTION smlar_op(anyarray,anyarray)
+       RETURNS bool
+       AS 'MODULE_PATHNAME', 'arraysml_op'
+       LANGUAGE C STRICT STABLE;
+
+CREATE OPERATOR % (
+       LEFTARG = anyarray,
+       RIGHTARG = anyarray,
+       PROCEDURE = smlar_op,
+       COMMUTATOR = '%',
+       RESTRICT = contsel,
+       JOIN = contjoinsel
+);
+
+--
+
+CREATE OR REPLACE FUNCTION tsvector2textarray(tsvector)
+       RETURNS _text
+       AS 'MODULE_PATHNAME', 'tsvector2textarray'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION array_unique(anyarray)
+       RETURNS anyarray
+       AS      'MODULE_PATHNAME', 'array_unique'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION inarray(anyarray, anyelement)
+       RETURNS float4
+       AS      'MODULE_PATHNAME', 'inarray'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION inarray(anyarray, anyelement, float4, float4)
+       RETURNS float4
+       AS      'MODULE_PATHNAME', 'inarray'
+       LANGUAGE C STRICT IMMUTABLE;
+
+--gist key
+
+CREATE OR REPLACE FUNCTION gsmlsign_in(cstring)
+       RETURNS gsmlsign
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C STRICT;
+
+CREATE OR REPLACE FUNCTION gsmlsign_out(gsmlsign)
+       RETURNS cstring
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C STRICT;
+
+CREATE TYPE gsmlsign (
+       INTERNALLENGTH = -1,
+       INPUT = gsmlsign_in,
+       OUTPUT = gsmlsign_out
+);
+
+-- support functions for gist
+CREATE OR REPLACE FUNCTION gsmlsign_consistent(gsmlsign,internal,int4)
+       RETURNS bool
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION gsmlsign_compress(internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION gsmlsign_decompress(internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION gsmlsign_penalty(internal,internal,internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION gsmlsign_picksplit(internal, internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION gsmlsign_union(bytea, internal)
+       RETURNS _int4
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION gsmlsign_same(gsmlsign, gsmlsign, internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+--create the operator classes for gist
+
+CREATE OPERATOR CLASS _int2_sml_ops
+FOR TYPE _int2 USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _int4_sml_ops
+FOR TYPE _int4 USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _int8_sml_ops
+FOR TYPE _int8 USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _float4_sml_ops
+FOR TYPE _float4 USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _float8_sml_ops
+FOR TYPE _float8 USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+-- money type hasn't hash support
+--CREATE OPERATOR CLASS _money_sml_ops
+--FOR TYPE _money USING gist
+--AS
+--     OPERATOR        1       && (anyarray, anyarray),
+--     OPERATOR        2       % (anyarray, anyarray),
+--     FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+--     FUNCTION        2       gsmlsign_union (bytea, internal),
+--     FUNCTION        3       gsmlsign_compress (internal),
+--     FUNCTION        4       gsmlsign_decompress (internal),
+--     FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+--     FUNCTION        6       gsmlsign_picksplit (internal, internal),
+--     FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+--STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _oid_sml_ops
+FOR TYPE _oid USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _timestamp_sml_ops
+FOR TYPE _timestamp USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _timestamptz_sml_ops
+FOR TYPE _timestamptz USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _time_sml_ops
+FOR TYPE _time USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _timetz_sml_ops
+FOR TYPE _timetz USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _date_sml_ops
+FOR TYPE _date USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _interval_sml_ops
+FOR TYPE _interval USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _macaddr_sml_ops
+FOR TYPE _macaddr USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _inet_sml_ops
+FOR TYPE _inet USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _cidr_sml_ops
+FOR TYPE _cidr USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _text_sml_ops
+FOR TYPE _text USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _varchar_sml_ops
+FOR TYPE _varchar USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _char_sml_ops
+FOR TYPE _char USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _bytea_sml_ops
+FOR TYPE _bytea USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+--no hash 
+--CREATE OPERATOR CLASS _bit_sml_ops
+--FOR TYPE _bit USING gist
+--AS
+--     OPERATOR        1       && (anyarray, anyarray),
+--     OPERATOR        2       % (anyarray, anyarray),
+--     FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+--     FUNCTION        2       gsmlsign_union (bytea, internal),
+--     FUNCTION        3       gsmlsign_compress (internal),
+--     FUNCTION        4       gsmlsign_decompress (internal),
+--     FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+--     FUNCTION        6       gsmlsign_picksplit (internal, internal),
+--     FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+--STORAGE         gsmlsign;
+
+--CREATE OPERATOR CLASS _varbit_sml_ops
+--FOR TYPE _varbit USING gist
+--AS
+--     OPERATOR        1       && (anyarray, anyarray),
+--     OPERATOR        2       % (anyarray, anyarray),
+--     FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+--     FUNCTION        2       gsmlsign_union (bytea, internal),
+--     FUNCTION        3       gsmlsign_compress (internal),
+--     FUNCTION        4       gsmlsign_decompress (internal),
+--     FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+--     FUNCTION        6       gsmlsign_picksplit (internal, internal),
+--     FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+--STORAGE         gsmlsign;
+
+CREATE OPERATOR CLASS _numeric_sml_ops
+FOR TYPE _numeric USING gist
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       % (anyarray, anyarray),
+       FUNCTION        1       gsmlsign_consistent (gsmlsign, internal, int4),
+       FUNCTION        2       gsmlsign_union (bytea, internal),
+       FUNCTION        3       gsmlsign_compress (internal),
+       FUNCTION        4       gsmlsign_decompress (internal),
+       FUNCTION        5       gsmlsign_penalty (internal, internal, internal),
+       FUNCTION        6       gsmlsign_picksplit (internal, internal),
+       FUNCTION        7       gsmlsign_same (gsmlsign, gsmlsign, internal),
+STORAGE         gsmlsign;
+
+--gin support functions
+CREATE OR REPLACE FUNCTION smlararrayextract(anyarray, internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION smlarqueryarrayextract(anyarray, internal, internal)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION smlararrayconsistent(internal, internal, anyarray)
+       RETURNS internal
+       AS 'MODULE_PATHNAME'
+       LANGUAGE C IMMUTABLE;
+
+--gin opclasses
+
+CREATE OPERATOR CLASS _int2_sml_ops
+FOR TYPE _int2 USING gin
+AS
+       OPERATOR        1       && (anyarray, anyarray),
+       OPERATOR        2       %  (anyarray, anyarray),
+       FUNCTION        1       btint2cmp(int2,int2),
+       FUNCTION        2       smlararrayextract(anyarray, internal),
+       FUNCTION        3       smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION        4       smlararrayconsistent(internal, internal, anyarray),
+       STORAGE         int2;
+CREATE OPERATOR CLASS _int4_sml_ops
+FOR TYPE _int4  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   btint4cmp(int4,int4),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     int4;
+
+CREATE OPERATOR CLASS _int8_sml_ops
+FOR TYPE _int8  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   btint8cmp(int8,int8),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     int8;
+
+CREATE OPERATOR CLASS _float4_sml_ops
+FOR TYPE _float4  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   btfloat4cmp(float4,float4),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     float4;
+
+CREATE OPERATOR CLASS _float8_sml_ops
+FOR TYPE _float8  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   btfloat8cmp(float8,float8),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     float8;
+
+CREATE OPERATOR CLASS _money_sml_ops
+FOR TYPE _money  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   cash_cmp(money,money),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     money;
+
+CREATE OPERATOR CLASS _oid_sml_ops
+FOR TYPE _oid  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   btoidcmp(oid,oid),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     oid;
+
+CREATE OPERATOR CLASS _timestamp_sml_ops
+FOR TYPE _timestamp  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   timestamp_cmp(timestamp,timestamp),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     timestamp;
+
+CREATE OPERATOR CLASS _timestamptz_sml_ops
+FOR TYPE _timestamptz  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   timestamptz_cmp(timestamptz,timestamptz),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     timestamptz;
+
+CREATE OPERATOR CLASS _time_sml_ops
+FOR TYPE _time  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   time_cmp(time,time),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     time;
+
+CREATE OPERATOR CLASS _timetz_sml_ops
+FOR TYPE _timetz  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   timetz_cmp(timetz,timetz),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     timetz;
+
+CREATE OPERATOR CLASS _date_sml_ops
+FOR TYPE _date  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   date_cmp(date,date),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     date;
+
+CREATE OPERATOR CLASS _interval_sml_ops
+FOR TYPE _interval  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   interval_cmp(interval,interval),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     interval;
+
+CREATE OPERATOR CLASS _macaddr_sml_ops
+FOR TYPE _macaddr  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   macaddr_cmp(macaddr,macaddr),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     macaddr;
+
+CREATE OPERATOR CLASS _inet_sml_ops
+FOR TYPE _inet  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   network_cmp(inet,inet),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     inet;
+
+CREATE OPERATOR CLASS _cidr_sml_ops
+FOR TYPE _cidr  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   network_cmp(inet,inet),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     cidr;
+
+CREATE OPERATOR CLASS _text_sml_ops
+FOR TYPE _text  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   bttextcmp(text,text),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     text;
+
+CREATE OPERATOR CLASS _varchar_sml_ops
+FOR TYPE _varchar  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   bttextcmp(text,text),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     varchar;
+
+CREATE OPERATOR CLASS _char_sml_ops
+FOR TYPE "_char"  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   btcharcmp("char","char"),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     "char";
+
+CREATE OPERATOR CLASS _bytea_sml_ops
+FOR TYPE _bytea  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   byteacmp(bytea,bytea),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     bytea;
+
+CREATE OPERATOR CLASS _bit_sml_ops
+FOR TYPE _bit  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   bitcmp(bit,bit),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     bit;
+
+CREATE OPERATOR CLASS _varbit_sml_ops
+FOR TYPE _varbit  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   varbitcmp(varbit,varbit),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     varbit;
+
+CREATE OPERATOR CLASS _numeric_sml_ops
+FOR TYPE _numeric  USING gin
+AS
+    OPERATOR    1   && (anyarray, anyarray),
+       OPERATOR    2   %  (anyarray, anyarray),
+       FUNCTION    1   numeric_cmp(numeric,numeric),
+       FUNCTION    2   smlararrayextract(anyarray, internal),
+       FUNCTION    3   smlarqueryarrayextract(anyarray, internal, internal),
+       FUNCTION    4   smlararrayconsistent(internal, internal, anyarray),
+       STORAGE     numeric;
+
diff --git a/smlar--unpackaged--1.0.sql b/smlar--unpackaged--1.0.sql
new file mode 100644 (file)
index 0000000..36f8720
--- /dev/null
@@ -0,0 +1,125 @@
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION extension_name" to load this file. \quit
+
+ALTER EXTENSION smlar ADD FUNCTION tsvector2textarray(tsvector);
+ALTER EXTENSION smlar ADD FUNCTION array_unique(anyarray);
+ALTER EXTENSION smlar ADD FUNCTION inarray(anyarray, anyelement);
+ALTER EXTENSION smlar ADD FUNCTION inarray(anyarray, anyelement, float4, float4);
+
+ALTER EXTENSION smlar ADD FUNCTION smlar(anyarray, anyarray);
+ALTER EXTENSION smlar ADD FUNCTION smlar(anyarray, anyarray, bool);
+ALTER EXTENSION smlar ADD FUNCTION smlar(anyarray, anyarray, text);
+ALTER EXTENSION smlar ADD FUNCTION set_smlar_limit(float4);
+ALTER EXTENSION smlar ADD FUNCTION show_smlar_limit();
+ALTER EXTENSION smlar ADD FUNCTION smlar_op(anyarray,anyarray);
+ALTER EXTENSION smlar ADD OPERATOR % (anyarray,anyarray);
+
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_out(gsmlsign);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_in(cstring);
+ALTER EXTENSION smlar ADD TYPE gsmlsign;
+
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_consistent(gsmlsign,internal,int4);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_compress(internal);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_decompress(internal);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_penalty(internal,internal,internal);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_picksplit(internal, internal);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_union(bytea, internal);
+ALTER EXTENSION smlar ADD FUNCTION gsmlsign_same(gsmlsign, gsmlsign, internal);
+
+ALTER EXTENSION smlar ADD FUNCTION smlararrayextract(anyarray, internal);
+ALTER EXTENSION smlar ADD FUNCTION smlarqueryarrayextract(anyarray, internal, internal);
+ALTER EXTENSION smlar ADD FUNCTION smlararrayconsistent(internal, internal, anyarray);
+
+ALTER EXTENSION smlar ADD OPERATOR CLASS _int2_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _int4_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _int8_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _float4_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _float8_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _money_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _oid_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _timestamp_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _timestamptz_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _time_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _timetz_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _date_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _interval_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _macaddr_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _inet_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _cidr_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _text_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _varchar_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _char_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _bytea_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _bit_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _varbit_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _numeric_sml_ops USING gin;
+
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _int2_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _int4_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _int8_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _float4_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _float8_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _money_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _oid_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _timestamp_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _timestamptz_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _time_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _timetz_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _date_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _interval_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _macaddr_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _inet_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _cidr_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _text_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _varchar_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _char_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _bytea_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _bit_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _varbit_sml_ops USING gin;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _numeric_sml_ops USING gin;
+
+ALTER EXTENSION smlar ADD OPERATOR CLASS _int2_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _int4_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _int8_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _float4_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _float8_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _oid_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _timestamp_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _timestamptz_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _time_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _timetz_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _date_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _interval_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _macaddr_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _inet_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _cidr_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _text_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _varchar_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _char_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _bytea_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR CLASS _numeric_sml_ops USING gist;
+
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _int2_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _int4_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _int8_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _float4_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _float8_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _oid_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _timestamp_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _timestamptz_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _time_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _timetz_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _date_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _interval_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _macaddr_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _inet_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _cidr_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _text_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _varchar_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _char_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _bytea_sml_ops USING gist;
+ALTER EXTENSION smlar ADD OPERATOR FAMILY _numeric_sml_ops USING gist;
+
+
+
+
diff --git a/smlar.c b/smlar.c
new file mode 100644 (file)
index 0000000..84fc344
--- /dev/null
+++ b/smlar.c
@@ -0,0 +1,992 @@
+#include "smlar.h"
+
+#include "fmgr.h"
+#include "access/genam.h"
+#include "access/heapam.h"
+#include "access/nbtree.h"
+#include "catalog/indexing.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_amproc.h"
+#include "catalog/pg_cast.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_type.h"
+#include "executor/spi.h"
+#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/tqual.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+PG_MODULE_MAGIC;
+
+static Oid
+getDefaultOpclass(Oid amoid, Oid typid) 
+{
+       ScanKeyData     skey;
+       SysScanDesc     scan;
+       HeapTuple       tuple;
+       Relation        heapRel;
+       Oid                     opclassOid = InvalidOid;
+
+       heapRel = heap_open(OperatorClassRelationId, AccessShareLock);  
+
+       ScanKeyInit(&skey,
+                               Anum_pg_opclass_opcmethod,
+                               BTEqualStrategyNumber,  F_OIDEQ,
+                               ObjectIdGetDatum(amoid));
+
+       scan = systable_beginscan(heapRel, 
+                                                               OpclassAmNameNspIndexId, true, 
+                                                               SnapshotNow, 1, &skey);
+
+       while (HeapTupleIsValid((tuple = systable_getnext(scan))))
+       {
+               Form_pg_opclass opclass = (Form_pg_opclass)GETSTRUCT(tuple);
+
+               if ( opclass->opcintype == typid && opclass->opcdefault )
+               {
+                       if ( OidIsValid(opclassOid) )
+                               elog(ERROR, "Ambiguous opclass for type %u (access method %u)", typid, amoid); 
+                       opclassOid = HeapTupleGetOid(tuple);
+               }
+       }
+
+       systable_endscan(scan);
+       heap_close(heapRel, AccessShareLock);
+
+       return opclassOid;
+}
+
+static Oid
+getAMProc(Oid amoid, Oid typid) 
+{
+       Oid             opclassOid = getDefaultOpclass(amoid, typid);
+       Oid             procOid = InvalidOid;
+       Oid             opfamilyOid;
+       ScanKeyData     skey[4];
+       SysScanDesc     scan;
+       HeapTuple       tuple;
+       Relation        heapRel;
+
+       if ( !OidIsValid(opclassOid) )
+       {
+               typid = getBaseType(typid);
+               opclassOid = getDefaultOpclass(amoid, typid);
+       }
+
+       if ( !OidIsValid(opclassOid) )
+       {
+               CatCList        *catlist;
+               int                     i;
+
+               /*
+                * Search binary-coercible type
+                */
+               catlist = SearchSysCacheList(CASTSOURCETARGET, 1,
+                                                                               ObjectIdGetDatum(typid),
+                                                                               0, 0, 0);
+
+               for (i = 0; i < catlist->n_members; i++)
+               {
+                       HeapTuple       tuple = &catlist->members[i]->tuple;
+                       Form_pg_cast    castForm = (Form_pg_cast)GETSTRUCT(tuple);
+
+                       if ( castForm->castfunc == InvalidOid && castForm->castcontext == COERCION_CODE_IMPLICIT )
+                       {
+                               typid = castForm->casttarget;
+                               opclassOid = getDefaultOpclass(amoid, typid);
+                               if( OidIsValid(opclassOid) )
+                                       break;
+                       }
+               }
+
+               ReleaseSysCacheList(catlist);
+       }
+       
+       if ( !OidIsValid(opclassOid) )
+               return InvalidOid;
+
+       opfamilyOid = get_opclass_family(opcla