Skip to content

Commit 1f0f791

Browse files
committed
NFI
1 parent c518c70 commit 1f0f791

File tree

7 files changed

+429
-880
lines changed

7 files changed

+429
-880
lines changed

sql/000-ore.sql

Lines changed: 58 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,61 @@ 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+
RAISE NOTICE '////////////////////////';
101+
102+
SELECT array_length(a, 1) INTO len_a;
103+
SELECT array_length(b, 1) INTO len_b;
104+
105+
RAISE NOTICE 'len_a %', len_a;
106+
RAISE NOTICE 'len_b %', len_b;
107+
108+
-- IF (a IS NULL) THEN
109+
-- RAISE NOTICE 'a is NULL';
110+
-- END IF;
111+
112+
-- IF (b IS NULL) THEN
113+
-- RAISE NOTICE 'b is NULL';
114+
-- END IF;
115+
258116
IF (array_length(a, 1) = 0 OR a IS NULL) AND (array_length(b, 1) = 0 OR b IS NULL) THEN
117+
RAISE NOTICE 'RETURN 0';
259118
RETURN 0;
260119
END IF;
120+
261121
IF array_length(a, 1) = 0 OR a IS NULL THEN
122+
RAISE NOTICE 'RETURN -1';
262123
RETURN -1;
263124
END IF;
125+
264126
IF array_length(b, 1) = 0 OR a IS NULL THEN
127+
RAISE NOTICE 'RETURN 1';
265128
RETURN 1;
266129
END IF;
267130

131+
-- RAISE NOTICE '////////////////////////';
132+
268133
cmp_result := compare_ore_64_8_v1_term(a[1], b[1]);
134+
135+
RAISE NOTICE 'cmp_result %', cmp_result;
136+
RAISE NOTICE '////////////////////////';
137+
138+
269139
IF cmp_result = 0 THEN
270140
-- Removes the first element in the array, and calls this fn again to compare the next element/s in the array.
271141
RETURN compare_ore_array(a[2:array_length(a,1)], b[2:array_length(b,1)]);
@@ -276,80 +146,70 @@ RETURNS integer AS $$
276146
$$ LANGUAGE plpgsql;
277147

278148
-- 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);
149+
DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1);
280150

281-
CREATE FUNCTION compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1)
151+
CREATE FUNCTION compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1)
282152
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;
297153
BEGIN
154+
RAISE NOTICE 'compare_ore_64_8_v1';
298155
-- Recursively compare blocks bailing as soon as we can make a decision
299156
RETURN compare_ore_array(a, b);
300157
END
301158
$$ LANGUAGE plpgsql;
302159

303160

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

306-
CREATE FUNCTION ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1)
163+
CREATE FUNCTION ore_64_8_v1_eq(a ore_64_8_index_v1, b ore_64_8_index_v1)
307164
RETURNS boolean AS $$
308165
SELECT compare_ore_64_8_v1(a, b) = 0
309166
$$ LANGUAGE SQL;
310167

311168

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

314-
CREATE FUNCTION ore_64_8_v1_neq(a ore_64_8_v1, b ore_64_8_v1)
171+
CREATE FUNCTION ore_64_8_v1_neq(a ore_64_8_index_v1, b ore_64_8_index_v1)
315172
RETURNS boolean AS $$
316173
SELECT compare_ore_64_8_v1(a, b) <> 0
317174
$$ LANGUAGE SQL;
318175

319176

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

322-
CREATE FUNCTION ore_64_8_v1_lt(a ore_64_8_v1, b ore_64_8_v1)
179+
CREATE FUNCTION ore_64_8_v1_lt(a ore_64_8_index_v1, b ore_64_8_index_v1)
323180
RETURNS boolean AS $$
324181
SELECT compare_ore_64_8_v1(a, b) = -1
325182
$$ LANGUAGE SQL;
326183

327184

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

330-
CREATE FUNCTION ore_64_8_v1_lte(a ore_64_8_v1, b ore_64_8_v1)
187+
CREATE FUNCTION ore_64_8_v1_lte(a ore_64_8_index_v1, b ore_64_8_index_v1)
331188
RETURNS boolean AS $$
332189
SELECT compare_ore_64_8_v1(a, b) != 1
333190
$$ LANGUAGE SQL;
334191

