repertoire-faceting 0.7.7 → 0.7.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6264683e83dc539f432a6617ef37407ff3b456c0
4
- data.tar.gz: a8f42529a9753efef5ac4d6e7d1d3382ae640b36
3
+ metadata.gz: ee76ad87302d1b279bff45b44ff554b7001895eb
4
+ data.tar.gz: d46ffc3c8d26c895a0b6ca9a031bdc28bc1f7304
5
5
  SHA512:
6
- metadata.gz: 67c4255f9c2dbda6d0b685816b7b203ee41ec8124f458b861443c11b86acf5424992d053be6232680e56a325b8e6c71d8e0f7c773798e117a512d1809ee4bb5c
7
- data.tar.gz: 89f79669694fa49615356dfea81c936b5ed8565345f2a07e02878344ec0007ccda4819104a8ae41b524e0226bba5c39f09b442acf499fa4baebc1bccf51e89e5
6
+ metadata.gz: 201fa166812f31f2bb2c7585e900d8589d947946bab3898c7d5b8602898415f810ae4633aa8ca9978ddfb712526515462bb4f145627ad4f1d9a96cbcb2eed90c
7
+ data.tar.gz: 1cf7369a282abaee24a0b6d4ffc1571098d4ab6018407df57c5293d7524fb8e6c21fee9ca557c1676dcd9d99c8b7ca6e45f425309e82f313b747e12816feb81a
data/ext/Makefile CHANGED
@@ -8,30 +8,35 @@
8
8
  #
9
9
  #-------------------------------------------------------------------------
10
10
 
11
- API_VERSION = 0.7.7
11
+ API_VERSION = 0.7.8
12
12
 
13
13
  MODULES = signature/signature
14
14
  EXTENSION = signature/faceting \
15
15
  bytea/faceting_bytea \
16
16
  varbit/faceting_varbit
17
- DATA_built = faceting--$(API_VERSION).sql \
18
- faceting_bytea--$(API_VERSION).sql \
19
- faceting_varbit--$(API_VERSION).sql
17
+ DATA_built = signature/faceting--$(API_VERSION).sql \
18
+ bytea/faceting_bytea--$(API_VERSION).sql \
19
+ varbit/faceting_varbit--$(API_VERSION).sql
20
20
  DOCS = README.faceting
21
+ EXTRA_CLEAN = $(EXTENSION:=.control)
21
22
 
22
23
  PG_CONFIG = pg_config
23
24
  PGXS := $(shell $(PG_CONFIG) --pgxs)
24
25
 
26
+ # build control files by setting default version number
27
+ %.control: %.control.in
28
+ LC_ALL=C sed -e 's/API_VERSION/$(API_VERSION)/g' < $< > $@
29
+
25
30
  -include $(PGXS)
26
31
  # the dash above means loading pgxs may fail silently on Heroku, but
27
32
  # the API bindings will still be built:
28
33
  api_bindings : $(DATA_built)
29
34
 
30
- faceting--$(API_VERSION).sql: signature/signature.sql common/util.sql
35
+ signature/faceting--$(API_VERSION).sql: signature/signature.sql common/util.sql
31
36
  cat signature/signature.sql common/util.sql > $@
32
37
 
33
- faceting_bytea--$(API_VERSION).sql: bytea/bytea.sql common/util.sql
38
+ bytea/faceting_bytea--$(API_VERSION).sql: bytea/bytea.sql common/util.sql
34
39
  cat bytea/bytea.sql common/util.sql > $@
35
40
 
36
- faceting_varbit--$(API_VERSION).sql: varbit/varbit.sql common/util.sql
41
+ varbit/faceting_varbit--$(API_VERSION).sql: varbit/varbit.sql common/util.sql
37
42
  cat varbit/varbit.sql common/util.sql > $@
data/ext/README.faceting CHANGED
@@ -49,3 +49,14 @@
49
49
  --
50
50
  -- $ cd repertoire-faceting/ext
51
51
  -- $ make; sudo make install
52
+ --
53
+ -- N.B. Policy to date is to keep the PostgreSQL API version numbers in sync with the Rubygems
54
+ -- module version numbers. To bump versions, alter these files:
55
+ --
56
+ -- ext/Makefile # the PostgreSQL API version number
57
+ -- lib/repertoire-faceting/version.rb # the Rubygems version number
58
+ --
59
+ -- Because this policy alters default_version in each postgresql extension control file with each
60
+ -- bump, only the most recent version of the PostgreSQL faceting API is available in any server
61
+ -- (legacy API support is not available.) To date, database servers have mapped onto applications
62
+ -- one-to-one, so this is not a problem.
@@ -1,6 +1,6 @@
1
1
  # Faceting PostgreSQL extension module
