Skip to content

Commit 26673ed

Browse files
committed
Added support for halfvec type
1 parent 130792c commit 26673ed

2 files changed

Lines changed: 36 additions & 3 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.2.0 (unreleased)
22

3-
- Added support for `sparsevec` type
3+
- Added support for `halfvec` and `sparsevec` type
44

55
## 0.1.1 (2023-03-09)
66

src/pgvector.lua

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ local vector_mt = {
66
end
77
}
88

9+
local halfvec_mt = {
10+
pgmoon_serialize = function(v)
11+
return 0, halfvec_serialize(v)
12+
end
13+
}
14+
915
local sparsevec_mt = {
1016
pgmoon_serialize = function(v)
1117
return 0, sparsevec_serialize(v)
@@ -36,6 +42,30 @@ function pgvector.deserialize(v)
3642
return setmetatable(vec, vector_mt)
3743
end
3844

45+
function pgvector.halfvec(v)
46+
local vec = {}
47+
for _, x in ipairs(v) do
48+
table.insert(vec, x)
49+
end
50+
return setmetatable(vec, halfvec_mt)
51+
end
52+
53+
function halfvec_serialize(v)
54+
for _, v in ipairs(v) do
55+
assert(type(v) == "number")
56+
end
57+
return "[" .. table.concat(v, ",") .. "]"
58+
end
59+
60+
function halfvec_deserialize(v)
61+
local vec = {}
62+
for x in string.gmatch(string.sub(v, 2, -2), "[^,]+") do
63+
table.insert(vec, tonumber(x))
64+
end
65+
-- pgvector.halfvec without copy
66+
return setmetatable(vec, halfvec_mt)
67+
end
68+
3969
function pgvector.sparsevec(elements, dim)
4070
for k, v in pairs(elements) do
4171
assert(type(k) == "number")
@@ -62,10 +92,13 @@ function sparsevec_deserialize(v)
6292
end
6393

6494
function pgvector.setup_vector(pg)
65-
local row = pg:query("SELECT to_regtype('vector')::oid AS vector_oid, to_regtype('sparsevec')::oid AS sparsevec_oid")[1]
95+
local row = pg:query("SELECT to_regtype('vector')::oid AS vector_oid, to_regtype('halfvec')::oid AS halfvec_oid, to_regtype('sparsevec')::oid AS sparsevec_oid")[1]
6696
assert(row["vector_oid"], "vector type not found in the database")
6797
pg:set_type_deserializer(row["vector_oid"], "vector", function(self, v) return pgvector.deserialize(v) end)
68-
-- if row["sparsevec_oid"] do
98+
if row["halfvec_oid"] then
99+
pg:set_type_deserializer(row["halfvec_oid"], "halfvec", function(self, v) return halfvec_deserialize(v) end)
100+
end
101+
-- if row["sparsevec_oid"] then
69102
-- pg:set_type_deserializer(row["sparsevec_oid"], "sparsevec", function(self, v) return sparsevec_deserialize(v) end)
70103
-- end
71104
end

0 commit comments

Comments
 (0)