Skip to content

Commit 78627a1

Browse files
ankaneJulian Pasquale
andcommitted
Fixed error with nil values for Sequel - resolves #7
Co-authored-by: Julian Pasquale <jpasquale@fu.do>
1 parent 7dd09ab commit 78627a1

3 files changed

Lines changed: 23 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.3.3 (unreleased)
2+
3+
- Fixed error with `nil` values for Sequel
4+
15
## 0.3.2 (2024-07-17)
26

37
- Added `to_binary` method to `Vector`, `Bit`, and `SparseVector`

lib/sequel/plugins/pgvector.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def self.configure(model, *columns)
1010

1111
module DatasetMethods
1212
def nearest_neighbors(column, value, distance:)
13+
return extension(:null_dataset).nullify if value.nil?
1314
value = ::Pgvector.encode(value) unless value.is_a?(String)
1415
quoted_column = quote_identifier(column)
1516
distance = distance.to_s
@@ -67,19 +68,20 @@ def nearest_neighbors(column, **options)
6768
end
6869

6970
def []=(k, v)
70-
if self.class.vector_columns.key?(k.to_sym) && !v.is_a?(String)
71+
if self.class.vector_columns.key?(k.to_sym) && !v.is_a?(String) && !v.nil?
7172
super(k, ::Pgvector.encode(v))
7273
else
7374
super
7475
end
7576
end
7677

7778
def [](k)
78-
if self.class.vector_columns.key?(k.to_sym)
79+
v = super
80+
if self.class.vector_columns.key?(k.to_sym) && !v.nil?
7981
# to_s needed for JRuby
80-
::Pgvector.decode(super.to_s)
82+
::Pgvector.decode(v.to_s)
8183
else
82-
super
84+
v
8385
end
8486
end
8587
end

test/sequel_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,19 @@ def test_instance_sparsevec_euclidean
153153
assert_equal [1, Math.sqrt(3)], results.map { |r| r[:neighbor_distance] }
154154
end
155155

156+
def test_model_nil
157+
create_items
158+
assert_equal 0, Item.nearest_neighbors(:embedding, nil, distance: "euclidean").first(5).count
159+
end
160+
161+
def test_instance_nil
162+
create_items
163+
item = Item.create(id: 4, embedding: nil)
164+
item.refresh
165+
assert_nil item.embedding
166+
assert_equal 0, item.nearest_neighbors(:embedding, distance: "euclidean").first(5).count
167+
end
168+
156169
def test_model_dataset
157170
create_items
158171
sampled_item = Item.order(Sequel.function(:random)).first

0 commit comments

Comments
 (0)