2
-
2
+
3
3
  comment = 'API for faceted indexing and queries (based on plv8 + bytea bitmaps)'
4
4
  requires = 'plv8, plpgsql'
5
- default_version = '0.7.6'
6
- schema = 'facet'
5
+ default_version = 'API_VERSION'
6
+ schema = 'facet'
@@ -1,6 +1,6 @@
1
1
  # Faceting PostgreSQL extension module
2
-
2
+
3
3
  comment = 'API for faceted indexing and queries (based on custom C bitmap type)'
4
4
  requires = plpgsql
5
- default_version = '0.7.6'
6
- schema = 'facet'
5
+ default_version = 'API_VERSION'
6
+ schema = 'facet'
@@ -1,7 +1,7 @@
1
1
  # Faceting PostgreSQL extension module
2
-
2
+
3
3
  comment = 'API for faceted indexing and queries (based on builtin VARBIT bit strings)'
4
4
  requires = plpgsql
5
5
  superuser = false
6
- default_version = '0.7.6'
7
- schema = 'facet'
6
+ default_version = 'API_VERSION'
7
+ schema = 'facet'
@@ -1,5 +1,5 @@
1
1
  module Repertoire
2
2
  module Faceting #:nodoc:
3
- VERSION = "0.7.7"
3
+ VERSION = "0.7.8"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,61 +1,61 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repertoire-faceting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7
4
+ version: 0.7.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher York
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2016-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.2.11
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.2.11
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: jquery-rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pg
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.11'
48
- - - "<"
48
+ - - <
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0.18'
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - ">="
55
+ - - '>='
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0.11'
58
- - - "<"
58
+ - - <
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.18'
61
61
  description: Repertoire-faceting adds scalable facet indexing, ajax facet widgets,
@@ -66,30 +66,19 @@ executables: []
66
66
  extensions: []
67
67
  extra_rdoc_files: []
68
68
  files:
69
- - FAQ
70
- - INSTALL
71
- - LICENSE
72
- - README
73
- - TODO
74
- - ext/Makefile
75
- - ext/README.faceting
76
69
  - ext/bytea/bytea.sql
77
- - ext/bytea/faceting_bytea.control
70
+ - ext/bytea/faceting_bytea.control.in
78
71
  - ext/common/util.sql
79
72
  - ext/extconf.rb
80
- - ext/faceting--0.7.7.sql
81
- - ext/faceting_bytea--0.7.7.sql
82
- - ext/faceting_varbit--0.7.7.sql
83
- - ext/signature/faceting.control
73
+ - ext/Makefile
74
+ - ext/README.faceting
75
+ - ext/signature/faceting.control.in
84
76
  - ext/signature/signature.c
85
- - ext/signature/signature.o
86
- - ext/signature/signature.so
87
77
  - ext/signature/signature.sql
88
- - ext/varbit/faceting_varbit.control
78
+ - ext/varbit/faceting_varbit.control.in
89
79
  - ext/varbit/varbit.sql
90
80
  - lib/assets/images/repertoire-faceting/proportional_symbol.png
91
81
  - lib/assets/images/repertoire-faceting/spinner_sm.gif
92
- - lib/assets/javascripts/rep.faceting.js
93
82
  - lib/assets/javascripts/rep.faceting/context.js
94
83
  - lib/assets/javascripts/rep.faceting/ext/earth_facet.js
95
84
  - lib/assets/javascripts/rep.faceting/facet.js
@@ -97,14 +86,14 @@ files:
97
86
  - lib/assets/javascripts/rep.faceting/nested_facet.js
98
87
  - lib/assets/javascripts/rep.faceting/results.js
99
88
  - lib/assets/javascripts/rep.faceting/urls.js
89
+ - lib/assets/javascripts/rep.faceting.js
100
90
  - lib/assets/javascripts/rep.protovis-facets.js
101
- - lib/assets/javascripts/rep.widgets.js
102
91
  - lib/assets/javascripts/rep.widgets/events.js
103
92
  - lib/assets/javascripts/rep.widgets/global.js
104
93
  - lib/assets/javascripts/rep.widgets/model.js
105
94
  - lib/assets/javascripts/rep.widgets/widget.js
95
+ - lib/assets/javascripts/rep.widgets.js
106
96
  - lib/assets/stylesheets/rep.faceting.css
107
- - lib/repertoire-faceting.rb
108
97
  - lib/repertoire-faceting/adapters/postgresql_adapter.rb
109
98
  - lib/repertoire-faceting/controller.rb
110
99
  - lib/repertoire-faceting/errors.rb
@@ -123,9 +112,15 @@ files:
123
112
  - lib/repertoire-faceting/tasks/all.rake
