@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.
Files changed (153) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-check-types.log +36 -0
  3. package/CHANGELOG.md +32 -0
  4. package/README.md +124 -0
  5. package/dist/__tests__/integration.test.js +2 -2
  6. package/dist/__tests__/memory-integration.test.d.ts +2 -0
  7. package/dist/__tests__/memory-integration.test.d.ts.map +1 -0
  8. package/dist/__tests__/memory-integration.test.js +287 -0
  9. package/dist/__tests__/memory.test.d.ts +2 -0
  10. package/dist/__tests__/memory.test.d.ts.map +1 -0
  11. package/dist/__tests__/memory.test.js +357 -0
  12. package/dist/index.d.ts +5 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +5 -3
  15. package/dist/memory/sql.d.ts +30 -0
  16. package/dist/memory/sql.d.ts.map +1 -0
  17. package/dist/memory/sql.js +100 -0
  18. package/dist/memory/store.d.ts +41 -0
  19. package/dist/memory/store.d.ts.map +1 -0
  20. package/dist/memory/store.js +114 -0
  21. package/dist/migrations.d.ts +1 -1
  22. package/dist/migrations.d.ts.map +1 -1
  23. package/dist/migrations.js +9 -3
  24. package/dist/pgvector/__tests__/handle.test.d.ts +2 -0
  25. package/dist/pgvector/__tests__/handle.test.d.ts.map +1 -0
  26. package/dist/pgvector/__tests__/handle.test.js +277 -0
  27. package/dist/pgvector/__tests__/hit.test.d.ts +2 -0
  28. package/dist/pgvector/__tests__/hit.test.d.ts.map +1 -0
  29. package/dist/pgvector/__tests__/hit.test.js +134 -0
  30. package/dist/pgvector/__tests__/integration/document.integration.test.d.ts +7 -0
  31. package/dist/pgvector/__tests__/integration/document.integration.test.d.ts.map +1 -0
  32. package/dist/pgvector/__tests__/integration/document.integration.test.js +587 -0
  33. package/dist/pgvector/__tests__/integration/edge.integration.test.d.ts +8 -0
  34. package/dist/pgvector/__tests__/integration/edge.integration.test.d.ts.map +1 -0
  35. package/dist/pgvector/__tests__/integration/edge.integration.test.js +663 -0
  36. package/dist/pgvector/__tests__/integration/filters.integration.test.d.ts +8 -0
  37. package/dist/pgvector/__tests__/integration/filters.integration.test.d.ts.map +1 -0
  38. package/dist/pgvector/__tests__/integration/filters.integration.test.js +609 -0
  39. package/dist/pgvector/__tests__/integration/lifecycle.integration.test.d.ts +8 -0
  40. package/dist/pgvector/__tests__/integration/lifecycle.integration.test.d.ts.map +1 -0
  41. package/dist/pgvector/__tests__/integration/lifecycle.integration.test.js +449 -0
  42. package/dist/pgvector/__tests__/integration/query.integration.test.d.ts +8 -0
  43. package/dist/pgvector/__tests__/integration/query.integration.test.d.ts.map +1 -0
  44. package/dist/pgvector/__tests__/integration/query.integration.test.js +544 -0
  45. package/dist/pgvector/__tests__/search.test.d.ts +2 -0
  46. package/dist/pgvector/__tests__/search.test.d.ts.map +1 -0
  47. package/dist/pgvector/__tests__/search.test.js +279 -0
  48. package/dist/pgvector/handle.d.ts +60 -0
  49. package/dist/pgvector/handle.d.ts.map +1 -0
  50. package/dist/pgvector/handle.js +213 -0
  51. package/dist/pgvector/hit.d.ts +10 -0
  52. package/dist/pgvector/hit.d.ts.map +1 -0
  53. package/dist/pgvector/hit.js +44 -0
  54. package/dist/pgvector/index.d.ts +7 -0
  55. package/dist/pgvector/index.d.ts.map +1 -0
  56. package/dist/pgvector/index.js +5 -0
  57. package/dist/pgvector/search.d.ts +60 -0
  58. package/dist/pgvector/search.d.ts.map +1 -0
  59. package/dist/pgvector/search.js +227 -0
  60. package/dist/pgvector/sql/__tests__/limit.test.d.ts +2 -0
  61. package/dist/pgvector/sql/__tests__/limit.test.d.ts.map +1 -0
  62. package/dist/pgvector/sql/__tests__/limit.test.js +161 -0
  63. package/dist/pgvector/sql/__tests__/order.test.d.ts +2 -0
  64. package/dist/pgvector/sql/__tests__/order.test.d.ts.map +1 -0
  65. package/dist/pgvector/sql/__tests__/order.test.js +218 -0
  66. package/dist/pgvector/sql/__tests__/query.test.d.ts +2 -0
  67. package/dist/pgvector/sql/__tests__/query.test.d.ts.map +1 -0
  68. package/dist/pgvector/sql/__tests__/query.test.js +392 -0
  69. package/dist/pgvector/sql/__tests__/select.test.d.ts +2 -0
  70. package/dist/pgvector/sql/__tests__/select.test.d.ts.map +1 -0
  71. package/dist/pgvector/sql/__tests__/select.test.js +293 -0
  72. package/dist/pgvector/sql/__tests__/where.test.d.ts +2 -0
  73. package/dist/pgvector/sql/__tests__/where.test.d.ts.map +1 -0
  74. package/dist/pgvector/sql/__tests__/where.test.js +488 -0
  75. package/dist/pgvector/sql/index.d.ts +7 -0
  76. package/dist/pgvector/sql/index.d.ts.map +1 -0
  77. package/dist/pgvector/sql/index.js +6 -0
  78. package/dist/pgvector/sql/limit.d.ts +8 -0
  79. package/dist/pgvector/sql/limit.d.ts.map +1 -0
  80. package/dist/pgvector/sql/limit.js +20 -0
  81. package/dist/pgvector/sql/order.d.ts +9 -0
  82. package/dist/pgvector/sql/order.d.ts.map +1 -0
  83. package/dist/pgvector/sql/order.js +47 -0
  84. package/dist/pgvector/sql/query.d.ts +46 -0
  85. package/dist/pgvector/sql/query.d.ts.map +1 -0
  86. package/dist/pgvector/sql/query.js +54 -0
  87. package/dist/pgvector/sql/schema.d.ts +16 -0
  88. package/dist/pgvector/sql/schema.d.ts.map +1 -0
  89. package/dist/pgvector/sql/schema.js +47 -0
  90. package/dist/pgvector/sql/select.d.ts +11 -0
  91. package/dist/pgvector/sql/select.d.ts.map +1 -0
  92. package/dist/pgvector/sql/select.js +87 -0
  93. package/dist/pgvector/sql/where.d.ts +8 -0
  94. package/dist/pgvector/sql/where.d.ts.map +1 -0
  95. package/dist/pgvector/sql/where.js +137 -0
  96. package/dist/pgvector/types.d.ts +20 -0
  97. package/dist/pgvector/types.d.ts.map +1 -0
  98. package/dist/pgvector/types.js +1 -0
  99. package/dist/pgvector/utils.d.ts +18 -0
  100. package/dist/pgvector/utils.d.ts.map +1 -0
  101. package/dist/pgvector/utils.js +22 -0
  102. package/dist/postgres.d.ts +19 -26
  103. package/dist/postgres.d.ts.map +1 -1
  104. package/dist/postgres.js +15 -27
  105. package/dist/storage.d.ts +48 -0
  106. package/dist/storage.d.ts.map +1 -1
  107. package/dist/storage.js +32 -9
  108. package/dist/thread/sql.d.ts +38 -0
  109. package/dist/thread/sql.d.ts.map +1 -0
  110. package/dist/thread/sql.js +112 -0
  111. package/dist/thread/store.d.ts +2 -2
  112. package/dist/thread/store.d.ts.map +1 -1
  113. package/dist/thread/store.js +32 -102
  114. package/package.json +7 -4
  115. package/src/__tests__/integration.test.ts +15 -17
  116. package/src/__tests__/memory-integration.test.ts +355 -0
  117. package/src/__tests__/memory.test.ts +428 -0
  118. package/src/index.ts +19 -3
  119. package/src/memory/sql.ts +141 -0
  120. package/src/memory/store.ts +166 -0
  121. package/src/migrations.ts +13 -3
  122. package/src/pgvector/README.md +50 -0
  123. package/src/pgvector/__tests__/handle.test.ts +335 -0
  124. package/src/pgvector/__tests__/hit.test.ts +165 -0
  125. package/src/pgvector/__tests__/integration/document.integration.test.ts +717 -0
  126. package/src/pgvector/__tests__/integration/edge.integration.test.ts +835 -0
  127. package/src/pgvector/__tests__/integration/filters.integration.test.ts +721 -0
  128. package/src/pgvector/__tests__/integration/lifecycle.integration.test.ts +570 -0
  129. package/src/pgvector/__tests__/integration/query.integration.test.ts +667 -0
  130. package/src/pgvector/__tests__/search.test.ts +366 -0
  131. package/src/pgvector/handle.ts +285 -0
  132. package/src/pgvector/hit.ts +56 -0
  133. package/src/pgvector/index.ts +7 -0
  134. package/src/pgvector/search.ts +330 -0
  135. package/src/pgvector/sql/__tests__/limit.test.ts +180 -0
  136. package/src/pgvector/sql/__tests__/order.test.ts +248 -0
  137. package/src/pgvector/sql/__tests__/query.test.ts +548 -0
  138. package/src/pgvector/sql/__tests__/select.test.ts +367 -0
  139. package/src/pgvector/sql/__tests__/where.test.ts +554 -0
  140. package/src/pgvector/sql/index.ts +14 -0
  141. package/src/pgvector/sql/limit.ts +29 -0
  142. package/src/pgvector/sql/order.ts +55 -0
  143. package/src/pgvector/sql/query.ts +112 -0
  144. package/src/pgvector/sql/schema.ts +61 -0
  145. package/src/pgvector/sql/select.ts +100 -0
  146. package/src/pgvector/sql/where.ts +152 -0
  147. package/src/pgvector/types.ts +21 -0
  148. package/src/pgvector/utils.ts +24 -0
  149. package/src/postgres.ts +31 -33
  150. package/src/storage.ts +77 -9
  151. package/src/thread/sql.ts +159 -0
  152. package/src/thread/store.ts +40 -127
  153. 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
+ });