Skip to content

Commit 542df82

Browse files
committed
Ore index as JSONB array
1 parent c518c70 commit 542df82

8 files changed

+253
-949
lines changed

sql/000-ore.sql

Lines changed: 35 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,9 @@
11
CREATE EXTENSION IF NOT EXISTS pgcrypto;
22

3-
CREATE TYPE ore_64_8_v1_term AS (
4-
bytes bytea
5-
);
6-
7-
CREATE TYPE ore_64_8_v1 AS (
8-
terms ore_64_8_v1_term[]
9-
);
10-
3+
CREATE DOMAIN ore_64_8_index_v1 AS bytea[];
114

12-
DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term);
135
DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a bytea, b bytea);
146

15-
CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term) returns integer AS $$
16-
BEGIN
17-
SELECT compare_ore_64_8_v1_term(a.bytes, b.bytes);
18-
END;
19-
$$ LANGUAGE plpgsql;
20-
217
CREATE FUNCTION compare_ore_64_8_v1_term(a bytea, b bytea) returns integer AS $$
228
DECLARE
239
eq boolean := true;
@@ -95,177 +81,40 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a bytea, b bytea) returns integer AS $$
9581
$$ LANGUAGE plpgsql;
9682

9783

98-
DROP FUNCTION IF EXISTS ore_64_8_v1_term_eq(a ore_64_8_v1_term, b ore_64_8_v1_term);
99-
100-
CREATE FUNCTION ore_64_8_v1_term_eq(a ore_64_8_v1_term, b ore_64_8_v1_term)
101-
RETURNS boolean AS $$
102-
SELECT compare_ore_64_8_v1_term(a, b) = 0
103-
$$ LANGUAGE SQL;
104-
105-
106-
DROP FUNCTION IF EXISTS ore_64_8_v1_term_neq(a ore_64_8_v1_term, b ore_64_8_v1_term);
107-
108-
CREATE FUNCTION ore_64_8_v1_term_neq(a ore_64_8_v1_term, b ore_64_8_v1_term)
109-
RETURNS boolean AS $$
110-
SELECT compare_ore_64_8_v1_term(a, b) <> 0
111-
$$ LANGUAGE SQL;
112-
113-
114-
DROP FUNCTION IF EXISTS ore_64_8_v1_term_lt(a ore_64_8_v1_term, b ore_64_8_v1_term);
115-
116-
CREATE FUNCTION ore_64_8_v1_term_lt(a ore_64_8_v1_term, b ore_64_8_v1_term)
117-
RETURNS boolean AS $$
118-
SELECT compare_ore_64_8_v1_term(a, b) = -1
119-
$$ LANGUAGE SQL;
120-
121-
122-
DROP FUNCTION IF EXISTS ore_64_8_v1_term_lte(a ore_64_8_v1_term, b ore_64_8_v1_term);
123-
124-
CREATE FUNCTION ore_64_8_v1_term_lte(a ore_64_8_v1_term, b ore_64_8_v1_term)
125-
RETURNS boolean AS $$
126-
SELECT compare_ore_64_8_v1_term(a, b) != 1
127-
$$ LANGUAGE SQL;
128-
129-
130-
DROP FUNCTION IF EXISTS ore_64_8_v1_term_gt(a ore_64_8_v1_term, b ore_64_8_v1_term);
131-
132-
CREATE FUNCTION ore_64_8_v1_term_gt(a ore_64_8_v1_term, b ore_64_8_v1_term)
133-
RETURNS boolean AS $$
134-
SELECT compare_ore_64_8_v1_term(a, b) = 1
135-
$$ LANGUAGE SQL;
136-
137-
138-
DROP FUNCTION IF EXISTS ore_64_8_v1_term_gte(a ore_64_8_v1_term, b ore_64_8_v1_term);
139-
140-
CREATE FUNCTION ore_64_8_v1_term_gte(a ore_64_8_v1_term, b ore_64_8_v1_term)
141-
RETURNS boolean AS $$
142-
SELECT compare_ore_64_8_v1_term(a, b) != -1
143-
$$ LANGUAGE SQL;
144-
145-
146-
DROP OPERATOR IF EXISTS = (ore_64_8_v1_term, ore_64_8_v1_term);
147-
148-
CREATE OPERATOR = (
149-
PROCEDURE="ore_64_8_v1_term_eq",
150-
LEFTARG=ore_64_8_v1_term,
151-
RIGHTARG=ore_64_8_v1_term,
152-
NEGATOR = <>,
153-
RESTRICT = eqsel,
154-
JOIN = eqjoinsel,
155-
HASHES,
156-
MERGES
157-
);
158-
159-
160-
DROP OPERATOR IF EXISTS <> (ore_64_8_v1_term, ore_64_8_v1_term);
161-
162-
CREATE OPERATOR <> (
163-
PROCEDURE="ore_64_8_v1_term_neq",
164-
LEFTARG=ore_64_8_v1_term,
165-
RIGHTARG=ore_64_8_v1_term,
166-
NEGATOR = =,
167-
RESTRICT = eqsel,
168-
JOIN = eqjoinsel,
169-
HASHES,
170-
MERGES
171-
);
172-
173-
DROP OPERATOR IF EXISTS > (ore_64_8_v1_term, ore_64_8_v1_term);
174-
175-
CREATE OPERATOR > (
176-
PROCEDURE="ore_64_8_v1_term_gt",
177-
LEFTARG=ore_64_8_v1_term,
178-
RIGHTARG=ore_64_8_v1_term,
179-
COMMUTATOR = <,
180-
NEGATOR = <=,
181-
RESTRICT = scalargtsel,
182-
JOIN = scalargtjoinsel
183-
);
184-
185-
DROP OPERATOR IF EXISTS < (ore_64_8_v1_term, ore_64_8_v1_term);
186-
187-
CREATE OPERATOR < (
188-
PROCEDURE="ore_64_8_v1_term_lt",
189-
LEFTARG=ore_64_8_v1_term,
190-
RIGHTARG=ore_64_8_v1_term,
191-
COMMUTATOR = >,
192-
NEGATOR = >=,
193-
RESTRICT = scalarltsel,
194-
JOIN = scalarltjoinsel
195-
);
196-
197-
DROP OPERATOR IF EXISTS <= (ore_64_8_v1_term, ore_64_8_v1_term);
198-
199-
CREATE OPERATOR <= (
200-
PROCEDURE="ore_64_8_v1_term_lte",
201-
LEFTARG=ore_64_8_v1_term,
202-
RIGHTARG=ore_64_8_v1_term,
203-
COMMUTATOR = >=,
204-
NEGATOR = >,
205-
RESTRICT = scalarlesel,
206-
JOIN = scalarlejoinsel
207-
);
208-
209-
DROP OPERATOR IF EXISTS >= (ore_64_8_v1_term, ore_64_8_v1_term);
210-
211-
CREATE OPERATOR >= (
212-
PROCEDURE="ore_64_8_v1_term_gte",
213-
LEFTARG=ore_64_8_v1_term,
214-
RIGHTARG=ore_64_8_v1_term,
215-
COMMUTATOR = <=,
216-
NEGATOR = <,
217-
RESTRICT = scalarlesel,
218-
JOIN = scalarlejoinsel
219-
);
220-
221-
DROP OPERATOR FAMILY IF EXISTS ore_64_8_v1_term_btree_ops USING btree;
222-
223-
CREATE OPERATOR FAMILY ore_64_8_v1_term_btree_ops USING btree;
224-
225-
226-
DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_term_btree_ops USING btree;
227-
228-
CREATE OPERATOR CLASS ore_64_8_v1_term_btree_ops DEFAULT FOR TYPE ore_64_8_v1_term USING btree FAMILY ore_64_8_v1_term_btree_ops AS
229-
OPERATOR 1 <,
230-
OPERATOR 2 <=,
231-
OPERATOR 3 =,
232-
OPERATOR 4 >=,
233-
OPERATOR 5 >,
234-
FUNCTION 1 compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term);
235-
23684
-- Compare the "head" of each array and recurse if necessary
23785
-- This function assumes an empty string is "less than" everything else
23886
-- so if a is empty we return -1, if be is empty and a isn't, we return 1.
23987
-- If both are empty we return 0. This cases probably isn't necessary as equality
24088
-- doesn't always make sense but it's here for completeness.
24189
-- If both are non-empty, we compare the first element. If they are equal
24290
-- we need to consider the next block so we recurse, otherwise we return the comparison result.
243-
-- DROP FUNCTION IF EXISTS compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[]);
24491

