Skip to content

Commit db54101

Browse files
committed
Improved SQLite examples
1 parent 2a2e9a5 commit db54101

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

README.md

+3-11
Original file line numberDiff line numberDiff line change
@@ -306,12 +306,14 @@ class AddEmbeddingToItems < ActiveRecord::Migration[8.0]
306306
def change
307307
# Rails 8+
308308
create_virtual_table :items, :vec0, [
309+
"id integer PRIMARY KEY AUTOINCREMENT NOT NULL",
309310
"embedding float[3] distance_metric=L2"
310311
]
311312

312313
# Rails < 8
313314
execute <<~SQL
314315
CREATE VIRTUAL TABLE items USING vec0(
316+
id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
315317
embedding float[3] distance_metric=L2
316318
)
317319
SQL
@@ -329,16 +331,6 @@ ActiveRecord::SchemaDumper.ignore_tables += [
329331
]
330332
```
331333

332-
Create a model with `rowid` as the primary key
333-
334-
```ruby
335-
class Item < ApplicationRecord
336-
self.primary_key = "rowid"
337-
338-
has_neighbors :embedding, dimensions: 3
339-
end
340-
```
341-
342334
Get the `k` nearest neighbors
343335

344336
```ruby
@@ -348,7 +340,7 @@ Item.where("embedding MATCH ?", [1, 2, 3].to_s).where(k: 5).order(:distance)
348340
Filter by primary key
349341

350342
```ruby
351-
Item.where(rowid: [2, 3]).where("embedding MATCH ?", [1, 2, 3].to_s).where(k: 5).order(:distance)
343+
Item.where(id: [2, 3]).where("embedding MATCH ?", [1, 2, 3].to_s).where(k: 5).order(:distance)
352344
```
353345

354346
### Int8 Vectors

test/sqlite_virtual_test.rb

+11-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def test_euclidean
2323

2424
relation = SqliteVecItem.where("embedding MATCH ?", [1, 1, 1].to_s).order(:distance).limit(3)
2525
assert_equal [1, 3, 2], relation.all.map(&:id)
26-
assert_equal [1, 3, 2], relation.pluck(:rowid)
26+
assert_equal [1, 3, 2], relation.pluck(:id)
2727
assert_elements_in_delta [0, 1, Math.sqrt(3)], relation.pluck(:distance)
2828
assert_match "SCAN vec_items VIRTUAL TABLE INDEX", relation.explain.inspect
2929

@@ -51,10 +51,17 @@ def test_where_k
5151
assert SqliteVecItem.where.not(embedding: nil).where("embedding MATCH ? AND k = ?", "[0, 0, 0]", 3).order(:distance).load
5252
end
5353

54-
def test_where_rowid
54+
def test_where_id
5555
create_items(SqliteVecItem, :embedding)
5656

57-
relation = SqliteVecItem.where(rowid: [2, 3]).where("embedding MATCH ?", [1, 1, 1].to_s).where(k: 5).order(:distance)
58-
assert_equal [3, 2], relation.pluck(:rowid)
57+
relation = SqliteVecItem.where(id: [2, 3]).where("embedding MATCH ?", [1, 1, 1].to_s).where(k: 5).order(:distance)
58+
assert_equal [3, 2], relation.pluck(:id)
59+
end
60+
61+
def test_create_returning_id
62+
item = SqliteVecItem.create!(embedding: [1, 2, 3])
63+
# TODO figure out why id not set
64+
assert_nil item.id
65+
assert_kind_of Integer, SqliteVecItem.last.id
5966
end
6067
end

test/support/sqlite.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,27 @@ class SqliteRecord < ActiveRecord::Base
1515

1616
if ActiveRecord::VERSION::MAJOR >= 8
1717
create_virtual_table :vec_items, :vec0, [
18+
"id integer PRIMARY KEY AUTOINCREMENT NOT NULL",
1819
"embedding float[3] distance_metric=L2"
1920
]
2021
else
2122
execute <<~SQL
2223
CREATE VIRTUAL TABLE vec_items USING vec0(
24+
id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
2325
embedding float[3] distance_metric=L2
2426
)
2527
SQL
2628
end
2729

2830
if ActiveRecord::VERSION::MAJOR >= 8
2931
create_virtual_table :cosine_items, :vec0, [
32+
"id integer PRIMARY KEY AUTOINCREMENT NOT NULL",
3033
"embedding float[3] distance_metric=cosine"
3134
]
3235
else
3336
execute <<~SQL
3437
CREATE VIRTUAL TABLE cosine_items USING vec0(
38+
id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3539
embedding float[3] distance_metric=cosine
3640
)
3741
SQL
@@ -47,13 +51,11 @@ class SqliteItem < SqliteRecord
4751

4852
class SqliteVecItem < SqliteRecord
4953
has_neighbors :embedding, dimensions: 3
50-
self.primary_key = "rowid"
5154
self.table_name = "vec_items"
5255
end
5356

5457
class SqliteCosineItem < SqliteRecord
5558
has_neighbors :embedding, dimensions: 3
56-
self.primary_key = "rowid"
5759
self.table_name = "cosine_items"
5860
end
5961

0 commit comments

Comments
 (0)