Skip to content

Commit 59bf427

Browse files
committed
Added to_binary method to Bit
1 parent ea9b077 commit 59bf427

4 files changed

Lines changed: 21 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 0.3.2 (unreleased)
22

3-
- Added `to_binary` method to `Vector` and `SparseVector`
3+
- Added `to_binary` method to `Vector`, `Bit`, and `SparseVector`
44

55
## 0.3.1 (2024-07-10)
66

lib/pgvector/bit.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,11 @@ def to_s
2424
def to_a
2525
@data.each_char.map { |v| v != "0" }
2626
end
27+
28+
def to_binary
29+
buffer = [@data.length].pack("l>")
30+
@data.split(/.{8}/).pack("B*", buffer: buffer)
31+
buffer
32+
end
2733
end
2834
end

lib/pgvector/pg.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def self.register_vector(registry)
1010
registry.register_type(0, "halfvec", TextEncoder::Halfvec, TextDecoder::Halfvec)
1111

1212
registry.register_type(0, "bit", TextEncoder::Bit, TextDecoder::Bit)
13-
registry.register_type(1, "bit", nil, BinaryDecoder::Bit)
13+
registry.register_type(1, "bit", BinaryEncoder::Bit, BinaryDecoder::Bit)
1414

1515
registry.register_type(0, "sparsevec", TextEncoder::Sparsevec, TextDecoder::Sparsevec)
1616
registry.register_type(1, "sparsevec", BinaryEncoder::Sparsevec, BinaryDecoder::Sparsevec)
@@ -41,6 +41,7 @@ module BinaryEncoder
4141
def self.type_map
4242
tm = ::PG::TypeMapByClass.new
4343
tm[::Pgvector::Vector] = Vector.new
44+
tm[::Pgvector::Bit] = Bit.new
4445
tm[::Pgvector::SparseVector] = Sparsevec.new
4546
tm
4647
end
@@ -51,6 +52,12 @@ def encode(value)
5152
end
5253
end
5354

55+
class Bit < ::PG::SimpleEncoder
56+
def encode(value)
57+
value.to_binary
58+
end
59+
end
60+
5461
class Sparsevec < ::PG::SimpleEncoder
5562
def encode(value)
5663
value.to_binary

test/pg_test.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,11 @@ def test_type_map_text
8888

8989
def test_type_map_binary
9090
vec = Pgvector::Vector.new([1, 2, 3])
91+
binary_vec = Pgvector::Bit.new([true, false, true])
9192
sparse_vec = Pgvector::SparseVector.new([1, 2, 3])
9293
coder = PG::BinaryEncoder::CopyRow.new(type_map: Pgvector::PG::BinaryEncoder.type_map)
9394
assert_match vec.to_binary, coder.encode([vec])
95+
assert_match binary_vec.to_binary, coder.encode([binary_vec])
9496
assert_match sparse_vec.to_binary, coder.encode([sparse_vec])
9597
end
9698

@@ -112,13 +114,15 @@ def test_copy_text
112114

113115
def test_copy_binary
114116
embedding = Pgvector::Vector.new([1, 2, 3])
117+
binary_embedding = Pgvector::Bit.new([true, false, true])
115118
sparse_embedding = Pgvector::SparseVector.new([1, 2, 3])
116119
coder = PG::BinaryEncoder::CopyRow.new
117-
conn.copy_data("COPY pg_items (embedding, sparse_embedding) FROM STDIN WITH (FORMAT BINARY)", coder) do
118-
conn.put_copy_data([embedding.to_binary, sparse_embedding.to_binary])
120+
conn.copy_data("COPY pg_items (embedding, binary_embedding, sparse_embedding) FROM STDIN WITH (FORMAT BINARY)", coder) do
121+
conn.put_copy_data([embedding.to_binary, binary_embedding.to_binary, sparse_embedding.to_binary])
119122
end
120123
res = conn.exec("SELECT * FROM pg_items").first
121124
assert_equal [1, 2, 3], res["embedding"]
125+
assert_equal "101", res["binary_embedding"]
122126
assert_equal [1, 2, 3], res["sparse_embedding"].to_a
123127
end
124128

0 commit comments

Comments
 (0)