@rocicorp/zero 0.25.0-canary.10 → 0.25.0-canary.11

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 (184) hide show
  1. package/out/analyze-query/src/run-ast.d.ts.map +1 -1
  2. package/out/analyze-query/src/run-ast.js +3 -7
  3. package/out/analyze-query/src/run-ast.js.map +1 -1
  4. package/out/shared/src/iterables.d.ts +0 -1
  5. package/out/shared/src/iterables.d.ts.map +1 -1
  6. package/out/shared/src/iterables.js +0 -34
  7. package/out/shared/src/iterables.js.map +1 -1
  8. package/out/zero/package.json.js +1 -1
  9. package/out/zero-cache/src/config/zero-config.d.ts +0 -4
  10. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  11. package/out/zero-cache/src/config/zero-config.js +5 -15
  12. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  13. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  14. package/out/zero-cache/src/db/transaction-pool.js +3 -6
  15. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  16. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  17. package/out/zero-cache/src/server/change-streamer.js +2 -8
  18. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  19. package/out/zero-cache/src/services/analyze.d.ts +1 -1
  20. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  21. package/out/zero-cache/src/services/analyze.js +50 -37
  22. package/out/zero-cache/src/services/analyze.js.map +1 -1
  23. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  24. package/out/zero-cache/src/services/change-source/pg/change-source.js +62 -42
  25. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  26. package/out/zero-cache/src/services/change-source/protocol/current/control.d.ts +1 -0
  27. package/out/zero-cache/src/services/change-source/protocol/current/control.d.ts.map +1 -1
  28. package/out/zero-cache/src/services/change-source/protocol/current/control.js +5 -1
  29. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  30. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +2 -0
  31. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  32. package/out/zero-cache/src/services/change-source/protocol/current/json.d.ts +8 -0
  33. package/out/zero-cache/src/services/change-source/protocol/current/json.d.ts.map +1 -0
  34. package/out/zero-cache/src/services/change-source/protocol/current/json.js +19 -0
  35. package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -0
  36. package/out/zero-cache/src/services/change-source/protocol/current.d.ts +1 -0
  37. package/out/zero-cache/src/services/change-source/protocol/current.d.ts.map +1 -1
  38. package/out/zero-cache/src/services/change-source/protocol/current.js +3 -0
  39. package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
  40. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +0 -2
  41. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  42. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +0 -5
  43. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  44. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  45. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +8 -1
  46. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  47. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  48. package/out/zero-cache/src/services/change-streamer/storer.js +2 -3
  49. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  50. package/out/zero-cache/src/services/http-service.d.ts +0 -1
  51. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  52. package/out/zero-cache/src/services/http-service.js +0 -4
  53. package/out/zero-cache/src/services/http-service.js.map +1 -1
  54. package/out/zero-cache/src/services/replicator/replication-status.d.ts +2 -0
  55. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
  56. package/out/zero-cache/src/services/replicator/replication-status.js +14 -1
  57. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  58. package/out/zero-cache/src/services/run-ast.d.ts +1 -1
  59. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  60. package/out/zero-cache/src/services/run-ast.js +5 -1
  61. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  62. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +6 -4
  63. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  64. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +71 -23
  65. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  66. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -1
  67. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  68. package/out/zero-cache/src/services/view-syncer/view-syncer.js +10 -6
  69. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  70. package/out/zero-client/src/client/version.js +1 -1
  71. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  72. package/out/zero-client/src/client/zero.js +6 -2
  73. package/out/zero-client/src/client/zero.js.map +1 -1
  74. package/out/zero-events/src/status.d.ts +1 -1
  75. package/out/zero-events/src/status.d.ts.map +1 -1
  76. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  77. package/out/zero-solid/src/solid-view.js +4 -3
  78. package/out/zero-solid/src/solid-view.js.map +1 -1
  79. package/out/zql/src/builder/builder.d.ts.map +1 -1
  80. package/out/zql/src/builder/builder.js +0 -1
  81. package/out/zql/src/builder/builder.js.map +1 -1
  82. package/out/zql/src/ivm/array-view.d.ts +1 -1
  83. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  84. package/out/zql/src/ivm/array-view.js +2 -1
  85. package/out/zql/src/ivm/array-view.js.map +1 -1
  86. package/out/zql/src/ivm/data.d.ts +7 -2
  87. package/out/zql/src/ivm/data.d.ts.map +1 -1
  88. package/out/zql/src/ivm/data.js +3 -0
  89. package/out/zql/src/ivm/data.js.map +1 -1
  90. package/out/zql/src/ivm/exists.d.ts +3 -2
  91. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  92. package/out/zql/src/ivm/exists.js +29 -76
  93. package/out/zql/src/ivm/exists.js.map +1 -1
  94. package/out/zql/src/ivm/fan-in.d.ts +2 -0
  95. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  96. package/out/zql/src/ivm/fan-in.js +4 -0
  97. package/out/zql/src/ivm/fan-in.js.map +1 -1
  98. package/out/zql/src/ivm/fan-out.d.ts +2 -0
  99. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  100. package/out/zql/src/ivm/fan-out.js +4 -0
  101. package/out/zql/src/ivm/fan-out.js.map +1 -1
  102. package/out/zql/src/ivm/filter-operators.d.ts +6 -2
  103. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  104. package/out/zql/src/ivm/filter-operators.js +16 -0
  105. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  106. package/out/zql/src/ivm/filter.d.ts +2 -0
  107. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  108. package/out/zql/src/ivm/filter.js +4 -0
  109. package/out/zql/src/ivm/filter.js.map +1 -1
  110. package/out/zql/src/ivm/flipped-join.d.ts +1 -1
  111. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  112. package/out/zql/src/ivm/flipped-join.js +26 -13
  113. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  114. package/out/zql/src/ivm/join-utils.d.ts +2 -1
  115. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  116. package/out/zql/src/ivm/join-utils.js +8 -0
  117. package/out/zql/src/ivm/join-utils.js.map +1 -1
  118. package/out/zql/src/ivm/join.d.ts +1 -1
  119. package/out/zql/src/ivm/join.d.ts.map +1 -1
  120. package/out/zql/src/ivm/join.js +32 -13
  121. package/out/zql/src/ivm/join.js.map +1 -1
  122. package/out/zql/src/ivm/memory-source.d.ts +1 -1
  123. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  124. package/out/zql/src/ivm/memory-source.js +8 -1
  125. package/out/zql/src/ivm/memory-source.js.map +1 -1
  126. package/out/zql/src/ivm/operator.d.ts +9 -1
  127. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  128. package/out/zql/src/ivm/operator.js +8 -0
  129. package/out/zql/src/ivm/operator.js.map +1 -1
  130. package/out/zql/src/ivm/push-accumulated.d.ts +1 -1
  131. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  132. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  133. package/out/zql/src/ivm/skip.d.ts +1 -1
  134. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  135. package/out/zql/src/ivm/skip.js +7 -1
  136. package/out/zql/src/ivm/skip.js.map +1 -1
  137. package/out/zql/src/ivm/take.d.ts +1 -1
  138. package/out/zql/src/ivm/take.d.ts.map +1 -1
  139. package/out/zql/src/ivm/take.js +87 -59
  140. package/out/zql/src/ivm/take.js.map +1 -1
  141. package/out/zql/src/ivm/union-fan-in.d.ts +2 -1
  142. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  143. package/out/zql/src/ivm/union-fan-in.js +67 -5
  144. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  145. package/out/zql/src/ivm/union-fan-out.d.ts +1 -1
  146. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  147. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  148. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  149. package/out/zql/src/ivm/view-apply-change.js +3 -2
  150. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  151. package/out/zql/src/query/abstract-query.d.ts +43 -0
  152. package/out/zql/src/query/abstract-query.d.ts.map +1 -0
  153. package/out/zql/src/query/abstract-query.js +408 -0
  154. package/out/zql/src/query/abstract-query.js.map +1 -0
  155. package/out/zql/src/query/create-builder.d.ts +2 -0
  156. package/out/zql/src/query/create-builder.d.ts.map +1 -1
  157. package/out/zql/src/query/create-builder.js +7 -2
  158. package/out/zql/src/query/create-builder.js.map +1 -1
  159. package/out/zql/src/query/measure-push-operator.d.ts +1 -1
  160. package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
  161. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  162. package/out/zql/src/query/query-delegate-base.d.ts +7 -1
  163. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  164. package/out/zql/src/query/query-delegate-base.js +132 -2
  165. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  166. package/out/zql/src/query/query-impl.d.ts +5 -39
  167. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  168. package/out/zql/src/query/query-impl.js +3 -521
  169. package/out/zql/src/query/query-impl.js.map +1 -1
  170. package/out/zql/src/query/query.d.ts +21 -0
  171. package/out/zql/src/query/query.d.ts.map +1 -1
  172. package/out/zql/src/query/runnable-query-impl.d.ts +22 -0
  173. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -0
  174. package/out/zql/src/query/runnable-query-impl.js +60 -0
  175. package/out/zql/src/query/runnable-query-impl.js.map +1 -0
  176. package/out/zql/src/query/static-query.d.ts +1 -1
  177. package/out/zql/src/query/static-query.d.ts.map +1 -1
  178. package/out/zql/src/query/static-query.js +1 -1
  179. package/out/zql/src/query/static-query.js.map +1 -1
  180. package/out/zqlite/src/table-source.d.ts +7 -1
  181. package/out/zqlite/src/table-source.d.ts.map +1 -1
  182. package/out/zqlite/src/table-source.js +34 -14
  183. package/out/zqlite/src/table-source.js.map +1 -1
  184. package/package.json +1 -1
