@jarenjs/db 0.56.0 → 0.66.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 (68) hide show
  1. package/ARCHITECTURE.md +393 -56
  2. package/README.md +585 -53
  3. package/docs/HOSTS.md +269 -0
  4. package/docs/JOBS-FORMAT.md +293 -45
  5. package/docs/LIVE-FORMAT.md +122 -14
  6. package/docs/MIGRATION-FORMAT.md +142 -17
  7. package/docs/MODEL-FORMAT.md +744 -64
  8. package/package.json +21 -7
  9. package/schemas/jaren-model.draft-07.schema.json +224 -162
  10. package/schemas/jaren-model.schema.json +224 -162
  11. package/src/algebra.js +227 -9
  12. package/src/backup.js +161 -0
  13. package/src/cancellation.js +48 -0
  14. package/src/capture.js +218 -45
  15. package/src/cli.js +165 -59
  16. package/src/cursor.js +411 -0
  17. package/src/dag-job.js +154 -21
  18. package/src/ddl.js +102 -8
  19. package/src/dialect.js +267 -112
  20. package/src/dialects/expression-read.js +158 -0
  21. package/src/dialects/postgres.js +618 -0
  22. package/src/dialects/rtree-ddl.js +129 -0
  23. package/src/dialects/sqlite.js +243 -11
  24. package/src/document-files.js +311 -0
  25. package/src/document-steps.js +422 -0
  26. package/src/documents.js +335 -0
  27. package/src/driver.js +448 -61
  28. package/src/drivers/bun.js +37 -1
  29. package/src/drivers/indexeddb-snapshot.js +149 -0
  30. package/src/drivers/node-pool.js +11 -0
  31. package/src/drivers/node-worker-endpoint.js +105 -0
  32. package/src/drivers/node-worker.js +204 -0
  33. package/src/drivers/node.js +41 -7
  34. package/src/drivers/postgres.js +331 -0
  35. package/src/drivers/wasm-oo1.js +97 -0
  36. package/src/drivers/wasm-session.js +67 -0
  37. package/src/drivers/wasm.js +17 -83
  38. package/src/drivers/worker-pool.js +183 -0
  39. package/src/drivers/worker-protocol.js +79 -0
  40. package/src/drivers/worker-queue.js +60 -0
  41. package/src/emit.js +339 -48
  42. package/src/entity.js +20 -22
  43. package/src/errors.js +422 -19
  44. package/src/expression.js +284 -0
  45. package/src/graph.js +64 -8
  46. package/src/index.js +46 -17
  47. package/src/introspect.js +583 -0
  48. package/src/jobs.js +843 -107
  49. package/src/json-bytes.js +58 -0
  50. package/src/maintenance.js +175 -0
  51. package/src/migrate.js +248 -181
  52. package/src/model.js +68 -0
  53. package/src/plan.js +1119 -138
  54. package/src/pragmas.js +314 -0
  55. package/src/profile.js +151 -3
  56. package/src/query.js +1634 -323
  57. package/src/residual.js +17 -0
  58. package/src/series.js +12 -4
  59. package/src/store.js +1505 -264
  60. package/src/tracker.js +203 -29
  61. package/src/udf.js +88 -7
  62. package/types/index.d.ts +1097 -25
  63. package/types/node-pool.d.ts +28 -0
  64. package/types/node-worker.d.ts +54 -0
  65. package/types/node.d.ts +69 -2
  66. package/types/postgres.d.ts +46 -0
  67. package/types/typed.d.ts +25 -3
  68. package/types/wasm.d.ts +14 -0
package/src/residual.js CHANGED
@@ -72,6 +72,23 @@ export function compileSetResidual(document, limits, operators, zoneProvider) {
72
72
  return (candidates, externals) => compiled(candidates, externals);
73
73
  }
74
74
 
75
+ /**
76
+ * Compile the whole document for a CURSOR's barrier: `[document]` packs
77
+ * the result sequence into one unambiguous item array, so a cursor
78
+ * hands out one item per pull whatever the engine's singleton rule
79
+ * would have folded — the same packing the row residual uses per row,
80
+ * applied to the whole set.
81
+ * @param {any} document
82
+ * @param {any} [limits]
83
+ * @param {{ functions?: any, extensions?: any } | null} [operators]
84
+ * @param {any} [zoneProvider]
85
+ * @returns {(candidates: any[], externals: any) => any[]} the items
86
+ */
87
+ export function compilePackedResidual(document, limits, operators, zoneProvider) {
88
+ const compiled = compileJsonQuery([document], residualOptions(limits, operators, zoneProvider));
89
+ return (candidates, externals) => /** @type {any[]} */ (compiled(candidates, externals));
90
+ }
91
+
75
92
  /**
76
93
  * Compile the per-row projection for row-mode evaluation.
77
94
  * @param {any} rowDocument - The planner's complete one-row document
package/src/series.js CHANGED
@@ -187,6 +187,11 @@ export function seekingIndexFor(shape, column, facts, minColumns = 1) {
187
187
  * to: any, toOp: string | null }> }}
188
188
  */
189
189
  export function filterFacts(filter) {
190
+ // one comparison, two spellings: the guarded form over a member, and
191
+ // the bare one over a declared column that a refinement pushes. A
192
+ // seek reads the same column either way, so the facts must too
193
+ const columnOf = (pred) => (pred.p === 'colCmp' ? pred.column
194
+ : pred.p === 'cmp' ? pred.ref.column : null);
190
195
  /** @type {Set<string>} */
191
196
  const pinned = new Set();
192
197
  /** @type {Map<string, any>} */
@@ -212,14 +217,15 @@ export function filterFacts(filter) {
212
217
  if (pred.p === 'or') {
213
218
  const columns = new Set();
214
219
  for (const item of pred.items) {
215
- if (item.p !== 'cmp' || item.op !== 'eq' || item.ref.column === null) return;
216
- columns.add(item.ref.column);
220
+ const named = columnOf(item);
221
+ if (named === null || item.op !== 'eq') return;
222
+ columns.add(named);
217
223
  }
218
224
  if (columns.size === 1) pinned.add([...columns][0]);
219
225
  return;
220
226
  }
221
- if (pred.p !== 'cmp' || pred.ref.column === null) return;
222
- const column = pred.ref.column;
227
+ const column = columnOf(pred);
228
+ if (column === null) return;
223
229
  const operand = 'lit' in pred.operand ? pred.operand.lit : undefined;
224
230
  if (pred.op === 'eq') {
225
231
  pinned.add(column);
@@ -341,6 +347,8 @@ export function seriesRecord(facts) {
341
347
  to: range.to ?? null,
342
348
  toOp: range.toOp ?? null,
343
349
  },
350
+ seeks: (facts.seeks ?? []).map((s) =>
351
+ ({ side: s.side, column: s.column, probe: s.probe, op: s.op })),
344
352
  ladder: facts.ladder ?? null,
345
353
  aggregates: [...(facts.aggregates ?? [])],
346
354
  refinement: facts.refinement ?? null,