@functional-systems/lambdadb 0.4.3 → 0.5.0-rc.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.
Files changed (209) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/FUNCTIONS.md +7 -2
  3. package/README.md +60 -2
  4. package/RUNTIMES.md +7 -0
  5. package/USAGE.md +20 -0
  6. package/dist/commonjs/client.d.ts +25 -10
  7. package/dist/commonjs/client.d.ts.map +1 -1
  8. package/dist/commonjs/client.js +182 -56
  9. package/dist/commonjs/client.js.map +1 -1
  10. package/dist/commonjs/compat/qdrant/client.d.ts +3 -6
  11. package/dist/commonjs/compat/qdrant/client.d.ts.map +1 -1
  12. package/dist/commonjs/compat/qdrant/client.js +17 -11
  13. package/dist/commonjs/compat/qdrant/client.js.map +1 -1
  14. package/dist/commonjs/funcs/collectionsCreate.js +1 -1
  15. package/dist/commonjs/funcs/collectionsDelete.js +1 -1
  16. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.js +4 -0
  17. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.js.map +1 -1
  18. package/dist/commonjs/funcs/collectionsDocsListDocs.js +2 -0
  19. package/dist/commonjs/funcs/collectionsDocsListDocs.js.map +1 -1
  20. package/dist/commonjs/index.d.ts +4 -1
  21. package/dist/commonjs/index.d.ts.map +1 -1
  22. package/dist/commonjs/index.js +15 -1
  23. package/dist/commonjs/index.js.map +1 -1
  24. package/dist/commonjs/lib/config.d.ts +2 -2
  25. package/dist/commonjs/lib/config.js +2 -2
  26. package/dist/commonjs/lib/config.js.map +1 -1
  27. package/dist/commonjs/lib/queryInput.d.ts +3 -11
  28. package/dist/commonjs/lib/queryInput.d.ts.map +1 -1
  29. package/dist/commonjs/lib/queryInput.js.map +1 -1
  30. package/dist/commonjs/models/collectionresponse.d.ts +12 -21
  31. package/dist/commonjs/models/collectionresponse.d.ts.map +1 -1
  32. package/dist/commonjs/models/collectionresponse.js +5 -6
  33. package/dist/commonjs/models/collectionresponse.js.map +1 -1
  34. package/dist/commonjs/models/index.d.ts +1 -0
  35. package/dist/commonjs/models/index.d.ts.map +1 -1
  36. package/dist/commonjs/models/index.js +1 -0
  37. package/dist/commonjs/models/index.js.map +1 -1
  38. package/dist/commonjs/models/operations/bulkupsertdocs.d.ts +6 -0
  39. package/dist/commonjs/models/operations/bulkupsertdocs.d.ts.map +1 -1
  40. package/dist/commonjs/models/operations/bulkupsertdocs.js +2 -0
  41. package/dist/commonjs/models/operations/bulkupsertdocs.js.map +1 -1
  42. package/dist/commonjs/models/operations/createcollection.d.ts +20 -13
  43. package/dist/commonjs/models/operations/createcollection.d.ts.map +1 -1
  44. package/dist/commonjs/models/operations/createcollection.js +15 -7
  45. package/dist/commonjs/models/operations/createcollection.js.map +1 -1
  46. package/dist/commonjs/models/operations/deletedocs.d.ts +3 -0
  47. package/dist/commonjs/models/operations/deletedocs.d.ts.map +1 -1
  48. package/dist/commonjs/models/operations/deletedocs.js +1 -0
  49. package/dist/commonjs/models/operations/deletedocs.js.map +1 -1
  50. package/dist/commonjs/models/operations/fetchdocs.d.ts +3 -0
  51. package/dist/commonjs/models/operations/fetchdocs.d.ts.map +1 -1
  52. package/dist/commonjs/models/operations/fetchdocs.js +9 -0
  53. package/dist/commonjs/models/operations/fetchdocs.js.map +1 -1
  54. package/dist/commonjs/models/operations/getbulkupsertdocs.d.ts +5 -0
  55. package/dist/commonjs/models/operations/getbulkupsertdocs.d.ts.map +1 -1
  56. package/dist/commonjs/models/operations/getbulkupsertdocs.js +5 -3
  57. package/dist/commonjs/models/operations/getbulkupsertdocs.js.map +1 -1
  58. package/dist/commonjs/models/operations/listdocs.d.ts +9 -0
  59. package/dist/commonjs/models/operations/listdocs.d.ts.map +1 -1
  60. package/dist/commonjs/models/operations/listdocs.js +11 -0
  61. package/dist/commonjs/models/operations/listdocs.js.map +1 -1
  62. package/dist/commonjs/models/operations/querycollection.d.ts +3 -0
  63. package/dist/commonjs/models/operations/querycollection.d.ts.map +1 -1
  64. package/dist/commonjs/models/operations/querycollection.js +9 -0
  65. package/dist/commonjs/models/operations/querycollection.js.map +1 -1
  66. package/dist/commonjs/models/operations/updatecollection.d.ts +10 -4
  67. package/dist/commonjs/models/operations/updatecollection.d.ts.map +1 -1
  68. package/dist/commonjs/models/operations/updatecollection.js +8 -1
  69. package/dist/commonjs/models/operations/updatecollection.js.map +1 -1
  70. package/dist/commonjs/models/operations/updatedocs.d.ts +3 -0
  71. package/dist/commonjs/models/operations/updatedocs.d.ts.map +1 -1
  72. package/dist/commonjs/models/operations/updatedocs.js +1 -0
  73. package/dist/commonjs/models/operations/updatedocs.js.map +1 -1
  74. package/dist/commonjs/models/operations/upsertdocs.d.ts +3 -0
  75. package/dist/commonjs/models/operations/upsertdocs.d.ts.map +1 -1
  76. package/dist/commonjs/models/operations/upsertdocs.js +1 -0
  77. package/dist/commonjs/models/operations/upsertdocs.js.map +1 -1
  78. package/dist/commonjs/models/versioning.d.ts +100 -0
  79. package/dist/commonjs/models/versioning.d.ts.map +1 -0
  80. package/dist/commonjs/models/versioning.js +93 -0
  81. package/dist/commonjs/models/versioning.js.map +1 -0
  82. package/dist/commonjs/types/public.d.ts +80 -6
  83. package/dist/commonjs/types/public.d.ts.map +1 -1
  84. package/dist/commonjs/types/public.js +30 -7
  85. package/dist/commonjs/types/public.js.map +1 -1
  86. package/dist/commonjs/versioning.d.ts +63 -0
  87. package/dist/commonjs/versioning.d.ts.map +1 -0
  88. package/dist/commonjs/versioning.js +390 -0
  89. package/dist/commonjs/versioning.js.map +1 -0
  90. package/dist/esm/client.d.ts +25 -10
  91. package/dist/esm/client.d.ts.map +1 -1
  92. package/dist/esm/client.js +183 -58
  93. package/dist/esm/client.js.map +1 -1
  94. package/dist/esm/compat/qdrant/client.d.ts +3 -6
  95. package/dist/esm/compat/qdrant/client.d.ts.map +1 -1
  96. package/dist/esm/compat/qdrant/client.js +17 -11
  97. package/dist/esm/compat/qdrant/client.js.map +1 -1
  98. package/dist/esm/funcs/collectionsCreate.js +1 -1
  99. package/dist/esm/funcs/collectionsDelete.js +1 -1
  100. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.js +5 -1
  101. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.js.map +1 -1
  102. package/dist/esm/funcs/collectionsDocsListDocs.js +2 -0
  103. package/dist/esm/funcs/collectionsDocsListDocs.js.map +1 -1
  104. package/dist/esm/index.d.ts +4 -1
  105. package/dist/esm/index.d.ts.map +1 -1
  106. package/dist/esm/index.js +3 -1
  107. package/dist/esm/index.js.map +1 -1
  108. package/dist/esm/lib/config.d.ts +2 -2
  109. package/dist/esm/lib/config.js +2 -2
  110. package/dist/esm/lib/config.js.map +1 -1
  111. package/dist/esm/lib/queryInput.d.ts +3 -11
  112. package/dist/esm/lib/queryInput.d.ts.map +1 -1
  113. package/dist/esm/lib/queryInput.js.map +1 -1
  114. package/dist/esm/models/collectionresponse.d.ts +12 -21
  115. package/dist/esm/models/collectionresponse.d.ts.map +1 -1
  116. package/dist/esm/models/collectionresponse.js +5 -6
  117. package/dist/esm/models/collectionresponse.js.map +1 -1
  118. package/dist/esm/models/index.d.ts +1 -0
  119. package/dist/esm/models/index.d.ts.map +1 -1
  120. package/dist/esm/models/index.js +1 -0
  121. package/dist/esm/models/index.js.map +1 -1
  122. package/dist/esm/models/operations/bulkupsertdocs.d.ts +6 -0
  123. package/dist/esm/models/operations/bulkupsertdocs.d.ts.map +1 -1
  124. package/dist/esm/models/operations/bulkupsertdocs.js +2 -0
  125. package/dist/esm/models/operations/bulkupsertdocs.js.map +1 -1
  126. package/dist/esm/models/operations/createcollection.d.ts +20 -13
  127. package/dist/esm/models/operations/createcollection.d.ts.map +1 -1
  128. package/dist/esm/models/operations/createcollection.js +15 -7
  129. package/dist/esm/models/operations/createcollection.js.map +1 -1
  130. package/dist/esm/models/operations/deletedocs.d.ts +3 -0
  131. package/dist/esm/models/operations/deletedocs.d.ts.map +1 -1
  132. package/dist/esm/models/operations/deletedocs.js +1 -0
  133. package/dist/esm/models/operations/deletedocs.js.map +1 -1
  134. package/dist/esm/models/operations/fetchdocs.d.ts +3 -0
  135. package/dist/esm/models/operations/fetchdocs.d.ts.map +1 -1
  136. package/dist/esm/models/operations/fetchdocs.js +9 -0
  137. package/dist/esm/models/operations/fetchdocs.js.map +1 -1
  138. package/dist/esm/models/operations/getbulkupsertdocs.d.ts +5 -0
  139. package/dist/esm/models/operations/getbulkupsertdocs.d.ts.map +1 -1
  140. package/dist/esm/models/operations/getbulkupsertdocs.js +6 -4
  141. package/dist/esm/models/operations/getbulkupsertdocs.js.map +1 -1
  142. package/dist/esm/models/operations/listdocs.d.ts +9 -0
  143. package/dist/esm/models/operations/listdocs.d.ts.map +1 -1
  144. package/dist/esm/models/operations/listdocs.js +11 -0
  145. package/dist/esm/models/operations/listdocs.js.map +1 -1
  146. package/dist/esm/models/operations/querycollection.d.ts +3 -0
  147. package/dist/esm/models/operations/querycollection.d.ts.map +1 -1
  148. package/dist/esm/models/operations/querycollection.js +9 -0
  149. package/dist/esm/models/operations/querycollection.js.map +1 -1
  150. package/dist/esm/models/operations/updatecollection.d.ts +10 -4
  151. package/dist/esm/models/operations/updatecollection.d.ts.map +1 -1
  152. package/dist/esm/models/operations/updatecollection.js +8 -1
  153. package/dist/esm/models/operations/updatecollection.js.map +1 -1
  154. package/dist/esm/models/operations/updatedocs.d.ts +3 -0
  155. package/dist/esm/models/operations/updatedocs.d.ts.map +1 -1
  156. package/dist/esm/models/operations/updatedocs.js +1 -0
  157. package/dist/esm/models/operations/updatedocs.js.map +1 -1
  158. package/dist/esm/models/operations/upsertdocs.d.ts +3 -0
  159. package/dist/esm/models/operations/upsertdocs.d.ts.map +1 -1
  160. package/dist/esm/models/operations/upsertdocs.js +1 -0
  161. package/dist/esm/models/operations/upsertdocs.js.map +1 -1
  162. package/dist/esm/models/versioning.d.ts +100 -0
  163. package/dist/esm/models/versioning.d.ts.map +1 -0
  164. package/dist/esm/models/versioning.js +57 -0
  165. package/dist/esm/models/versioning.js.map +1 -0
  166. package/dist/esm/types/public.d.ts +80 -6
  167. package/dist/esm/types/public.d.ts.map +1 -1
  168. package/dist/esm/types/public.js +26 -7
  169. package/dist/esm/types/public.js.map +1 -1
  170. package/dist/esm/versioning.d.ts +63 -0
  171. package/dist/esm/versioning.d.ts.map +1 -0
  172. package/dist/esm/versioning.js +344 -0
  173. package/dist/esm/versioning.js.map +1 -0
  174. package/jsr.json +3 -1
  175. package/package.json +14 -2
  176. package/src/client.ts +300 -61
  177. package/src/compat/qdrant/client.ts +28 -16
  178. package/src/funcs/collectionsCreate.ts +1 -1
  179. package/src/funcs/collectionsDelete.ts +1 -1
  180. package/src/funcs/collectionsDocsGetBulkUpsert.ts +6 -1
  181. package/src/funcs/collectionsDocsListDocs.ts +2 -0
  182. package/src/index.ts +17 -0
  183. package/src/lib/config.ts +2 -2
  184. package/src/lib/queryInput.ts +3 -10
  185. package/src/models/collectionresponse.ts +17 -26
  186. package/src/models/index.ts +1 -0
  187. package/src/models/operations/bulkupsertdocs.ts +8 -0
  188. package/src/models/operations/createcollection.ts +39 -18
  189. package/src/models/operations/deletedocs.ts +4 -0
  190. package/src/models/operations/fetchdocs.ts +12 -0
  191. package/src/models/operations/getbulkupsertdocs.ts +11 -4
  192. package/src/models/operations/listdocs.ts +20 -0
  193. package/src/models/operations/querycollection.ts +12 -0
  194. package/src/models/operations/updatecollection.ts +21 -3
  195. package/src/models/operations/updatedocs.ts +4 -0
  196. package/src/models/operations/upsertdocs.ts +4 -0
  197. package/src/models/versioning.ts +118 -0
  198. package/src/types/public.ts +127 -14
  199. package/src/versioning.ts +490 -0
  200. package/examples/collectionScoped.example.ts +0 -38
  201. package/examples/collectionsList.example.ts +0 -25
  202. package/examples/package-lock.json +0 -612
  203. package/examples/package.json +0 -18
  204. package/test/integration/qdrant-compat-external.test.mjs +0 -351
  205. package/test/integration/qdrant-compat-live.test.mjs +0 -122
  206. package/test/null-response.test.mjs +0 -73
  207. package/test/public-api.test.mjs +0 -540
  208. package/test/qdrant-compat.test.mjs +0 -547
  209. package/tsconfig.json +0 -39
