Skip to content

Commit 33bd250

Browse files
committed
Cube extension kNN support
Introduce distance operators over cubes: <#> taxicab distance <-> euclidean distance <=> chebyshev distance Also add kNN support of those distances in GiST opclass. Author: Stas Kelvich
1 parent 3d0c50f commit 33bd250

File tree

12 files changed

+1684
-4
lines changed

12 files changed

+1684
-4
lines changed

contrib/cube/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ MODULE_big = cube
44
OBJS= cube.o cubeparse.o $(WIN32RES)
55

66
EXTENSION = cube
7-
DATA = cube--1.0.sql cube--unpackaged--1.0.sql
7+
DATA = cube--1.1.sql cube--1.0--1.1.sql cube--unpackaged--1.0.sql
88
PGFILEDESC = "cube - multidimensional cube data type"
99

1010
REGRESS = cube

contrib/cube/cube--1.0--1.1.sql

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* contrib/cube/cube--1.0--1.1.sql */
2+
3+
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
4+
\echo Use "ALTER EXTENSION cube UPDATE TO '1.1'" to load this file. \quit
5+
6+
CREATE FUNCTION distance_chebyshev(cube, cube)
7+
RETURNS float8
8+
AS 'MODULE_PATHNAME'
9+
LANGUAGE C IMMUTABLE STRICT;
10+
11+
CREATE FUNCTION distance_taxicab(cube, cube)
12+
RETURNS float8
13+
AS 'MODULE_PATHNAME'
14+
LANGUAGE C IMMUTABLE STRICT;
15+
16+
CREATE FUNCTION cube_coord(cube, int4)
17+
RETURNS float8
18+
AS 'MODULE_PATHNAME'
19+
LANGUAGE C IMMUTABLE STRICT;
20+
21+
CREATE FUNCTION cube_coord_llur(cube, int4)
22+
RETURNS float8
23+
AS 'MODULE_PATHNAME'
24+
LANGUAGE C IMMUTABLE STRICT;
25+
26+
CREATE OPERATOR -> (
27+
LEFTARG = cube, RIGHTARG = int, PROCEDURE = cube_coord
28+
);
29+
30+
CREATE OPERATOR ~> (
31+
LEFTARG = cube, RIGHTARG = int, PROCEDURE = cube_coord_llur
32+
);
33+
34+
CREATE OPERATOR <#> (
35+
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = distance_taxicab,
36+
COMMUTATOR = '<#>'
37+
);
38+
39+
CREATE OPERATOR <-> (
40+
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_distance,
41+
COMMUTATOR = '<->'
42+
);
43+
44+
CREATE OPERATOR <=> (
45+
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = distance_chebyshev,
46+
COMMUTATOR = '<=>'
47+
);
48+
49+
CREATE FUNCTION g_cube_distance (internal, cube, smallint, oid)
50+
RETURNS internal
51+
AS 'MODULE_PATHNAME'
52+
LANGUAGE C IMMUTABLE STRICT;
53+
54+
ALTER OPERATOR FAMILY gist_cube_ops USING gist ADD
55+
OPERATOR 15 ~> (cube, int) FOR ORDER BY float_ops,
56+
OPERATOR 16 <#> (cube, cube) FOR ORDER BY float_ops,
57+
OPERATOR 17 <-> (cube, cube) FOR ORDER BY float_ops,
58+
OPERATOR 18 <=> (cube, cube) FOR ORDER BY float_ops,
59+
FUNCTION 8 (cube, cube) g_cube_distance (internal, cube, smallint, oid);
60+

contrib/cube/cube--1.0.sql renamed to contrib/cube/cube--1.1.sql

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* contrib/cube/cube--1.0.sql */
1+
/* contrib/cube/cube--1.1.sql */
22

33
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
44
\echo Use "CREATE EXTENSION cube" to load this file. \quit
@@ -140,6 +140,16 @@ RETURNS float8
140140
AS 'MODULE_PATHNAME'
141141
LANGUAGE C IMMUTABLE STRICT;
142142

