@malloy-publisher/server 0.0.237 → 0.0.239
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/app/api-doc.yaml +291 -60
- package/dist/app/assets/{EnvironmentPage-DaP6CpgK.js → EnvironmentPage-2oMC3DUO.js} +1 -1
- package/dist/app/assets/{HomePage-C9yNw3iu.js → HomePage-DmgHdpH6.js} +1 -1
- package/dist/app/assets/{LightMode-Be4-G-dX.js → LightMode-BNaG4oAx.js} +1 -1
- package/dist/app/assets/{MainPage-J_rU2SgI.js → MainPage-Dje9yqIp.js} +2 -2
- package/dist/app/assets/{MaterializationsPage-DHgPI4MO.js → MaterializationsPage-D4jCpScu.js} +1 -1
- package/dist/app/assets/{ModelPage-BzXfjTu5.js → ModelPage-oI3O6TwY.js} +1 -1
- package/dist/app/assets/{PackagePage-ByoSTLJ4.js → PackagePage-DlO2UBEI.js} +1 -1
- package/dist/app/assets/{RouteError-CrSeKN2r.js → RouteError-B5MgkwXx.js} +1 -1
- package/dist/app/assets/{ThemeEditorPage-Btxnmhtk.js → ThemeEditorPage-DZzT5zt4.js} +1 -1
- package/dist/app/assets/{WorkbookPage-D6JLPnWO.js → WorkbookPage-CfDz8XAp.js} +1 -1
- package/dist/app/assets/{core-BSRgt1mG.es-Bc_D2Lq4.js → core-BGHaIj_q.es-BeNX3GvK.js} +1 -1
- package/dist/app/assets/{index-DMAhIJNC.js → index-BeZphO3v.js} +1 -1
- package/dist/app/assets/{index-Cvy0xtb7.js → index-BfV8vaZu.js} +1 -1
- package/dist/app/assets/{index-BRijWj6K.js → index-ByceOJbS.js} +4 -4
- package/dist/app/assets/{index-BX4D94xw.js → index-DXjc2oZx.js} +1 -1
- package/dist/app/index.html +1 -1
- package/dist/package_load_worker.mjs +29 -3
- package/dist/server.mjs +2294 -397
- package/package.json +2 -2
package/dist/app/api-doc.yaml
CHANGED
|
@@ -2,32 +2,43 @@ openapi: 3.1.0
|
|
|
2
2
|
info:
|
|
3
3
|
title: Malloy Publisher - Semantic Model Serving API
|
|
4
4
|
description: |
|
|
5
|
-
The Malloy Publisher - Semantic Model Serving API provides
|
|
6
|
-
A Malloy package is a directory
|
|
7
|
-
(
|
|
5
|
+
The Malloy Publisher - Semantic Model Serving API provides access to Malloy packages and everything they contain.
|
|
6
|
+
A Malloy package is a directory with a `publisher.json` manifest at its root, holding Malloy models (`.malloy` files),
|
|
7
|
+
notebooks (`.malloynb` files), embedded data (`.parquet`, `.csv`, and `.xlsx` files), and optionally an HTML data app
|
|
8
|
+
under `public/`.
|
|
8
9
|
|
|
9
10
|
## Key Features
|
|
10
11
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **
|
|
16
|
-
- **Watch Mode**:
|
|
12
|
+
- **Discovery**: List environments, packages, and the models, notebooks, pages, and data a package contains
|
|
13
|
+
- **Query Execution**: Run queries against models, execute notebooks a cell at a time, and compile-check Malloy without running it
|
|
14
|
+
- **Pages**: In-package HTML data apps served from a package's `public/` directory
|
|
15
|
+
- **Materializations**: Persist Malloy sources as tables, on a schedule or on demand
|
|
16
|
+
- **Connection Management**: Configure and test warehouse connections, and browse their schemas and tables
|
|
17
|
+
- **Watch Mode**: File watching, and a change-event stream for development workflows
|
|
17
18
|
|
|
18
19
|
## Resource Hierarchy
|
|
19
20
|
|
|
20
21
|
The API follows a hierarchical resource structure:
|
|
21
22
|
```
|
|
22
|
-
|
|
23
|
-
├──
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
Server
|
|
24
|
+
├── /status, /theme server state, and the UI theme
|
|
25
|
+
├── /connections/test validate a connection config
|
|
26
|
+
├── /watch-mode/… development file watching
|
|
27
|
+
└── Environments
|
|
28
|
+
├── Connections schemas, tables, and ad-hoc SQL
|
|
29
|
+
└── Packages
|
|
30
|
+
├── Models query and compile
|
|
31
|
+
├── Notebooks execute a cell at a time
|
|
32
|
+
├── Pages static HTML data apps from public/
|
|
33
|
+
├── Databases embedded data files
|
|
34
|
+
├── Materializations persisted sources
|
|
35
|
+
├── Connections package-scoped connection access
|
|
36
|
+
└── Events SSE stream of file changes
|
|
28
37
|
```
|
|
29
38
|
|
|
30
|
-
For examples, see the
|
|
39
|
+
For worked examples, see the packages this server bundles
|
|
40
|
+
(https://github.com/malloydata/publisher/tree/main/examples); the package format is documented in
|
|
41
|
+
docs/packages.md (https://github.com/malloydata/publisher/blob/main/docs/packages.md).
|
|
31
42
|
version: v0
|
|
32
43
|
|
|
33
44
|
servers:
|
|
@@ -1861,7 +1872,12 @@ paths:
|
|
|
1861
1872
|
- "false"
|
|
1862
1873
|
- name: givens
|
|
1863
1874
|
in: query
|
|
1864
|
-
description:
|
|
1875
|
+
description:
|
|
1876
|
+
A `GivenValues` object, JSON-encoded so it can travel in a query
|
|
1877
|
+
string. Values are typed as `GivenValues` describes them, not
|
|
1878
|
+
string-encoded as `EncodedGivenValues` would be. The parameter keeps
|
|
1879
|
+
its name for compatibility; the schema it carries is the one named
|
|
1880
|
+
here.
|
|
1865
1881
|
required: false
|
|
1866
1882
|
schema:
|
|
1867
1883
|
type: string
|
|
@@ -2425,16 +2441,26 @@ components:
|
|
|
2425
2441
|
$ref: "#/components/schemas/Error"
|
|
2426
2442
|
PayloadTooLarge:
|
|
2427
2443
|
description: |
|
|
2428
|
-
The request was well-formed but the response
|
|
2429
|
-
|
|
2430
|
-
* PUBLISHER_MAX_QUERY_ROWS (default 100000)
|
|
2431
|
-
* PUBLISHER_MAX_RESPONSE_BYTES (default 50 MB)
|
|
2432
|
-
response
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2444
|
+
The request was well-formed but the response is too large to return.
|
|
2445
|
+
Three cases, and the message says which:
|
|
2446
|
+
* PUBLISHER_MAX_QUERY_ROWS (default 100000) exceeded: too many rows.
|
|
2447
|
+
* PUBLISHER_MAX_RESPONSE_BYTES (default 50 MB) exceeded: the
|
|
2448
|
+
JSON-serialized response measured over the cap. What is measured is
|
|
2449
|
+
the shape the request asked for, so on the model-query endpoint two
|
|
2450
|
+
requests differing only in compactJson reach this cap at different
|
|
2451
|
+
result sizes.
|
|
2452
|
+
* The response could not be serialized at all, past the JavaScript
|
|
2453
|
+
engine's own limit (V8 refuses the string; JSC fails the
|
|
2454
|
+
allocation). No cap was necessarily exceeded here, and raising one
|
|
2455
|
+
does not help. This third case applies to the model-query and
|
|
2456
|
+
notebook-cell endpoints; the connection SQL endpoints have no such
|
|
2457
|
+
guard and answer 500.
|
|
2458
|
+
In every case, refine the query (add a LIMIT, a more selective WHERE,
|
|
2459
|
+
project fewer columns, or filter out wide values); retrying unchanged
|
|
2460
|
+
will not succeed. Raising the relevant cap is an option for the first
|
|
2461
|
+
two only. The rejection counter is exported as
|
|
2462
|
+
publisher_query_cap_exceeded_total{cap_type, source}, where cap_type is
|
|
2463
|
+
rows, bytes, or unserializable.
|
|
2438
2464
|
content:
|
|
2439
2465
|
application/json:
|
|
2440
2466
|
schema:
|
|
@@ -2734,7 +2760,7 @@ components:
|
|
|
2734
2760
|
default: package
|
|
2735
2761
|
description: >-
|
|
2736
2762
|
Package-level Malloy Persistence scope mode, declared once at the
|
|
2737
|
-
|
|
2763
|
+
publisher.json root and applied uniformly to every persist
|
|
2738
2764
|
source and index in the package. `package` (the default) =
|
|
2739
2765
|
persisted artifacts are package-scoped: reused across the package's
|
|
2740
2766
|
published versions whenever they still satisfy freshness. `version`
|
|
@@ -2775,28 +2801,35 @@ components:
|
|
|
2775
2801
|
type: array
|
|
2776
2802
|
readOnly: true
|
|
2777
2803
|
description: >-
|
|
2778
|
-
Non-fatal
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2804
|
+
Non-fatal findings collected when the package loaded, none of which
|
|
2805
|
+
stop the model compiling or the package loading. Render-tag
|
|
2806
|
+
findings: a render annotation (e.g. `# big_value` or `# currency`)
|
|
2807
|
+
misconfigured for the field it sits on, so it renders as
|
|
2808
|
+
"[object Object]" or an inline error at query time. Materialization
|
|
2809
|
+
findings: a `storage=` source not served from storage, a `#@ persist`
|
|
2810
|
+
source that was not recognized as materializable, a persist-target
|
|
2811
|
+
collision, and materialization-config problems that degrade
|
|
2812
|
+
attribution. Server-computed and read-only: ignored on create/update
|
|
2813
|
+
requests and only returned in responses. Present only when there are
|
|
2814
|
+
such findings.
|
|
2785
2815
|
items:
|
|
2786
2816
|
type: object
|
|
2787
2817
|
properties:
|
|
2788
2818
|
model:
|
|
2789
2819
|
type: string
|
|
2790
2820
|
description: >-
|
|
2791
|
-
Package-relative path of the model the finding is on.
|
|
2792
|
-
|
|
2821
|
+
Package-relative path of the model the finding is on. Absent
|
|
2822
|
+
for a package-wide finding.
|
|
2823
|
+
subject:
|
|
2793
2824
|
type: string
|
|
2794
2825
|
description: >-
|
|
2795
|
-
|
|
2796
|
-
`flights -> by_carrier
|
|
2826
|
+
What the finding is about: the query or view a render finding
|
|
2827
|
+
sits on (`by_carrier`, `flights -> by_carrier`), or the source
|
|
2828
|
+
a materialization finding belongs to. Absent when a finding
|
|
2829
|
+
spans several, in which case the message names them.
|
|
2797
2830
|
message:
|
|
2798
2831
|
type: string
|
|
2799
|
-
description:
|
|
2832
|
+
description: A description of the problem.
|
|
2800
2833
|
severity:
|
|
2801
2834
|
type: string
|
|
2802
2835
|
enum:
|
|
@@ -2835,7 +2868,7 @@ components:
|
|
|
2835
2868
|
- type: "null"
|
|
2836
2869
|
description: |
|
|
2837
2870
|
Package-level Malloy Persistence policy declared in
|
|
2838
|
-
|
|
2871
|
+
publisher.json. The control plane reads it to drive scheduled
|
|
2839
2872
|
re-materialization. The object is present whenever the package has
|
|
2840
2873
|
loaded — with `schedule: null` when the manifest declares no
|
|
2841
2874
|
schedule — so the caller can treat object-present as the
|
|
@@ -2921,7 +2954,7 @@ components:
|
|
|
2921
2954
|
PackageMaterializationConfig:
|
|
2922
2955
|
type: object
|
|
2923
2956
|
description: >-
|
|
2924
|
-
Package-level Malloy Persistence policy from
|
|
2957
|
+
Package-level Malloy Persistence policy from publisher.json's
|
|
2925
2958
|
`materialization` block. Surfaced verbatim so the control plane can drive
|
|
2926
2959
|
scheduled version-level re-materialization without re-reading the package
|
|
2927
2960
|
files. The object is emitted whenever the package is loaded, even when no
|
|
@@ -2967,7 +3000,7 @@ components:
|
|
|
2967
3000
|
Freshness:
|
|
2968
3001
|
type: object
|
|
2969
3002
|
description: >-
|
|
2970
|
-
Freshness policy declared in
|
|
3003
|
+
Freshness policy declared in publisher.json's
|
|
2971
3004
|
`materialization.freshness` block. Fields are surfaced verbatim;
|
|
2972
3005
|
invalid values are dropped (reported as absent), never defaulted.
|
|
2973
3006
|
properties:
|
|
@@ -3054,18 +3087,22 @@ components:
|
|
|
3054
3087
|
type: object
|
|
3055
3088
|
description: Raw Malloy notebook with unexecuted cell contents
|
|
3056
3089
|
properties:
|
|
3057
|
-
|
|
3090
|
+
type:
|
|
3058
3091
|
type: string
|
|
3059
|
-
description:
|
|
3092
|
+
description: Always `notebook`. Distinguishes the payload from the
|
|
3093
|
+
compiled-model shape returned by the model endpoint.
|
|
3060
3094
|
packageName:
|
|
3061
3095
|
type: string
|
|
3062
3096
|
description: Name of the package containing this notebook
|
|
3063
|
-
|
|
3097
|
+
modelPath:
|
|
3064
3098
|
type: string
|
|
3065
3099
|
description: Relative path to the notebook file within its package directory
|
|
3066
3100
|
malloyVersion:
|
|
3067
3101
|
type: string
|
|
3068
3102
|
description: Version of the Malloy compiler used to generate the notebook data
|
|
3103
|
+
modelInfo:
|
|
3104
|
+
type: string
|
|
3105
|
+
description: JSON string containing model metadata and structure information
|
|
3069
3106
|
notebookCells:
|
|
3070
3107
|
type: array
|
|
3071
3108
|
description: Array of notebook cells containing raw markdown and code content
|
|
@@ -3076,11 +3113,23 @@ components:
|
|
|
3076
3113
|
description: Array of file-level (##) annotations attached to the notebook
|
|
3077
3114
|
items:
|
|
3078
3115
|
type: string
|
|
3116
|
+
startingGivens:
|
|
3117
|
+
allOf:
|
|
3118
|
+
- $ref: "#/components/schemas/EncodedGivenValues"
|
|
3119
|
+
description:
|
|
3120
|
+
Starting values for the notebook's controls, declared at its file
|
|
3121
|
+
level. URL parameters override these, which is why the two share a
|
|
3122
|
+
shape. Omitted when the notebook declares none.
|
|
3079
3123
|
sources:
|
|
3080
3124
|
type: array
|
|
3081
3125
|
description: Sources defined in the notebook's model
|
|
3082
3126
|
items:
|
|
3083
3127
|
$ref: "#/components/schemas/Source"
|
|
3128
|
+
queries:
|
|
3129
|
+
type: array
|
|
3130
|
+
description: Named queries defined in the notebook's model
|
|
3131
|
+
items:
|
|
3132
|
+
$ref: "#/components/schemas/Query"
|
|
3084
3133
|
|
|
3085
3134
|
CompiledModel:
|
|
3086
3135
|
type: object
|
|
@@ -3193,10 +3242,22 @@ components:
|
|
|
3193
3242
|
|
|
3194
3243
|
Given:
|
|
3195
3244
|
type: object
|
|
3196
|
-
description:
|
|
3245
|
+
description: |
|
|
3197
3246
|
A given (runtime parameter) declared on a Malloy model via the
|
|
3198
3247
|
`given:` keyword. Surfaced on `CompiledModel.givens` and `Source.givens`
|
|
3199
3248
|
so callers can introspect what runtime values a model accepts.
|
|
3249
|
+
|
|
3250
|
+
`givens` always names a collection of these declarations. Values keyed
|
|
3251
|
+
by given name are `GivenValues` (or `EncodedGivenValues` in the form
|
|
3252
|
+
that survives a URL), and a bare list of names is spelled `givenNames`.
|
|
3253
|
+
|
|
3254
|
+
It also carries how the given should be presented as an input control
|
|
3255
|
+
(`label`, `control`, `rangeMin`, `rangeMax`, `suggest`), derived from
|
|
3256
|
+
the declaration's own tags. That contract belongs to the given rather
|
|
3257
|
+
than to any one surface, which is what lets a notebook and an SDK host
|
|
3258
|
+
render the same control without restating it. Those five fields describe
|
|
3259
|
+
the contract a renderer implements; no endpoint populates them yet, so
|
|
3260
|
+
they are absent from every response today.
|
|
3200
3261
|
properties:
|
|
3201
3262
|
name:
|
|
3202
3263
|
type: string
|
|
@@ -3217,15 +3278,85 @@ components:
|
|
|
3217
3278
|
the model. Omitted when the given declares no default. Consumers
|
|
3218
3279
|
render or prefill it per the given's `type` (e.g. unquote a string
|
|
3219
3280
|
literal for a text input).
|
|
3281
|
+
label:
|
|
3282
|
+
type: string
|
|
3283
|
+
description: Display label from the declaration's `# label=` tag
|
|
3284
|
+
control:
|
|
3285
|
+
type: string
|
|
3286
|
+
enum:
|
|
3287
|
+
- select
|
|
3288
|
+
- multiselect
|
|
3289
|
+
description:
|
|
3290
|
+
How the control renders when the choice is between a single-pick and
|
|
3291
|
+
a multi-pick list. Omitted means infer from the given's type. A
|
|
3292
|
+
slider is not one of these values; it is signalled by `rangeMin` and
|
|
3293
|
+
`rangeMax` instead, per the rule on those fields.
|
|
3294
|
+
rangeMin:
|
|
3295
|
+
type: number
|
|
3296
|
+
description:
|
|
3297
|
+
Slider lower bound from `# range_min=`. The two bounds are what
|
|
3298
|
+
signal a slider, so a `number` or `filter<number>` given renders as
|
|
3299
|
+
one when BOTH are present and as a plain number input otherwise, so
|
|
3300
|
+
a lone bound changes nothing about the control.
|
|
3301
|
+
rangeMax:
|
|
3302
|
+
type: number
|
|
3303
|
+
description:
|
|
3304
|
+
Slider upper bound from `# range_max=`. See `rangeMin` for the rule
|
|
3305
|
+
that turns the pair into a slider.
|
|
3306
|
+
suggest:
|
|
3307
|
+
$ref: "#/components/schemas/GivenSuggest"
|
|
3308
|
+
|
|
3309
|
+
GivenSuggest:
|
|
3310
|
+
type: object
|
|
3311
|
+
description: |
|
|
3312
|
+
Where a select or multiselect control gets its options: a named `query`,
|
|
3313
|
+
a `source` + `dimension` pair, or a `query` with a `dimension` naming
|
|
3314
|
+
which of its columns to read. All three run through the ordinary query
|
|
3315
|
+
endpoint.
|
|
3316
|
+
|
|
3317
|
+
With `query` alone the first column of each row is used, so a
|
|
3318
|
+
single-column `group_by` needs no `dimension`. Give `dimension`
|
|
3319
|
+
alongside `query` when the query returns more than one column.
|
|
3320
|
+
properties:
|
|
3321
|
+
query:
|
|
3322
|
+
type: string
|
|
3323
|
+
source:
|
|
3324
|
+
type: string
|
|
3325
|
+
dimension:
|
|
3326
|
+
type: string
|
|
3220
3327
|
|
|
3221
|
-
|
|
3328
|
+
GivenValues:
|
|
3222
3329
|
type: object
|
|
3223
|
-
description:
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3330
|
+
description: |
|
|
3331
|
+
Given *values* keyed by given name: what a caller sends, as distinct
|
|
3332
|
+
from `Given`, which describes what the model *accepts*. A collection of
|
|
3333
|
+
declarations is a plain array of `Given`, never this.
|
|
3334
|
+
|
|
3335
|
+
Values are decoded and must match the declared type: a `number` given
|
|
3336
|
+
takes a JSON number, a `date` takes a bare `YYYY-MM-DD` string, a
|
|
3337
|
+
`timestamp` an ISO string with no zone, a `timestamptz` a full ISO
|
|
3338
|
+
string. `EncodedGivenValues` is the string-encoded counterpart.
|
|
3227
3339
|
additionalProperties: true
|
|
3228
3340
|
|
|
3341
|
+
EncodedGivenValues:
|
|
3342
|
+
type: object
|
|
3343
|
+
description: |
|
|
3344
|
+
The same values as `GivenValues`, string-encoded: the form that survives
|
|
3345
|
+
a URL. Every value is a string regardless of the given's declared type,
|
|
3346
|
+
and a `filter<…>` value is the filter body rather than the `f'…'`
|
|
3347
|
+
literal.
|
|
3348
|
+
|
|
3349
|
+
The role it names: a surface's URL parameters and the starting values a
|
|
3350
|
+
document declares share this shape, so the two can merge and then be
|
|
3351
|
+
decoded once against the declarations and sent as `GivenValues`. No
|
|
3352
|
+
endpoint returns it yet. `RawNotebook.startingGivens` is the first field
|
|
3353
|
+
typed as it, and nothing populates that field so far, so today this
|
|
3354
|
+
schema documents the contract rather than describing live traffic. The
|
|
3355
|
+
`givens` query parameter is not an instance of it: that carries a
|
|
3356
|
+
JSON-encoded `GivenValues`, with values typed rather than stringified.
|
|
3357
|
+
additionalProperties:
|
|
3358
|
+
type: string
|
|
3359
|
+
|
|
3229
3360
|
Source:
|
|
3230
3361
|
type: object
|
|
3231
3362
|
description: A Malloy source defined in a model
|
|
@@ -3349,7 +3480,7 @@ components:
|
|
|
3349
3480
|
|
|
3350
3481
|
When true, skip server-side `#(filter)` injection entirely.
|
|
3351
3482
|
givens:
|
|
3352
|
-
$ref: "#/components/schemas/
|
|
3483
|
+
$ref: "#/components/schemas/GivenValues"
|
|
3353
3484
|
queryMetadata:
|
|
3354
3485
|
$ref: "#/components/schemas/QueryMetadata"
|
|
3355
3486
|
description: >-
|
|
@@ -4305,7 +4436,7 @@ components:
|
|
|
4305
4436
|
(only available when compilation succeeds and the source contains a
|
|
4306
4437
|
runnable query).
|
|
4307
4438
|
givens:
|
|
4308
|
-
$ref: "#/components/schemas/
|
|
4439
|
+
$ref: "#/components/schemas/GivenValues"
|
|
4309
4440
|
required:
|
|
4310
4441
|
- source
|
|
4311
4442
|
|
|
@@ -4379,7 +4510,36 @@ components:
|
|
|
4379
4510
|
forceRefresh:
|
|
4380
4511
|
type: boolean
|
|
4381
4512
|
default: false
|
|
4382
|
-
description:
|
|
4513
|
+
description: >-
|
|
4514
|
+
Build a new table even when a source's sourceEntityId is unchanged —
|
|
4515
|
+
that is, defeat skip-if-unchanged, which would otherwise carry the
|
|
4516
|
+
existing table forward and run no SQL for that source.
|
|
4517
|
+
|
|
4518
|
+
It means ONLY that. It never re-seeds a source declaring
|
|
4519
|
+
`refresh="incremental"`: such a source is exempt from
|
|
4520
|
+
skip-if-unchanged anyway (its content address does not move when its
|
|
4521
|
+
data does), so there is nothing here for the flag to change, and
|
|
4522
|
+
reading it as "rebuild from scratch" would make a forced run — which
|
|
4523
|
+
is every scheduled fire — a full rebuild that no delta could ever
|
|
4524
|
+
follow. Ask for a rebuild with `reseed`.
|
|
4525
|
+
|
|
4526
|
+
Has no effect at all on an orchestrated build: the host decides what
|
|
4527
|
+
gets built by instructing it, so no carry-forward runs.
|
|
4528
|
+
reseed:
|
|
4529
|
+
type: boolean
|
|
4530
|
+
default: false
|
|
4531
|
+
description: >-
|
|
4532
|
+
Rebuild every in-scope source declaring `refresh="incremental"` from
|
|
4533
|
+
scratch, ignoring its recorded `covered_through` boundary, and
|
|
4534
|
+
re-derive the boundary from the table each rebuild writes. The escape
|
|
4535
|
+
hatch for a boundary or a table that is no longer trusted. Narrow it
|
|
4536
|
+
with `sourceNames`.
|
|
4537
|
+
|
|
4538
|
+
Unlike `forceRefresh` this is about HOW an incremental source is
|
|
4539
|
+
built, not whether it is built at all, which is why the two are
|
|
4540
|
+
separate flags rather than one. An orchestrated caller can instead
|
|
4541
|
+
set `reseed` per source on each BuildInstruction, and the two are
|
|
4542
|
+
OR-ed: either asks for that source to rebuild.
|
|
4383
4543
|
sourceNames:
|
|
4384
4544
|
type: array
|
|
4385
4545
|
items:
|
|
@@ -4548,9 +4708,15 @@ components:
|
|
|
4548
4708
|
refresh:
|
|
4549
4709
|
type: ["string", "null"]
|
|
4550
4710
|
description: >-
|
|
4551
|
-
The source's declared `#@ persist ... refresh=...` value
|
|
4552
|
-
(
|
|
4553
|
-
|
|
4711
|
+
The source's declared `#@ persist ... refresh=...` value, reported
|
|
4712
|
+
verbatim; null = unset (which means "full"). Read and VALIDATED by
|
|
4713
|
+
the publisher, no longer an inert pass-through: a value outside
|
|
4714
|
+
{"full", "incremental"} is a publish rejection, and
|
|
4715
|
+
`refresh="incremental"` additionally requires a `watermark=` naming
|
|
4716
|
+
one output dimension (see `annotationFields`). An incremental source
|
|
4717
|
+
advances its serving table by a bounded delta in place instead of
|
|
4718
|
+
being rebuilt, so the mode also governs the build path — which is why
|
|
4719
|
+
it is validated rather than passed through.
|
|
4554
4720
|
freshness:
|
|
4555
4721
|
oneOf:
|
|
4556
4722
|
- $ref: "#/components/schemas/Freshness"
|
|
@@ -4586,12 +4752,37 @@ components:
|
|
|
4586
4752
|
type: object
|
|
4587
4753
|
additionalProperties:
|
|
4588
4754
|
type: string
|
|
4589
|
-
description:
|
|
4755
|
+
description: >-
|
|
4590
4756
|
All key=value fields of the source's `#@ persist` annotation (e.g.
|
|
4591
4757
|
`name`, `realization`). The control plane uses `name` as the
|
|
4592
4758
|
materialized table name (it may carry a dialect container path like
|
|
4593
4759
|
`dataset.table`). Returned as the full set so new persist directives
|
|
4594
|
-
need no publisher change
|
|
4760
|
+
need no publisher change; an unrecognized key rides through here and
|
|
4761
|
+
is reported as a package warning, never a rejection.
|
|
4762
|
+
|
|
4763
|
+
|
|
4764
|
+
Recognized keys beyond `name`/`realization`/`storage`, both read from
|
|
4765
|
+
the EFFECTIVE merged tag (a source extending a persisted parent
|
|
4766
|
+
inherits the parent's keys, and its own keys merge over them per key):
|
|
4767
|
+
|
|
4768
|
+
|
|
4769
|
+
* `watermark` — one output dimension name, monotone non-decreasing.
|
|
4770
|
+
Required by `refresh="incremental"`; the platform derives each
|
|
4771
|
+
refresh's half-open range from it. Must be a single quoted string
|
|
4772
|
+
naming a column of `columns`.
|
|
4773
|
+
|
|
4774
|
+
|
|
4775
|
+
* `merge_key` — comma-separated output dimension names, none of them
|
|
4776
|
+
the watermark. Declares row identity for a source whose rows are
|
|
4777
|
+
restated with a LATER watermark value, which selects a MERGE apply;
|
|
4778
|
+
omitted, the delta replaces the range instead. Compound keys go in one
|
|
4779
|
+
quoted string (`merge_key="order_id, region"`).
|
|
4780
|
+
|
|
4781
|
+
|
|
4782
|
+
Both are validated at publish against the compiled output schema, so
|
|
4783
|
+
a dangling or stale name is rejected rather than deferred to a build.
|
|
4784
|
+
Neither participates in `sourceEntityId`: adding a watermark to an
|
|
4785
|
+
existing source must not re-address its table.
|
|
4595
4786
|
modelPath:
|
|
4596
4787
|
type: string
|
|
4597
4788
|
description:
|
|
@@ -4709,6 +4900,26 @@ components:
|
|
|
4709
4900
|
The name resolves generically against registered connections; any
|
|
4710
4901
|
managed-tier alias is resolved by the host upstream and never
|
|
4711
4902
|
reaches the publisher.
|
|
4903
|
+
reseed:
|
|
4904
|
+
type: boolean
|
|
4905
|
+
default: false
|
|
4906
|
+
description: >-
|
|
4907
|
+
Rebuild this source from scratch even if it declares
|
|
4908
|
+
`refresh="incremental"` and has a recorded `covered_through`
|
|
4909
|
+
boundary: the build runs the ordinary full CTAS and the boundary is
|
|
4910
|
+
re-derived from the table it writes. The escape hatch for a boundary
|
|
4911
|
+
or a table that is no longer trusted.
|
|
4912
|
+
|
|
4913
|
+
Per-source rather than only per-request because re-seeding is a
|
|
4914
|
+
per-source decision: a host may want one source rebuilt while the
|
|
4915
|
+
rest advance by delta in the same run. OR-ed with the request-level
|
|
4916
|
+
`reseed`, so either asks for this source to rebuild. Ignored for a
|
|
4917
|
+
source that is not incremental (such a source is always built in
|
|
4918
|
+
full).
|
|
4919
|
+
|
|
4920
|
+
Note `forceRefresh` is NOT how you ask for this, in any mode: it
|
|
4921
|
+
only defeats skip-if-unchanged, which does not even run for an
|
|
4922
|
+
orchestrated build.
|
|
4712
4923
|
|
|
4713
4924
|
BuildManifest:
|
|
4714
4925
|
type: object
|
|
@@ -4794,6 +5005,26 @@ components:
|
|
|
4794
5005
|
description: >-
|
|
4795
5006
|
Per-version read-time policy when the entry is stale. Never combined
|
|
4796
5007
|
across versions; each version's entries carry its own declared fallback.
|
|
5008
|
+
coveredThrough:
|
|
5009
|
+
type: string
|
|
5010
|
+
description: >-
|
|
5011
|
+
For a source declaring `refresh="incremental"`, the EXCLUSIVE upper
|
|
5012
|
+
end of the watermark range this table is now known to contain — the
|
|
5013
|
+
boundary the next refresh will start from. Canonical scalar text
|
|
5014
|
+
(`2024-07-01`, `2024-07-01 12:00:00`, `41`), interpreted per
|
|
5015
|
+
`coveredThroughType`.
|
|
5016
|
+
|
|
5017
|
+
Reported so a caller can observe and verify incremental progress
|
|
5018
|
+
rather than infer it: a value that advanced between runs is a delta
|
|
5019
|
+
that applied. Absent for a non-incremental source, and for an
|
|
5020
|
+
incremental one whose source is empty (no boundary is derivable, so
|
|
5021
|
+
none is recorded).
|
|
5022
|
+
coveredThroughType:
|
|
5023
|
+
type: string
|
|
5024
|
+
description: >-
|
|
5025
|
+
The Malloy type of `coveredThrough` (`date`, `timestamp`, `number`,
|
|
5026
|
+
`string`), which decides how its text is compared and rendered.
|
|
5027
|
+
Present exactly when `coveredThrough` is.
|
|
4797
5028
|
|
|
4798
5029
|
parameters:
|
|
4799
5030
|
environmentName:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as r,F as t,j as e,a0 as i,a9 as o}from"./index-
|
|
1
|
+
import{$ as r,F as t,j as e,a0 as i,a9 as o}from"./index-ByceOJbS.js";function m(){const s=r(),{environmentName:n}=t();if(n){const a=i({environmentName:n});return e.jsx(o,{onSelectPackage:s,resourceUri:a})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as t,j as o,J as a}from"./index-
|
|
1
|
+
import{$ as t,j as o,J as a}from"./index-ByceOJbS.js";function s(){const n=t();return o.jsx(a,{onClickEnvironment:n})}export{s as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c,j as s}from"./index-
|
|
1
|
+
import{c,j as s}from"./index-ByceOJbS.js";const t=c(s.jsx("path",{d:"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1"})),a=c(s.jsx("path",{d:"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5M2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1m18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1M11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1m0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1M5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0z"}));export{t as D,a as L};
|