124
113
  - lib/repertoire-faceting/tasks/client.rake
125
114
  - lib/repertoire-faceting/version.rb
115
+ - lib/repertoire-faceting.rb
126
116
  - vendor/assets/javascripts/deparam.js
127
117
  - vendor/assets/javascripts/google-earth-extensions.js
128
118
  - vendor/assets/javascripts/protovis.js
119
+ - FAQ
120
+ - INSTALL
121
+ - LICENSE
122
+ - README
123
+ - TODO
129
124
  homepage: http://github.com/repertoire/repertoire-faceting
130
125
  licenses: []
131
126
  metadata: {}
@@ -144,17 +139,17 @@ require_paths:
144
139
  - lib
145
140
  required_ruby_version: !ruby/object:Gem::Requirement
146
141
  requirements:
147
- - - ">="
142
+ - - '>='
148
143
  - !ruby/object:Gem::Version
149
144
  version: 2.2.0
150
145
  required_rubygems_version: !ruby/object:Gem::Requirement
151
146
  requirements:
152
- - - ">="
147
+ - - '>='
153
148
  - !ruby/object:Gem::Version
154
149
  version: 1.3.7
155
150
  requirements: []
156
151
  rubyforge_project: repertoire-faceting
157
- rubygems_version: 2.4.6
152
+ rubygems_version: 2.0.14.1
158
153
  signing_key:
159
154
  specification_version: 4
160
155
  summary: Rails/Postgresql plugin for faceted indexing and browsing
