@mastra/pg 0.3.4 → 0.4.0-alpha.1
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 +7 -7
- package/CHANGELOG.md +37 -0
- package/dist/_tsup-dts-rollup.d.cts +21 -83
- package/dist/_tsup-dts-rollup.d.ts +21 -83
- package/dist/index.cjs +169 -185
- package/dist/index.js +169 -185
- package/docker-compose.perf.yaml +9 -9
- package/package.json +7 -4
- package/src/storage/index.test.ts +32 -51
- package/src/storage/index.ts +13 -17
- package/src/vector/index.test.ts +52 -179
- package/src/vector/index.ts +64 -152
- package/src/vector/sql-builder.ts +110 -77
- package/src/vector/vector.performance.test.ts +2 -2
package/src/vector/index.test.ts
CHANGED
|
@@ -12,29 +12,23 @@ describe('PgVector', () => {
|
|
|
12
12
|
|
|
13
13
|
beforeAll(async () => {
|
|
14
14
|
// Initialize PgVector
|
|
15
|
-
vectorDB = new PgVector(connectionString);
|
|
15
|
+
vectorDB = new PgVector({ connectionString });
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
afterAll(async () => {
|
|
19
19
|
// Clean up test tables
|
|
20
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
20
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
21
21
|
await vectorDB.disconnect();
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
// --- Validation tests ---
|
|
25
25
|
describe('Validation', () => {
|
|
26
|
-
it('throws if connectionString is empty
|
|
27
|
-
expect(() => new PgVector('')).toThrow(/connectionString must be provided and cannot be empty/);
|
|
28
|
-
});
|
|
29
|
-
it('throws if connectionString is empty (object)', () => {
|
|
26
|
+
it('throws if connectionString is empty', () => {
|
|
30
27
|
expect(() => new PgVector({ connectionString: '' })).toThrow(
|
|
31
28
|
/connectionString must be provided and cannot be empty/,
|
|
32
29
|
);
|
|
33
30
|
});
|
|
34
|
-
it('does not throw on non-empty connection string
|
|
35
|
-
expect(() => new PgVector(connectionString)).not.toThrow();
|
|
36
|
-
});
|
|
37
|
-
it('does not throw on non-empty connection string (object)', () => {
|
|
31
|
+
it('does not throw on non-empty connection string', () => {
|
|
38
32
|
expect(() => new PgVector({ connectionString })).not.toThrow();
|
|
39
33
|
});
|
|
40
34
|
});
|
|
@@ -43,19 +37,19 @@ describe('PgVector', () => {
|
|
|
43
37
|
describe('Index Management', () => {
|
|
44
38
|
describe('createIndex', () => {
|
|
45
39
|
afterAll(async () => {
|
|
46
|
-
await vectorDB.deleteIndex(testIndexName2);
|
|
40
|
+
await vectorDB.deleteIndex({ indexName: testIndexName2 });
|
|
47
41
|
});
|
|
48
42
|
|
|
49
43
|
it('should create a new vector table with specified dimensions', async () => {
|
|
50
44
|
await vectorDB.createIndex({ indexName: testIndexName, dimension: 3 });
|
|
51
|
-
const stats = await vectorDB.describeIndex(testIndexName);
|
|
45
|
+
const stats = await vectorDB.describeIndex({ indexName: testIndexName });
|
|
52
46
|
expect(stats?.dimension).toBe(3);
|
|
53
47
|
expect(stats?.count).toBe(0);
|
|
54
48
|
});
|
|
55
49
|
|
|
56
50
|
it('should create index with specified metric', async () => {
|
|
57
51
|
await vectorDB.createIndex({ indexName: testIndexName2, dimension: 3, metric: 'euclidean' });
|
|
58
|
-
const stats = await vectorDB.describeIndex(testIndexName2);
|
|
52
|
+
const stats = await vectorDB.describeIndex({ indexName: testIndexName2 });
|
|
59
53
|
expect(stats.metric).toBe('euclidean');
|
|
60
54
|
});
|
|
61
55
|
|
|
@@ -70,7 +64,7 @@ describe('PgVector', () => {
|
|
|
70
64
|
metric: 'cosine',
|
|
71
65
|
indexConfig: { type: 'flat' },
|
|
72
66
|
});
|
|
73
|
-
const stats = await vectorDB.describeIndex(testIndexName2);
|
|
67
|
+
const stats = await vectorDB.describeIndex({ indexName: testIndexName2 });
|
|
74
68
|
expect(stats.type).toBe('flat');
|
|
75
69
|
});
|
|
76
70
|
|
|
@@ -81,7 +75,7 @@ describe('PgVector', () => {
|
|
|
81
75
|
metric: 'cosine',
|
|
82
76
|
indexConfig: { type: 'hnsw', hnsw: { m: 16, efConstruction: 64 } }, // Any reasonable values work
|
|
83
77
|
});
|
|
84
|
-
const stats = await vectorDB.describeIndex(testIndexName2);
|
|
78
|
+
const stats = await vectorDB.describeIndex({ indexName: testIndexName2 });
|
|
85
79
|
expect(stats.type).toBe('hnsw');
|
|
86
80
|
expect(stats.config.m).toBe(16);
|
|
87
81
|
});
|
|
@@ -93,7 +87,7 @@ describe('PgVector', () => {
|
|
|
93
87
|
metric: 'cosine',
|
|
94
88
|
indexConfig: { type: 'ivfflat', ivf: { lists: 100 } },
|
|
95
89
|
});
|
|
96
|
-
const stats = await vectorDB.describeIndex(testIndexName2);
|
|
90
|
+
const stats = await vectorDB.describeIndex({ indexName: testIndexName2 });
|
|
97
91
|
expect(stats.type).toBe('ivfflat');
|
|
98
92
|
expect(stats.config.lists).toBe(100);
|
|
99
93
|
});
|
|
@@ -106,7 +100,7 @@ describe('PgVector', () => {
|
|
|
106
100
|
});
|
|
107
101
|
|
|
108
102
|
afterAll(async () => {
|
|
109
|
-
await vectorDB.deleteIndex(indexName);
|
|
103
|
+
await vectorDB.deleteIndex({ indexName });
|
|
110
104
|
});
|
|
111
105
|
|
|
112
106
|
it('should list all vector tables', async () => {
|
|
@@ -115,7 +109,7 @@ describe('PgVector', () => {
|
|
|
115
109
|
});
|
|
116
110
|
|
|
117
111
|
it('should not return created index in list if it is deleted', async () => {
|
|
118
|
-
await vectorDB.deleteIndex(indexName);
|
|
112
|
+
await vectorDB.deleteIndex({ indexName });
|
|
119
113
|
const indexes = await vectorDB.listIndexes();
|
|
120
114
|
expect(indexes).not.toContain(indexName);
|
|
121
115
|
});
|
|
@@ -128,7 +122,7 @@ describe('PgVector', () => {
|
|
|
128
122
|
});
|
|
129
123
|
|
|
130
124
|
afterAll(async () => {
|
|
131
|
-
await vectorDB.deleteIndex(indexName);
|
|
125
|
+
await vectorDB.deleteIndex({ indexName });
|
|
132
126
|
});
|
|
133
127
|
|
|
134
128
|
it('should return correct index stats', async () => {
|
|
@@ -139,7 +133,7 @@ describe('PgVector', () => {
|
|
|
139
133
|
];
|
|
140
134
|
await vectorDB.upsert({ indexName, vectors });
|
|
141
135
|
|
|
142
|
-
const stats = await vectorDB.describeIndex(indexName);
|
|
136
|
+
const stats = await vectorDB.describeIndex({ indexName });
|
|
143
137
|
expect(stats).toEqual({
|
|
144
138
|
type: 'ivfflat',
|
|
145
139
|
config: {
|
|
@@ -152,7 +146,7 @@ describe('PgVector', () => {
|
|
|
152
146
|
});
|
|
153
147
|
|
|
154
148
|
it('should throw error for non-existent index', async () => {
|
|
155
|
-
await expect(vectorDB.describeIndex('non_existent')).rejects.toThrow();
|
|
149
|
+
await expect(vectorDB.describeIndex({ indexName: 'non_existent' })).rejects.toThrow();
|
|
156
150
|
});
|
|
157
151
|
});
|
|
158
152
|
|
|
@@ -163,7 +157,7 @@ describe('PgVector', () => {
|
|
|
163
157
|
});
|
|
164
158
|
|
|
165
159
|
afterAll(async () => {
|
|
166
|
-
await vectorDB.deleteIndex(indexName);
|
|
160
|
+
await vectorDB.deleteIndex({ indexName });
|
|
167
161
|
});
|
|
168
162
|
|
|
169
163
|
it('should build index with specified metric and config', async () => {
|
|
@@ -173,7 +167,7 @@ describe('PgVector', () => {
|
|
|
173
167
|
indexConfig: { type: 'hnsw', hnsw: { m: 16, efConstruction: 64 } },
|
|
174
168
|
});
|
|
175
169
|
|
|
176
|
-
const stats = await vectorDB.describeIndex(indexName);
|
|
170
|
+
const stats = await vectorDB.describeIndex({ indexName });
|
|
177
171
|
expect(stats.type).toBe('hnsw');
|
|
178
172
|
expect(stats.metric).toBe('cosine');
|
|
179
173
|
expect(stats.config.m).toBe(16);
|
|
@@ -186,7 +180,7 @@ describe('PgVector', () => {
|
|
|
186
180
|
indexConfig: { type: 'ivfflat', ivf: { lists: 100 } },
|
|
187
181
|
});
|
|
188
182
|
|
|
189
|
-
const stats = await vectorDB.describeIndex(indexName);
|
|
183
|
+
const stats = await vectorDB.describeIndex({ indexName });
|
|
190
184
|
expect(stats.type).toBe('ivfflat');
|
|
191
185
|
expect(stats.metric).toBe('euclidean');
|
|
192
186
|
expect(stats.config.lists).toBe(100);
|
|
@@ -202,7 +196,7 @@ describe('PgVector', () => {
|
|
|
202
196
|
});
|
|
203
197
|
|
|
204
198
|
afterEach(async () => {
|
|
205
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
199
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
206
200
|
});
|
|
207
201
|
|
|
208
202
|
it('should insert new vectors', async () => {
|
|
@@ -213,7 +207,7 @@ describe('PgVector', () => {
|
|
|
213
207
|
const ids = await vectorDB.upsert({ indexName: testIndexName, vectors });
|
|
214
208
|
|
|
215
209
|
expect(ids).toHaveLength(2);
|
|
216
|
-
const stats = await vectorDB.describeIndex(testIndexName);
|
|
210
|
+
const stats = await vectorDB.describeIndex({ indexName: testIndexName });
|
|
217
211
|
expect(stats.count).toBe(2);
|
|
218
212
|
});
|
|
219
213
|
|
|
@@ -267,7 +261,7 @@ describe('PgVector', () => {
|
|
|
267
261
|
});
|
|
268
262
|
|
|
269
263
|
afterEach(async () => {
|
|
270
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
264
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
271
265
|
});
|
|
272
266
|
|
|
273
267
|
it('should update the vector by id', async () => {
|
|
@@ -285,7 +279,7 @@ describe('PgVector', () => {
|
|
|
285
279
|
metadata: newMetaData,
|
|
286
280
|
};
|
|
287
281
|
|
|
288
|
-
await vectorDB.updateVector(testIndexName, idToBeUpdated, update);
|
|
282
|
+
await vectorDB.updateVector({ indexName: testIndexName, id: idToBeUpdated, update });
|
|
289
283
|
|
|
290
284
|
const results: QueryResult[] = await vectorDB.query({
|
|
291
285
|
indexName: testIndexName,
|
|
@@ -311,7 +305,7 @@ describe('PgVector', () => {
|
|
|
311
305
|
metadata: newMetaData,
|
|
312
306
|
};
|
|
313
307
|
|
|
314
|
-
await vectorDB.updateVector(testIndexName, idToBeUpdated, update);
|
|
308
|
+
await vectorDB.updateVector({ indexName: testIndexName, id: idToBeUpdated, update });
|
|
315
309
|
|
|
316
310
|
const results: QueryResult[] = await vectorDB.query({
|
|
317
311
|
indexName: testIndexName,
|
|
@@ -335,7 +329,7 @@ describe('PgVector', () => {
|
|
|
335
329
|
vector: newVector,
|
|
336
330
|
};
|
|
337
331
|
|
|
338
|
-
await vectorDB.updateVector(testIndexName, idToBeUpdated, update);
|
|
332
|
+
await vectorDB.updateVector({ indexName: testIndexName, id: idToBeUpdated, update });
|
|
339
333
|
|
|
340
334
|
const results: QueryResult[] = await vectorDB.query({
|
|
341
335
|
indexName: testIndexName,
|
|
@@ -348,7 +342,9 @@ describe('PgVector', () => {
|
|
|
348
342
|
});
|
|
349
343
|
|
|
350
344
|
it('should throw exception when no updates are given', async () => {
|
|
351
|
-
await expect(vectorDB.updateVector(testIndexName, 'id', {})).rejects.toThrow(
|
|
345
|
+
await expect(vectorDB.updateVector({ indexName: testIndexName, id: 'id', update: {} })).rejects.toThrow(
|
|
346
|
+
'No updates provided',
|
|
347
|
+
);
|
|
352
348
|
});
|
|
353
349
|
});
|
|
354
350
|
|
|
@@ -364,7 +360,7 @@ describe('PgVector', () => {
|
|
|
364
360
|
});
|
|
365
361
|
|
|
366
362
|
afterEach(async () => {
|
|
367
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
363
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
368
364
|
});
|
|
369
365
|
|
|
370
366
|
it('should delete the vector by id', async () => {
|
|
@@ -372,7 +368,7 @@ describe('PgVector', () => {
|
|
|
372
368
|
expect(ids).toHaveLength(3);
|
|
373
369
|
const idToBeDeleted = ids[0];
|
|
374
370
|
|
|
375
|
-
await vectorDB.deleteVector(testIndexName, idToBeDeleted);
|
|
371
|
+
await vectorDB.deleteVector({ indexName: testIndexName, id: idToBeDeleted });
|
|
376
372
|
|
|
377
373
|
const results: QueryResult[] = await vectorDB.query({
|
|
378
374
|
indexName: testIndexName,
|
|
@@ -390,7 +386,7 @@ describe('PgVector', () => {
|
|
|
390
386
|
const indexName = `test_query_2_${indexType}`;
|
|
391
387
|
beforeAll(async () => {
|
|
392
388
|
try {
|
|
393
|
-
await vectorDB.deleteIndex(indexName);
|
|
389
|
+
await vectorDB.deleteIndex({ indexName });
|
|
394
390
|
} catch {
|
|
395
391
|
// Ignore if doesn't exist
|
|
396
392
|
}
|
|
@@ -398,7 +394,7 @@ describe('PgVector', () => {
|
|
|
398
394
|
});
|
|
399
395
|
|
|
400
396
|
beforeEach(async () => {
|
|
401
|
-
await vectorDB.truncateIndex(indexName);
|
|
397
|
+
await vectorDB.truncateIndex({ indexName });
|
|
402
398
|
const vectors = [
|
|
403
399
|
[1, 0, 0],
|
|
404
400
|
[0.8, 0.2, 0],
|
|
@@ -413,7 +409,7 @@ describe('PgVector', () => {
|
|
|
413
409
|
});
|
|
414
410
|
|
|
415
411
|
afterAll(async () => {
|
|
416
|
-
await vectorDB.deleteIndex(indexName);
|
|
412
|
+
await vectorDB.deleteIndex({ indexName });
|
|
417
413
|
});
|
|
418
414
|
|
|
419
415
|
it('should return closest vectors', async () => {
|
|
@@ -451,7 +447,7 @@ describe('PgVector', () => {
|
|
|
451
447
|
const indexName = 'test_query_filters';
|
|
452
448
|
beforeAll(async () => {
|
|
453
449
|
try {
|
|
454
|
-
await vectorDB.deleteIndex(indexName);
|
|
450
|
+
await vectorDB.deleteIndex({ indexName });
|
|
455
451
|
} catch {
|
|
456
452
|
// Ignore if doesn't exist
|
|
457
453
|
}
|
|
@@ -459,7 +455,7 @@ describe('PgVector', () => {
|
|
|
459
455
|
});
|
|
460
456
|
|
|
461
457
|
beforeEach(async () => {
|
|
462
|
-
await vectorDB.truncateIndex(indexName);
|
|
458
|
+
await vectorDB.truncateIndex({ indexName });
|
|
463
459
|
const vectors = [
|
|
464
460
|
[1, 0.1, 0],
|
|
465
461
|
[0.9, 0.2, 0],
|
|
@@ -509,7 +505,7 @@ describe('PgVector', () => {
|
|
|
509
505
|
});
|
|
510
506
|
|
|
511
507
|
afterAll(async () => {
|
|
512
|
-
await vectorDB.deleteIndex(indexName);
|
|
508
|
+
await vectorDB.deleteIndex({ indexName });
|
|
513
509
|
});
|
|
514
510
|
|
|
515
511
|
// Numeric Comparison Tests
|
|
@@ -1346,7 +1342,7 @@ describe('PgVector', () => {
|
|
|
1346
1342
|
});
|
|
1347
1343
|
|
|
1348
1344
|
afterAll(async () => {
|
|
1349
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
1345
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
1350
1346
|
});
|
|
1351
1347
|
|
|
1352
1348
|
it('should handle non-existent index queries', async () => {
|
|
@@ -1379,7 +1375,7 @@ describe('PgVector', () => {
|
|
|
1379
1375
|
).resolves.not.toThrow();
|
|
1380
1376
|
|
|
1381
1377
|
// Cleanup
|
|
1382
|
-
await vectorDB.deleteIndex(duplicateIndexName);
|
|
1378
|
+
await vectorDB.deleteIndex({ indexName: duplicateIndexName });
|
|
1383
1379
|
});
|
|
1384
1380
|
});
|
|
1385
1381
|
|
|
@@ -1765,7 +1761,7 @@ describe('PgVector', () => {
|
|
|
1765
1761
|
});
|
|
1766
1762
|
|
|
1767
1763
|
afterAll(async () => {
|
|
1768
|
-
await vectorDB.deleteIndex(indexName);
|
|
1764
|
+
await vectorDB.deleteIndex({ indexName });
|
|
1769
1765
|
});
|
|
1770
1766
|
|
|
1771
1767
|
it('should use default ef value', async () => {
|
|
@@ -1810,7 +1806,7 @@ describe('PgVector', () => {
|
|
|
1810
1806
|
});
|
|
1811
1807
|
|
|
1812
1808
|
afterAll(async () => {
|
|
1813
|
-
await vectorDB.deleteIndex(indexName);
|
|
1809
|
+
await vectorDB.deleteIndex({ indexName });
|
|
1814
1810
|
});
|
|
1815
1811
|
|
|
1816
1812
|
it('should use default probe value', async () => {
|
|
@@ -1837,124 +1833,6 @@ describe('PgVector', () => {
|
|
|
1837
1833
|
});
|
|
1838
1834
|
});
|
|
1839
1835
|
});
|
|
1840
|
-
describe('Deprecation Warnings', () => {
|
|
1841
|
-
const indexName = 'testdeprecationwarnings';
|
|
1842
|
-
|
|
1843
|
-
const indexName2 = 'testdeprecationwarnings2';
|
|
1844
|
-
|
|
1845
|
-
let warnSpy;
|
|
1846
|
-
|
|
1847
|
-
beforeAll(async () => {
|
|
1848
|
-
await vectorDB.createIndex({ indexName: indexName, dimension: 3 });
|
|
1849
|
-
});
|
|
1850
|
-
|
|
1851
|
-
afterAll(async () => {
|
|
1852
|
-
await vectorDB.deleteIndex(indexName);
|
|
1853
|
-
await vectorDB.deleteIndex(indexName2);
|
|
1854
|
-
});
|
|
1855
|
-
|
|
1856
|
-
beforeEach(async () => {
|
|
1857
|
-
warnSpy = vi.spyOn(vectorDB['logger'], 'warn');
|
|
1858
|
-
});
|
|
1859
|
-
|
|
1860
|
-
afterEach(async () => {
|
|
1861
|
-
warnSpy.mockRestore();
|
|
1862
|
-
await vectorDB.deleteIndex(indexName2);
|
|
1863
|
-
});
|
|
1864
|
-
|
|
1865
|
-
it('should show deprecation warning when using individual args for createIndex', async () => {
|
|
1866
|
-
await vectorDB.createIndex(indexName2, 3, 'cosine');
|
|
1867
|
-
|
|
1868
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
1869
|
-
expect.stringContaining('Deprecation Warning: Passing individual arguments to createIndex() is deprecated'),
|
|
1870
|
-
);
|
|
1871
|
-
});
|
|
1872
|
-
|
|
1873
|
-
it('should show deprecation warning when using individual args for upsert', async () => {
|
|
1874
|
-
await vectorDB.upsert(indexName, [[1, 2, 3]], [{ test: 'data' }]);
|
|
1875
|
-
|
|
1876
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
1877
|
-
expect.stringContaining('Deprecation Warning: Passing individual arguments to upsert() is deprecated'),
|
|
1878
|
-
);
|
|
1879
|
-
});
|
|
1880
|
-
|
|
1881
|
-
it('should show deprecation warning when using individual args for query', async () => {
|
|
1882
|
-
await vectorDB.query(indexName, [1, 2, 3], 5);
|
|
1883
|
-
|
|
1884
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
1885
|
-
expect.stringContaining('Deprecation Warning: Passing individual arguments to query() is deprecated'),
|
|
1886
|
-
);
|
|
1887
|
-
});
|
|
1888
|
-
|
|
1889
|
-
it('should show deprecation warning when using individual args for buildIndex', async () => {
|
|
1890
|
-
await vectorDB.buildIndex(indexName, 'cosine', { type: 'flat' });
|
|
1891
|
-
|
|
1892
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
1893
|
-
expect.stringContaining('Deprecation Warning: Passing individual arguments to buildIndex() is deprecated'),
|
|
1894
|
-
);
|
|
1895
|
-
});
|
|
1896
|
-
|
|
1897
|
-
it('should not show deprecation warning when using object param for buildIndex', async () => {
|
|
1898
|
-
await vectorDB.buildIndex({
|
|
1899
|
-
indexName: indexName,
|
|
1900
|
-
metric: 'cosine',
|
|
1901
|
-
indexConfig: { type: 'flat' },
|
|
1902
|
-
});
|
|
1903
|
-
|
|
1904
|
-
expect(warnSpy).not.toHaveBeenCalled();
|
|
1905
|
-
});
|
|
1906
|
-
|
|
1907
|
-
it('should not show deprecation warning when using object param for query', async () => {
|
|
1908
|
-
await vectorDB.query({
|
|
1909
|
-
indexName,
|
|
1910
|
-
queryVector: [1, 2, 3],
|
|
1911
|
-
topK: 5,
|
|
1912
|
-
});
|
|
1913
|
-
|
|
1914
|
-
expect(warnSpy).not.toHaveBeenCalled();
|
|
1915
|
-
});
|
|
1916
|
-
|
|
1917
|
-
it('should not show deprecation warning when using object param for createIndex', async () => {
|
|
1918
|
-
await vectorDB.createIndex({
|
|
1919
|
-
indexName: indexName2,
|
|
1920
|
-
dimension: 3,
|
|
1921
|
-
metric: 'cosine',
|
|
1922
|
-
});
|
|
1923
|
-
|
|
1924
|
-
expect(warnSpy).not.toHaveBeenCalled();
|
|
1925
|
-
});
|
|
1926
|
-
|
|
1927
|
-
it('should not show deprecation warning when using object param for upsert', async () => {
|
|
1928
|
-
await vectorDB.upsert({
|
|
1929
|
-
indexName,
|
|
1930
|
-
vectors: [[1, 2, 3]],
|
|
1931
|
-
metadata: [{ test: 'data' }],
|
|
1932
|
-
});
|
|
1933
|
-
|
|
1934
|
-
expect(warnSpy).not.toHaveBeenCalled();
|
|
1935
|
-
});
|
|
1936
|
-
|
|
1937
|
-
it('should maintain backward compatibility with individual args', async () => {
|
|
1938
|
-
// Query
|
|
1939
|
-
const queryResults = await vectorDB.query(indexName, [1, 2, 3], 5);
|
|
1940
|
-
expect(Array.isArray(queryResults)).toBe(true);
|
|
1941
|
-
|
|
1942
|
-
// CreateIndex
|
|
1943
|
-
await expect(vectorDB.createIndex(indexName2, 3, 'cosine')).resolves.not.toThrow();
|
|
1944
|
-
|
|
1945
|
-
// Upsert
|
|
1946
|
-
const upsertResults = await vectorDB.upsert({
|
|
1947
|
-
indexName,
|
|
1948
|
-
vectors: [[1, 2, 3]],
|
|
1949
|
-
metadata: [{ test: 'data' }],
|
|
1950
|
-
});
|
|
1951
|
-
expect(Array.isArray(upsertResults)).toBe(true);
|
|
1952
|
-
expect(upsertResults).toHaveLength(1);
|
|
1953
|
-
|
|
1954
|
-
// BuildIndex
|
|
1955
|
-
await expect(vectorDB.buildIndex(indexName, 'cosine', { type: 'flat' })).resolves.not.toThrow();
|
|
1956
|
-
});
|
|
1957
|
-
});
|
|
1958
1836
|
|
|
1959
1837
|
describe('Concurrent Operations', () => {
|
|
1960
1838
|
it('should handle concurrent index creation attempts', async () => {
|
|
@@ -1970,10 +1848,10 @@ describe('PgVector', () => {
|
|
|
1970
1848
|
await expect(Promise.all(promises)).resolves.not.toThrow();
|
|
1971
1849
|
|
|
1972
1850
|
// Verify only one index was actually created
|
|
1973
|
-
const stats = await vectorDB.describeIndex(indexName);
|
|
1851
|
+
const stats = await vectorDB.describeIndex({ indexName });
|
|
1974
1852
|
expect(stats.dimension).toBe(dimension);
|
|
1975
1853
|
|
|
1976
|
-
await vectorDB.deleteIndex(indexName);
|
|
1854
|
+
await vectorDB.deleteIndex({ indexName });
|
|
1977
1855
|
});
|
|
1978
1856
|
|
|
1979
1857
|
it('should handle concurrent buildIndex attempts', async () => {
|
|
@@ -1992,10 +1870,10 @@ describe('PgVector', () => {
|
|
|
1992
1870
|
|
|
1993
1871
|
await expect(Promise.all(promises)).resolves.not.toThrow();
|
|
1994
1872
|
|
|
1995
|
-
const stats = await vectorDB.describeIndex(indexName);
|
|
1873
|
+
const stats = await vectorDB.describeIndex({ indexName });
|
|
1996
1874
|
expect(stats.type).toBe('ivfflat');
|
|
1997
1875
|
|
|
1998
|
-
await vectorDB.deleteIndex(indexName);
|
|
1876
|
+
await vectorDB.deleteIndex({ indexName });
|
|
1999
1877
|
});
|
|
2000
1878
|
});
|
|
2001
1879
|
|
|
@@ -2006,7 +1884,7 @@ describe('PgVector', () => {
|
|
|
2006
1884
|
|
|
2007
1885
|
beforeAll(async () => {
|
|
2008
1886
|
// Initialize default vectorDB first
|
|
2009
|
-
vectorDB = new PgVector(connectionString);
|
|
1887
|
+
vectorDB = new PgVector({ connectionString });
|
|
2010
1888
|
|
|
2011
1889
|
// Create schema using the default vectorDB connection
|
|
2012
1890
|
const client = await vectorDB['pool'].connect();
|
|
@@ -2030,7 +1908,7 @@ describe('PgVector', () => {
|
|
|
2030
1908
|
afterAll(async () => {
|
|
2031
1909
|
// Clean up test tables and schema
|
|
2032
1910
|
try {
|
|
2033
|
-
await customSchemaVectorDB.deleteIndex('schema_test_vectors');
|
|
1911
|
+
await customSchemaVectorDB.deleteIndex({ indexName: 'schema_test_vectors' });
|
|
2034
1912
|
} catch {
|
|
2035
1913
|
// Ignore errors if index doesn't exist
|
|
2036
1914
|
}
|
|
@@ -2053,11 +1931,6 @@ describe('PgVector', () => {
|
|
|
2053
1931
|
});
|
|
2054
1932
|
|
|
2055
1933
|
describe('Constructor', () => {
|
|
2056
|
-
it('should accept connectionString directly', () => {
|
|
2057
|
-
const db = new PgVector(connectionString);
|
|
2058
|
-
expect(db).toBeInstanceOf(PgVector);
|
|
2059
|
-
});
|
|
2060
|
-
|
|
2061
1934
|
it('should accept config object with connectionString', () => {
|
|
2062
1935
|
const db = new PgVector({ connectionString });
|
|
2063
1936
|
expect(db).toBeInstanceOf(PgVector);
|
|
@@ -2075,12 +1948,12 @@ describe('PgVector', () => {
|
|
|
2075
1948
|
beforeEach(async () => {
|
|
2076
1949
|
// Clean up any existing indexes
|
|
2077
1950
|
try {
|
|
2078
|
-
await customSchemaVectorDB.deleteIndex(testIndexName);
|
|
1951
|
+
await customSchemaVectorDB.deleteIndex({ indexName: testIndexName });
|
|
2079
1952
|
} catch {
|
|
2080
1953
|
// Ignore if doesn't exist
|
|
2081
1954
|
}
|
|
2082
1955
|
try {
|
|
2083
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
1956
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
2084
1957
|
} catch {
|
|
2085
1958
|
// Ignore if doesn't exist
|
|
2086
1959
|
}
|
|
@@ -2089,12 +1962,12 @@ describe('PgVector', () => {
|
|
|
2089
1962
|
afterEach(async () => {
|
|
2090
1963
|
// Clean up indexes after each test
|
|
2091
1964
|
try {
|
|
2092
|
-
await customSchemaVectorDB.deleteIndex(testIndexName);
|
|
1965
|
+
await customSchemaVectorDB.deleteIndex({ indexName: testIndexName });
|
|
2093
1966
|
} catch {
|
|
2094
1967
|
// Ignore if doesn't exist
|
|
2095
1968
|
}
|
|
2096
1969
|
try {
|
|
2097
|
-
await vectorDB.deleteIndex(testIndexName);
|
|
1970
|
+
await vectorDB.deleteIndex({ indexName: testIndexName });
|
|
2098
1971
|
} catch {
|
|
2099
1972
|
// Ignore if doesn't exist
|
|
2100
1973
|
}
|
|
@@ -2150,7 +2023,7 @@ describe('PgVector', () => {
|
|
|
2150
2023
|
// Insert a vector
|
|
2151
2024
|
await customSchemaVectorDB.upsert({ indexName: testIndexName, vectors: [[1, 2, 3]] });
|
|
2152
2025
|
// Describe the index
|
|
2153
|
-
const stats = await customSchemaVectorDB.describeIndex(testIndexName);
|
|
2026
|
+
const stats = await customSchemaVectorDB.describeIndex({ indexName: testIndexName });
|
|
2154
2027
|
expect(stats).toMatchObject({
|
|
2155
2028
|
dimension: 3,
|
|
2156
2029
|
metric: 'dotproduct',
|
|
@@ -2198,7 +2071,7 @@ describe('PgVector', () => {
|
|
|
2198
2071
|
await customSchemaVectorDB.createIndex({ indexName: testIndexName, dimension: 3 });
|
|
2199
2072
|
|
|
2200
2073
|
// Test index operations
|
|
2201
|
-
const stats = await customSchemaVectorDB.describeIndex(testIndexName);
|
|
2074
|
+
const stats = await customSchemaVectorDB.describeIndex({ indexName: testIndexName });
|
|
2202
2075
|
expect(stats.dimension).toBe(3);
|
|
2203
2076
|
|
|
2204
2077
|
// Test list operation
|
|
@@ -2215,7 +2088,7 @@ describe('PgVector', () => {
|
|
|
2215
2088
|
});
|
|
2216
2089
|
|
|
2217
2090
|
// Test delete operation
|
|
2218
|
-
await customSchemaVectorDB.deleteVector(testIndexName, id!);
|
|
2091
|
+
await customSchemaVectorDB.deleteVector({ indexName: testIndexName, id: id! });
|
|
2219
2092
|
|
|
2220
2093
|
// Verify deletion
|
|
2221
2094
|
const results = await customSchemaVectorDB.query({
|