Skip to content

Commit

Permalink
WIP: GiST index
Browse files Browse the repository at this point in the history
  • Loading branch information
zachasme committed Oct 15, 2019
1 parent 468b304 commit 6c9acd7
Show file tree
Hide file tree
Showing 12 changed files with 1,269 additions and 2 deletions.
53 changes: 53 additions & 0 deletions sql/install/13-opclass_gist.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright 2019 Bytes & Brains
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- GiST Operator Class (opclass_gist.c)
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------

-- GiST operator class
CREATE OR REPLACE FUNCTION h3index_gist_consistent(internal, h3index, smallint, oid, internal) RETURNS boolean
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_union(internal, internal) RETURNS h3index
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_compress(internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_decompress(internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_penalty(internal, internal, internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_picksplit(internal, internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_same(h3index, h3index, internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_distance(internal, h3index, smallint, oid, internal) RETURNS integer
AS 'h3' LANGUAGE C STRICT;

CREATE OPERATOR CLASS gist_h3index_ops DEFAULT FOR TYPE h3index USING gist AS
OPERATOR 3 && ,
OPERATOR 6 = ,
OPERATOR 7 @> ,
OPERATOR 8 <@ ,
OPERATOR 15 <-> (h3index, h3index) FOR ORDER BY integer_ops,

FUNCTION 1 h3index_gist_consistent(internal, h3index, smallint, oid, internal),
FUNCTION 2 h3index_gist_union(internal, internal),
FUNCTION 3 h3index_gist_compress(internal),
FUNCTION 4 h3index_gist_decompress(internal),
FUNCTION 5 h3index_gist_penalty(internal, internal, internal),
FUNCTION 6 h3index_gist_picksplit(internal, internal),
FUNCTION 7 h3index_gist_same(h3index, h3index, internal),
FUNCTION 8 (h3index, h3index) h3index_gist_distance(internal, h3index, smallint, oid, internal);
42 changes: 42 additions & 0 deletions sql/install/14-opclass_spgist.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright 2019 Bytes & Brains
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- SP-GiST Operator Class (opclass_spgist.c)
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------

-- SP-GiST operator class
CREATE OR REPLACE FUNCTION h3index_spgist_config(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_choose(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_picksplit(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_inner_consistent(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_leaf_consistent(internal, internal) RETURNS bool
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;

CREATE OPERATOR CLASS spgist_h3index_ops DEFAULT FOR TYPE h3index USING spgist AS
OPERATOR 6 = ,
OPERATOR 7 @> ,
OPERATOR 8 <@ ,

FUNCTION 1 h3index_spgist_config(internal, internal),
FUNCTION 2 h3index_spgist_choose(internal, internal),
FUNCTION 3 h3index_spgist_picksplit(internal, internal),
FUNCTION 4 h3index_spgist_inner_consistent(internal, internal),
FUNCTION 5 h3index_spgist_leaf_consistent(internal, internal);
130 changes: 130 additions & 0 deletions sql/updates/h3--3.5.0--3.6.0-alpha.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*
* Copyright 2019 Bytes & Brains
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "ALTER EXTENSION h3 UPDATE TO '3.6.0-alpha'" to load this file. \quit

-- Hierarchical grid functions (hierarchy.c)
CREATE OR REPLACE FUNCTION h3_to_center_child(h3index, resolution integer DEFAULT -1) RETURNS h3index
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
COMMENT ON FUNCTION h3_to_parent(h3index, resolution integer) IS
'Returns the center child (finer) index contained by input index at given resolution';

-- Miscellaneous H3 functions (miscellaneous.c)
CREATE OR REPLACE FUNCTION h3_get_pentagon_indexes(resolution integer) RETURNS SETOF h3index
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
COMMENT ON FUNCTION h3_get_res_0_indexes() IS
'All the pentagon H3 indexes at the specified resolution.';

-- PostgreSQL operators
DROP FUNCTION IF EXISTS h3_to_string(h3index);
DROP FUNCTION IF EXISTS h3_string_to_h3(cstring);

CREATE OR REPLACE FUNCTION h3index_overlap(h3index, h3index) RETURNS boolean
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_contains(h3index, h3index) RETURNS boolean
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_contained(h3index, h3index) RETURNS boolean
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;

CREATE OPERATOR <-> (
LEFTARG = h3index,
RIGHTARG = h3index,
PROCEDURE = h3_distance,
COMMUTATOR = <->
);
CREATE OPERATOR && (
LEFTARG = h3index,
RIGHTARG = h3index,
PROCEDURE = h3index_overlap,
COMMUTATOR = &&,
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR @> (
LEFTARG = h3index,
RIGHTARG = h3index,
PROCEDURE = h3index_contains,
COMMUTATOR = <@,
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR <@ (
LEFTARG = h3index,
RIGHTARG = h3index,
PROCEDURE = h3index_contained,
COMMUTATOR = @>,
NEGATOR = <,
RESTRICT = contsel,
JOIN = contjoinsel
);

-- GiST operator class
CREATE OR REPLACE FUNCTION h3index_gist_consistent(internal, h3index, smallint, oid, internal) RETURNS boolean
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_union(internal, internal) RETURNS h3index
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_compress(internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_decompress(internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_penalty(internal, internal, internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_picksplit(internal, internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_same(h3index, h3index, internal) RETURNS internal
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_gist_distance(internal, h3index, smallint, oid, internal) RETURNS integer
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;

CREATE OPERATOR CLASS gist_h3index_ops DEFAULT FOR TYPE h3index USING gist AS
OPERATOR 3 && ,
OPERATOR 6 = ,
OPERATOR 7 @> ,
OPERATOR 8 <@ ,
OPERATOR 15 <-> (h3index, h3index) FOR ORDER BY integer_ops,

FUNCTION 1 h3index_gist_consistent(internal, h3index, smallint, oid, internal),
FUNCTION 2 h3index_gist_union(internal, internal),
FUNCTION 3 h3index_gist_compress(internal),
FUNCTION 4 h3index_gist_decompress(internal),
FUNCTION 5 h3index_gist_penalty(internal, internal, internal),
FUNCTION 6 h3index_gist_picksplit(internal, internal),
FUNCTION 7 h3index_gist_same(h3index, h3index, internal),
FUNCTION 8 h3index_gist_distance(internal, h3index, smallint, oid, internal);

-- SP-GiST operator class
CREATE OR REPLACE FUNCTION h3index_spgist_config(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_choose(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_picksplit(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_inner_consistent(internal, internal) RETURNS void
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3index_spgist_leaf_consistent(internal, internal) RETURNS bool
AS 'h3' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;

CREATE OPERATOR CLASS spgist_h3index_ops DEFAULT FOR TYPE h3index USING spgist AS
OPERATOR 6 = ,
OPERATOR 7 @> ,
OPERATOR 8 <@ ,

FUNCTION 1 h3index_spgist_config(internal, internal),
FUNCTION 2 h3index_spgist_choose(internal, internal),
FUNCTION 3 h3index_spgist_picksplit(internal, internal),
FUNCTION 4 h3index_spgist_inner_consistent(internal, internal),
FUNCTION 5 h3index_spgist_leaf_consistent(internal, internal);
62 changes: 62 additions & 0 deletions sql/updates/h3--3.6.0-alpha--3.5.0.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2019 Bytes & Brains
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "ALTER EXTENSION h3 UPDATE TO '3.6.0'" to load this file. \quit

--- JUST REVERSE EVERYTHING FROM ALPHA

-- Hierarchical grid functions (hierarchy.c)
DROP FUNCTION IF EXISTS h3_to_center_child(h3index, resolution integer);

-- Miscellaneous H3 functions (miscellaneous.c)
DROP FUNCTION IF EXISTS h3_get_pentagon_indexes(resolution integer);

-- PostgreSQL operators
CREATE OR REPLACE FUNCTION h3_string_to_h3(cstring) RETURNS h3index
AS 'h3', 'h3index_in' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION h3_to_string(h3index) RETURNS cstring
AS 'h3', 'h3index_out' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;

-- GiST operator class
DROP OPERATOR CLASS gist_h3index_ops USING gist;
DROP FUNCTION IF EXISTS h3index_gist_consistent(internal, h3index, smallint, oid, internal);
DROP FUNCTION IF EXISTS h3index_gist_union(internal, internal);
DROP FUNCTION IF EXISTS h3index_gist_compress(internal);
DROP FUNCTION IF EXISTS h3index_gist_decompress(internal);
DROP FUNCTION IF EXISTS h3index_gist_penalty(internal, internal, internal);
DROP FUNCTION IF EXISTS h3index_gist_picksplit(internal, internal);
DROP FUNCTION IF EXISTS h3index_gist_same(h3index, h3index, internal);
DROP FUNCTION IF EXISTS h3index_gist_distance(internal, h3index, smallint, oid, internal);


-- SP-GiST operator class
DROP OPERATOR CLASS spgist_h3index_ops USING spgist;
DROP FUNCTION IF EXISTS h3index_spgist_config(internal, internal);
DROP FUNCTION IF EXISTS h3index_spgist_choose(internal, internal);
DROP FUNCTION IF EXISTS h3index_spgist_picksplit(internal, internal);
DROP FUNCTION IF EXISTS h3index_spgist_inner_consistent(internal, internal);
DROP FUNCTION IF EXISTS h3index_spgist_leaf_consistent(internal, internal);

-- general
DROP OPERATOR <-> (h3index, h3index);
DROP OPERATOR && (h3index, h3index);
DROP OPERATOR @> (h3index, h3index);
DROP OPERATOR <@ (h3index, h3index);

DROP FUNCTION IF EXISTS h3index_overlap(h3index, h3index);
DROP FUNCTION IF EXISTS h3index_contains(h3index, h3index);
DROP FUNCTION IF EXISTS h3index_contained(h3index, h3index);
6 changes: 4 additions & 2 deletions src/extension.in.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ typedef struct
/* base type in postgres is Datum, and we cannot fit 8 bytes on all platforms
so we use pointers */
#define PG_RETURN_H3_INDEX_P(x) PG_RETURN_POINTER(x)
#define PG_GETARG_H3_INDEX_P(x) (H3Index *)PG_GETARG_POINTER(x)
#define PG_GETARG_H3_INDEX_P(x) (H3Index *) PG_GETARG_POINTER(x)
#define DatumGetH3IndexP(x) (H3Index *) DatumGetPointer(x)
#define H3IndexPGetDatum(x) PointerGetDatum(x)

/* helper functions to return sets from user fctx */
Datum srf_return_h3_indexes_from_user_fctx(PG_FUNCTION_ARGS);
Expand Down Expand Up @@ -63,7 +65,7 @@ Datum srf_return_h3_index_distances_from_user_fctx(PG_FUNCTION_ARGS);
)

#define DEBUG(msg, ...) \
ereport(DEBUG1, ( \
ereport(WARNING, ( \
errmsg(msg, ##__VA_ARGS__) \
))

Expand Down
Loading

0 comments on commit 6c9acd7

Please sign in to comment.