@kernl-sdk/pg 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-check-types.log +36 -0
- package/CHANGELOG.md +32 -0
- package/README.md +124 -0
- package/dist/__tests__/integration.test.js +2 -2
- package/dist/__tests__/memory-integration.test.d.ts +2 -0
- package/dist/__tests__/memory-integration.test.d.ts.map +1 -0
- package/dist/__tests__/memory-integration.test.js +287 -0
- package/dist/__tests__/memory.test.d.ts +2 -0
- package/dist/__tests__/memory.test.d.ts.map +1 -0
- package/dist/__tests__/memory.test.js +357 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/memory/sql.d.ts +30 -0
- package/dist/memory/sql.d.ts.map +1 -0
- package/dist/memory/sql.js +100 -0
- package/dist/memory/store.d.ts +41 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +114 -0
- package/dist/migrations.d.ts +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +9 -3
- package/dist/pgvector/__tests__/handle.test.d.ts +2 -0
- package/dist/pgvector/__tests__/handle.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/handle.test.js +277 -0
- package/dist/pgvector/__tests__/hit.test.d.ts +2 -0
- package/dist/pgvector/__tests__/hit.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/hit.test.js +134 -0
- package/dist/pgvector/__tests__/integration/document.integration.test.d.ts +7 -0
- package/dist/pgvector/__tests__/integration/document.integration.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/integration/document.integration.test.js +587 -0
- package/dist/pgvector/__tests__/integration/edge.integration.test.d.ts +8 -0
- package/dist/pgvector/__tests__/integration/edge.integration.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/integration/edge.integration.test.js +663 -0
- package/dist/pgvector/__tests__/integration/filters.integration.test.d.ts +8 -0
- package/dist/pgvector/__tests__/integration/filters.integration.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/integration/filters.integration.test.js +609 -0
- package/dist/pgvector/__tests__/integration/lifecycle.integration.test.d.ts +8 -0
- package/dist/pgvector/__tests__/integration/lifecycle.integration.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/integration/lifecycle.integration.test.js +449 -0
- package/dist/pgvector/__tests__/integration/query.integration.test.d.ts +8 -0
- package/dist/pgvector/__tests__/integration/query.integration.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/integration/query.integration.test.js +544 -0
- package/dist/pgvector/__tests__/search.test.d.ts +2 -0
- package/dist/pgvector/__tests__/search.test.d.ts.map +1 -0
- package/dist/pgvector/__tests__/search.test.js +279 -0
- package/dist/pgvector/handle.d.ts +60 -0
- package/dist/pgvector/handle.d.ts.map +1 -0
- package/dist/pgvector/handle.js +213 -0
- package/dist/pgvector/hit.d.ts +10 -0
- package/dist/pgvector/hit.d.ts.map +1 -0
- package/dist/pgvector/hit.js +44 -0
- package/dist/pgvector/index.d.ts +7 -0
- package/dist/pgvector/index.d.ts.map +1 -0
- package/dist/pgvector/index.js +5 -0
- package/dist/pgvector/search.d.ts +60 -0
- package/dist/pgvector/search.d.ts.map +1 -0
- package/dist/pgvector/search.js +227 -0
- package/dist/pgvector/sql/__tests__/limit.test.d.ts +2 -0
- package/dist/pgvector/sql/__tests__/limit.test.d.ts.map +1 -0
- package/dist/pgvector/sql/__tests__/limit.test.js +161 -0
- package/dist/pgvector/sql/__tests__/order.test.d.ts +2 -0
- package/dist/pgvector/sql/__tests__/order.test.d.ts.map +1 -0
- package/dist/pgvector/sql/__tests__/order.test.js +218 -0
- package/dist/pgvector/sql/__tests__/query.test.d.ts +2 -0
- package/dist/pgvector/sql/__tests__/query.test.d.ts.map +1 -0
- package/dist/pgvector/sql/__tests__/query.test.js +392 -0
- package/dist/pgvector/sql/__tests__/select.test.d.ts +2 -0
- package/dist/pgvector/sql/__tests__/select.test.d.ts.map +1 -0
- package/dist/pgvector/sql/__tests__/select.test.js +293 -0
- package/dist/pgvector/sql/__tests__/where.test.d.ts +2 -0
- package/dist/pgvector/sql/__tests__/where.test.d.ts.map +1 -0
- package/dist/pgvector/sql/__tests__/where.test.js +488 -0
- package/dist/pgvector/sql/index.d.ts +7 -0
- package/dist/pgvector/sql/index.d.ts.map +1 -0
- package/dist/pgvector/sql/index.js +6 -0
- package/dist/pgvector/sql/limit.d.ts +8 -0
- package/dist/pgvector/sql/limit.d.ts.map +1 -0
- package/dist/pgvector/sql/limit.js +20 -0
- package/dist/pgvector/sql/order.d.ts +9 -0
- package/dist/pgvector/sql/order.d.ts.map +1 -0
- package/dist/pgvector/sql/order.js +47 -0
- package/dist/pgvector/sql/query.d.ts +46 -0
- package/dist/pgvector/sql/query.d.ts.map +1 -0
- package/dist/pgvector/sql/query.js +54 -0
- package/dist/pgvector/sql/schema.d.ts +16 -0
- package/dist/pgvector/sql/schema.d.ts.map +1 -0
- package/dist/pgvector/sql/schema.js +47 -0
- package/dist/pgvector/sql/select.d.ts +11 -0
- package/dist/pgvector/sql/select.d.ts.map +1 -0
- package/dist/pgvector/sql/select.js +87 -0
- package/dist/pgvector/sql/where.d.ts +8 -0
- package/dist/pgvector/sql/where.d.ts.map +1 -0
- package/dist/pgvector/sql/where.js +137 -0
- package/dist/pgvector/types.d.ts +20 -0
- package/dist/pgvector/types.d.ts.map +1 -0
- package/dist/pgvector/types.js +1 -0
- package/dist/pgvector/utils.d.ts +18 -0
- package/dist/pgvector/utils.d.ts.map +1 -0
- package/dist/pgvector/utils.js +22 -0
- package/dist/postgres.d.ts +19 -26
- package/dist/postgres.d.ts.map +1 -1
- package/dist/postgres.js +15 -27
- package/dist/storage.d.ts +48 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +32 -9
- package/dist/thread/sql.d.ts +38 -0
- package/dist/thread/sql.d.ts.map +1 -0
- package/dist/thread/sql.js +112 -0
- package/dist/thread/store.d.ts +2 -2
- package/dist/thread/store.d.ts.map +1 -1
- package/dist/thread/store.js +32 -102
- package/package.json +7 -4
- package/src/__tests__/integration.test.ts +15 -17
- package/src/__tests__/memory-integration.test.ts +355 -0
- package/src/__tests__/memory.test.ts +428 -0
- package/src/index.ts +19 -3
- package/src/memory/sql.ts +141 -0
- package/src/memory/store.ts +166 -0
- package/src/migrations.ts +13 -3
- package/src/pgvector/README.md +50 -0
- package/src/pgvector/__tests__/handle.test.ts +335 -0
- package/src/pgvector/__tests__/hit.test.ts +165 -0
- package/src/pgvector/__tests__/integration/document.integration.test.ts +717 -0
- package/src/pgvector/__tests__/integration/edge.integration.test.ts +835 -0
- package/src/pgvector/__tests__/integration/filters.integration.test.ts +721 -0
- package/src/pgvector/__tests__/integration/lifecycle.integration.test.ts +570 -0
- package/src/pgvector/__tests__/integration/query.integration.test.ts +667 -0
- package/src/pgvector/__tests__/search.test.ts +366 -0
- package/src/pgvector/handle.ts +285 -0
- package/src/pgvector/hit.ts +56 -0
- package/src/pgvector/index.ts +7 -0
- package/src/pgvector/search.ts +330 -0
- package/src/pgvector/sql/__tests__/limit.test.ts +180 -0
- package/src/pgvector/sql/__tests__/order.test.ts +248 -0
- package/src/pgvector/sql/__tests__/query.test.ts +548 -0
- package/src/pgvector/sql/__tests__/select.test.ts +367 -0
- package/src/pgvector/sql/__tests__/where.test.ts +554 -0
- package/src/pgvector/sql/index.ts +14 -0
- package/src/pgvector/sql/limit.ts +29 -0
- package/src/pgvector/sql/order.ts +55 -0
- package/src/pgvector/sql/query.ts +112 -0
- package/src/pgvector/sql/schema.ts +61 -0
- package/src/pgvector/sql/select.ts +100 -0
- package/src/pgvector/sql/where.ts +152 -0
- package/src/pgvector/types.ts +21 -0
- package/src/pgvector/utils.ts +24 -0
- package/src/postgres.ts +31 -33
- package/src/storage.ts +77 -9
- package/src/thread/sql.ts +159 -0
- package/src/thread/store.ts +40 -127
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SQL_ORDER } from "../order";
|
|
3
|
+
|
|
4
|
+
describe("SQL_ORDER", () => {
|
|
5
|
+
describe("encode", () => {
|
|
6
|
+
it("returns score DESC when no signals or orderBy", () => {
|
|
7
|
+
const result = SQL_ORDER.encode({
|
|
8
|
+
signals: [],
|
|
9
|
+
});
|
|
10
|
+
expect(result.sql).toBe("score DESC");
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe("explicit orderBy", () => {
|
|
14
|
+
it("handles orderBy with default direction (desc)", () => {
|
|
15
|
+
const result = SQL_ORDER.encode({
|
|
16
|
+
signals: [],
|
|
17
|
+
orderBy: { field: "created_at" },
|
|
18
|
+
});
|
|
19
|
+
expect(result.sql).toBe('"created_at" DESC');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("handles orderBy with asc direction", () => {
|
|
23
|
+
const result = SQL_ORDER.encode({
|
|
24
|
+
signals: [],
|
|
25
|
+
orderBy: { field: "name", direction: "asc" },
|
|
26
|
+
});
|
|
27
|
+
expect(result.sql).toBe('"name" ASC');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("handles orderBy with desc direction", () => {
|
|
31
|
+
const result = SQL_ORDER.encode({
|
|
32
|
+
signals: [],
|
|
33
|
+
orderBy: { field: "views", direction: "desc" },
|
|
34
|
+
});
|
|
35
|
+
expect(result.sql).toBe('"views" DESC');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("orderBy takes precedence over vector signals", () => {
|
|
39
|
+
const result = SQL_ORDER.encode({
|
|
40
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
41
|
+
orderBy: { field: "created_at", direction: "desc" },
|
|
42
|
+
});
|
|
43
|
+
expect(result.sql).toBe('"created_at" DESC');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("vector ordering", () => {
|
|
48
|
+
it("orders by cosine distance (default)", () => {
|
|
49
|
+
const result = SQL_ORDER.encode({
|
|
50
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
51
|
+
});
|
|
52
|
+
expect(result.sql).toBe('"embedding" <=> $1::vector');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("uses binding to map field to column", () => {
|
|
56
|
+
const result = SQL_ORDER.encode({
|
|
57
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
58
|
+
binding: {
|
|
59
|
+
schema: "public",
|
|
60
|
+
table: "docs",
|
|
61
|
+
pkey: "id",
|
|
62
|
+
fields: {
|
|
63
|
+
embedding: {
|
|
64
|
+
column: "vec_col",
|
|
65
|
+
type: "vector",
|
|
66
|
+
dimensions: 3,
|
|
67
|
+
similarity: "cosine",
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
expect(result.sql).toBe('"vec_col" <=> $1::vector');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("orders by euclidean distance", () => {
|
|
76
|
+
const result = SQL_ORDER.encode({
|
|
77
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
78
|
+
binding: {
|
|
79
|
+
schema: "public",
|
|
80
|
+
table: "docs",
|
|
81
|
+
pkey: "id",
|
|
82
|
+
fields: {
|
|
83
|
+
embedding: {
|
|
84
|
+
column: "embedding",
|
|
85
|
+
type: "vector",
|
|
86
|
+
dimensions: 3,
|
|
87
|
+
similarity: "euclidean",
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
expect(result.sql).toBe('"embedding" <-> $1::vector');
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("orders by dot product distance", () => {
|
|
96
|
+
const result = SQL_ORDER.encode({
|
|
97
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
98
|
+
binding: {
|
|
99
|
+
schema: "public",
|
|
100
|
+
table: "docs",
|
|
101
|
+
pkey: "id",
|
|
102
|
+
fields: {
|
|
103
|
+
embedding: {
|
|
104
|
+
column: "embedding",
|
|
105
|
+
type: "vector",
|
|
106
|
+
dimensions: 3,
|
|
107
|
+
similarity: "dot_product",
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
expect(result.sql).toBe('"embedding" <#> $1::vector');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("ignores non-vector signals", () => {
|
|
116
|
+
const result = SQL_ORDER.encode({
|
|
117
|
+
signals: [{ content: "search text" }],
|
|
118
|
+
});
|
|
119
|
+
expect(result.sql).toBe("score DESC");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("finds vector signal among mixed signals", () => {
|
|
123
|
+
const result = SQL_ORDER.encode({
|
|
124
|
+
signals: [
|
|
125
|
+
{ content: "search text", weight: 0.3 },
|
|
126
|
+
{ embedding: [0.1, 0.2, 0.3], weight: 0.7 },
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
expect(result.sql).toBe('"embedding" <=> $1::vector');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe("binding edge cases", () => {
|
|
134
|
+
it("falls back to field name when binding exists but field not in fields", () => {
|
|
135
|
+
const result = SQL_ORDER.encode({
|
|
136
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
137
|
+
binding: {
|
|
138
|
+
schema: "public",
|
|
139
|
+
table: "docs",
|
|
140
|
+
pkey: "id",
|
|
141
|
+
fields: {
|
|
142
|
+
other_field: {
|
|
143
|
+
column: "other_col",
|
|
144
|
+
type: "vector",
|
|
145
|
+
dimensions: 3,
|
|
146
|
+
similarity: "euclidean",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// embedding not in binding.fields, uses field name and defaults to cosine
|
|
153
|
+
expect(result.sql).toBe('"embedding" <=> $1::vector');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("defaults to cosine when binding field has no similarity", () => {
|
|
157
|
+
const result = SQL_ORDER.encode({
|
|
158
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
159
|
+
binding: {
|
|
160
|
+
schema: "public",
|
|
161
|
+
table: "docs",
|
|
162
|
+
fields: {
|
|
163
|
+
embedding: {
|
|
164
|
+
column: "vec_col",
|
|
165
|
+
type: "vector",
|
|
166
|
+
dimensions: 3,
|
|
167
|
+
// similarity intentionally omitted
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
} as any, // cast to bypass type check for test
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
expect(result.sql).toBe('"vec_col" <=> $1::vector');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe("multiple vector signals", () => {
|
|
178
|
+
it("uses only the first vector signal for ordering", () => {
|
|
179
|
+
const result = SQL_ORDER.encode({
|
|
180
|
+
signals: [
|
|
181
|
+
{ embedding1: [0.1, 0.2, 0.3] },
|
|
182
|
+
{ embedding2: [0.4, 0.5, 0.6] },
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Should use embedding1, not embedding2
|
|
187
|
+
expect(result.sql).toBe('"embedding1" <=> $1::vector');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("uses first vector field within a single signal object", () => {
|
|
191
|
+
const result = SQL_ORDER.encode({
|
|
192
|
+
signals: [{ embedding1: [0.1, 0.2], embedding2: [0.3, 0.4] }],
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// Object iteration order - first encountered wins
|
|
196
|
+
expect(result.sql).toMatch(/\$1::vector/);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
describe("consistency with SELECT", () => {
|
|
201
|
+
it("uses same $1 placeholder as SELECT for vector param", () => {
|
|
202
|
+
// ORDER BY always references $1::vector when there's a vector signal
|
|
203
|
+
// This must stay in sync with SELECT which puts vector at $1
|
|
204
|
+
const result = SQL_ORDER.encode({
|
|
205
|
+
signals: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
expect(result.sql).toBe('"embedding" <=> $1::vector');
|
|
209
|
+
// No params returned - ORDER BY reuses SELECT's $1
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe("malformed signals", () => {
|
|
214
|
+
it("treats empty signal object as no vector signal", () => {
|
|
215
|
+
const result = SQL_ORDER.encode({
|
|
216
|
+
signals: [{}],
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
expect(result.sql).toBe("score DESC");
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("treats signal with only weight as no vector signal", () => {
|
|
223
|
+
const result = SQL_ORDER.encode({
|
|
224
|
+
signals: [{ weight: 0.5 }],
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
expect(result.sql).toBe("score DESC");
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it("handles empty vector array", () => {
|
|
231
|
+
const result = SQL_ORDER.encode({
|
|
232
|
+
signals: [{ embedding: [] }],
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// Empty array is still detected as vector
|
|
236
|
+
expect(result.sql).toBe('"embedding" <=> $1::vector');
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe("decode", () => {
|
|
242
|
+
it("throws not implemented", () => {
|
|
243
|
+
expect(() => SQL_ORDER.decode({} as any)).toThrow(
|
|
244
|
+
"SQL_ORDER.decode not implemented",
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
});
|