@@ -1,501 +1,9 @@
1
- import { resolver } from "@rocicorp/resolver";
2
- import { assert } from "../../../shared/src/asserts.js";
3
- import { SUBQ_PREFIX } from "../../../zero-protocol/src/ast.js";
4
- import { hashOfAST, hashOfNameAndArgs } from "../../../zero-protocol/src/query-hash.js";
5
- import { buildPipeline } from "../builder/builder.js";
6
- import { NotImplementedError } from "../error.js";
7
- import { ArrayView } from "../ivm/array-view.js";
1
+ import "../../../zero-protocol/src/ast.js";
8
2
  import { defaultFormat } from "../../../zero-types/src/format.js";
9
- import { ExpressionBuilder, cmp, and, simplifyCondition } from "./expression.js";
10
- import { queryInternalsTag, asQueryInternals } from "./query-internals.js";
11
- import { DEFAULT_TTL_MS, DEFAULT_PRELOAD_TTL_MS } from "./ttl.js";
3
+ import { AbstractQuery } from "./abstract-query.js";
12
4
  function newQuery(schema, table) {
13
5
  return new QueryImpl(schema, table, { table }, defaultFormat, void 0);
14
6
  }
15
- class AbstractQuery {
16
- [queryInternalsTag] = true;
17
- #schema;
18
- #tableName;
19
- #ast;
20
- format;
21
- #hash = "";
22
- #system;
23
- #currentJunction;
24
- customQueryID;
25
- #newQuery;
26
- constructor(schema, tableName, ast, format, system, customQueryID, currentJunction, newQuery2) {
27
- this.#schema = schema;
28
- this.#tableName = tableName;
29
- this.#ast = ast;
30
- this.format = format;
31
- this.#system = system;
32
- this.#currentJunction = currentJunction;
33
- this.customQueryID = customQueryID;
34
- this.#newQuery = newQuery2;
35
- }
36
- nameAndArgs(name, args) {
37
- return this.#newQuery(
38
- this.#tableName,
39
- this.#ast,
40
- this.format,
41
- {
42
- name,
43
- args
44
- },
45
- this.#currentJunction
46
- );
47
- }
48
- hash() {
49
- if (!this.#hash) {
50
- this.#hash = hashOfAST(this.#ast);
51
- }
52
- return this.#hash;
53
- }
54
- one = () => this.#newQuery(
55
- this.#tableName,
56
- {
57
- ...this.#ast,
58
- limit: 1
59
- },
60
- {
61
- ...this.format,
62
- singular: true
63
- },
64
- this.customQueryID,
65
- this.#currentJunction
66
- );
67
- whereExists = (relationship, cbOrOptions, options) => {
68
- const cb = typeof cbOrOptions === "function" ? cbOrOptions : void 0;
69
- const opts = typeof cbOrOptions === "function" ? options : cbOrOptions;
70
- const flipped = opts?.flip;
71
- return this.where(
72
- ({ exists }) => exists(
73
- relationship,
74
- cb,
75
- flipped !== void 0 ? { flip: flipped } : void 0
76
- )
77
- );
78
- };
79
- related = (relationship, cb) => {
80
- if (relationship.startsWith(SUBQ_PREFIX)) {
81
- throw new Error(
82
- `Relationship names may not start with "${SUBQ_PREFIX}". That is a reserved prefix.`
83
- );
84
- }
85
- cb = cb ?? ((q) => q);
86
- const related = this.#schema.relationships[this.#tableName][relationship];
87
- assert(related, "Invalid relationship");
88
- if (isOneHop(related)) {
89
- const { destSchema, destField, sourceField, cardinality } = related[0];
90
- const q = this.#newQuery(
91
- destSchema,
92
- {
93
- table: destSchema,
94
- alias: relationship
95
- },
96
- {
97
- relationships: {},
98
- singular: cardinality === "one"
99
- },
100
- this.customQueryID,
101
- void 0
102
- );
103
- const subQuery = asAbstractQuery(cb(q));
104
- assert(
105
- isCompoundKey(sourceField),
106
- "The source of a relationship must specify at last 1 field"
107
- );
108
- assert(
109
- isCompoundKey(destField),
110
- "The destination of a relationship must specify at last 1 field"
111
- );
112
- assert(
113
- sourceField.length === destField.length,
114
- "The source and destination of a relationship must have the same number of fields"
115
- );
116
- return this.#newQuery(
117
- this.#tableName,
118
- {
119
- ...this.#ast,
120
- related: [
121
- ...this.#ast.related ?? [],
122
- {
123
- system: this.#system,
124
- correlation: {
125
- parentField: sourceField,
126
- childField: destField
127
- },
128
- subquery: subQuery.#ast
129
- }
130
- ]
131
- },
132
- {
133
- ...this.format,
134
- relationships: {
135
- ...this.format.relationships,
136
- [relationship]: subQuery.format
137
- }
138
- },
139
- this.customQueryID,
140
- this.#currentJunction
141
- );
142
- }
143
- if (isTwoHop(related)) {
144
- const [firstRelation, secondRelation] = related;
145
- const { destSchema } = secondRelation;
146
- const junctionSchema = firstRelation.destSchema;
147
- const sq = asAbstractQuery(
148
- cb(
149
- this.#newQuery(
150
- destSchema,
151
- {
152
- table: destSchema,
153
- alias: relationship
154
- },
155
- {
156
- relationships: {},
157
- singular: secondRelation.cardinality === "one"
158
- },
159
- this.customQueryID,
160
- relationship
161
- )
162
- )
163
- );
164
- assert(isCompoundKey(firstRelation.sourceField), "Invalid relationship");
165
- assert(isCompoundKey(firstRelation.destField), "Invalid relationship");
166
- assert(isCompoundKey(secondRelation.sourceField), "Invalid relationship");
167
- assert(isCompoundKey(secondRelation.destField), "Invalid relationship");
168
- return this.#newQuery(
169
- this.#tableName,
170
- {
171
- ...this.#ast,
172
- related: [
173
- ...this.#ast.related ?? [],
174
- {
175
- system: this.#system,
176
- correlation: {
177
- parentField: firstRelation.sourceField,
178
- childField: firstRelation.destField
179
- },
180
- hidden: true,
181
- subquery: {
182
- table: junctionSchema,
183
- alias: relationship,
184
- related: [
185
- {
186
- system: this.#system,
187
- correlation: {
188
- parentField: secondRelation.sourceField,
189
- childField: secondRelation.destField
190
- },
191
- subquery: sq.#ast
192
- }
193
- ]
194
- }
195
- }
196
- ]
197
- },
198
- {
199
- ...this.format,
200
- relationships: {
201
- ...this.format.relationships,
202
- [relationship]: sq.format
203
- }
204
- },
205
- this.customQueryID,
206
- this.#currentJunction
207
- );
208
- }
209
- throw new Error(`Invalid relationship ${relationship}`);
210
- };
211
- where = (fieldOrExpressionFactory, opOrValue, value) => {
212
- let cond;
213
- if (typeof fieldOrExpressionFactory === "function") {
214
- cond = fieldOrExpressionFactory(
215
- new ExpressionBuilder(this._exists)
216
- );
217
- } else {
218
- assert(opOrValue !== void 0, "Invalid condition");
219
- cond = cmp(fieldOrExpressionFactory, opOrValue, value);
220
- }
221
- const existingWhere = this.#ast.where;
222
- if (existingWhere) {
223
- cond = and(existingWhere, cond);
224
- }
225
- const where = simplifyCondition(cond);
226
- return this.#newQuery(
227
- this.#tableName,
228
- {
229
- ...this.#ast,
230
- where
231
- },
232
- this.format,
233
- this.customQueryID,
234
- this.#currentJunction
235
- );
236
- };
237
- start = (row, opts) => this.#newQuery(
238
- this.#tableName,
239
- {
240
- ...this.#ast,
241
- start: {
242
- row,
243
- exclusive: !opts?.inclusive
244
- }
245
- },
246
- this.format,
247
- this.customQueryID,
248
- this.#currentJunction
249
- );
250
- limit = (limit) => {
251
- if (limit < 0) {
252
- throw new Error("Limit must be non-negative");
253
- }
254
- if ((limit | 0) !== limit) {
255
- throw new Error("Limit must be an integer");
256
- }
257
- if (this.#currentJunction) {
258
- throw new NotImplementedError(
259
- "Limit is not supported in junction relationships yet. Junction relationship being limited: " + this.#currentJunction
260
- );
261
- }
262
- return this.#newQuery(
263
- this.#tableName,
264
- {
265
- ...this.#ast,
266
- limit
267
- },
268
- this.format,
269
- this.customQueryID,
270
- this.#currentJunction
271
- );
272
- };
273
- orderBy = (field, direction) => {
274
- if (this.#currentJunction) {
275
- throw new NotImplementedError(
276
- "Order by is not supported in junction relationships yet. Junction relationship being ordered: " + this.#currentJunction
277
- );
278
- }
279
- return this.#newQuery(
280
- this.#tableName,
281
- {
282
- ...this.#ast,
283
- orderBy: [...this.#ast.orderBy ?? [], [field, direction]]
284
- },
285
- this.format,
286
- this.customQueryID,
287
- this.#currentJunction
288
- );
289
- };
290
- _exists = (relationship, cb, options) => {
291
- cb = cb ?? ((q) => q);
292
- const flip = options?.flip;
293
- const related = this.#schema.relationships[this.#tableName][relationship];
294
- assert(related, "Invalid relationship");
295
- if (isOneHop(related)) {
296
- const { destSchema: destTableName, sourceField, destField } = related[0];
297
- assert(isCompoundKey(sourceField), "Invalid relationship");
298
- assert(isCompoundKey(destField), "Invalid relationship");
299
- const subQuery = asAbstractQuery(
300
- cb(
301
- this.#newQuery(
302
- destTableName,
303
- {
304
- table: destTableName,
305
- alias: `${SUBQ_PREFIX}${relationship}`
306
- },
307
- defaultFormat,
308
- this.customQueryID,
309
- void 0
310
- )
311
- )
312
- );
313
- return {
314
- type: "correlatedSubquery",
315
- related: {
316
- system: this.#system,
317
- correlation: {
318
- parentField: sourceField,
319
- childField: destField
320
- },
321
- subquery: subQuery.#ast
322
- },
323
- op: "EXISTS",
324
- flip
325
- };
326
- }
327
- if (isTwoHop(related)) {
328
- const [firstRelation, secondRelation] = related;
329
- assert(isCompoundKey(firstRelation.sourceField), "Invalid relationship");
330
- assert(isCompoundKey(firstRelation.destField), "Invalid relationship");
331
- assert(isCompoundKey(secondRelation.sourceField), "Invalid relationship");
332
- assert(isCompoundKey(secondRelation.destField), "Invalid relationship");
333
- const { destSchema } = secondRelation;
334
- const junctionSchema = firstRelation.destSchema;
335
- const queryToDest = cb(
336
- this.#newQuery(
337
- destSchema,
338
- {
339
- table: destSchema,
340
- alias: `${SUBQ_PREFIX}zhidden_${relationship}`
341
- },
342
- defaultFormat,
343
- this.customQueryID,
344
- relationship
345
- )
346
- );
347
- return {
348
- type: "correlatedSubquery",
349
- related: {
350
- system: this.#system,
351
- correlation: {
352
- parentField: firstRelation.sourceField,
353
- childField: firstRelation.destField
354
- },
355
- subquery: {
356
- table: junctionSchema,
357
- alias: `${SUBQ_PREFIX}${relationship}`,
358
- where: {
359
- type: "correlatedSubquery",
360
- related: {
361
- system: this.#system,
362
- correlation: {
363
- parentField: secondRelation.sourceField,
364
- childField: secondRelation.destField
365
- },
366
- subquery: queryToDest.#ast
367
- },
368
- op: "EXISTS",
369
- flip
370
- }
371
- }
372
- },
373
- op: "EXISTS",
374
- flip
375
- };
376
- }
377
- throw new Error(`Invalid relationship ${relationship}`);
378
- };
379
- get ast() {
380
- return this.#ast;
381
- }
382
- toQuery(_context) {
383
- return this;
384
- }
385
- }
386
- function asAbstractQuery(q) {
387
- assert(q instanceof AbstractQuery);
388
- return q;
389
- }
390
- function materializeImpl(query, delegate, factory = arrayViewFactory, options) {
391
- let ttl = options?.ttl ?? DEFAULT_TTL_MS;
392
- const qi = asQueryInternals(query);
393
- const { ast, format, customQueryID } = qi;
394
- const queryHash = qi.hash();
395
- const queryID = customQueryID ? hashOfNameAndArgs(customQueryID.name, customQueryID.args) : queryHash;
396
- const queryCompleteResolver = resolver();
397
- let queryComplete = delegate.defaultQueryComplete;
398
- const updateTTL = customQueryID ? (newTTL) => delegate.updateCustomQuery(customQueryID, newTTL) : (newTTL) => delegate.updateServerQuery(ast, newTTL);
399
- const gotCallback = (got, error) => {
400
- if (error) {
401
- queryCompleteResolver.reject(error);
402
- queryComplete = error;
403
- return;
404
- }
405
- if (got) {
406
- delegate.addMetric(
407
- "query-materialization-end-to-end",
408
- performance.now() - t0,
409
- queryID,
410
- ast
411
- );
412
- queryComplete = true;
413
- queryCompleteResolver.resolve(true);
414
- }
415
- };
416
- let removeCommitObserver;
417
- const onDestroy = () => {
418
- input.destroy();
419
- removeCommitObserver?.();
420
- removeAddedQuery();
421
- };
422
- const t0 = performance.now();
423
- const removeAddedQuery = customQueryID ? delegate.addCustomQuery(ast, customQueryID, ttl, gotCallback) : delegate.addServerQuery(ast, ttl, gotCallback);
424
- const input = buildPipeline(ast, delegate, queryID);
425
- const view = delegate.batchViewUpdates(
426
- () => (factory ?? arrayViewFactory)(
427
- query,
428
- input,
429
- format,
430
- onDestroy,
431
- (cb) => {
432
- removeCommitObserver = delegate.onTransactionCommit(cb);
433
- },
434
- queryComplete || queryCompleteResolver.promise,
435
- updateTTL
436
- )
437
- );
438
- delegate.addMetric(
439
- "query-materialization-client",
440
- performance.now() - t0,
441
- queryID
442
- );
443
- return view;
444
- }
445
- async function runImpl(query, delegate, options) {
446
- delegate.assertValidRunOptions(options);
447
- const v = materializeImpl(
448
- query,
449
- delegate,
450
- void 0,
451
- {
452
- ttl: options?.ttl
453
- }
454
- );
455
- if (options?.type === "complete") {
456
- return new Promise((resolve) => {
457
- v.addListener((data, type) => {
458
- if (type === "complete") {
459
- v.destroy();
460
- resolve(data);
461
- } else if (type === "error") {
462
- v.destroy();
463
- resolve(Promise.reject(data));
464
- }
465
- });
466
- });
467
- }
468
- options?.type;
469
- const ret = v.data;
470
- v.destroy();
471
- return ret;
472
- }
473
- function preloadImpl(query, delegate, options) {
474
- const qi = asQueryInternals(query);
475
- const ttl = options?.ttl ?? DEFAULT_PRELOAD_TTL_MS;
476
- const { resolve, promise: complete } = resolver();
477
- const { customQueryID, ast } = qi;
478
- if (customQueryID) {
479
- const cleanup2 = delegate.addCustomQuery(ast, customQueryID, ttl, (got) => {
480
- if (got) {
481
- resolve();
482
- }
483
- });
484
- return {
485
- cleanup: cleanup2,
486
- complete
487
- };
488
- }
489
- const cleanup = delegate.addServerQuery(ast, ttl, (got) => {
490
- if (got) {
491
- resolve();
492
- }
493
- });
494
- return {
495
- cleanup,
496
- complete
497
- };
498
- }
499
7
  class QueryImpl extends AbstractQuery {
500
8
  constructor(schema, tableName, ast = { table: tableName }, format = defaultFormat, system = "client", customQueryID, currentJunction) {
501
9
  super(
@@ -518,34 +26,8 @@ class QueryImpl extends AbstractQuery {
518
26
  );
519
27
  }
520
28
  }
521
- function arrayViewFactory(_query, input, format, onDestroy, onTransactionCommit, queryComplete, updateTTL) {
522
- const v = new ArrayView(
523
- input,
524
- format,
525
- queryComplete,
526
- updateTTL
527
- );
528
- v.onDestroy = onDestroy;
529
- onTransactionCommit(() => {
530
- v.flush();
531
- });
532
- return v;
533
- }
534
- function isCompoundKey(field) {
535
- return Array.isArray(field) && field.length >= 1;
536
- }
537
- function isOneHop(r) {
538
- return r.length === 1;
539
- }
540
- function isTwoHop(r) {
541
- return r.length === 2;
542
- }
543
29
  export {
544
- AbstractQuery,
545
30
  QueryImpl,
546
- materializeImpl,
547
- newQuery,
548
- preloadImpl,
549
- runImpl
31
+ newQuery
550
32
  };
551
33
  //# sourceMappingURL=query-impl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-impl.js","sources":["../../../../../zql/src/query/query-impl.ts"],"sourcesContent":["import {resolver} from '@rocicorp/resolver';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {\n SUBQ_PREFIX,\n type AST,\n type CompoundKey,\n type Condition,\n type Parameter,\n type SimpleOperator,\n type System,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts';\nimport {\n hashOfAST,\n hashOfNameAndArgs,\n} from '../../../zero-protocol/src/query-hash.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {buildPipeline} from '../builder/builder.ts';\nimport {NotImplementedError} from '../error.ts';\nimport {ArrayView} from '../ivm/array-view.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Input} from '../ivm/operator.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport {\n and,\n cmp,\n ExpressionBuilder,\n simplifyCondition,\n type ExpressionFactory,\n} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {GotCallback, QueryDelegate} from './query-delegate.ts';\nimport {\n asQueryInternals,\n queryInternalsTag,\n type QueryInternals,\n} from './query-internals.ts';\nimport {\n type AnyQuery,\n type ExistsOptions,\n type GetFilterType,\n type HumanReadable,\n type MaterializeOptions,\n type PreloadOptions,\n type PullRow,\n type Query,\n type RunOptions,\n type ToQuery,\n} from './query.ts';\nimport {DEFAULT_PRELOAD_TTL_MS, DEFAULT_TTL_MS, type TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\nexport function newQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(schema: TSchema, table: TTable): Query<TTable, TSchema, TReturn> {\n return new QueryImpl(schema, table, {table}, defaultFormat, undefined);\n}\n\nexport function staticParam(\n anchorClass: 'authData' | 'preMutationRow',\n field: string | string[],\n): Parameter {\n return {\n type: 'static',\n anchor: anchorClass,\n // for backwards compatibility\n field: field.length === 1 ? field[0] : field,\n };\n}\n\n// oxlint-disable-next-line no-explicit-any\ntype GetFilterTypeAny = GetFilterType<any, any, any>;\n\ntype NewQueryFunction<TSchema extends Schema> = <\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n>(\n this: unknown,\n tableName: TTable,\n ast: AST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n) => Query<TTable, TSchema, TReturn>;\n\nexport abstract class AbstractQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n >\n implements\n Query<TTable, TSchema, TReturn>,\n QueryInternals<TTable, TSchema, TReturn>,\n ToQuery<TTable, TSchema, TReturn, unknown>\n{\n readonly [queryInternalsTag] = true;\n\n readonly #schema: TSchema;\n readonly #tableName: TTable;\n readonly #ast: AST;\n readonly format: Format;\n #hash: string = '';\n readonly #system: System;\n readonly #currentJunction: string | undefined;\n readonly customQueryID: CustomQueryID | undefined;\n readonly #newQuery: NewQueryFunction<TSchema>;\n\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n newQuery: NewQueryFunction<TSchema>,\n ) {\n this.#schema = schema;\n this.#tableName = tableName;\n this.#ast = ast;\n this.format = format;\n this.#system = system;\n this.#currentJunction = currentJunction;\n this.customQueryID = customQueryID;\n this.#newQuery = newQuery;\n }\n\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn> {\n return this.#newQuery(\n this.#tableName,\n this.#ast,\n this.format,\n {\n name,\n args,\n },\n this.#currentJunction,\n );\n }\n\n hash(): string {\n if (!this.#hash) {\n this.#hash = hashOfAST(this.#ast);\n }\n return this.#hash;\n }\n\n one = (): Query<TTable, TSchema, TReturn | undefined> =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n limit: 1,\n },\n {\n ...this.format,\n singular: true,\n },\n this.customQueryID,\n this.#currentJunction,\n );\n\n whereExists = (\n relationship: string,\n cbOrOptions?: ((q: AnyQuery) => AnyQuery) | ExistsOptions,\n options?: ExistsOptions,\n ): Query<TTable, TSchema, TReturn> => {\n const cb = typeof cbOrOptions === 'function' ? cbOrOptions : undefined;\n const opts = typeof cbOrOptions === 'function' ? options : cbOrOptions;\n const flipped = opts?.flip;\n return this.where(({exists}) =>\n exists(\n relationship,\n cb,\n flipped !== undefined ? {flip: flipped} : undefined,\n ),\n ) as Query<TTable, TSchema, TReturn>;\n };\n\n related = (\n relationship: string,\n cb?: (q: AnyQuery) => AnyQuery,\n // oxlint-disable-next-line no-explicit-any\n ): Query<TTable, TSchema, any> => {\n if (relationship.startsWith(SUBQ_PREFIX)) {\n throw new Error(\n `Relationship names may not start with \"${SUBQ_PREFIX}\". That is a reserved prefix.`,\n );\n }\n cb = cb ?? (q => q);\n\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n if (isOneHop(related)) {\n const {destSchema, destField, sourceField, cardinality} = related[0];\n const q: AnyQuery = this.#newQuery(\n destSchema,\n {\n table: destSchema,\n alias: relationship,\n },\n {\n relationships: {},\n singular: cardinality === 'one',\n },\n this.customQueryID,\n undefined,\n ) as AnyQuery;\n // Intentionally not setting to `one` as it is a perf degradation\n // and the user should not be making the mistake of setting cardinality to\n // `one` when it is actually not.\n // if (cardinality === 'one') {\n // q = q.one();\n // }\n const subQuery = asAbstractQuery(cb(q));\n assert(\n isCompoundKey(sourceField),\n 'The source of a relationship must specify at last 1 field',\n );\n assert(\n isCompoundKey(destField),\n 'The destination of a relationship must specify at last 1 field',\n );\n assert(\n sourceField.length === destField.length,\n 'The source and destination of a relationship must have the same number of fields',\n );\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: [\n ...(this.#ast.related ?? []),\n {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n ],\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: subQuery.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ) as AnyQuery;\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const sq = asAbstractQuery(\n cb(\n this.#newQuery(\n destSchema,\n {\n table: destSchema,\n alias: relationship,\n },\n {\n relationships: {},\n singular: secondRelation.cardinality === 'one',\n },\n this.customQueryID,\n relationship,\n ),\n ),\n );\n\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: [\n ...(this.#ast.related ?? []),\n {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n hidden: true,\n subquery: {\n table: junctionSchema,\n alias: relationship,\n related: [\n {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: sq.#ast,\n },\n ],\n },\n },\n ],\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: sq.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ) as AnyQuery;\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n };\n\n where = (\n fieldOrExpressionFactory: string | ExpressionFactory<TTable, TSchema>,\n opOrValue?: SimpleOperator | GetFilterTypeAny | Parameter,\n value?: GetFilterTypeAny | Parameter,\n ): Query<TTable, TSchema, TReturn> => {\n let cond: Condition;\n\n if (typeof fieldOrExpressionFactory === 'function') {\n cond = fieldOrExpressionFactory(\n new ExpressionBuilder(this._exists) as ExpressionBuilder<\n TTable,\n TSchema\n >,\n );\n } else {\n assert(opOrValue !== undefined, 'Invalid condition');\n cond = cmp(fieldOrExpressionFactory, opOrValue, value);\n }\n\n const existingWhere = this.#ast.where;\n if (existingWhere) {\n cond = and(existingWhere, cond);\n }\n\n const where = simplifyCondition(cond);\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n where,\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n };\n\n start = (\n row: Partial<Record<string, ReadonlyJSONValue | undefined>>,\n opts?: {inclusive: boolean},\n ): Query<TTable, TSchema, TReturn> =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n start: {\n row,\n exclusive: !opts?.inclusive,\n },\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n\n limit = (limit: number): Query<TTable, TSchema, TReturn> => {\n if (limit < 0) {\n throw new Error('Limit must be non-negative');\n }\n if ((limit | 0) !== limit) {\n throw new Error('Limit must be an integer');\n }\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Limit is not supported in junction relationships yet. Junction relationship being limited: ' +\n this.#currentJunction,\n );\n }\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n limit,\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n };\n\n orderBy = <TSelector extends keyof TSchema['tables'][TTable]['columns']>(\n field: TSelector,\n direction: 'asc' | 'desc',\n ): Query<TTable, TSchema, TReturn> => {\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Order by is not supported in junction relationships yet. Junction relationship being ordered: ' +\n this.#currentJunction,\n );\n }\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n orderBy: [...(this.#ast.orderBy ?? []), [field as string, direction]],\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n };\n\n protected _exists = (\n relationship: string,\n cb: ((query: AnyQuery) => AnyQuery) | undefined,\n options?: ExistsOptions,\n ): Condition => {\n cb = cb ?? (q => q);\n const flip = options?.flip;\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n\n if (isOneHop(related)) {\n const {destSchema: destTableName, sourceField, destField} = related[0];\n assert(isCompoundKey(sourceField), 'Invalid relationship');\n assert(isCompoundKey(destField), 'Invalid relationship');\n\n const subQuery = asAbstractQuery(\n cb(\n this.#newQuery(\n destTableName,\n {\n table: destTableName,\n alias: `${SUBQ_PREFIX}${relationship}`,\n },\n defaultFormat,\n this.customQueryID,\n undefined,\n ),\n ),\n );\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n op: 'EXISTS',\n flip,\n };\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const queryToDest = cb(\n this.#newQuery(\n destSchema,\n {\n table: destSchema,\n alias: `${SUBQ_PREFIX}zhidden_${relationship}`,\n },\n defaultFormat,\n this.customQueryID,\n relationship,\n ) as AnyQuery,\n );\n\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n subquery: {\n table: junctionSchema,\n alias: `${SUBQ_PREFIX}${relationship}`,\n where: {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: (queryToDest as QueryImpl<string, Schema, unknown>)\n .#ast,\n },\n op: 'EXISTS',\n flip,\n },\n },\n },\n op: 'EXISTS',\n flip,\n };\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n };\n\n get ast(): AST {\n return this.#ast;\n }\n\n toQuery(_context: unknown): this {\n return this;\n }\n}\n\nfunction asAbstractQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(q: Query<TTable, TSchema, TReturn>): AbstractQuery<TTable, TSchema, TReturn> {\n assert(q instanceof AbstractQuery);\n return q;\n}\n\nexport function materializeImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n factory: ViewFactory<\n TTable,\n TSchema,\n TReturn,\n T\n // oxlint-disable-next-line no-explicit-any\n > = arrayViewFactory as any,\n options?: MaterializeOptions,\n): T {\n let ttl: TTL = options?.ttl ?? DEFAULT_TTL_MS;\n\n const qi = asQueryInternals(query);\n const {ast, format, customQueryID} = qi;\n const queryHash = qi.hash();\n\n const queryID = customQueryID\n ? hashOfNameAndArgs(customQueryID.name, customQueryID.args)\n : queryHash;\n const queryCompleteResolver = resolver<true>();\n let queryComplete: boolean | ErroredQuery = delegate.defaultQueryComplete;\n const updateTTL = customQueryID\n ? (newTTL: TTL) => delegate.updateCustomQuery(customQueryID, newTTL)\n : (newTTL: TTL) => delegate.updateServerQuery(ast, newTTL);\n\n const gotCallback: GotCallback = (got, error) => {\n if (error) {\n queryCompleteResolver.reject(error);\n queryComplete = error;\n return;\n }\n\n if (got) {\n delegate.addMetric(\n 'query-materialization-end-to-end',\n performance.now() - t0,\n queryID,\n ast,\n );\n queryComplete = true;\n queryCompleteResolver.resolve(true);\n }\n };\n\n let removeCommitObserver: (() => void) | undefined;\n const onDestroy = () => {\n input.destroy();\n removeCommitObserver?.();\n removeAddedQuery();\n };\n\n const t0 = performance.now();\n\n const removeAddedQuery = customQueryID\n ? delegate.addCustomQuery(ast, customQueryID, ttl, gotCallback)\n : delegate.addServerQuery(ast, ttl, gotCallback);\n\n const input = buildPipeline(ast, delegate, queryID);\n\n const view = delegate.batchViewUpdates(() =>\n (factory ?? arrayViewFactory)(\n query,\n input,\n format,\n onDestroy,\n cb => {\n removeCommitObserver = delegate.onTransactionCommit(cb);\n },\n queryComplete || queryCompleteResolver.promise,\n updateTTL,\n ),\n );\n\n delegate.addMetric(\n 'query-materialization-client',\n performance.now() - t0,\n queryID,\n );\n\n return view as T;\n}\n\n// oxlint-disable-next-line require-await\nexport async function runImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n options?: RunOptions,\n): Promise<HumanReadable<TReturn>> {\n delegate.assertValidRunOptions(options);\n const v: TypedView<HumanReadable<TReturn>> = materializeImpl(\n query,\n delegate,\n undefined,\n {\n ttl: options?.ttl,\n },\n );\n if (options?.type === 'complete') {\n return new Promise(resolve => {\n v.addListener((data, type) => {\n if (type === 'complete') {\n v.destroy();\n resolve(data as HumanReadable<TReturn>);\n } else if (type === 'error') {\n v.destroy();\n resolve(Promise.reject(data));\n }\n });\n });\n }\n\n options?.type satisfies 'unknown' | undefined;\n\n const ret = v.data;\n v.destroy();\n return ret;\n}\n\nexport function preloadImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n options?: PreloadOptions,\n): {\n cleanup: () => void;\n complete: Promise<void>;\n} {\n const qi = asQueryInternals(query);\n const ttl = options?.ttl ?? DEFAULT_PRELOAD_TTL_MS;\n const {resolve, promise: complete} = resolver<void>();\n const {customQueryID, ast} = qi;\n if (customQueryID) {\n const cleanup = delegate.addCustomQuery(ast, customQueryID, ttl, got => {\n if (got) {\n resolve();\n }\n });\n return {\n cleanup,\n complete,\n };\n }\n\n const cleanup = delegate.addServerQuery(ast, ttl, got => {\n if (got) {\n resolve();\n }\n });\n return {\n cleanup,\n complete,\n };\n}\n\nexport class QueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n >\n extends AbstractQuery<TTable, TSchema, TReturn>\n implements\n Query<TTable, TSchema, TReturn>,\n ToQuery<TTable, TSchema, TReturn, unknown>\n{\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: AST = {table: tableName},\n format: Format = defaultFormat,\n system: System = 'client',\n customQueryID?: CustomQueryID,\n currentJunction?: string,\n ) {\n super(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n (tableName, ast, format, customQueryID, currentJunction) =>\n new QueryImpl(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n ),\n );\n }\n}\n\nfunction arrayViewFactory<\n TTable extends string,\n TSchema extends Schema,\n TReturn,\n>(\n _query: QueryInternals<TTable, TSchema, TReturn>,\n input: Input,\n format: Format,\n onDestroy: () => void,\n onTransactionCommit: (cb: () => void) => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n): TypedView<HumanReadable<TReturn>> {\n const v = new ArrayView<HumanReadable<TReturn>>(\n input,\n format,\n queryComplete,\n updateTTL,\n );\n v.onDestroy = onDestroy;\n onTransactionCommit(() => {\n v.flush();\n });\n return v;\n}\n\nfunction isCompoundKey(field: readonly string[]): field is CompoundKey {\n return Array.isArray(field) && field.length >= 1;\n}\n\nfunction isOneHop<T>(r: readonly T[]): r is readonly [T] {\n return r.length === 1;\n}\n\nfunction isTwoHop<T>(r: readonly T[]): r is readonly [T, T] {\n return r.length === 2;\n}\n"],"names":["newQuery","cleanup","tableName","ast","format","customQueryID","currentJunction"],"mappings":"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"}
1
+ {"version":3,"file":"query-impl.js","sources":["../../../../../zql/src/query/query-impl.ts"],"sourcesContent":["import {type AST, type System} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format} from '../ivm/view.ts';\nimport {AbstractQuery} from './abstract-query.ts';\nimport type {CustomQueryID} from './named.ts';\nimport {type PullRow, type Query, type ToQuery} from './query.ts';\n\nexport function newQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(schema: TSchema, table: TTable): Query<TTable, TSchema> {\n return new QueryImpl(schema, table, {table}, defaultFormat, undefined);\n}\n\nexport class QueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n >\n extends AbstractQuery<TTable, TSchema, TReturn>\n implements\n Query<TTable, TSchema, TReturn>,\n ToQuery<TTable, TSchema, TReturn, unknown>\n{\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: AST = {table: tableName},\n format: Format = defaultFormat,\n system: System = 'client',\n customQueryID?: CustomQueryID,\n currentJunction?: string,\n ) {\n super(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n (tableName, ast, format, customQueryID, currentJunction) =>\n new QueryImpl(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n ),\n );\n }\n}\n"],"names":["tableName","ast","format","customQueryID","currentJunction"],"mappings":";;;AAQO,SAAS,SAGd,QAAiB,OAAuC;AACxD,SAAO,IAAI,UAAU,QAAQ,OAAO,EAAC,MAAA,GAAQ,eAAe,MAAS;AACvE;AAEO,MAAM,kBAKH,cAIV;AAAA,EACE,YACE,QACA,WACA,MAAW,EAAC,OAAO,aACnB,SAAiB,eACjB,SAAiB,UACjB,eACA,iBACA;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAACA,YAAWC,MAAKC,SAAQC,gBAAeC,qBACtC,IAAI;AAAA,QACF;AAAA,QACAJ;AAAAA,QACAC;AAAAA,QACAC;AAAAA,QACA;AAAA,QACAC;AAAAA,QACAC;AAAAA,MAAA;AAAA,IACF;AAAA,EAEN;AACF;"}
@@ -3,8 +3,10 @@ import { type SimpleOperator } from '../../../zero-protocol/src/ast.ts';
3
3
  import type { DefaultSchema } from '../../../zero-types/src/default-types.ts';
4
4
  import type { SchemaValueToTSType, SchemaValueWithCustomType } from '../../../zero-types/src/schema-value.ts';
5
5
  import type { LastInTuple, Schema, TableSchema, Schema as ZeroSchema } from '../../../zero-types/src/schema.ts';
6
+ import type { ViewFactory } from '../ivm/view.ts';
6
7
  import type { ExpressionFactory, ParameterReference } from './expression.ts';
7
8
  import type { TTL } from './ttl.ts';
9
+ import type { TypedView } from './typed-view.ts';
8
10
  type Selector<E extends TableSchema> = keyof E['columns'];
9
11
  export type NoCompoundTypeSelector<T extends TableSchema> = Exclude<Selector<T>, JsonSelectors<T> | ArraySelectors<T>>;
10
12
  type JsonSelectors<E extends TableSchema> = {
@@ -88,6 +90,25 @@ export interface Query<TTable extends keyof TSchema['tables'] & string, TSchema
88
90
  limit(limit: number): Query<TTable, TSchema, TReturn>;
89
91
  orderBy<TSelector extends Selector<PullTableSchema<TTable, TSchema>>>(field: TSelector, direction: 'asc' | 'desc'): Query<TTable, TSchema, TReturn>;
90
92
  one(): Query<TTable, TSchema, TReturn | undefined>;
93
+ /**
94
+ * @deprecated Use {@linkcode RunOptions} with {@linkcode zero.run} instead.
95
+ */
96
+ run(options?: RunOptions): Promise<HumanReadable<TReturn>>;
97
+ /**
98
+ * @deprecated Use {@linkcode PreloadOptions} with {@linkcode zero.preload} instead.
99
+ */
100
+ preload(options?: PreloadOptions): {
101
+ cleanup: () => void;
102
+ complete: Promise<void>;
103
+ };
104
+ /**
105
+ * @deprecated Use {@linkcode MaterializeOptions} with {@linkcode zero.materialize} instead.
106
+ */
107
+ materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;
108
+ /**
109
+ * @deprecated Use {@linkcode MaterializeOptions} with {@linkcode zero.materialize} instead.
110
+ */
111
+ materialize<T>(factory: ViewFactory<TTable, TSchema, TReturn, T>, ttl?: TTL): T;
91
112
  }
92
113
  export type PreloadOptions = {
93
114
  /**