245-
-- CREATE FUNCTION compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[])
246-
-- RETURNS integer AS $$
247-
-- BEGIN
248-
-- -- SELECT compare_ore_array(a, b);
249-
-- SELECT compare_ore_array(CAST(a AS bytea[]), CAST(b AS bytea[]));
250-
-- END
251-
-- $$ LANGUAGE plpgsql;
25292

25393
CREATE FUNCTION compare_ore_array(a bytea[], b bytea[])
25494
RETURNS integer AS $$
25595
DECLARE
25696
cmp_result integer;
97+
len_a integer;
98+
len_b integer;
25799
BEGIN
100+
101+
SELECT array_length(a, 1) INTO len_a;
102+
SELECT array_length(b, 1) INTO len_b;
103+
258104
IF (array_length(a, 1) = 0 OR a IS NULL) AND (array_length(b, 1) = 0 OR b IS NULL) THEN
259105
RETURN 0;
260106
END IF;
107+
261108
IF array_length(a, 1) = 0 OR a IS NULL THEN
262109
RETURN -1;
263110
END IF;
111+
264112
IF array_length(b, 1) = 0 OR a IS NULL THEN
265113
RETURN 1;
266114
END IF;
267115

268116
cmp_result := compare_ore_64_8_v1_term(a[1], b[1]);
117+
269118
IF cmp_result = 0 THEN
270119
-- Removes the first element in the array, and calls this fn again to compare the next element/s in the array.
271120
RETURN compare_ore_array(a[2:array_length(a,1)], b[2:array_length(b,1)]);
@@ -276,80 +125,68 @@ RETURNS integer AS $$
276125
$$ LANGUAGE plpgsql;
277126

