Skip to content

Commit de5b5d1

Browse files
committed
Added l1_distance function for Ecto
1 parent fae8a59 commit de5b5d1

File tree

4 files changed

+20
-1
lines changed

4 files changed

+20
-1
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
dev-files: true
1717
- run: |
1818
cd /tmp
19-
git clone --branch v0.6.0 https://github.com/pgvector/pgvector.git
19+
git clone --branch v0.7.0 https://github.com/pgvector/pgvector.git
2020
cd pgvector
2121
make
2222
sudo make install

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.2.2 (unreleased)
2+
3+
- Added `l1_distance` function for Ecto
4+
15
## 0.2.1 (2023-09-25)
26

37
- Added support for `Pgvector` to `Pgvector.new/1`

lib/pgvector/ecto/query.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,14 @@ if Code.ensure_loaded?(Ecto) do
3030
fragment("(? <=> ?::vector)", unquote(column), unquote(value))
3131
end
3232
end
33+
34+
@doc """
35+
Returns the L1 distance
36+
"""
37+
defmacro l1_distance(column, value) do
38+
quote do
39+
fragment("(? <+> ?::vector)", unquote(column), unquote(value))
40+
end
41+
end
3342
end
3443
end

test/ecto_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ defmodule EctoTest do
4747
assert Enum.map(items, fn v -> v.id end) == [3, 2, 1]
4848
end
4949

50+
test "l1 distance" do
51+
items = Repo.all(from i in Item, order_by: l1_distance(i.embedding, [1, 1, 1]), limit: 5)
52+
assert Enum.map(items, fn v -> v.id end) == [1, 3, 2]
53+
assert Enum.map(items, fn v -> v.embedding |> Pgvector.to_list() end) == [[1.0, 1.0, 1.0], [1.0, 1.0, 2.0], [2.0, 2.0, 3.0]]
54+
end
55+
5056
test "cast" do
5157
embedding = [1, 1, 1]
5258
items = Repo.all(from i in Item, where: i.embedding == ^embedding)

0 commit comments

Comments
 (0)