@@ -1,251 +0,0 @@
1
- -- ============================================================================
2
- -- Faceting API implementing bitmap indices using a custom C datatype and
3
- -- associated functions.
4
- --
5
- -- This API is to be preferred in all situations where it is possible to
6
- -- build and install the datatype (requires superuser access to PostgreSQL)
7
- --
8
- -- Christopher York
9
- -- MIT Hyperstudio
10
- -- February 2014
11
- -- ============================================================================
12
-
13
- -- complain if script is sourced in psql, rather than via CREATE EXTENSION
14
- \echo Use "CREATE EXTENSION faceting" to load this the default faceting API.\quit
15
-
16
- -- functions for bitmap indices using datatype written in C
17
-
18
- CREATE TYPE @extschema@.signature;
19
-
20
- -- basic i/o functions for signatures
21
-
22
- CREATE FUNCTION @extschema@.sig_in( cstring )
23
- RETURNS signature
24
- AS 'signature.so', 'sig_in'
25
- LANGUAGE C STRICT;
26
-
27
- CREATE FUNCTION @extschema@.sig_out( signature )
28
- RETURNS cstring
29
- AS 'signature.so', 'sig_out'
30
- LANGUAGE C STRICT;
31
-
32
- -- signature postgresql type
33
-
34
- CREATE TYPE @extschema@.signature (
35
- INTERNALLENGTH = VARIABLE,
36
- INPUT = sig_in,
37
- OUTPUT = sig_out,
38
- STORAGE = extended
39
- );
40
-
41
- -- functions for signatures
42
-
43
- CREATE FUNCTION @extschema@.sig_resize( signature, INT )
44
- RETURNS signature
45
- AS 'signature.so', 'sig_resize'
46
- LANGUAGE C STRICT IMMUTABLE;
47
-
48
- CREATE FUNCTION @extschema@.sig_set( signature, INT, INT )
49
- RETURNS signature
50
- AS 'signature.so', 'sig_set'
51
- LANGUAGE C STRICT IMMUTABLE;
52
-
53
- CREATE FUNCTION @extschema@.sig_set( signature, INT )
54
- RETURNS signature
55
- AS 'signature.so', 'sig_set'
56
- LANGUAGE C STRICT IMMUTABLE;
57
-
58
- CREATE FUNCTION @extschema@.sig_get( signature, INT )
59
- RETURNS INT
60
- AS 'signature.so', 'sig_get'
61
- LANGUAGE C STRICT IMMUTABLE;
62
-
63
- CREATE FUNCTION @extschema@.sig_length( signature )
64
- RETURNS INT
65
- AS 'signature.so', 'sig_length'
66
- LANGUAGE C STRICT IMMUTABLE;
67
-
68
- CREATE FUNCTION @extschema@.sig_min( signature )
69
- RETURNS INT
70
- AS 'signature.so', 'sig_min'
71
- LANGUAGE C STRICT IMMUTABLE;
72
-
73
- CREATE FUNCTION @extschema@.sig_and( signature, signature )
74
- RETURNS signature
75
- AS 'signature.so', 'sig_and'
76
- LANGUAGE C STRICT IMMUTABLE;
77
-
78
- CREATE FUNCTION @extschema@.sig_or( signature, signature )
79
- RETURNS signature
80
- AS 'signature.so', 'sig_or'
81
- LANGUAGE C STRICT IMMUTABLE;
82
-
83
- CREATE FUNCTION @extschema@.sig_xor( signature )
84
- RETURNS signature
85
- AS 'signature.so', 'sig_xor'
86
- LANGUAGE C STRICT IMMUTABLE;
87
-
88
- CREATE FUNCTION @extschema@.count( signature )
89
- RETURNS INT
90
- AS 'signature.so', 'count'
91
- LANGUAGE C STRICT IMMUTABLE;
92
-
93
- CREATE FUNCTION @extschema@.contains( signature, INT )
94
- RETURNS BOOL
95
- AS 'signature.so', 'contains'
96
- LANGUAGE C STRICT IMMUTABLE;
97
-
98
- CREATE FUNCTION @extschema@.members( signature )
99
- RETURNS SETOF INT
100
- AS 'signature.so', 'members'
101
- LANGUAGE C STRICT IMMUTABLE;
102
-
103
- CREATE FUNCTION @extschema@.sig_cmp( signature, signature )
104
- RETURNS INT
105
- AS 'signature.so', 'sig_cmp'
106
- LANGUAGE C STRICT IMMUTABLE;
107
-
108
- CREATE FUNCTION @extschema@.sig_lt( signature, signature )
109
- RETURNS BOOL
110
- AS 'signature.so', 'sig_lt'
111
- LANGUAGE C STRICT IMMUTABLE;
112
-
113
- CREATE FUNCTION @extschema@.sig_lte( signature, signature )
114
- RETURNS BOOL
115
- AS 'signature.so', 'sig_lte'
116
- LANGUAGE C STRICT IMMUTABLE;
117
-
118
- CREATE FUNCTION @extschema@.sig_eq( signature, signature )
119
- RETURNS BOOL
120
- AS 'signature.so', 'sig_eq'
121
- LANGUAGE C STRICT IMMUTABLE;
122
-
123
- CREATE FUNCTION @extschema@.sig_gt( signature, signature )
124
- RETURNS BOOL
125
- AS 'signature.so', 'sig_gt'
126
- LANGUAGE C STRICT IMMUTABLE;
127
-
128
- CREATE FUNCTION @extschema@.sig_gte( signature, signature )
129
- RETURNS BOOL
130
- AS 'signature.so', 'sig_gte'
131
- LANGUAGE C STRICT IMMUTABLE;
132
-
133
-
134
- -- operators for signatures
135
-
136
- CREATE OPERATOR @extschema@.& (
137
- leftarg = signature,
138
- rightarg = signature,
139
- procedure = @extschema@.sig_and,
140
- commutator = &
141
- );
142
-
143
- CREATE OPERATOR @extschema@.| (
144
- leftarg = signature,
145
- rightarg = signature,
146
- procedure = @extschema@.sig_or,
147
- commutator = |
148
- );
149
-
150
- CREATE OPERATOR @extschema@.+ (
151
- leftarg = signature,
152
- rightarg = int,
153
- procedure = @extschema@.sig_set
154
- );
155
-
156
- CREATE OPERATOR @extschema@.< (
157
- leftarg = signature, rightarg = signature, procedure = sig_lt,
158
- commutator = > , negator = >= ,
159
- restrict = scalarltsel, join = scalarltjoinsel
160
- );
161
-
162
- CREATE OPERATOR @extschema@.<= (
163
- leftarg = signature, rightarg = signature, procedure = sig_lte,
164
- commutator = >= , negator = > ,
165
- restrict = scalarltsel, join = scalarltjoinsel
166
- );
167
-
168
- CREATE OPERATOR @extschema@.= (
169
- leftarg = signature, rightarg = signature, procedure = sig_eq,
170
- commutator = = , negator = <> ,
171
- restrict = eqsel, join = eqjoinsel
172
- );
173
-
174
- CREATE OPERATOR >= (
175
- leftarg = signature, rightarg = signature, procedure = sig_gte,
176
- commutator = <= , negator = < ,
177
- restrict = scalargtsel, join = scalargtjoinsel
178
- );
179
-
180
- CREATE OPERATOR @extschema@.> (
181
- leftarg = signature, rightarg = signature, procedure = sig_gt,
182
- commutator = < , negator = <= ,
183
- restrict = scalargtsel, join = scalargtjoinsel
184
- );
185
-
186
- -- index operator classes for signatures
187
-
188
- CREATE OPERATOR CLASS @extschema@.signature_ops
189
- DEFAULT FOR TYPE signature USING btree AS
190
- OPERATOR 1 < ,
191
- OPERATOR 2 <= ,
192
- OPERATOR 3 = ,
193
- OPERATOR 4 >= ,
194
- OPERATOR 5 > ,
195
- FUNCTION 1 sig_cmp(signature, signature);
196
-
197
-
198
- -- aggregate functions for faceting
199
-
200
- CREATE AGGREGATE @extschema@.collect( signature )
201
- (
202
- sfunc = @extschema@.sig_or,
203
- stype = signature
204
- );
205
-
206
- CREATE AGGREGATE @extschema@.filter( signature )
207
- (
208
- sfunc = @extschema@.sig_and,
209
- stype = signature
210
- );
211
-
212
- CREATE AGGREGATE @extschema@.signature( INT )
213
- (
214
- sfunc = @extschema@.sig_set,
215
- stype = signature,
216
- initcond = '0'
217
- );-- ============================================================================
218
- -- These functions are common to all bindings of the Repertoire faceting API
219
- --
220
- -- Christopher York
221
- -- MIT Hyperstudio
222
- -- February 2014
223
- -- ============================================================================
224
-
225
-
226
- -- Aggregator to measure how many bits from a loosely-packed id column would be wasted, if
227
- -- they were all collected into a bitset signature. Returns a float between 0 (no waste)
228
- -- and 1.0 (all waste). An example of its use:
229
- --
230
- -- SELECT wastage(id) FROM nobelists
231
- -- =# 0.999999
232
- --
233
- -- ALTER TABLE nobelists ADD COLUMN _packed_id SERIAL
234
- -- SELECT wastage(_packed_id) FROM nobelists
235
- -- =# 0.015625
236
- --
237
- CREATE FUNCTION @extschema@.wastage_proportion( state INT[] ) RETURNS double precision AS $$
238
- SELECT (1.0 - (state[1]::double precision / (COALESCE(state[2], 0.0) + 1.0)))
239
- $$ LANGUAGE sql;
240
-
241
- CREATE FUNCTION @extschema@.wastage_accum( state INT[], val INT ) RETURNS INT[] AS $$
242
- SELECT ARRAY[ state[1]+1, GREATEST(state[2], val) ];
243
- $$ LANGUAGE sql;
244
-
245
- CREATE AGGREGATE @extschema@.wastage( INT )
246
- (
247
- sfunc = @extschema@.wastage_accum,
248
- stype = INT[],
249
- finalfunc = @extschema@.wastage_proportion,
250
- initcond = '{0,0}'
251
- );
@@ -1,207 +0,0 @@
1
- -- ============================================================================
2
- -- Faceting API implementing bitmap indices using PostgreSQL's built-in BYTEA
3
- -- type, processed using plv8 typed arrays.
4
- --
5
- -- This API is suitable for deployment on Heroku, where plv8 is installed by
6
- -- default. Performance is many times better than the VARBIT-based faceting
7
- -- API, primarily because of optimisations in memory handling in the count
8
- -- function.
9
- --
10
- -- See https://code.google.com/p/plv8js/wiki/PLV8
11
- -- https://postgres.heroku.com/blog/past/2013/6/5/javascript_in_your_postgres/
12
- --
13
- -- Christopher York
14
- -- MIT Hyperstudio
15
- -- February 2014
16
- -- ============================================================================
17
-
18
- CREATE EXTENSION IF NOT EXISTS plv8;
19
-
20
- SET bytea_output TO hex;
21
-
22
- -- these functions are in pl/pgsql, because they involve appending bytea values,
23
- -- which is easier done with direct access to the || operator
24
-
25
- CREATE FUNCTION @extschema@.sig_resize( sig BYTEA, bits INT ) RETURNS BYTEA AS $$
26
- DECLARE
27
- len INT;
28
- bytes INT;
29
- BEGIN
30
- bytes := ceil(bits / 8.0)::INT;
31
- len := length(sig);
32
- IF bytes > len THEN
33
- -- RAISE NOTICE 'Extending signature from % to % bytes', len, bytes;
34
- RETURN sig || ('\x' || repeat('00', bytes - len))::BYTEA;
35
- ELSIF bits < len THEN
36
- -- no provision in PostgreSQL for truncating a BYTEA
37
- RETURN sig;
38
- END IF;
39
- RETURN sig;
40
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
41
-
42
- CREATE FUNCTION @extschema@.sig_set( sig BYTEA, pos INT, val INT ) RETURNS BYTEA AS $$
43
- BEGIN
44
- RETURN set_bit(@extschema@.sig_resize(sig, pos+1), pos, val);
45
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
46
-
47
- CREATE FUNCTION @extschema@.sig_set( sig BYTEA, pos INT ) RETURNS BYTEA AS $$
48
- BEGIN
49
- RETURN @extschema@.sig_set(sig, pos, 1);
50
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
51
-
52
- -- these functions are in javascript, because (1) pl/pgsql is close
53
- -- to the worst language in the world; (2) plv8's typed arrays make
54
- -- the count function much faster
55
-
56
- CREATE FUNCTION @extschema@.sig_get( sig BYTEA, pos INT ) RETURNS INT AS $$
57
- if (pos <= sig.length * 8) {
58
- return sig[ Math.floor(pos / 8) ] >> (pos % 8) & 1;
59
- } else {
60
- return 0;
61
- }
62
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
63
-
64
- CREATE FUNCTION @extschema@.sig_length( sig BYTEA ) RETURNS INT AS $$
65
- return sig.length;
66
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
67
-
68
- CREATE FUNCTION @extschema@.sig_and(sig1 BYTEA, sig2 BYTEA) RETURNS BYTEA AS $$
69
- if (sig2.length < sig1.length) {
70
- var tmp = sig1;
71
- sig1 = sig2;
72
- sig2 = tmp;
73
- }
74
- for (var i = 0; i < sig1.length; i++) {
75
- sig1[i] = sig1[i] & sig2[i];
76
- }
77
- return sig1;
78
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
79
-
80
- CREATE FUNCTION @extschema@.sig_or(sig1 BYTEA, sig2 BYTEA) RETURNS BYTEA AS $$
81
- if (sig2.length > sig1.length) {
82
- var tmp = sig1;
83
- sig1 = sig2;
84
- sig2 = tmp;
85
- }
86
- for (var i = 0; i < sig2.length; i++) {
87
- sig1[i] = sig1[i] | sig2[i];
88
- }
89
- return sig1;
90
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
91
-
92
- CREATE FUNCTION @extschema@.count( sig BYTEA ) RETURNS int4 AS $$
93
- var count_table = [
94
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
95
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
96
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
97
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
98
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
99
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
100
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
101
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
102
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
103
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
104
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
105
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
106
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
107
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
108
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
109
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
110
- ];
111
- var count = 0;
112
- for (var i = 0; i < sig.length; i++) { count += count_table[ sig[i] ]; }
113
- return count;
114
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
115
-
116
- CREATE FUNCTION @extschema@.contains( sig BYTEA, pos INT ) RETURNS BOOL AS $$
117
- return (pos <= sig.length * 8) && (sig[ Math.floor(pos / 8) ] >> (pos % 8) & 1);
118
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
119
-
120
- CREATE FUNCTION @extschema@.members( sig BYTEA ) RETURNS SETOF INT AS $$
121
- for (var i = 0; i < sig.length; i++) {
122
- for (var j = 0; j < 8; j++) {
123
- if (sig[i] >> j & 1) {
124
- plv8.return_next(i * 8 + j);
125
- }
126
- }
127
- }
128
- $$ LANGUAGE plv8 STRICT IMMUTABLE;
129
-
130
-
131
- -- operators for faceting
132
-
133
- CREATE OPERATOR @extschema@.& (
134
- leftarg = BYTEA,
135
- rightarg = BYTEA,
136
- procedure = @extschema@.sig_and,
137
- commutator = &
138
- );
139
-
140
- CREATE OPERATOR @extschema@.| (
141
- leftarg = BYTEA,
142
- rightarg = BYTEA,
143
- procedure = @extschema@.sig_or,
144
- commutator = |
145
- );
146
-
147
- CREATE OPERATOR @extschema@.+ (
148
- leftarg = BYTEA,
149
- rightarg = int,
150
- procedure = @extschema@.sig_set
151
- );
152
-
153
-
154
- -- aggregate functions for faceting
155
-
156
- CREATE AGGREGATE @extschema@.collect( BYTEA )
157
- (
158
- sfunc = @extschema@.sig_or,
159
- stype = BYTEA
160
- );
161
-
162
- CREATE AGGREGATE @extschema@.filter( BYTEA )
163
- (
164
- sfunc = @extschema@.sig_and,
165
- stype = BYTEA
166
- );
167
-
168
- CREATE AGGREGATE @extschema@.signature( INT )
169
- (
170
- sfunc = @extschema@.sig_set,
171
- stype = BYTEA,
172
- initcond = ''
173
- );-- ============================================================================
174
- -- These functions are common to all bindings of the Repertoire faceting API
175
- --
176
- -- Christopher York
177
- -- MIT Hyperstudio
178
- -- February 2014
179
- -- ============================================================================
180
-
181
-
182
- -- Aggregator to measure how many bits from a loosely-packed id column would be wasted, if
183
- -- they were all collected into a bitset signature. Returns a float between 0 (no waste)
184
- -- and 1.0 (all waste). An example of its use:
185
- --
186
- -- SELECT wastage(id) FROM nobelists
187
- -- =# 0.999999
188
- --
189
- -- ALTER TABLE nobelists ADD COLUMN _packed_id SERIAL
190
- -- SELECT wastage(_packed_id) FROM nobelists
191
- -- =# 0.015625
192
- --
193
- CREATE FUNCTION @extschema@.wastage_proportion( state INT[] ) RETURNS double precision AS $$
194
- SELECT (1.0 - (state[1]::double precision / (COALESCE(state[2], 0.0) + 1.0)))
195
- $$ LANGUAGE sql;
196
-
197
- CREATE FUNCTION @extschema@.wastage_accum( state INT[], val INT ) RETURNS INT[] AS $$
198
- SELECT ARRAY[ state[1]+1, GREATEST(state[2], val) ];
199
- $$ LANGUAGE sql;
200
-
201
- CREATE AGGREGATE @extschema@.wastage( INT )
202
- (
203
- sfunc = @extschema@.wastage_accum,
204
- stype = INT[],
205
- finalfunc = @extschema@.wastage_proportion,
206
- initcond = '{0,0}'
207
- );
@@ -1,198 +0,0 @@
1
- -- ============================================================================
2
- -- Faceting API implementing bitmap indices using PostgreSQL's built-in VARBIT
3
- -- type, processed using the built-in language pl/pgsql.
4
- --
5
- -- This API is suitable for deployment on any host, since it requires no
6
- -- PostgreSQL extensions outside the default install.
7
- --
8
- -- However, performance is limited to around 30,000 items in practice (in part
9
- -- because of unnecessary duplication of varbit values when pl/pgsql evaluates
10
- -- the count function.)
11
- --
12
- -- The 'signature' C-based faceting API is preferable for any install where
13
- -- you have superuser access to the database.
14
- --
15
- -- Christopher York
16
- -- MIT Hyperstudio
17
- -- February 2014
18
- -- ============================================================================
19
-
20
- CREATE FUNCTION @extschema@.sig_resize( sig VARBIT, bits INT ) RETURNS VARBIT AS $$
21
- DECLARE
22
- len INT;
23
- BEGIN
24
- len := length(sig);
25
- IF bits > len THEN
26
- RETURN sig || repeat('0', bits - len)::VARBIT;
27
- ELSIF bits < len THEN
28
- RETURN substring(sig FROM 1 FOR bits);
29
- END IF;
30
- RETURN sig;
31
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
32
-
33
- CREATE FUNCTION @extschema@.sig_set( sig VARBIT, pos INT, val INT ) RETURNS VARBIT AS $$
34
- DECLARE
35
- len INT;
36
- BEGIN
37
- len := length(sig);
38
- IF pos >= len THEN
39
- IF val > 0 THEN
40
- RETURN set_bit(@extschema@.sig_resize(sig, pos+1), pos, 1);
41
- ELSE
42
- RETURN sig;
43
- END IF;
44
- ELSE
45
- RETURN set_bit(sig, pos, val);
46
- END IF;
47
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
48
-
49
- CREATE FUNCTION @extschema@.sig_set( sig VARBIT, pos INT ) RETURNS VARBIT AS $$
50
- BEGIN
51
- RETURN @extschema@.sig_set(sig, pos, 1);
52
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
53
-
54
- CREATE FUNCTION @extschema@.sig_get( sig VARBIT, pos INT ) RETURNS INT AS $$
55
- DECLARE
56
- len INT;
57
- BEGIN
58
- len := length(sig);
59
- IF pos >= len THEN
60
- RETURN 0;
61
- ELSE
62
- RETURN get_bit(sig, pos);
63
- END IF;
64
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
65
-
66
- CREATE FUNCTION @extschema@.sig_length( sig VARBIT ) RETURNS INT AS $$
67
- BEGIN
68
- RETURN length(sig);
69
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
70
-
71
- CREATE FUNCTION @extschema@.sig_min( sig VARBIT ) RETURNS INT AS $$
72
- BEGIN
73
- RETURN position('1' in sig) - 1;
74
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
75
-
76
- CREATE FUNCTION @extschema@.sig_and( sig1 VARBIT, sig2 VARBIT ) RETURNS VARBIT AS $$
77
- DECLARE
78
- len INT;
79
- BEGIN
80
- len := GREATEST(length(sig1), length(sig2));
81
- RETURN bitand(@extschema@.sig_resize(sig1, len), @extschema@.sig_resize(sig2, len)) ;
82
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
83
-
84
- CREATE FUNCTION @extschema@.sig_or( sig1 VARBIT, sig2 VARBIT ) RETURNS VARBIT AS $$
85
- DECLARE
86
- len INT;
87
- BEGIN
88
- len := GREATEST(length(sig1), length(sig2));
89
- RETURN bitor(@extschema@.sig_resize(sig1, len), @extschema@.sig_resize(sig2, len)) ;
90
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
91
-
92
- CREATE FUNCTION @extschema@.sig_xor( sig1 VARBIT, sig2 VARBIT ) RETURNS VARBIT AS $$
93
- DECLARE
94
- len INT;
95
- BEGIN
96
- len := GREATEST(length(sig1), length(sig2));
97
- RETURN bitxor(@extschema@.sig_resize(sig1, len), @extschema@.sig_resize(sig2, len)) ;
98
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
99
-
100
- CREATE FUNCTION @extschema@.count( sig VARBIT ) RETURNS INT AS $$
101
- BEGIN
102
- -- This is, by any measure, horrific. However, it appears to be the only
103
- -- way to use PostgreSQL built in functions to count bits in a bit string.
104
- RETURN length(replace(sig::TEXT, '0', ''));
105
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
106
-
107
- CREATE FUNCTION @extschema@.contains( sig VARBIT, pos INT ) RETURNS BOOL AS $$
108
- BEGIN
109
- RETURN @extschema@.sig_get(sig, pos) = 1;
110
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
111
-
112
- CREATE FUNCTION @extschema@.members( sig VARBIT ) RETURNS SETOF INT AS $$
113
- BEGIN
114
- FOR i IN 0 .. length(sig) - 1 LOOP
115
- IF @extschema@.contains(sig, i) THEN
116
- RETURN NEXT i;
117
- END IF;
118
- END LOOP;
119
- END $$ LANGUAGE plpgsql STRICT IMMUTABLE;
120
-
121
-
122
- -- operators for faceting
123
-
124
- CREATE OPERATOR @extschema@.& (
125
- leftarg = VARBIT,
126
- rightarg = VARBIT,
127
- procedure = @extschema@.sig_and,
128
- commutator = &
129
- );
130
-
131
- CREATE OPERATOR @extschema@.| (
132
- leftarg = VARBIT,
133
- rightarg = VARBIT,
134
- procedure = @extschema@.sig_or,
135
- commutator = |
136
- );
137
-
138
- CREATE OPERATOR @extschema@.+ (
139
- leftarg = VARBIT,
140
- rightarg = int,
141
- procedure = @extschema@.sig_set
142
- );
143
-
144
-
145
- -- aggregate functions for faceting
146
-
147
- CREATE AGGREGATE @extschema@.collect( VARBIT )
148
- (
149
- sfunc = @extschema@.sig_or,
150
- stype = VARBIT
151
- );
152
-
153
- CREATE AGGREGATE @extschema@.filter( VARBIT )
154
- (
155
- sfunc = @extschema@.sig_and,
156
- stype = VARBIT
157
- );
158
-
159
- CREATE AGGREGATE @extschema@.signature( INT )
160
- (
161
- sfunc = @extschema@.sig_set,
162
- stype = VARBIT,
163
- initcond = '0'
164
- );-- ============================================================================
165
- -- These functions are common to all bindings of the Repertoire faceting API
166
- --
167
- -- Christopher York
168
- -- MIT Hyperstudio
169
- -- February 2014
170
- -- ============================================================================
171
-
172
-
173
- -- Aggregator to measure how many bits from a loosely-packed id column would be wasted, if
174
- -- they were all collected into a bitset signature. Returns a float between 0 (no waste)
175
- -- and 1.0 (all waste). An example of its use:
176
- --
177
- -- SELECT wastage(id) FROM nobelists
178
- -- =# 0.999999
179
- --
180
- -- ALTER TABLE nobelists ADD COLUMN _packed_id SERIAL
181
- -- SELECT wastage(_packed_id) FROM nobelists
182
- -- =# 0.015625
183
- --
184
- CREATE FUNCTION @extschema@.wastage_proportion( state INT[] ) RETURNS double precision AS $$
185
- SELECT (1.0 - (state[1]::double precision / (COALESCE(state[2], 0.0) + 1.0)))
186
- $$ LANGUAGE sql;
187
-
188
- CREATE FUNCTION @extschema@.wastage_accum( state INT[], val INT ) RETURNS INT[] AS $$
189
- SELECT ARRAY[ state[1]+1, GREATEST(state[2], val) ];
190
- $$ LANGUAGE sql;
191
-
192
- CREATE AGGREGATE @extschema@.wastage( INT )
193
- (
194
- sfunc = @extschema@.wastage_accum,
195
- stype = INT[],
196
- finalfunc = @extschema@.wastage_proportion,
197
- initcond = '{0,0}'
198
- );
Binary file
Binary file