@rocicorp/zero 0.25.0-canary.10 → 0.25.0-canary.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.
- package/out/analyze-query/src/run-ast.d.ts.map +1 -1
- package/out/analyze-query/src/run-ast.js +3 -7
- package/out/analyze-query/src/run-ast.js.map +1 -1
- package/out/shared/src/iterables.d.ts +0 -1
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +0 -34
- package/out/shared/src/iterables.js.map +1 -1
- package/out/zero/package.json.js +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +3 -6
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +50 -37
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +5 -1
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +6 -4
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +71 -23
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +10 -6
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-client/src/client/bindings.d.ts +2 -3
- package/out/zero-client/src/client/bindings.d.ts.map +1 -1
- package/out/zero-client/src/client/bindings.js.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.d.ts +2 -2
- package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +3 -3
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.d.ts +1 -2
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +6 -2
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.d.ts +5 -7
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-react/src/components/inspector.d.ts +1 -2
- package/out/zero-react/src/components/inspector.d.ts.map +1 -1
- package/out/zero-react/src/components/inspector.js.map +1 -1
- package/out/zero-react/src/components/zero-inspector.d.ts +1 -2
- package/out/zero-react/src/components/zero-inspector.d.ts.map +1 -1
- package/out/zero-react/src/components/zero-inspector.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts +1 -2
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/zero-provider.d.ts +4 -5
- package/out/zero-react/src/zero-provider.d.ts.map +1 -1
- package/out/zero-react/src/zero-provider.js.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +4 -3
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-zero.d.ts +4 -5
- package/out/zero-solid/src/use-zero.d.ts.map +1 -1
- package/out/zero-solid/src/use-zero.js.map +1 -1
- package/out/zero-types/src/default-types.d.ts +2 -2
- package/out/zero-types/src/default-types.d.ts.map +1 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +0 -1
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/ivm/array-view.d.ts +1 -1
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +2 -1
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/data.d.ts +7 -2
- package/out/zql/src/ivm/data.d.ts.map +1 -1
- package/out/zql/src/ivm/data.js +3 -0
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts +3 -2
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +29 -76
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.d.ts +2 -0
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js +4 -0
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts +2 -0
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js +4 -0
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +6 -2
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +16 -0
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter.d.ts +2 -0
- package/out/zql/src/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/ivm/filter.js +4 -0
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +26 -13
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/join-utils.d.ts +2 -1
- package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
- package/out/zql/src/ivm/join-utils.js +8 -0
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/join.d.ts +1 -1
- package/out/zql/src/ivm/join.d.ts.map +1 -1
- package/out/zql/src/ivm/join.js +15 -6
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +1 -1
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +8 -1
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/operator.d.ts +9 -1
- package/out/zql/src/ivm/operator.d.ts.map +1 -1
- package/out/zql/src/ivm/operator.js +8 -0
- package/out/zql/src/ivm/operator.js.map +1 -1
- package/out/zql/src/ivm/push-accumulated.d.ts +1 -1
- package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/skip.d.ts +1 -1
- package/out/zql/src/ivm/skip.d.ts.map +1 -1
- package/out/zql/src/ivm/skip.js +7 -1
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/take.d.ts +1 -1
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +87 -59
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts +2 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +67 -5
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/union-fan-out.d.ts +1 -1
- package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-out.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +3 -2
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/mutate/custom.d.ts +2 -2
- package/out/zql/src/mutate/custom.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.d.ts +33 -15
- package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js +2 -8
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/mutate/mutator.d.ts +50 -25
- package/out/zql/src/mutate/mutator.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator.js +2 -3
- package/out/zql/src/mutate/mutator.js.map +1 -1
- package/out/zql/src/query/abstract-query.d.ts +43 -0
- package/out/zql/src/query/abstract-query.d.ts.map +1 -0
- package/out/zql/src/query/abstract-query.js +408 -0
- package/out/zql/src/query/abstract-query.js.map +1 -0
- package/out/zql/src/query/create-builder.d.ts +2 -0
- package/out/zql/src/query/create-builder.d.ts.map +1 -1
- package/out/zql/src/query/create-builder.js +7 -2
- package/out/zql/src/query/create-builder.js.map +1 -1
- package/out/zql/src/query/measure-push-operator.d.ts +1 -1
- package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
- package/out/zql/src/query/measure-push-operator.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +7 -1
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +132 -2
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +5 -39
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +3 -521
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-internals.d.ts.map +1 -1
- package/out/zql/src/query/query-internals.js +2 -2
- package/out/zql/src/query/query-internals.js.map +1 -1
- package/out/zql/src/query/query-registry.d.ts +126 -58
- package/out/zql/src/query/query-registry.d.ts.map +1 -1
- package/out/zql/src/query/query-registry.js +13 -21
- package/out/zql/src/query/query-registry.js.map +1 -1
- package/out/zql/src/query/query.d.ts +21 -0
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.d.ts +22 -0
- package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -0
- package/out/zql/src/query/runnable-query-impl.js +60 -0
- package/out/zql/src/query/runnable-query-impl.js.map +1 -0
- package/out/zql/src/query/static-query.d.ts +1 -1
- package/out/zql/src/query/static-query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.js +1 -1
- package/out/zql/src/query/static-query.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +7 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +34 -14
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,501 +1,9 @@
|
|
|
1
|
-
import
|
|
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 {
|
|
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
|
-
|
|
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;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-internals.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-internals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,KAAK,EAAC,MAAM,IAAI,UAAU,EAAC,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEtC,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"query-internals.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-internals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,KAAK,EAAC,MAAM,IAAI,UAAU,EAAC,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEtC,eAAO,MAAM,iBAAiB,eAAW,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc,CAC7B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO;IAEP,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;;;;;;;;;;;;OAeG;IACH,IAAI,IAAI,MAAM,CAAC;IAEf;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAElB,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAElD;;;;;OAKG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACrC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EAEP,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GACrC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAG1C;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EACP,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAE/D;AAED,wBAAgB,OAAO,CACrB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EAEP,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GACvD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAGjC;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { assert } from "../../../shared/src/asserts.js";
|
|
2
|
-
const queryInternalsTag = Symbol(
|
|
2
|
+
const queryInternalsTag = Symbol();
|
|
3
3
|
function asQueryInternals(query) {
|
|
4
|
-
assert(queryInternalsTag in query);
|
|
4
|
+
assert(queryInternalsTag in query, "Query does not implement QueryInternals");
|
|
5
5
|
return query;
|
|
6
6
|
}
|
|
7
7
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-internals.js","sources":["../../../../../zql/src/query/query-internals.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema as ZeroSchema} from '../../../zero-types/src/schema.ts';\nimport type {Format} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {Query} from './query.ts';\n\nexport const queryInternalsTag = Symbol(
|
|
1
|
+
{"version":3,"file":"query-internals.js","sources":["../../../../../zql/src/query/query-internals.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema as ZeroSchema} from '../../../zero-types/src/schema.ts';\nimport type {Format} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {Query} from './query.ts';\n\nexport const queryInternalsTag = Symbol();\n\n/**\n * Internal interface for query implementation details.\n * This is not part of the public API and should only be accessed via\n * the {@linkcode asQueryInternals} function.\n *\n * @typeParam TSchema The database schema type extending ZeroSchema\n * @typeParam TTable The name of the table being queried, must be a key of TSchema['tables']\n * @typeParam TReturn The return type of the query, defaults to PullRow<TTable, TSchema>\n */\nexport interface QueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n> {\n readonly [queryInternalsTag]: true;\n\n /**\n * Format is used to specify the shape of the query results. This is used by\n * {@linkcode one} and it also describes the shape when using\n * {@linkcode related}.\n */\n readonly format: Format;\n\n /**\n * A string that uniquely identifies this query. This can be used to determine\n * if two queries are the same.\n *\n * The hash of a custom query, on the client, is the hash of its AST.\n * The hash of a custom query, on the server, is the hash of its name and args.\n *\n * The first allows many client-side queries to be pinned to the same backend query.\n * The second ensures we do not invoke a named query on the backend more than once for the same `name:arg` pairing.\n *\n * If the query.hash was of `name:args` then `useQuery` would de-dupe\n * queries with divergent ASTs.\n *\n * QueryManager will hash based on `name:args` since it is speaking with\n * the server which tracks queries by `name:args`.\n */\n hash(): string;\n\n /**\n * The completed AST for this query, with any missing primary keys added to\n * orderBy and start.\n */\n readonly ast: AST;\n\n readonly customQueryID: CustomQueryID | undefined;\n\n /**\n * Associates a name and arguments with this query for custom query tracking.\n * This is used internally to track named queries on the server.\n *\n * @internal\n */\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn>;\n}\n\n/**\n * Helper function to cast a Query to QueryInternals.\n * This is used in tests and internal code to access query implementation details.\n * The function asserts that the query has the queryInternalsTag to ensure it\n * properly implements the QueryInternals interface.\n *\n * @internal\n */\nexport function asQueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n): QueryInternals<TTable, TSchema, TReturn> {\n assert(queryInternalsTag in query, 'Query does not implement QueryInternals');\n return query as unknown as QueryInternals<TTable, TSchema, TReturn>;\n}\n\nexport function isQueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(obj: unknown): obj is QueryInternals<TTable, TSchema, TReturn> {\n return typeof obj === 'object' && obj !== null && queryInternalsTag in obj;\n}\n\nexport function asQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(\n queryInternals: QueryInternals<TTable, TSchema, TReturn>,\n): Query<TTable, TSchema, TReturn> {\n assert(queryInternalsTag in queryInternals);\n return queryInternals as unknown as Query<TTable, TSchema, TReturn>;\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyQueryInternals = QueryInternals<string, ZeroSchema, any>;\n"],"names":[],"mappings":";AAQO,MAAM,oBAAoB,OAAA;AAuE1B,SAAS,iBAKd,OAC0C;AAC1C,SAAO,qBAAqB,OAAO,yCAAyC;AAC5E,SAAO;AACT;"}
|