143+
CREATE FUNCTION distance_chebyshev(cube, cube)
144+
RETURNS float8
145+
AS 'MODULE_PATHNAME'
146+
LANGUAGE C IMMUTABLE STRICT;
147+
148+
CREATE FUNCTION distance_taxicab(cube, cube)
149+
RETURNS float8
150+
AS 'MODULE_PATHNAME'
151+
LANGUAGE C IMMUTABLE STRICT;
152+
143153
-- Extracting elements functions
144154

145155
CREATE FUNCTION cube_dim(cube)
@@ -157,6 +167,16 @@ RETURNS float8
157167
AS 'MODULE_PATHNAME'
158168
LANGUAGE C IMMUTABLE STRICT;
159169

170+
CREATE FUNCTION cube_coord(cube, int4)
171+
RETURNS float8
172+
AS 'MODULE_PATHNAME'
173+
LANGUAGE C IMMUTABLE STRICT;
174+
175+
CREATE FUNCTION cube_coord_llur(cube, int4)
176+
RETURNS float8
177+
AS 'MODULE_PATHNAME'
178+
LANGUAGE C IMMUTABLE STRICT;
179+
160180
CREATE FUNCTION cube(float8) RETURNS cube
161181
AS 'MODULE_PATHNAME', 'cube_f8'
162182
LANGUAGE C IMMUTABLE STRICT;
@@ -246,6 +266,29 @@ CREATE OPERATOR <@ (
246266
RESTRICT = contsel, JOIN = contjoinsel
247267
);
248268

269+
CREATE OPERATOR -> (
270+
LEFTARG = cube, RIGHTARG = int, PROCEDURE = cube_coord
271+
);
272+
273+
CREATE OPERATOR ~> (
274+
LEFTARG = cube, RIGHTARG = int, PROCEDURE = cube_coord_llur
275+
);
276+
277+
CREATE OPERATOR <#> (
278+
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = distance_taxicab,
279+
COMMUTATOR = '<#>'
280+
);
281+
282+
CREATE OPERATOR <-> (
283+
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_distance,
284+
COMMUTATOR = '<->'
285+
);
286+
287+
CREATE OPERATOR <=> (
288+
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = distance_chebyshev,
289+
COMMUTATOR = '<=>'
290+
);
291+
249292
-- these are obsolete/deprecated:
250293
CREATE OPERATOR @ (
251294
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contains,
@@ -296,6 +339,10 @@ RETURNS internal
296339
AS 'MODULE_PATHNAME'
297340
LANGUAGE C IMMUTABLE STRICT;
298341

342+
CREATE FUNCTION g_cube_distance (internal, cube, smallint, oid)
343+
RETURNS internal
344+
AS 'MODULE_PATHNAME'
345+
LANGUAGE C IMMUTABLE STRICT;
299346

300347
-- Create the operator classes for indexing
301348

@@ -316,10 +363,17 @@ CREATE OPERATOR CLASS gist_cube_ops
316363
OPERATOR 8 <@ ,
317364
OPERATOR 13 @ ,
318365
OPERATOR 14 ~ ,
366+
OPERATOR 15 ~> (cube, int) FOR ORDER BY float_ops,
367+
OPERATOR 16 <#> (cube, cube) FOR ORDER BY float_ops,
368+
OPERATOR 17 <-> (cube, cube) FOR ORDER BY float_ops,
369+
OPERATOR 18 <=> (cube, cube) FOR ORDER BY float_ops,
370+
319371
FUNCTION 1 g_cube_consistent (internal, cube, int, oid, internal),
320372
FUNCTION 2 g_cube_union (internal, internal),
321373
FUNCTION 3 g_cube_compress (internal),
322374
FUNCTION 4 g_cube_decompress (internal),
323375
FUNCTION 5 g_cube_penalty (internal, internal, internal),
324376
FUNCTION 6 g_cube_picksplit (internal, internal),
325-
FUNCTION 7 g_cube_same (cube, cube, internal);
377+
FUNCTION 7 g_cube_same (cube, cube, internal),
378+
FUNCTION 8 g_cube_distance (internal, cube, smallint, oid);
379+

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy