Skip to content

Commit

Permalink
WIP: GiST support
Browse files Browse the repository at this point in the history
  • Loading branch information
zachasme committed Dec 1, 2022
1 parent 686349f commit 4a532cc
Show file tree
Hide file tree
Showing 11 changed files with 820 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ avoid adding features or APIs which do not map onto the
- Use CMake for entire build (see [#70])
- Add helper to fix pass-by-value migration (see [#111])
- Allow distance operator `<->` to work for cells at different resolutions (using center child).
- Add `gist` operator class (see [#42], thanks [@abelvm])

</details>

Expand Down Expand Up @@ -219,6 +220,7 @@ avoid adding features or APIs which do not map onto the
[#37]: https://github.com/zachasme/h3-pg/issues/37
[#38]: https://github.com/zachasme/h3-pg/issues/38
[#41]: https://github.com/zachasme/h3-pg/issues/41
[#42]: https://github.com/zachasme/h3-pg/pull/42
[#55]: https://github.com/zachasme/h3-pg/issues/55
[#64]: https://github.com/zachasme/h3-pg/issues/64
[#65]: https://github.com/zachasme/h3-pg/pull/65
Expand Down
24 changes: 24 additions & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,30 @@ Returns true if A containts B.
Returns true if A is contained by B.


### h3index_gist_consistent(`internal`, `h3index`, `smallint`, `oid`, `internal`) ⇒ `boolean`


### h3index_gist_union(`internal`, `internal`) ⇒ `h3index`


### h3index_gist_compress(`internal`) ⇒ `internal`


### h3index_gist_decompress(`internal`) ⇒ `internal`


### h3index_gist_penalty(`internal`, `internal`, `internal`) ⇒ `internal`


### h3index_gist_picksplit(`internal`, `internal`) ⇒ `internal`


### h3index_gist_same(`h3index`, `h3index`, `internal`) ⇒ `internal`


### h3index_gist_distance(`internal`, `h3index`, `smallint`, `oid`, `internal`) ⇒ `float8`


# Type casts

### `h3index` :: `bigint`
Expand Down
2 changes: 2 additions & 0 deletions h3/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ PostgreSQL_add_extension(postgresql_h3
src/inspection.c
src/miscellaneous.c
src/opclass_btree.c
src/opclass_gist.c
src/opclass_hash.c
src/operators.c
src/regions.c
Expand All @@ -33,6 +34,7 @@ PostgreSQL_add_extension(postgresql_h3
sql/install/11-opclass_btree.sql
sql/install/12-opclass_hash.sql
sql/install/13-opclass_brin.sql
sql/install/14-opclass_gist.sql
sql/install/20-casts.sql
sql/install/30-extension.sql
sql/install/99-deprecated.sql
Expand Down
52 changes: 52 additions & 0 deletions h3/sql/install/14-opclass_gist.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright 2019-2020 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)
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------

CREATE OR REPLACE FUNCTION h3index_gist_consistent(internal, h3index, smallint, oid, internal) RETURNS boolean
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_union(internal, internal) RETURNS h3index
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_compress(internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_decompress(internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_penalty(internal, internal, internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_picksplit(internal, internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_same(h3index, h3index, internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_distance(internal, h3index, smallint, oid, internal) RETURNS float8
AS 'h3' LANGUAGE C STRICT;

CREATE OPERATOR CLASS 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);
36 changes: 36 additions & 0 deletions h3/sql/updates/h3--4.0.3--unreleased.sql
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,39 @@ CREATE OPERATOR <-> (
);
COMMENT ON OPERATOR <-> (h3index, h3index) IS
'Returns the distance in grid cells between the two indices (at the lowest resolution of the two).';
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- GiST Operator Class (opclass_gist.c)
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------

CREATE OR REPLACE FUNCTION h3index_gist_consistent(internal, h3index, smallint, oid, internal) RETURNS boolean
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_union(internal, internal) RETURNS h3index
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_compress(internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_decompress(internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_penalty(internal, internal, internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_picksplit(internal, internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_same(h3index, h3index, internal) RETURNS internal
AS 'h3' LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION h3index_gist_distance(internal, h3index, smallint, oid, internal) RETURNS float8
AS 'h3' LANGUAGE C STRICT;

CREATE OPERATOR CLASS 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);
Loading

0 comments on commit 4a532cc

Please sign in to comment.