@@ -1,547 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
-
4
- import {
5
- QdrantClient,
6
- QdrantCompatClient,
7
- QdrantCompatValidationError,
8
- UnsupportedQdrantFeatureError,
9
- models,
10
- } from "../dist/esm/compat/qdrant.js";
11
- import { PointStruct } from "../dist/esm/compat/qdrant/models.js";
12
-
13
- class FakeDocs {
14
- constructor() {
15
- this.upserts = [];
16
- this.deletes = [];
17
- this.fetches = [];
18
- this.lists = [];
19
- }
20
-
21
- async upsert(body) {
22
- this.upserts.push(body);
23
- return { message: "ok" };
24
- }
25
-
26
- async fetch(body) {
27
- this.fetches.push(body);
28
- return {
29
- docs: [
30
- {
31
- collection: "docs",
32
- doc: {
33
- id: "1",
34
- _qdrant_id: 1,
35
- _qdrant_vector: [0.1, 0.2],
36
- tenant: "acme",
37
- },
38
- },
39
- ],
40
- };
41
- }
42
-
43
- async delete(body) {
44
- this.deletes.push(body);
45
- return { message: "ok" };
46
- }
47
-
48
- async list(body = {}) {
49
- this.lists.push(body);
50
- return {
51
- docs: [
52
- {
53
- collection: "docs",
54
- doc: {
55
- id: "1",
56
- _qdrant_id: 1,
57
- _qdrant_vector: [0.1, 0.2],
58
- _qdrant_vector_title: [0.3, 0.4],
59
- tenant: "acme",
60
- },
61
- },
62
- ],
63
- nextPageToken: "next-token",
64
- };
65
- }
66
- }
67
-
68
- class FakeCollection {
69
- constructor(owner, name) {
70
- this.owner = owner;
71
- this.name = name;
72
- this.docs = new FakeDocs();
73
- this.queries = [];
74
- this.updates = [];
75
- this.deletes = [];
76
- }
77
-
78
- async get() {
79
- this.owner.gets.push({ collectionName: this.name });
80
- return {
81
- collection: {
82
- collectionName: this.name,
83
- indexConfigs: this.owner.indexConfigs,
84
- numDocs: this.owner.numDocs,
85
- collectionStatus: "ACTIVE",
86
- },
87
- };
88
- }
89
-
90
- async update(body) {
91
- this.updates.push(body);
92
- this.owner.indexConfigs = body.indexConfigs;
93
- return { collection: { collectionName: this.name, indexConfigs: body.indexConfigs } };
94
- }
95
-
96
- async delete() {
97
- this.deletes.push({});
98
- return { message: "ok" };
99
- }
100
-
101
- async query(body) {
102
- this.queries.push(body);
103
- return {
104
- docs: [
105
- {
106
- collection: this.name,
107
- score: 0.9,
108
- doc: {
109
- id: "1",
110
- _qdrant_id: 1,
111
- _qdrant_vector: [0.1, 0.2],
112
- tenant: "acme",
113
- },
114
- },
115
- ],
116
- };
117
- }
118
- }
119
-
120
- class FakeLambdaDB {
121
- constructor() {
122
- this.created = [];
123
- this.gets = [];
124
- this.indexConfigs = {};
125
- this.numDocs = 0;
126
- this.collectionsByName = new Map();
127
- }
128
-
129
- async createCollection(body) {
130
- this.created.push(body);
131
- this.indexConfigs = body.indexConfigs ?? {};
132
- return { collection: { collectionName: body.collectionName } };
133
- }
134
-
135
- collection(name) {
136
- if (!this.collectionsByName.has(name)) {
137
- this.collectionsByName.set(name, new FakeCollection(this, name));
138
- }
139
- return this.collectionsByName.get(name);
140
- }
141
- }
142
-
143
- test("qdrant compatibility exports public client and models", () => {
144
- assert.equal(QdrantClient, QdrantCompatClient);
145
- assert.equal(models.PointStruct, PointStruct);
146
-
147
- const point = new models.PointStruct({
148
- id: 1,
149
- vector: [0.1, 0.2],
150
- payload: { tenant: "acme" },
151
- });
152
- assert.equal(point.id, 1);
153
- });
154
-
155
- test("createCollection maps vector params and payload schema", async () => {
156
- const fake = new FakeLambdaDB();
157
- const client = new QdrantCompatClient(fake);
158
-
159
- assert.equal(
160
- await client.createCollection("docs", {
161
- vectorsConfig: new models.VectorParams({
162
- size: 3,
163
- distance: models.Distance.DOT,
164
- }),
165
- payloadSchema: {
166
- tenant: models.PayloadSchemaType.KEYWORD,
167
- views: models.PayloadSchemaType.INTEGER,
168
- score: models.PayloadSchemaType.FLOAT,
169
- active: models.PayloadSchemaType.BOOL,
170
- },
171
- }),
172
- true,
173
- );
174
-
175
- assert.deepEqual(fake.created, [
176
- {
177
- collectionName: "docs",
178
- indexConfigs: {
179
- _qdrant_vector: {
180
- type: "vector",
181
- dimensions: 3,
182
- similarity: "dot_product",
183
- },
184
- tenant: { type: "keyword" },
185
- views: { type: "long" },
186
- score: { type: "double" },
187
- active: { type: "boolean" },
188
- },
189
- },
190
- ]);
191
- });
192
-
193
- test("createPayloadIndex merges existing configs and rejects non-empty backfill", async () => {
194
- const fake = new FakeLambdaDB();
195
- fake.indexConfigs = {
196
- _qdrant_vector: {
197
- type: "vector",
198
- dimensions: 3,
199
- similarity: "cosine",
200
- },
201
- };
202
- const client = new QdrantCompatClient(fake);
203
-
204
- assert.equal(
205
- await client.createPayloadIndex(
206
- "docs",
207
- "tenant",
208
- models.PayloadSchemaType.KEYWORD,
209
- ),
210
- true,
211
- );
212
-
213
- assert.deepEqual(fake.collection("docs").updates, [
214
- {
215
- indexConfigs: {
216
- _qdrant_vector: {
217
- type: "vector",
218
- dimensions: 3,
219
- similarity: "cosine",
220
- },
221
- tenant: { type: "keyword" },
222
- },
223
- },
224
- ]);
225
-
226
- fake.numDocs = 3;
227
- await assert.rejects(
228
- client.createPayloadIndex("docs", "views", models.PayloadSchemaType.INTEGER),
229
- UnsupportedQdrantFeatureError,
230
- );
231
- });
232
-
233
- test("upsert maps qdrant points to LambdaDB documents", async () => {
234
- const fake = new FakeLambdaDB();
235
- const client = new QdrantCompatClient(fake);
236
-
237
- const result = await client.upsert("docs", {
238
- points: [
239
- new models.PointStruct({
240
- id: 1,
241
- vector: [0.1, 0.2],
242
- payload: { tenant: "acme" },
243
- }),
244
- ],
245
- });
246
-
247
- assert.equal(result.status, models.UpdateStatus.COMPLETED);
248
- assert.deepEqual(fake.collection("docs").docs.upserts, [
249
- {
250
- docs: [
251
- {
252
- id: "1",
253
- _qdrant_id: 1,
254
- _qdrant_vector: [0.1, 0.2],
255
- tenant: "acme",
256
- },
257
- ],
258
- },
259
- ]);
260
-
261
- await assert.rejects(
262
- client.upsert("docs", {
263
- points: [{ id: 1, vector: [0.1], payload: { _qdrant_vector: [0.2] } }],
264
- }),
265
- /reserved prefix/,
266
- );
267
-
268
- await assert.rejects(
269
- client.upsert("docs", {
270
- points: [
271
- {
272
- id: 1,
273
- vector: {
274
- sparse: new models.SparseVector({ indices: [1], values: [0.9] }),
275
- },
276
- },
277
- ],
278
- }),
279
- UnsupportedQdrantFeatureError,
280
- );
281
- });
282
-
283
- test("queryPoints maps dense vectors, filters, and responses", async () => {
284
- const fake = new FakeLambdaDB();
285
- const client = new QdrantCompatClient(fake);
286
-
287
- const response = await client.queryPoints("docs", {
288
- query: [0.1, 0.2],
289
- queryFilter: new models.Filter({
290
- must: [
291
- new models.FieldCondition({
292
- key: "tenant",
293
- match: new models.MatchValue({ value: "acme" }),
294
- }),
295
- ],
296
- mustNot: [
297
- new models.FieldCondition({
298
- key: "status",
299
- match: new models.MatchValue({ value: "deleted" }),
300
- }),
301
- ],
302
- }),
303
- limit: 5,
304
- withVectors: true,
305
- });
306
-
307
- assert.equal(response.points[0].id, 1);
308
- assert.equal(response.points[0].score, 0.9);
309
- assert.deepEqual(response.points[0].payload, { tenant: "acme" });
310
- assert.deepEqual(response.points[0].vector, [0.1, 0.2]);
311
- assert.deepEqual(fake.collection("docs").queries, [
312
- {
313
- query: {
314
- knn: {
315
- field: "_qdrant_vector",
316
- k: 5,
317
- queryVector: [0.1, 0.2],
318
- filter: {
319
- bool: [
320
- { queryString: { query: "tenant:acme" }, occur: "filter" },
321
- { queryString: { query: "status:deleted" }, occur: "must_not" },
322
- ],
323
- },
324
- },
325
- },
326
- size: 5,
327
- consistentRead: true,
328
- includeVectors: true,
329
- },
330
- ]);
331
-
332
- await assert.rejects(
333
- client.queryPoints("docs", { query: [0.1], offset: 1 }),
334
- UnsupportedQdrantFeatureError,
335
- );
336
- });
337
-
338
- test("MatchText maps to LambdaDB text filter terms", async () => {
339
- const fake = new FakeLambdaDB();
340
- const client = new QdrantCompatClient(fake);
341
-
342
- await client.queryPoints("docs", {
343
- query: [0.1, 0.2],
344
- queryFilter: new models.Filter({
345
- must: [
346
- new models.FieldCondition({
347
- key: "body",
348
- match: new models.MatchText({ text: "serverless database" }),
349
- }),
350
- ],
351
- }),
352
- });
353
-
354
- assert.deepEqual(fake.collection("docs").queries[0].query.knn.filter, {
355
- bool: [
356
- { queryString: { query: "body:serverless" }, occur: "filter" },
357
- { queryString: { query: "body:database" }, occur: "filter" },
358
- ],
359
- });
360
-
361
- await assert.rejects(
362
- client.queryPoints("docs", {
363
- query: [0.1, 0.2],
364
- queryFilter: new models.Filter({
365
- must: [
366
- new models.FieldCondition({
367
- key: "body",
368
- match: new models.MatchText({ text: " " }),
369
- }),
370
- ],
371
- }),
372
- }),
373
- QdrantCompatValidationError,
374
- );
375
- });
376
-
377
- test("payload and vector selectors map to LambdaDB fields and qdrant responses", async () => {
378
- const fake = new FakeLambdaDB();
379
- const collection = fake.collection("docs");
380
- collection.query = async function query(body) {
381
- this.queries.push(body);
382
- return {
383
- docs: [
384
- {
385
- collection: this.name,
386
- score: 0.9,
387
- doc: {
388
- id: "1",
389
- _qdrant_id: 1,
390
- _qdrant_vector: [0.1, 0.2],
391
- _qdrant_vector_title: [0.3, 0.4],
392
- tenant: "acme",
393
- hidden: "value",
394
- },
395
- },
396
- ],
397
- };
398
- };
399
- const client = new QdrantCompatClient(fake);
400
-
401
- const response = await client.queryPoints("docs", {
402
- query: [0.1, 0.2],
403
- limit: 1,
404
- withPayload: ["tenant"],
405
- withVectors: ["title"],
406
- });
407
-
408
- assert.deepEqual(response.points[0].payload, { tenant: "acme" });
409
- assert.deepEqual(response.points[0].vector, { title: [0.3, 0.4] });
410
- assert.deepEqual(collection.queries[0].fields, {
411
- include: ["_qdrant_id", "tenant", "_qdrant_vector_title"],
412
- });
413
- assert.equal(collection.queries[0].includeVectors, true);
414
-
415
- const records = await client.retrieve("docs", {
416
- ids: [1],
417
- withPayload: ["tenant"],
418
- withVectors: false,
419
- });
420
- assert.deepEqual(records[0].payload, { tenant: "acme" });
421
- assert.equal(records[0].vector, undefined);
422
- assert.deepEqual(collection.docs.fetches.at(-1), {
423
- ids: ["1"],
424
- consistentRead: true,
425
- includeVectors: false,
426
- fields: { include: ["_qdrant_id", "tenant"] },
427
- });
428
- });
429
-
430
- test("retrieve, delete, scroll, count, and getCollection return qdrant-style objects", async () => {
431
- const fake = new FakeLambdaDB();
432
- fake.indexConfigs = {
433
- _qdrant_vector: {
434
- type: "vector",
435
- dimensions: 2,
436
- similarity: "cosine",
437
- },
438
- };
439
- fake.numDocs = 12;
440
- const client = new QdrantCompatClient(fake);
441
-
442
- const collection = await client.getCollection("docs");
443
- assert.equal(collection.config.params.vectors.size, 2);
444
- assert.equal(collection.config.params.vectors.distance, models.Distance.COSINE);
445
-
446
- const records = await client.retrieve("docs", { ids: [1], withVectors: true });
447
- assert.equal(records[0].id, 1);
448
- assert.deepEqual(records[0].payload, { tenant: "acme" });
449
- assert.deepEqual(records[0].vector, [0.1, 0.2]);
450
- assert.deepEqual(fake.collection("docs").docs.fetches, [
451
- { ids: ["1"], consistentRead: true, includeVectors: true },
452
- ]);
453
-
454
- const deleteResult = await client.delete("docs", { pointsSelector: [1] });
455
- assert.equal(deleteResult.status, models.UpdateStatus.COMPLETED);
456
- assert.deepEqual(fake.collection("docs").docs.deletes, [{ ids: ["1"] }]);
457
-
458
- await client.delete("docs", {
459
- filter: new models.Filter({
460
- must: [
461
- new models.FieldCondition({
462
- key: "tenant",
463
- match: new models.MatchValue({ value: "acme" }),
464
- }),
465
- ],
466
- }),
467
- });
468
- await client.delete("docs", {
469
- pointsSelector: {
470
- filter: {
471
- must: [
472
- {
473
- key: "status",
474
- match: { value: "archived" },
475
- },
476
- ],
477
- },
478
- },
479
- });
480
- assert.deepEqual(fake.collection("docs").docs.deletes, [
481
- { ids: ["1"] },
482
- {
483
- filter: {
484
- queryString: { query: "tenant:acme" },
485
- },
486
- },
487
- {
488
- filter: {
489
- queryString: { query: "status:archived" },
490
- },
491
- },
492
- ]);
493
-
494
- const [scrollRecords, nextOffset] = await client.scroll("docs", {
495
- limit: 3,
496
- withPayload: ["tenant"],
497
- withVectors: ["title"],
498
- });
499
- assert.equal(scrollRecords[0].id, 1);
500
- assert.deepEqual(scrollRecords[0].payload, { tenant: "acme" });
501
- assert.deepEqual(scrollRecords[0].vector, { title: [0.3, 0.4] });
502
- assert.equal(nextOffset, "next-token");
503
- assert.deepEqual(fake.collection("docs").docs.lists, [
504
- {
505
- size: 3,
506
- includeVectors: true,
507
- fields: { include: ["_qdrant_id", "tenant", "_qdrant_vector_title"] },
508
- },
509
- ]);
510
-
511
- const count = await client.count("docs");
512
- assert.equal(count.count, 12);
513
- });
514
-
515
- test("filtered scroll maps to extended list options and page-token offsets", async () => {
516
- const fake = new FakeLambdaDB();
517
- const client = new QdrantCompatClient(fake);
518
-
519
- const [records, nextOffset] = await client.scroll("docs", {
520
- scrollFilter: new models.Filter({
521
- must: [
522
- new models.FieldCondition({
523
- key: "tenant",
524
- match: new models.MatchValue({ value: "acme" }),
525
- }),
526
- ],
527
- }),
528
- offset: "page-1",
529
- withPayload: true,
530
- });
531
-
532
- assert.equal(nextOffset, "next-token");
533
- assert.equal(records[0].id, 1);
534
- assert.deepEqual(fake.collection("docs").docs.lists, [
535
- {
536
- size: 10,
537
- includeVectors: false,
538
- pageToken: "page-1",
539
- filter: { queryString: { query: "tenant:acme" } },
540
- },
541
- ]);
542
-
543
- await assert.rejects(
544
- client.scroll("docs", { offset: 1 }),
545
- UnsupportedQdrantFeatureError,
546
- );
547
- });
package/tsconfig.json DELETED
@@ -1,39 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "incremental": false,
4
- "target": "ES2020",
5
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
6
- "jsx": "react-jsx",
7
-
8
- "module": "Node16",
9
- "moduleResolution": "Node16",
10
-
11
- "allowJs": true,
12
-
13
- "declaration": true,
14
- "declarationMap": true,
15
- "sourceMap": true,
16
- "outDir": ".",
17
- "rootDir": "src",
18
-
19
- "strict": true,
20
- "allowUnusedLabels": false,
21
- "allowUnreachableCode": false,
22
- "exactOptionalPropertyTypes": true,
23
- "useUnknownInCatchVariables": true,
24
- "noFallthroughCasesInSwitch": true,
25
- "noImplicitOverride": true,
26
- "noImplicitReturns": true,
27
- "noPropertyAccessFromIndexSignature": true,
28
- "noUncheckedIndexedAccess": true,
29
- "noUnusedLocals": true,
30
- "noUnusedParameters": true,
31
- "isolatedModules": true,
32
- "checkJs": true,
33
- "esModuleInterop": true,
34
- "skipLibCheck": true,
35
- "forceConsistentCasingInFileNames": true
36
- },
37
- "include": ["src"],
38
- "exclude": ["node_modules"]
39
- }