278127
-- This function uses lexicographic comparison
279-
DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1);
128+
DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1);
280129

281-
CREATE FUNCTION compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1)
130+
CREATE FUNCTION compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1)
282131
RETURNS integer AS $$
283-
DECLARE
284-
cmp_result integer;
285-
BEGIN
286-
-- Recursively compare blocks bailing as soon as we can make a decision
287-
RETURN compare_ore_array(a.terms::bytea[], b.terms::bytea[]);
288-
END
289-
$$ LANGUAGE plpgsql;
290-
291-
DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a bytea[], b bytea[]);
292-
293-
CREATE FUNCTION compare_ore_64_8_v1(a bytea[], b bytea[])
294-
RETURNS integer AS $$
295-
DECLARE
296-
cmp_result integer;
297132
BEGIN
298133
-- Recursively compare blocks bailing as soon as we can make a decision
299134
RETURN compare_ore_array(a, b);
300135
END
301136
$$ LANGUAGE plpgsql;
302137

303138

304-
DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1);
139+
DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_index_v1, b ore_64_8_index_v1);
305140

306-
CREATE FUNCTION ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1)
141+
CREATE FUNCTION ore_64_8_v1_eq(a ore_64_8_index_v1, b ore_64_8_index_v1)
307142
RETURNS boolean AS $$
308143
SELECT compare_ore_64_8_v1(a, b) = 0
309144
$$ LANGUAGE SQL;
310145

311146

312-
DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_v1, b ore_64_8_v1);
147+
DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_index_v1, b ore_64_8_index_v1);
313148

314-
CREATE FUNCTION ore_64_8_v1_neq(a ore_64_8_v1, b ore_64_8_v1)
149+
CREATE FUNCTION ore_64_8_v1_neq(a ore_64_8_index_v1, b ore_64_8_index_v1)
315150
RETURNS boolean AS $$
316151
SELECT compare_ore_64_8_v1(a, b) <> 0
317152
$$ LANGUAGE SQL;
318153

319154

320-
DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_v1, b ore_64_8_v1);
155+
DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_index_v1, b ore_64_8_index_v1);
321156

322-
CREATE FUNCTION ore_64_8_v1_lt(a ore_64_8_v1, b ore_64_8_v1)
157+
CREATE FUNCTION ore_64_8_v1_lt(a ore_64_8_index_v1, b ore_64_8_index_v1)
323158
RETURNS boolean AS $$
324159
SELECT compare_ore_64_8_v1(a, b) = -1
325160
$$ LANGUAGE SQL;
326161

327162

328-
DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_v1, b ore_64_8_v1);
163+
DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_index_v1, b ore_64_8_index_v1);
329164