335192

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

338-
CREATE FUNCTION ore_64_8_v1_gt(a ore_64_8_v1, b ore_64_8_v1)
195+
CREATE FUNCTION ore_64_8_v1_gt(a ore_64_8_index_v1, b ore_64_8_index_v1)
339196
RETURNS boolean AS $$
340-
SELECT compare_ore_64_8_v1(a, b) = 1
341-
$$ LANGUAGE SQL;
197+
BEGIN
198+
RAISE NOTICE 'ore_64_8_v1_gt';
199+
SELECT compare_ore_64_8_v1(a, b) = 1;
200+
END;
201+
$$ LANGUAGE plpgsql;
342202

343203

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

346-
CREATE FUNCTION ore_64_8_v1_gte(a ore_64_8_v1, b ore_64_8_v1)
206+
CREATE FUNCTION ore_64_8_v1_gte(a ore_64_8_index_v1, b ore_64_8_index_v1)
347207
RETURNS boolean AS $$
348208
SELECT compare_ore_64_8_v1(a, b) != -1
349209
$$ LANGUAGE SQL;
350210

351211

352-
DROP OPERATOR IF EXISTS = (ore_64_8_v1, ore_64_8_v1);
212+
DROP OPERATOR IF EXISTS = (ore_64_8_index_v1, ore_64_8_index_v1);
353213

354214
CREATE OPERATOR = (
355215
PROCEDURE="ore_64_8_v1_eq",
@@ -363,7 +223,7 @@ CREATE OPERATOR = (
363223
);
364224

365225

366-
DROP OPERATOR IF EXISTS <> (ore_64_8_v1, ore_64_8_v1);
226+
DROP OPERATOR IF EXISTS <> (ore_64_8_index_v1, ore_64_8_index_v1);
367227

368228
CREATE OPERATOR <> (
369229
PROCEDURE="ore_64_8_v1_neq",
@@ -376,7 +236,7 @@ CREATE OPERATOR <> (
376236
MERGES
377237
);
378238

379-
DROP OPERATOR IF EXISTS > (ore_64_8_v1, ore_64_8_v1);
239+
DROP OPERATOR IF EXISTS > (ore_64_8_index_v1, ore_64_8_index_v1);
380240

381241
CREATE OPERATOR > (
382242
PROCEDURE="ore_64_8_v1_gt",
@@ -389,7 +249,7 @@ CREATE OPERATOR > (
389249
);
390250

391251

392-
DROP OPERATOR IF EXISTS < (ore_64_8_v1, ore_64_8_v1);
252+
DROP OPERATOR IF EXISTS < (ore_64_8_index_v1, ore_64_8_index_v1);
393253

394254
CREATE OPERATOR < (
395255
PROCEDURE="ore_64_8_v1_lt",
@@ -402,7 +262,7 @@ CREATE OPERATOR < (
402262
);
403263

404264

405-
DROP OPERATOR IF EXISTS <= (ore_64_8_v1, ore_64_8_v1);
265+
DROP OPERATOR IF EXISTS <= (ore_64_8_index_v1, ore_64_8_index_v1);
406266

407267
CREATE OPERATOR <= (
408268
PROCEDURE="ore_64_8_v1_lte",
@@ -415,7 +275,7 @@ CREATE OPERATOR <= (
415275
);
416276

417277

418-
DROP OPERATOR IF EXISTS >= (ore_64_8_v1, ore_64_8_v1);
278+
DROP OPERATOR IF EXISTS >= (ore_64_8_index_v1, ore_64_8_index_v1);
419279

420280
CREATE OPERATOR >= (
421281
PROCEDURE="ore_64_8_v1_gte",
@@ -441,4 +301,4 @@ CREATE OPERATOR CLASS ore_64_8_v1_btree_ops DEFAULT FOR TYPE ore_64_8_v1 USING b
441301
OPERATOR 3 =,
442302
OPERATOR 4 >=,
443303
OPERATOR 5 >,
444-
FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1);
304+
FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1);

0 commit comments

Comments
 (0)