@quereus/quereus 4.22.0 → 4.24.0
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/dist/src/core/database-cardinality-feedback.d.ts +133 -20
- package/dist/src/core/database-cardinality-feedback.d.ts.map +1 -1
- package/dist/src/core/database-cardinality-feedback.js +312 -39
- package/dist/src/core/database-cardinality-feedback.js.map +1 -1
- package/dist/src/core/database.d.ts +1 -0
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +14 -6
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +6 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +11 -2
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/cardinality-feedback.d.ts +6 -0
- package/dist/src/func/builtins/cardinality-feedback.d.ts.map +1 -1
- package/dist/src/func/builtins/cardinality-feedback.js +55 -3
- package/dist/src/func/builtins/cardinality-feedback.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +3 -1
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +2 -1
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +27 -19
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +30 -21
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/framework/trace.js +2 -2
- package/dist/src/planner/framework/trace.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts +2 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +1 -0
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +5 -10
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts +2 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +1 -0
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +16 -3
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +3 -0
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +3 -3
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +16 -12
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +2 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +1 -0
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +14 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +52 -20
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +42 -9
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +9 -4
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts +9 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.js +18 -12
- package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +7 -8
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +7 -0
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.d.ts +6 -2
- package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.js +20 -14
- package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +5 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts +6 -4
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +10 -7
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +108 -53
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +15 -6
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +9 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts +2 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +6 -5
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts +4 -3
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +4 -3
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts +4 -3
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +5 -4
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +4 -3
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/stats/catalog-stats.d.ts +8 -8
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
- package/dist/src/planner/stats/catalog-stats.js +10 -10
- package/dist/src/planner/stats/catalog-stats.js.map +1 -1
- package/dist/src/planner/stats/table-cardinality.d.ts +119 -30
- package/dist/src/planner/stats/table-cardinality.d.ts.map +1 -1
- package/dist/src/planner/stats/table-cardinality.js +137 -29
- package/dist/src/planner/stats/table-cardinality.js.map +1 -1
- package/dist/src/planner/util/relative-rows.d.ts +29 -0
- package/dist/src/planner/util/relative-rows.d.ts.map +1 -0
- package/dist/src/planner/util/relative-rows.js +67 -0
- package/dist/src/planner/util/relative-rows.js.map +1 -0
- package/dist/src/planner/util/row-estimates.d.ts +23 -0
- package/dist/src/planner/util/row-estimates.d.ts.map +1 -1
- package/dist/src/planner/util/row-estimates.js +29 -0
- package/dist/src/planner/util/row-estimates.js.map +1 -1
- package/dist/src/runtime/cardinality-observations.d.ts +62 -7
- package/dist/src/runtime/cardinality-observations.d.ts.map +1 -1
- package/dist/src/runtime/cardinality-observations.js +74 -8
- package/dist/src/runtime/cardinality-observations.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +78 -10
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/schema/manager.d.ts +5 -5
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +9 -5
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/vtab/cost-profile.d.ts +61 -0
- package/dist/src/vtab/cost-profile.d.ts.map +1 -0
- package/dist/src/vtab/cost-profile.js +52 -0
- package/dist/src/vtab/cost-profile.js.map +1 -0
- package/dist/src/vtab/filter-info.d.ts +16 -0
- package/dist/src/vtab/filter-info.d.ts.map +1 -1
- package/dist/src/vtab/filter-info.js +29 -0
- package/dist/src/vtab/filter-info.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +5 -3
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/module.d.ts +53 -9
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -3,31 +3,47 @@
|
|
|
3
3
|
*
|
|
4
4
|
* One per `Database`. The planner reads it through `plannedRowCount`
|
|
5
5
|
* (`planner/stats/table-cardinality.ts`), where an answering entry outranks the
|
|
6
|
-
* catalog's `ANALYZE` count
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* catalog's `ANALYZE` count and a module's approximate count, but not a module's
|
|
7
|
+
* exact one, and through `plannedRowsPerKey`, where an entry's rows per key answers
|
|
8
|
+
* unless the catalog's statistics cover the column set. This module owns the record
|
|
9
|
+
* policy — which observations are worth keeping, and when one has moved far enough
|
|
10
|
+
* from what plans were costed against to call it a *shift* — and the entries' lifetime.
|
|
9
11
|
*
|
|
10
12
|
* Validity is schema identity: an entry answers only for the exact `TableSchema`
|
|
11
13
|
* object it was observed under. Any swap (`ANALYZE`, `ALTER TABLE`, drop and
|
|
12
14
|
* re-create) silences it, and a schema-change listener evicts it. The identity
|
|
13
15
|
* check is the correctness guard; the listener is memory hygiene.
|
|
14
16
|
*
|
|
17
|
+
* An entry holds an exact count from a complete read, a floor ("at least N rows") from a
|
|
18
|
+
* partial one, or both; a floor only ever raises an estimate, and an exact count clears it.
|
|
19
|
+
* Beside them it keeps, per equality column set the table is seeked on through a
|
|
20
|
+
* non-unique index, a running mean of the rows one key matched ({@link PerKeyEntry}).
|
|
21
|
+
*
|
|
15
22
|
* Execution feeds it through {@link CardinalityFeedbackManager.publish}, which admits
|
|
16
|
-
* only
|
|
23
|
+
* only observations of committed state: one made inside a transaction is held until
|
|
17
24
|
* that transaction commits ({@link CardinalityFeedbackManager.onCommitted}) and
|
|
18
25
|
* dropped if it rolls back ({@link CardinalityFeedbackManager.onRolledBack}).
|
|
19
26
|
*
|
|
20
27
|
* A shift reaches prepared statements through `onShift`; each statement paces its
|
|
21
|
-
* re-plans with a {@link FeedbackReplanState}.
|
|
28
|
+
* re-plans with a {@link FeedbackReplanState}. A module-reported size, which moves with
|
|
29
|
+
* no observation at all, is re-checked by each statement at execution start against the
|
|
30
|
+
* size its plan was costed with ({@link ReportedSizeSnapshot}).
|
|
22
31
|
*
|
|
23
32
|
* Nothing here is persisted: a new `Database` starts empty. See
|
|
24
33
|
* docs/progressive-optimizer.md §3.2–3.6.
|
|
25
34
|
*/
|
|
26
35
|
import { createLogger } from '../common/logger.js';
|
|
27
|
-
import { CardinalityObservations } from '../runtime/cardinality-observations.js';
|
|
28
|
-
import { catalogRowCount } from '../planner/stats/table-cardinality.js';
|
|
36
|
+
import { CardinalityObservations, columnSetKey } from '../runtime/cardinality-observations.js';
|
|
37
|
+
import { catalogRowCount, moduleReportsRowCount, plannedRowCount, } from '../planner/stats/table-cardinality.js';
|
|
29
38
|
const log = createLogger('core:cardinality-feedback');
|
|
30
39
|
const debugLog = log.extend('debug');
|
|
40
|
+
/**
|
|
41
|
+
* Samples a rows-per-key mean tracks exactly before it becomes an exponential average:
|
|
42
|
+
* up to this many, the mean is the exact running mean of every sample; past it, each
|
|
43
|
+
* sample weighs 1/32, so a changing distribution is followed rather than averaged away.
|
|
44
|
+
* A module constant, not a tuning knob — nothing a deployment would turn.
|
|
45
|
+
*/
|
|
46
|
+
const ROWS_PER_KEY_WINDOW = 32;
|
|
31
47
|
/**
|
|
32
48
|
* Distance between two counts as a ratio ≥ 1. The `+ 1` on both sides keeps a zero
|
|
33
49
|
* count finite and makes tiny counts compare sanely (0 vs 3 is 4×, not infinite).
|
|
@@ -42,6 +58,20 @@ export function overlayTableKey(schemaName, tableName) {
|
|
|
42
58
|
function tableKey(table) {
|
|
43
59
|
return overlayTableKey(table.schemaName, table.name);
|
|
44
60
|
}
|
|
61
|
+
function newEntry(schema, baselineRows) {
|
|
62
|
+
return { schema, rows: undefined, atLeast: undefined, baselineRows, observations: 0, shifts: 0, perKey: new Map() };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Folds a batch of `count` samples averaging `batchMean` into `entry` (docs/progressive-optimizer.md
|
|
66
|
+
* §3.4): with `n` samples already held the batch weighs `min(1, count / min(n + count, WINDOW))` —
|
|
67
|
+
* the exact running mean up to the window, 1/32 per sample past it, and a batch at least the
|
|
68
|
+
* window's size replaces the mean outright.
|
|
69
|
+
*/
|
|
70
|
+
function foldRowsPerKey(entry, batchMean, count) {
|
|
71
|
+
const weight = Math.min(1, count / Math.min(entry.samples + count, ROWS_PER_KEY_WINDOW));
|
|
72
|
+
entry.mean += (batchMean - entry.mean) * weight;
|
|
73
|
+
entry.samples += count;
|
|
74
|
+
}
|
|
45
75
|
/** Cap on the cooldown's doubling: re-plans past the seventh wait `64 × replanCooldown` executions. */
|
|
46
76
|
const MAX_COOLDOWN_DOUBLINGS = 6;
|
|
47
77
|
/**
|
|
@@ -80,6 +110,68 @@ export class FeedbackReplanState {
|
|
|
80
110
|
return cooldown * 2 ** Math.min(this.replans - 1, MAX_COOLDOWN_DOUBLINGS);
|
|
81
111
|
}
|
|
82
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* The planned sizes, as of one compile, of the tables the plan reads whose module reports
|
|
115
|
+
* its own count (docs/progressive-optimizer.md §3.6). Such a count moves on every write
|
|
116
|
+
* with no event the planner hears, and a plan that no longer reads the table in full
|
|
117
|
+
* never produces an observation, so nothing else notices that a table planned at 10 rows
|
|
118
|
+
* now holds a million. A prepared statement compares its snapshot with the current
|
|
119
|
+
* planned sizes at each execution start and treats a drift like an overlay shift.
|
|
120
|
+
*
|
|
121
|
+
* Planned sizes, not raw module answers, are compared, so an approximate count the
|
|
122
|
+
* overlay outranks drifts only when what planning would use drifts.
|
|
123
|
+
*/
|
|
124
|
+
export class ReportedSizeSnapshot {
|
|
125
|
+
sizes;
|
|
126
|
+
static empty = new ReportedSizeSnapshot([]);
|
|
127
|
+
constructor(sizes) {
|
|
128
|
+
this.sizes = sizes;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Called right after a compile, in the same synchronous turn, so each size is the one
|
|
132
|
+
* the plan's table references were costed with. Tables whose module has no
|
|
133
|
+
* `getRowCount` are left out: overlay shifts and schema changes already cover them.
|
|
134
|
+
*/
|
|
135
|
+
static capture(db, dependencies) {
|
|
136
|
+
// NOTE: write targets are kept too (dependencies do not record read vs write), so a
|
|
137
|
+
// prepared `insert` driving a bulk load re-plans at each 10× of its target, paced by
|
|
138
|
+
// the cooldown; if those re-plans ever show up in a profile, record dependency roles
|
|
139
|
+
// in the builder and keep only read tables here.
|
|
140
|
+
const sizes = [];
|
|
141
|
+
for (const dep of dependencies) {
|
|
142
|
+
if (dep.type !== 'table' || !dep.schemaName)
|
|
143
|
+
continue;
|
|
144
|
+
const table = db.schemaManager.findTable(dep.objectName, dep.schemaName);
|
|
145
|
+
if (table && moduleReportsRowCount(db, table))
|
|
146
|
+
sizes.push({ table, rows: currentPlannedRows(db, table) });
|
|
147
|
+
}
|
|
148
|
+
return sizes.length > 0 ? new ReportedSizeSnapshot(sizes) : ReportedSizeSnapshot.empty;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* True when some table's planned size has moved `shiftFactor` from the captured one
|
|
152
|
+
* with the larger side above `minRows` — the overlay's shift rule (§3.4). A table whose
|
|
153
|
+
* catalog object was replaced is skipped: that schema change already dropped the plan.
|
|
154
|
+
*/
|
|
155
|
+
drifted(db) {
|
|
156
|
+
if (this.sizes.length === 0)
|
|
157
|
+
return false;
|
|
158
|
+
const { shiftFactor, minRows } = db.optimizer.tuning.cardinalityFeedback;
|
|
159
|
+
for (const { table, rows } of this.sizes) {
|
|
160
|
+
if (db.schemaManager.findTable(table.name, table.schemaName) !== table)
|
|
161
|
+
continue;
|
|
162
|
+
const now = currentPlannedRows(db, table);
|
|
163
|
+
if (Math.max(now, rows) > minRows && rowCountSpread(now, rows) >= shiftFactor) {
|
|
164
|
+
debugLog('Reported size drift on %s: planned %d, now %d rows', tableKey(table), rows, now);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** What planning would size `table` at now; an unknown size reads as `defaultRowEstimate`, as in the overlay's record policy. */
|
|
172
|
+
function currentPlannedRows(db, table) {
|
|
173
|
+
return plannedRowCount(table, db._rowCountSources) ?? db.optimizer.tuning.defaultRowEstimate;
|
|
174
|
+
}
|
|
83
175
|
export class CardinalityFeedbackManager {
|
|
84
176
|
ctx;
|
|
85
177
|
/**
|
|
@@ -90,8 +182,8 @@ export class CardinalityFeedbackManager {
|
|
|
90
182
|
entries = new Map();
|
|
91
183
|
/**
|
|
92
184
|
* Observations made inside the open transaction, held until it ends; same key as
|
|
93
|
-
* `entries`, last count per table
|
|
94
|
-
* transaction observes.
|
|
185
|
+
* `entries`, last count and largest floor per table win. Bounded by the distinct
|
|
186
|
+
* tables one transaction observes.
|
|
95
187
|
*/
|
|
96
188
|
pending = new Map();
|
|
97
189
|
/** {@link onRolledBack} calls so far; each execution's sink records it at start. */
|
|
@@ -107,40 +199,114 @@ export class CardinalityFeedbackManager {
|
|
|
107
199
|
if (!entry || entry.schema !== table)
|
|
108
200
|
return undefined;
|
|
109
201
|
this.touch(key, entry);
|
|
110
|
-
return entry
|
|
202
|
+
return entry;
|
|
203
|
+
}
|
|
204
|
+
/** The running mean for `columns` on `table`, under the same identity rule as {@link observedRows}; a hit refreshes the table's recency. */
|
|
205
|
+
observedRowsPerKey(table, columns) {
|
|
206
|
+
const key = tableKey(table);
|
|
207
|
+
const entry = this.entries.get(key);
|
|
208
|
+
if (!entry || entry.schema !== table)
|
|
209
|
+
return undefined;
|
|
210
|
+
const keyEntry = entry.perKey.get(columnSetKey(columns));
|
|
211
|
+
if (!keyEntry)
|
|
212
|
+
return undefined;
|
|
213
|
+
this.touch(key, entry);
|
|
214
|
+
return keyEntry.mean;
|
|
111
215
|
}
|
|
112
216
|
/**
|
|
113
217
|
* Offer one exact row count of `table`, observed by a complete enumeration of
|
|
114
218
|
* committed state. Applies the record policy (docs/progressive-optimizer.md §3.4):
|
|
115
219
|
* ignored when the schema object is superseded or when both the observation and the
|
|
116
|
-
* current estimate are small; otherwise recorded,
|
|
117
|
-
*
|
|
220
|
+
* current estimate are small; otherwise recorded — clearing any floor, which the newer
|
|
221
|
+
* complete count supersedes — and reported through `onShift` when it has moved
|
|
222
|
+
* `shiftFactor` from the entry's baseline.
|
|
118
223
|
*/
|
|
119
224
|
record(table, rows) {
|
|
120
|
-
if (this.
|
|
121
|
-
debugLog('Ignored %d rows for %s.%s: observed under a superseded schema', rows, table.schemaName, table.name);
|
|
225
|
+
if (this.isSuperseded(table))
|
|
122
226
|
return;
|
|
123
|
-
|
|
124
|
-
const tuning = this.ctx.getTuning();
|
|
125
|
-
const policy = tuning.cardinalityFeedback;
|
|
227
|
+
const policy = this.ctx.getTuning().cardinalityFeedback;
|
|
126
228
|
const key = tableKey(table);
|
|
127
229
|
const existing = this.validEntry(key, table);
|
|
128
|
-
|
|
230
|
+
// NOTE: an exactly module-sized table still records an entry, which `plannedRowCount`
|
|
231
|
+
// never reads while the module answers — one LRU slot each; if `maxTables` pressure
|
|
232
|
+
// ever matters, skip recording when the module's count is exact.
|
|
233
|
+
const before = this.plannedBefore(table, existing);
|
|
129
234
|
if (Math.max(before, rows) <= policy.minRows)
|
|
130
235
|
return;
|
|
131
|
-
const entry = existing ??
|
|
236
|
+
const entry = this.upsert(key, existing ?? newEntry(table, before));
|
|
132
237
|
entry.rows = rows;
|
|
133
|
-
entry.
|
|
134
|
-
|
|
135
|
-
this.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
238
|
+
entry.atLeast = undefined;
|
|
239
|
+
debugLog('Recorded %d rows for %s (was %d, baseline %d)', rows, key, before, entry.baselineRows);
|
|
240
|
+
this.shiftIfMoved(key, entry, rows);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Offer one floor for `table`: a read of committed state yielded `rows` distinct rows of
|
|
244
|
+
* it, so it holds at least that many (docs/progressive-optimizer.md §3.4). Recorded only
|
|
245
|
+
* when it exceeds both what planning would use now and `minRows`, so a floor never
|
|
246
|
+
* lowers an estimate and never makes an unknown table look smaller than the default it
|
|
247
|
+
* plans at today. Shifts like a count; floors only raise, so they cannot oscillate.
|
|
248
|
+
*/
|
|
249
|
+
recordAtLeast(table, rows) {
|
|
250
|
+
if (this.isSuperseded(table))
|
|
139
251
|
return;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.
|
|
252
|
+
const policy = this.ctx.getTuning().cardinalityFeedback;
|
|
253
|
+
const key = tableKey(table);
|
|
254
|
+
const existing = this.validEntry(key, table);
|
|
255
|
+
const before = this.plannedBefore(table, existing);
|
|
256
|
+
if (rows <= before || rows <= policy.minRows)
|
|
257
|
+
return;
|
|
258
|
+
const entry = this.upsert(key, existing ?? newEntry(table, before));
|
|
259
|
+
entry.atLeast = Math.max(entry.atLeast ?? 0, rows);
|
|
260
|
+
debugLog('Recorded at least %d rows for %s (was %d, baseline %d)', rows, key, before, entry.baselineRows);
|
|
261
|
+
this.shiftIfMoved(key, entry, rows);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Offer `count` samples of rows per key for `spec`'s column set on `table`, summing to
|
|
265
|
+
* `sum` rows — one sample per exhausted equality seek with non-NULL keys
|
|
266
|
+
* (docs/progressive-optimizer.md §3.4). Ignored under a superseded schema, and unless
|
|
267
|
+
* the table's planned size exceeds `minRows`: below that every plan finishes fast, and
|
|
268
|
+
* the gate keeps small-table plans unchanged exactly as the count gate does. So a table
|
|
269
|
+
* of unknown size learns rows per key only once its size is learned (a complete scan,
|
|
270
|
+
* a floor, or a module count above the gate); publication applies per-key batches
|
|
271
|
+
* after the same execution's counts and floors, so one execution can open the gate for
|
|
272
|
+
* itself. A new column-set entry's baseline is the rows per key the plan was priced
|
|
273
|
+
* with; the table remembers at most `maxKeySetsPerTable` sets, least recently recorded
|
|
274
|
+
* evicted. Accepted bias: frequently probed keys weigh more than a uniform sample would.
|
|
275
|
+
* Reported through `onShift` under the table's key when the folded mean has moved
|
|
276
|
+
* `shiftFactor` from the set's baseline — the count rule, applied to the mean.
|
|
277
|
+
*/
|
|
278
|
+
recordRowsPerKey(table, spec, sum, count) {
|
|
279
|
+
if (count <= 0 || this.isSuperseded(table))
|
|
280
|
+
return;
|
|
281
|
+
const policy = this.ctx.getTuning().cardinalityFeedback;
|
|
282
|
+
const key = tableKey(table);
|
|
283
|
+
const existing = this.validEntry(key, table);
|
|
284
|
+
const before = this.plannedBefore(table, existing);
|
|
285
|
+
if (before <= policy.minRows)
|
|
286
|
+
return;
|
|
287
|
+
// NOTE: a set the catalog's statistics cover is recorded too, though `plannedRowsPerKey`
|
|
288
|
+
// never consults it under this schema object (an `ANALYZE` swaps the object before
|
|
289
|
+
// coverage can change), so under a stale catalog its first record can shift once and
|
|
290
|
+
// re-plan statements that land the same plan; if that re-plan ever shows in a profile,
|
|
291
|
+
// skip the record when `catalogCoversColumns` holds.
|
|
292
|
+
const entry = this.upsert(key, existing ?? newEntry(table, before));
|
|
293
|
+
const batchMean = sum / count;
|
|
294
|
+
let keyEntry = entry.perKey.get(spec.key);
|
|
295
|
+
if (keyEntry) {
|
|
296
|
+
entry.perKey.delete(spec.key);
|
|
297
|
+
foldRowsPerKey(keyEntry, batchMean, count);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
keyEntry = { columns: spec.columns, mean: batchMean, samples: count, baseline: spec.plannedRowsPerKey, shifts: 0 };
|
|
301
|
+
}
|
|
302
|
+
entry.perKey.set(spec.key, keyEntry);
|
|
303
|
+
for (const staleKey of entry.perKey.keys()) {
|
|
304
|
+
if (entry.perKey.size <= policy.maxKeySetsPerTable)
|
|
305
|
+
break;
|
|
306
|
+
entry.perKey.delete(staleKey);
|
|
307
|
+
}
|
|
308
|
+
debugLog('Recorded %d rows per key over %d samples for %s (%s) (mean now %d, baseline %d)', batchMean, count, key, spec.key, keyEntry.mean, keyEntry.baseline);
|
|
309
|
+
this.shiftIfRowsPerKeyMoved(key, spec.key, keyEntry);
|
|
144
310
|
}
|
|
145
311
|
/**
|
|
146
312
|
* Offer one finished execution's observations (docs/progressive-optimizer.md §3.5).
|
|
@@ -162,19 +328,20 @@ export class CardinalityFeedbackManager {
|
|
|
162
328
|
this.recordAll(observations);
|
|
163
329
|
}
|
|
164
330
|
else {
|
|
165
|
-
|
|
166
|
-
this.pending.set(tableKey(table), { table, rows });
|
|
167
|
-
}
|
|
331
|
+
this.holdAll(observations);
|
|
168
332
|
}
|
|
169
333
|
}
|
|
170
|
-
/**
|
|
334
|
+
/**
|
|
335
|
+
* A fresh per-execution sink, stamped so {@link publish} can tell whether a rollback ran
|
|
336
|
+
* under it, and carrying the record floor so it can drop floors that could never record.
|
|
337
|
+
*/
|
|
171
338
|
beginObservations() {
|
|
172
|
-
return new CardinalityObservations(this.rollbacks);
|
|
339
|
+
return new CardinalityObservations(this.rollbacks, this.ctx.getTuning().cardinalityFeedback.minRows);
|
|
173
340
|
}
|
|
174
341
|
/**
|
|
175
342
|
* The open transaction committed: record what it held, except tables it wrote.
|
|
176
|
-
* Such
|
|
177
|
-
* transaction, and the change log cannot say which came first. `changedCounts` is
|
|
343
|
+
* Such an observation was made mid-transaction, possibly before later writes in the
|
|
344
|
+
* same transaction, and the change log cannot say which came first. `changedCounts` is
|
|
178
345
|
* the change log keyed like `entries` — every table the transaction wrote, even one
|
|
179
346
|
* whose writes cancelled out — and is not built when nothing is held.
|
|
180
347
|
*/
|
|
@@ -186,12 +353,12 @@ export class CardinalityFeedbackManager {
|
|
|
186
353
|
return;
|
|
187
354
|
try {
|
|
188
355
|
const changed = changedCounts();
|
|
189
|
-
for (const [key,
|
|
356
|
+
for (const [key, held] of this.pending) {
|
|
190
357
|
if (changed.has(key)) {
|
|
191
|
-
debugLog('Dropped
|
|
358
|
+
debugLog('Dropped observations of %s: the committing transaction wrote it', key);
|
|
192
359
|
continue;
|
|
193
360
|
}
|
|
194
|
-
this.
|
|
361
|
+
this.recordHeld(held);
|
|
195
362
|
}
|
|
196
363
|
}
|
|
197
364
|
finally {
|
|
@@ -219,10 +386,18 @@ export class CardinalityFeedbackManager {
|
|
|
219
386
|
schemaName: schema.schemaName,
|
|
220
387
|
tableName: schema.name,
|
|
221
388
|
rows: entry.rows,
|
|
389
|
+
atLeast: entry.atLeast,
|
|
222
390
|
catalogRows: catalogRowCount(schema),
|
|
223
391
|
baselineRows: entry.baselineRows,
|
|
224
392
|
observations: entry.observations,
|
|
225
393
|
shifts: entry.shifts,
|
|
394
|
+
perKey: [...entry.perKey.values()].map(keyEntry => ({
|
|
395
|
+
keyColumns: keyEntry.columns.map(i => schema.columns[i].name),
|
|
396
|
+
rowsPerKey: keyEntry.mean,
|
|
397
|
+
samples: keyEntry.samples,
|
|
398
|
+
baselineRowsPerKey: keyEntry.baseline,
|
|
399
|
+
shifts: keyEntry.shifts,
|
|
400
|
+
})),
|
|
226
401
|
});
|
|
227
402
|
}
|
|
228
403
|
return out;
|
|
@@ -245,10 +420,108 @@ export class CardinalityFeedbackManager {
|
|
|
245
420
|
}
|
|
246
421
|
});
|
|
247
422
|
}
|
|
423
|
+
/**
|
|
424
|
+
* Exact counts first: a floor at or below the count just recorded is then ignored.
|
|
425
|
+
* Rows per key last, so a count or floor from the same execution can open its table-size gate.
|
|
426
|
+
*/
|
|
248
427
|
recordAll(observations) {
|
|
249
428
|
for (const [table, rows] of observations.entries()) {
|
|
250
429
|
this.record(table, rows);
|
|
251
430
|
}
|
|
431
|
+
for (const [table, rows] of observations.lowerBounds()) {
|
|
432
|
+
this.recordAtLeast(table, rows);
|
|
433
|
+
}
|
|
434
|
+
for (const [table, { spec, sum, count }] of observations.rowsPerKey()) {
|
|
435
|
+
this.recordRowsPerKey(table, spec, sum, count);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
holdAll(observations) {
|
|
439
|
+
for (const [table, rows] of observations.entries()) {
|
|
440
|
+
this.held(table).rows = rows;
|
|
441
|
+
}
|
|
442
|
+
for (const [table, rows] of observations.lowerBounds()) {
|
|
443
|
+
const held = this.held(table);
|
|
444
|
+
held.atLeast = Math.max(held.atLeast ?? 0, rows);
|
|
445
|
+
}
|
|
446
|
+
for (const [table, { spec, sum, count }] of observations.rowsPerKey()) {
|
|
447
|
+
const held = this.held(table).perKey;
|
|
448
|
+
const heldSamples = held.get(spec.key);
|
|
449
|
+
if (heldSamples) {
|
|
450
|
+
heldSamples.sum += sum;
|
|
451
|
+
heldSamples.count += count;
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
held.set(spec.key, { spec, sum, count });
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/** What is held for `table`; anything held under an older schema object for its name is superseded. */
|
|
459
|
+
held(table) {
|
|
460
|
+
const key = tableKey(table);
|
|
461
|
+
const existing = this.pending.get(key);
|
|
462
|
+
if (existing?.table === table)
|
|
463
|
+
return existing;
|
|
464
|
+
const fresh = { table, rows: undefined, atLeast: undefined, perKey: new Map() };
|
|
465
|
+
this.pending.set(key, fresh);
|
|
466
|
+
return fresh;
|
|
467
|
+
}
|
|
468
|
+
/** As {@link recordAll}: the count first, so a floor it already covers is ignored, and rows per key last. */
|
|
469
|
+
recordHeld({ table, rows, atLeast, perKey }) {
|
|
470
|
+
if (rows !== undefined)
|
|
471
|
+
this.record(table, rows);
|
|
472
|
+
if (atLeast !== undefined)
|
|
473
|
+
this.recordAtLeast(table, atLeast);
|
|
474
|
+
for (const { spec, sum, count } of perKey.values())
|
|
475
|
+
this.recordRowsPerKey(table, spec, sum, count);
|
|
476
|
+
}
|
|
477
|
+
isSuperseded(table) {
|
|
478
|
+
if (this.ctx.schemaManager.findTable(table.name, table.schemaName) === table)
|
|
479
|
+
return false;
|
|
480
|
+
debugLog('Ignored an observation of %s.%s: made under a superseded schema', table.schemaName, table.name);
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* What planning would use for `table` right now — `existing` ranked with the module's
|
|
485
|
+
* count and the catalog's (§3.3), else the default — so an exactly module-sized table
|
|
486
|
+
* compares against the module and a scan agreeing with it shifts nothing.
|
|
487
|
+
*/
|
|
488
|
+
plannedBefore(table, existing) {
|
|
489
|
+
return plannedRowCount(table, {
|
|
490
|
+
observedRows: () => existing,
|
|
491
|
+
reportedRows: t => this.ctx.reportedRows(t),
|
|
492
|
+
}) ?? this.ctx.getTuning().defaultRowEstimate;
|
|
493
|
+
}
|
|
494
|
+
/** Counts one recorded observation on `entry`, makes it the most recent, and enforces the cap. */
|
|
495
|
+
upsert(key, entry) {
|
|
496
|
+
entry.observations++;
|
|
497
|
+
this.touch(key, entry);
|
|
498
|
+
this.evictBeyond(this.ctx.getTuning().cardinalityFeedback.maxTables);
|
|
499
|
+
return entry;
|
|
500
|
+
}
|
|
501
|
+
/** Reports a shift through `onShift` when `rows` has moved `shiftFactor` from the entry's baseline. */
|
|
502
|
+
shiftIfMoved(key, entry, rows) {
|
|
503
|
+
if (rowCountSpread(rows, entry.baselineRows) < this.ctx.getTuning().cardinalityFeedback.shiftFactor)
|
|
504
|
+
return;
|
|
505
|
+
log('Shift on %s: baseline %d -> %d rows', key, entry.baselineRows, rows);
|
|
506
|
+
entry.baselineRows = rows;
|
|
507
|
+
entry.shifts++;
|
|
508
|
+
this.ctx.onShift(key);
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Reports a shift through `onShift` when a column set's mean has moved `shiftFactor`
|
|
512
|
+
* from its baseline. The table key is reported, not the set: a statement that reads the
|
|
513
|
+
* table re-plans and every seek node in it re-snapshots the overlay (§3.6). A set's first
|
|
514
|
+
* record cannot shift when its plan was already priced from the mean (the baseline is what
|
|
515
|
+
* the plan used); a set re-created after eviction carries the module's estimate again and
|
|
516
|
+
* may shift once, landing the same plan.
|
|
517
|
+
*/
|
|
518
|
+
shiftIfRowsPerKeyMoved(key, setKey, keyEntry) {
|
|
519
|
+
if (rowCountSpread(keyEntry.mean, keyEntry.baseline) < this.ctx.getTuning().cardinalityFeedback.shiftFactor)
|
|
520
|
+
return;
|
|
521
|
+
log('Shift on %s (%s): rows per key baseline %d -> %d', key, setKey, keyEntry.baseline, keyEntry.mean);
|
|
522
|
+
keyEntry.baseline = keyEntry.mean;
|
|
523
|
+
keyEntry.shifts++;
|
|
524
|
+
this.ctx.onShift(key);
|
|
252
525
|
}
|
|
253
526
|
/** The entry under `key` if it was observed against `table`; a stale one is replaced on record. */
|
|
254
527
|
validEntry(key, table) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-cardinality-feedback.js","sourceRoot":"","sources":["../../../src/core/database-cardinality-feedback.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database-cardinality-feedback.js","sourceRoot":"","sources":["../../../src/core/database-cardinality-feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAA+C,MAAM,wCAAwC,CAAC;AAC5I,OAAO,EACN,eAAe,EAAE,qBAAqB,EAAE,eAAe,GAEvD,MAAM,uCAAuC,CAAC;AAO/C,MAAM,GAAG,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AA0FrC;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;GAGG;AACH,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS;IAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,SAAiB;IACpE,OAAO,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAkB;IACnC,OAAO,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,MAAmB,EAAE,YAAoB;IAC1D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACrH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAkB,EAAE,SAAiB,EAAE,KAAa;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAChD,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;AACxB,CAAC;AAED,uGAAuG;AACvG,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IACvB,MAAM,GAAG,KAAK,CAAC;IACvB,gCAAgC;IACxB,OAAO,GAAG,CAAC,CAAC;IACpB,wFAAwF;IAChF,qBAAqB,GAAG,CAAC,CAAC;IAElC,6CAA6C;IAC7C,SAAS;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,oGAAoG;IACpG,aAAa;QACZ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,sFAAsF;IACtF,gBAAgB,CAAC,QAAgB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnH,IAAI,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC;IACZ,CAAC;IAEO,kBAAkB,CAAC,QAAgB;QAC1C,OAAO,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC3E,CAAC;CACD;AAQD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,oBAAoB;IAGK;IAFrC,MAAM,CAAU,KAAK,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAErD,YAAqC,KAAkC;QAAlC,UAAK,GAAL,KAAK,CAA6B;IAAG,CAAC;IAE3E;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAY,EAAE,YAAyC;QACrE,oFAAoF;QACpF,qFAAqF;QACrF,qFAAqF;QACrF,iDAAiD;QACjD,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU;gBAAE,SAAS;YACtD,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACzE,IAAI,KAAK,IAAI,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC;IACxF,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,EAAY;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACzE,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,KAAK;gBAAE,SAAS;YACjF,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC/E,QAAQ,CAAC,oDAAoD,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3F,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;;AAGF,iIAAiI;AACjI,SAAS,kBAAkB,CAAC,EAAY,EAAE,KAAkB;IAC3D,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC;AAC9F,CAAC;AAED,MAAM,OAAO,0BAA0B;IAiBT;IAhB7B;;;;OAIG;IACc,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC5D;;;;OAIG;IACc,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC9D,oFAAoF;IAC5E,SAAS,GAAG,CAAC,CAAC;IACd,wBAAwB,GAAwB,IAAI,CAAC;IAE7D,YAA6B,GAAsC;QAAtC,QAAG,GAAH,GAAG,CAAmC;QAClE,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,KAAkB;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,4IAA4I;IAC5I,kBAAkB,CAAC,KAAkB,EAAE,OAA0B;QAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,KAAkB,EAAE,IAAY;QACtC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,sFAAsF;QACtF,oFAAoF;QACpF,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAErD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1B,QAAQ,CAAC,+CAA+C,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACjG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,aAAa,CAAC,KAAkB,EAAE,IAAY;QAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAErD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,QAAQ,CAAC,wDAAwD,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1G,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,KAAkB,EAAE,IAAoB,EAAE,GAAW,EAAE,KAAa;QACpF,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAAE,OAAO;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QACrC,yFAAyF;QACzF,mFAAmF;QACnF,qFAAqF;QACrF,uFAAuF;QACvF,qDAAqD;QAErD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC;QAC9B,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,QAAQ,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACpH,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,kBAAkB;gBAAE,MAAM;YAC1D,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,QAAQ,CAAC,iFAAiF,EACzF,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAqC,EAAE,OAAmC;QACjF,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,YAAY,CAAC,gBAAgB,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7D,QAAQ,CAAC,mEAAmE,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,iBAAiB;QAChB,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtG,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,aAAwC;QACnD,sFAAsF;QACtF,wFAAwF;QACxF,wFAAwF;QACxF,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACpC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtB,QAAQ,CAAC,iEAAiE,EAAE,GAAG,CAAC,CAAC;oBACjF,SAAS;gBACV,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;IAED,qFAAqF;IACrF,YAAY;QACX,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC;IAED,0FAA0F;IAC1F,KAAK;QACJ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,oFAAoF;IACpF,QAAQ;QACP,MAAM,GAAG,GAA+B,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YACzB,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,MAAM;gBAAE,SAAS;YAC1F,GAAG,CAAC,IAAI,CAAC;gBACR,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,IAAI;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC;gBACpC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACnD,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC7D,UAAU,EAAE,QAAQ,CAAC,IAAI;oBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,kBAAkB,EAAE,QAAQ,CAAC,QAAQ;oBACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACvB,CAAC,CAAC;aACH,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAEO,wBAAwB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAC5D,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAwB,EAAE,EAAE;YACjF,6EAA6E;YAC7E,4EAA4E;YAC5E,iCAAiC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACvE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAChD,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,YAAqC;QACtD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC;YACvE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAEO,OAAO,CAAC,YAAqC;QACpD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,WAAW,EAAE,CAAC;gBACjB,WAAW,CAAC,GAAG,IAAI,GAAG,CAAC;gBACvB,WAAW,CAAC,KAAK,IAAI,KAAK,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC;IACF,CAAC;IAED,uGAAuG;IAC/F,IAAI,CAAC,KAAkB;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,KAAK,KAAK,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC/C,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACjG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,6GAA6G;IACrG,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAmB;QACnE,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9D,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACpG,CAAC;IAEO,YAAY,CAAC,KAAkB;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAC3F,QAAQ,CAAC,iEAAiE,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,KAAkB,EAAE,QAAmC;QAC5E,OAAO,eAAe,CAAC,KAAK,EAAE;YAC7B,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ;YAC5B,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;SAC3C,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC;IAC/C,CAAC;IAED,kGAAkG;IAC1F,MAAM,CAAC,GAAW,EAAE,KAAoB;QAC/C,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;IACd,CAAC;IAED,uGAAuG;IAC/F,YAAY,CAAC,GAAW,EAAE,KAAoB,EAAE,IAAY;QACnE,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,WAAW;YAAE,OAAO;QAC5G,GAAG,CAAC,qCAAqC,EAAE,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1E,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACK,sBAAsB,CAAC,GAAW,EAAE,MAAc,EAAE,QAAqB;QAChF,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,WAAW;YAAE,OAAO;QACpH,GAAG,CAAC,kDAAkD,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;QAClC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,mGAAmG;IAC3F,UAAU,CAAC,GAAW,EAAE,KAAkB;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,KAAoB;QAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,SAAiB;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS;gBAAE,OAAO;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;CACD"}
|
|
@@ -112,6 +112,7 @@ export declare class Database implements TransactionManagerContext, AssertionEva
|
|
|
112
112
|
private readonly autoAnalyzeManager;
|
|
113
113
|
/** Observed row-count overlay — exact table sizes seen during execution */
|
|
114
114
|
private readonly cardinalityFeedbackManager;
|
|
115
|
+
private readonly rowCountSources;
|
|
115
116
|
/** Per-database collation registry — comparator + optional key normalizer +
|
|
116
117
|
* optional REPLICABLE and ORDER-PRESERVING assertions. The normalizer is required
|
|
117
118
|
* for index participation; comparator-only collations may still be used in ORDER BY
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/core/database.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxJ,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,EAA+E,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG5I,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,OAAO,EAAE,QAAQ,EAAoB,MAAM,+BAA+B,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAkB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/core/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
|
|
|
28
28
|
import { EmissionContext } from '../runtime/emission-context.js';
|
|
29
29
|
import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
|
|
30
30
|
import { CatalogStatsProvider } from '../planner/stats/catalog-stats.js';
|
|
31
|
+
import { databaseRowCountSources } from '../planner/stats/table-cardinality.js';
|
|
31
32
|
import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
|
|
32
33
|
import { DatabaseOptionsManager } from './database-options.js';
|
|
33
34
|
import { MAINTENANCE_REBUILD_ROW_THRESHOLD } from '../planner/cost/index.js';
|
|
@@ -141,6 +142,7 @@ export class Database {
|
|
|
141
142
|
autoAnalyzeManager;
|
|
142
143
|
/** Observed row-count overlay — exact table sizes seen during execution */
|
|
143
144
|
cardinalityFeedbackManager;
|
|
145
|
+
rowCountSources;
|
|
144
146
|
/** Per-database collation registry — comparator + optional key normalizer +
|
|
145
147
|
* optional REPLICABLE and ORDER-PRESERVING assertions. The normalizer is required
|
|
146
148
|
* for index participation; comparator-only collations may still be used in ORDER BY
|
|
@@ -191,15 +193,17 @@ export class Database {
|
|
|
191
193
|
// Register built-in window functions
|
|
192
194
|
registerBuiltinWindowFunctions();
|
|
193
195
|
registerEmitters();
|
|
194
|
-
// The
|
|
195
|
-
// `TableReferenceNode` (via `SchemaManager.
|
|
196
|
+
// The row-count sources are constructed before the optimizer so the stats provider
|
|
197
|
+
// and `TableReferenceNode` (via `SchemaManager.getRowCountSources`) read one object.
|
|
196
198
|
this.cardinalityFeedbackManager = new CardinalityFeedbackManager({
|
|
197
199
|
schemaManager: this.schemaManager,
|
|
198
200
|
getTuning: () => this.optimizer.tuning,
|
|
199
201
|
getAutocommit: () => this.transactionManager.getAutocommit(),
|
|
202
|
+
reportedRows: table => this.rowCountSources.reportedRows(table),
|
|
200
203
|
onShift: key => this.noteCardinalityShift(key),
|
|
201
204
|
});
|
|
202
|
-
this.
|
|
205
|
+
this.rowCountSources = databaseRowCountSources(this, this.cardinalityFeedbackManager);
|
|
206
|
+
this.optimizer = new Optimizer(DEFAULT_TUNING, new CatalogStatsProvider(undefined, this.rowCountSources));
|
|
203
207
|
// Initialize transaction manager and assertion evaluator
|
|
204
208
|
this.transactionManager = new TransactionManager(this);
|
|
205
209
|
this.assertionEvaluator = new AssertionEvaluator(this);
|
|
@@ -410,9 +414,9 @@ export class Database {
|
|
|
410
414
|
this.options.registerOption('cardinality_feedback', {
|
|
411
415
|
type: 'boolean',
|
|
412
416
|
defaultValue: true,
|
|
413
|
-
description: 'Remember the exact row count of any table a query happens to read in full, and
|
|
414
|
-
'
|
|
415
|
-
'forgets
|
|
417
|
+
description: 'Remember the exact row count of any table a query happens to read in full, and the ' +
|
|
418
|
+
'rows per key of equality lookups through non-unique indexes, and plan later statements ' +
|
|
419
|
+
'against them in place of a default or outdated statistics. Turning it off forgets everything remembered.',
|
|
416
420
|
onChange: (event) => {
|
|
417
421
|
if (!event.newValue)
|
|
418
422
|
this.cardinalityFeedbackManager.clear();
|
|
@@ -2601,6 +2605,10 @@ export class Database {
|
|
|
2601
2605
|
get _cardinalityFeedback() {
|
|
2602
2606
|
return this.cardinalityFeedbackManager;
|
|
2603
2607
|
}
|
|
2608
|
+
/** @internal Every source the planner ranks for a base table's size (`plannedRowCount`). */
|
|
2609
|
+
get _rowCountSources() {
|
|
2610
|
+
return this.rowCountSources;
|
|
2611
|
+
}
|
|
2604
2612
|
/** Tells every live prepared statement that `key`'s observed size shifted; each decides whether its plan reads it. */
|
|
2605
2613
|
noteCardinalityShift(key) {
|
|
2606
2614
|
for (const stmt of this.statements)
|