@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.
- 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/config/zero-config.d.ts +0 -4
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +5 -15
- package/out/zero-cache/src/config/zero-config.js.map +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/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +2 -8
- package/out/zero-cache/src/server/change-streamer.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/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +62 -42
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/control.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.js +5 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +2 -0
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/json.d.ts +8 -0
- package/out/zero-cache/src/services/change-source/protocol/current/json.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/json.js +19 -0
- package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current.js +3 -0
- package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +0 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +0 -5
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +8 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +2 -3
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/http-service.d.ts +0 -1
- package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/http-service.js +0 -4
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.d.ts +2 -0
- package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js +14 -1
- package/out/zero-cache/src/services/replicator/replication-status.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/version.js +1 -1
- 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-events/src/status.d.ts +1 -1
- package/out/zero-events/src/status.d.ts.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/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 +32 -13
- 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/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.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;"}
|
|
@@ -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
|
/**
|