From 263e684824b4e8b59196420748c56f9e3a323bc0 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 25 Mar 2024 15:25:04 -0700 Subject: [PATCH] Started indexing --- sql/vector--0.6.2--0.6.3.sql | 10 ++++++++++ sql/vector.sql | 10 ++++++++++ test/expected/hnsw_hamming.out | 21 +++++++++++++++++++++ test/sql/hnsw_hamming.sql | 12 ++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 test/expected/hnsw_hamming.out create mode 100644 test/sql/hnsw_hamming.sql diff --git a/sql/vector--0.6.2--0.6.3.sql b/sql/vector--0.6.2--0.6.3.sql index 5fcab73..5484808 100644 --- a/sql/vector--0.6.2--0.6.3.sql +++ b/sql/vector--0.6.2--0.6.3.sql @@ -3,3 +3,13 @@ CREATE FUNCTION hamming_distance(bit, bit) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + +CREATE OPERATOR <~> ( + LEFTARG = bit, RIGHTARG = bit, PROCEDURE = hamming_distance, + COMMUTATOR = '<~>' +); + +CREATE OPERATOR CLASS bit_hamming_ops + FOR TYPE bit USING hnsw AS + OPERATOR 1 <~> (bit, bit) FOR ORDER BY float_ops, + FUNCTION 1 hamming_distance(bit, bit); diff --git a/sql/vector.sql b/sql/vector.sql index eb32566..3cbaadb 100644 --- a/sql/vector.sql +++ b/sql/vector.sql @@ -292,3 +292,13 @@ CREATE OPERATOR CLASS vector_cosine_ops CREATE FUNCTION hamming_distance(bit, bit) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + +CREATE OPERATOR <~> ( + LEFTARG = bit, RIGHTARG = bit, PROCEDURE = hamming_distance, + COMMUTATOR = '<~>' +); + +CREATE OPERATOR CLASS bit_hamming_ops + FOR TYPE bit USING hnsw AS + OPERATOR 1 <~> (bit, bit) FOR ORDER BY float_ops, + FUNCTION 1 hamming_distance(bit, bit); diff --git a/test/expected/hnsw_hamming.out b/test/expected/hnsw_hamming.out new file mode 100644 index 0000000..5c73dc0 --- /dev/null +++ b/test/expected/hnsw_hamming.out @@ -0,0 +1,21 @@ +SET enable_seqscan = off; +CREATE TABLE t (val bit(3)); +INSERT INTO t (val) VALUES (B'000'), (B'100'), (B'111'), (NULL); +CREATE INDEX ON t USING hnsw (val bit_hamming_ops); +INSERT INTO t (val) VALUES ('110'); +SELECT * FROM t ORDER BY val <~> '111'; + val +----- + 111 + 110 + 100 + 000 +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <~> (SELECT NULL::bit)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; diff --git a/test/sql/hnsw_hamming.sql b/test/sql/hnsw_hamming.sql new file mode 100644 index 0000000..1e096e1 --- /dev/null +++ b/test/sql/hnsw_hamming.sql @@ -0,0 +1,12 @@ +SET enable_seqscan = off; + +CREATE TABLE t (val bit(3)); +INSERT INTO t (val) VALUES (B'000'), (B'100'), (B'111'), (NULL); +CREATE INDEX ON t USING hnsw (val bit_hamming_ops); + +INSERT INTO t (val) VALUES ('110'); + +SELECT * FROM t ORDER BY val <~> '111'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <~> (SELECT NULL::bit)) t2; + +DROP TABLE t;