330-
CREATE FUNCTION ore_64_8_v1_lte(a ore_64_8_v1, b ore_64_8_v1)
165+
CREATE FUNCTION ore_64_8_v1_lte(a ore_64_8_index_v1, b ore_64_8_index_v1)
331166
RETURNS boolean AS $$
332167
SELECT compare_ore_64_8_v1(a, b) != 1
333168
$$ LANGUAGE SQL;
334169

335170

336-
DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_v1, b ore_64_8_v1);
171+
DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_index_v1, b ore_64_8_index_v1);
337172

338-
CREATE FUNCTION ore_64_8_v1_gt(a ore_64_8_v1, b ore_64_8_v1)
173+
CREATE FUNCTION ore_64_8_v1_gt(a ore_64_8_index_v1, b ore_64_8_index_v1)
339174
RETURNS boolean AS $$
340-
SELECT compare_ore_64_8_v1(a, b) = 1
341-
$$ LANGUAGE SQL;
175+
BEGIN
176+
SELECT compare_ore_64_8_v1(a, b) = 1;
177+
END;
178+
$$ LANGUAGE plpgsql;
342179

343180

344-
DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_v1, b ore_64_8_v1);
181+
DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_index_v1, b ore_64_8_index_v1);
345182

346-
CREATE FUNCTION ore_64_8_v1_gte(a ore_64_8_v1, b ore_64_8_v1)
183+
CREATE FUNCTION ore_64_8_v1_gte(a ore_64_8_index_v1, b ore_64_8_index_v1)
347184
RETURNS boolean AS $$
348185
SELECT compare_ore_64_8_v1(a, b) != -1
349186
$$ LANGUAGE SQL;
350187

351188

352-
DROP OPERATOR IF EXISTS = (ore_64_8_v1, ore_64_8_v1);
189+
DROP OPERATOR IF EXISTS = (ore_64_8_index_v1, ore_64_8_index_v1);
353190

354191
CREATE OPERATOR = (
355192
PROCEDURE="ore_64_8_v1_eq",
@@ -363,7 +200,7 @@ CREATE OPERATOR = (
363200
);
364201

365202

366-
DROP OPERATOR IF EXISTS <> (ore_64_8_v1, ore_64_8_v1);
203+
DROP OPERATOR IF EXISTS <> (ore_64_8_index_v1, ore_64_8_index_v1);
367204

368205
CREATE OPERATOR <> (
369206
PROCEDURE="ore_64_8_v1_neq",
@@ -376,7 +213,7 @@ CREATE OPERATOR <> (
376213
MERGES
377214
);
378215

379-
DROP OPERATOR IF EXISTS > (ore_64_8_v1, ore_64_8_v1);
216+
DROP OPERATOR IF EXISTS > (ore_64_8_index_v1, ore_64_8_index_v1);
380217

381218
CREATE OPERATOR > (
382219
PROCEDURE="ore_64_8_v1_gt",
@@ -389,7 +226,7 @@ CREATE OPERATOR > (
389226
);
390227

391228

392-
DROP OPERATOR IF EXISTS < (ore_64_8_v1, ore_64_8_v1);
229+
DROP OPERATOR IF EXISTS < (ore_64_8_index_v1, ore_64_8_index_v1);
393230

394231
CREATE OPERATOR < (
395232
PROCEDURE="ore_64_8_v1_lt",
@@ -402,7 +239,7 @@ CREATE OPERATOR < (
402239
);
403240

404241

405-
DROP OPERATOR IF EXISTS <= (ore_64_8_v1, ore_64_8_v1);
242+
DROP OPERATOR IF EXISTS <= (ore_64_8_index_v1, ore_64_8_index_v1);
406243

407244
CREATE OPERATOR <= (
408245
PROCEDURE="ore_64_8_v1_lte",
@@ -415,7 +252,7 @@ CREATE OPERATOR <= (
415252
);
416253

417254

418-
DROP OPERATOR IF EXISTS >= (ore_64_8_v1, ore_64_8_v1);
255+
DROP OPERATOR IF EXISTS >= (ore_64_8_index_v1, ore_64_8_index_v1);
419256

420257
CREATE OPERATOR >= (
421258
PROCEDURE="ore_64_8_v1_gte",
@@ -441,4 +278,4 @@ CREATE OPERATOR CLASS ore_64_8_v1_btree_ops DEFAULT FOR TYPE ore_64_8_v1 USING b
441278
OPERATOR 3 =,
442279
OPERATOR 4 >=,
443280
OPERATOR 5 >,
444-
FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1);
281+
FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1);

0 commit comments

Comments
 (0)