Compare commits

...

48 Commits

Author SHA1 Message Date
Romeo Van Snick
d0815d3471 Stamp bundle-size rows with the commit's timestamp, not the day they ran
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01171Lkmug15JzrcN2aMBLMk
2026-09-11 00:09:19 -07:00
Romeo Van Snick
6b27c064dc Stamp load-time rows with the commit's timestamp, not the day they ran
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01171Lkmug15JzrcN2aMBLMk
2026-09-11 00:02:49 -07:00
Romeo Van Snick
1c5ba041d6 Stop the metabot viewing-context tests from depending on absent entity ids (#82248)
The tests pass ids like 789 for entities they do not create. format-entity looks the
id up, and the test asserts on the fallback rendering that a 404 produces. When a
parallel test happens to hold that id, read-check gives a 403 instead, which renders
nothing, and the test fails.

Use Integer/MAX_VALUE, which no fixture allocates.


Claude-Session: https://claude.ai/code/session_01GCoSa7L7KrXh42rDRYR3Nk

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-11 15:11:30 +10:00
Romeo Van Snick
86c23eaf5e Read a card's UI parameters off its question (#82238)
* Read a card's UI parameters off its question

* Drop a tombstone comment

* Pin the agreement between getCardUiParameters and Question.parameters

* Type the unsaved card in the agreement test

* Format the agreement test
2026-09-11 15:11:21 +10:00
Fraser
1447d9cf97 Move the application permissions selector slot into current-user (#81846)
* Move the application permissions selector slot into current-user

PLUGIN_APPLICATION_PERMISSIONS.selectors was only read by current-user, so the slot now lives there as PLUGIN_APPLICATION_PERMISSIONS_SELECTORS with its OSS defaults, and the EE application permissions plugin registers into it from metabase/current-user. getRoutes and tabs stay in metabase/plugins for the admin permissions editor.
2026-09-11 16:42:11 +12:00
Romeo Van Snick
90688e49a7 Translate at call time, not at import time (#82147)
* Translate viz nouns and formatting operators on demand

`noun` was the one field on a visualization definition still translated at
import. `get noun()` matches what ObjectDetail and TreemapChart already do,
and the registry stores a definition by reference, so the getter survives.

The table-formatting operator names were four module-level objects. They are
functions now. `ALL_OPERATOR_NAMES` becomes `getAllOperatorNames()`, which
its three readers call.

25 of the 124 sites that translate before a catalogue can be applied.

* Translate settings titles on demand

`title` in a settings definition follows the same rule as the rest of the
object. 152 settings already use `get title()`; these 23 were the laggards.

The group-managers confirmation held two frozen strings, so it becomes a
function rather than an object with getters.

49 of 124.

* Lift translated containers into functions

Where a whole array or object is translations, the function goes on the
container so consumers keep a plain array or object: PieChart's ring titles,
the whitelabel illustration options and descriptions, PivotTable's partitions
(which held JSX built at import), the model-caching options, the cloud
migration messages, and the geo filter placeholders.

Where only a field or two of a mixed config is translated, and call sites read
it by property, the getter goes on the field instead. That covers the
collection configs, the permission option records and the loading messages,
none of which are spread anywhere.

Four files carried a whole-file disable rather than one per site, hiding 20
sites behind 4 directives. The real total is 140, not 124.

118 of 140.

* Clear the last module-scope translations

Validation schemas become functions, matching getOidcFormSchema and the other
lazy schemas already here. Module-local error strings become functions called
at their use sites. Three exported constants follow: NULL_DISPLAY_VALUE,
BEFORE_UNLOAD_UNSAVED_MESSAGE and NO_X_AXIS_VALUES_ERROR_MESSAGE, across 37
files.

The two Mantine `aria-label` defaults get a getter. Mantine merges
`defaultProps` by spread on each render, so the getter is read every time.

`ttag/no-module-declaration` now passes across all five trees it covers with
no opt-outs left, and `--report-unused-disable-directives` confirms none were
stranded.

* Stop spreads from flattening lazy translations

A spread or a rest destructure reads every getter it copies. Where an object
holds `get title()` so the string translates when it is read, spreading that
object at module scope translates it at import instead, which is the bug the
getters were meant to avoid.

Adds `mergeLazily` / `omitLazily`, which copy property descriptors instead,
and uses them where the flattening happened at import:

- `viz-core/lib/settings/utils.ts` flattened twice, once in the rest
  destructure and once in `...def`, so every setting built through
  `fieldSetting` / `metricSetting` / `dimensionSetting` froze at import.
- `palette/shortcuts/index.ts` spread five shortcut maps into one.
- `PaletteShortcutsModal` spread each shortcut again while grouping, so that
  now happens per render.

Measured with a test that imports every source module with `ttag` mocked:
40 modules and 370 translation calls at import, down to 35 and 256.

* Build parameter, admin and graph settings when read

* Build option lists when they are rendered

* Guard import-time translation with a test

* Make the instance analytics message a function so the plugin registry can replace it

* Resolve admin path names when the navbar renders them

* Give the enterprise caching tabs a lazy name too

* Skip generated cli-snippets from the side-effect scan

* Key the null slice by its untranslated label

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NUuaopJ7ZtMVvdwwxF6qyx

* Fail the import-time guard on unlisted import errors

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NUuaopJ7ZtMVvdwwxF6qyx

* Read lazy translations once per render, not per lookup

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NUuaopJ7ZtMVvdwwxF6qyx

* Let jest transform the MCP ext-apps package

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NUuaopJ7ZtMVvdwwxF6qyx

* Skip the SDK cli scripts in the import-time guard

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NUuaopJ7ZtMVvdwwxF6qyx

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-11 14:16:04 +10:00
Romeo Van Snick
60f2668137 Build dashboard and query-runner questions from the store (#82241)
* Build dashboard and query-runner questions from the store

* Cover the pivot endpoint selection
2026-09-11 14:13:19 +10:00
Romeo Van Snick
503c3bf068 Build the card embed and SDK questions from the store (#82253)
* Build the card embed questions from the store

* Read the SDK parameter values off the question
2026-09-11 10:27:16 +10:00
Fraser
a6de42f467 Re-tier styled-components to U4 and enforce its shared tiers (#82256) 2026-09-11 12:22:50 +12:00
github-automation-metabase
c998859487 Auto-update documentation for master (#82298)
Update generated docs (master)

Co-authored-by: github-actions <github-actions@github.com>
2026-09-10 23:37:23 +00:00
Alexander Polyankin
a491bd11be Namespace the table name BigQuery's compiled native form carries as :qp/table-name (#82275)
* Namespace the table name BigQuery's compiled native form carries as :qp/table-name

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Update the BigQuery compile tests for :qp/table-name

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Update the remaining BigQuery compile tests for :qp/table-name

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 19:23:06 -04:00
Anderson
0a30b63176 Trim redundant Data Studio TablePicker end-to-end tests (#81848)
Trim redundant Data Studio TablePicker E2Es
2026-09-10 19:18:50 -03:00
technomancy
f1ce332568 Refuse to create new tables in static datasets with Snowflake (#82222)
Refuse to create new tables in static datasets with Snowflake.

Table creation will always succeed on non-static datasets, but if it's
static then the table being created has to be a table that's in the
dataset definition.

Ensure all tests which alter the dataset by creating new tables
declare a non-static dataset. The transform-related tests switch over
to using transforms-dataset/transforms-test which most of them are
already using.

Upload tests have their dataset defined in a fixture so we can do it
all in one place instead of editing 60 different deftests.
2026-09-10 14:55:14 -07:00
Will Fry
1690028d0f GDGT-2653: uncomment E2E assertions (#82199) 2026-09-11 00:10:43 +03:00
Andrei Chernykh
0c76874681 Move SSO user provisioning a toggle card under server settings (#82232)
* Make SSO user provisioning a toggle card under server settings

* Debounce provisioning writes and drop the real timers from the spec
2026-09-10 13:52:45 -07:00
Chris Vandoodewaard
a6be073fb2 auto-merge e2e timing update prs (#82292)
* create PR using CLI, also auto-approve/merge

* cleanup string, check if things changed

* remove extra blank line

* namespace file
2026-09-10 15:05:29 -04:00
Ben Grabow
cb4541b965 Extract dispatch type hierarchy (#82226) 2026-09-10 13:37:56 -05:00
Ben Grabow
463fb9355b Extract entity types (#82265) 2026-09-10 13:23:50 -05:00
Andrei Chernykh
791b649cc0 bump qs to 6.16.0 (#82283) 2026-09-10 11:06:44 -07:00
Tyler Plude
085418edb8 [GIT-74095] Use git path separators in remote-sync export paths (#82284)
use git path separators in remote-sync export paths
2026-09-10 10:47:29 -07:00
Andrei Chernykh
1118c3e897 Bump js-yaml to 4.3.2 (#82282) 2026-09-10 10:36:08 -07:00
Alexander Polyankin
6e74e41eaf Strip undeclared keys from stored and legacy queries the way the request decoder does (#82273) 2026-09-10 13:32:50 -04:00
metabase-bot[bot]
38404fd9df [chore] Update E2E test timings with recent data (#81995)
Update E2E test timings with averaged data

Collected timing data from 7 days of test runs.
All specs with timing data were included (simple averages).

🤖 Generated automatically by update-e2e-timings workflow

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Actions <actions@github.com>
2026-09-10 17:26:53 +00:00
Chris Vandoodewaard
8a7cd79f47 Bump backend deps to resolve security vulnerabilities (#82261)
* bump backend deps

* missed bump
2026-09-10 13:25:18 -04:00
Alex Yarosh
f3685652d3 docs: making semantic layer happen - org part (#82247)
* rename directories

* Revert "rename directories"

This reverts commit 13ebd4ae48.

* heard you like links

* what good is claude if it doesn't even find all the links

* Optimized 55 images, saved 698.8 KB (11.2% smaller)

* Fix docs links after merge

Co-authored-by: alexyarosh <16640109+alexyarosh@users.noreply.github.com>

* Fix merged docs regressions

Co-authored-by: alexyarosh <16640109+alexyarosh@users.noreply.github.com>

* Tighten merged docs links

Co-authored-by: alexyarosh <16640109+alexyarosh@users.noreply.github.com>

* Revert extra post-merge docs edits

Co-authored-by: alexyarosh <16640109+alexyarosh@users.noreply.github.com>

* link

---------

Co-authored-by: Metabase Automation <github-automation@metabase.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alexyarosh <16640109+alexyarosh@users.noreply.github.com>
2026-09-10 12:49:43 -04:00
Andrei Simionescu
08497ded2f Bump csv-parse to 7.0.2 (#82266) 2026-09-10 15:48:24 +00:00
appleby
bfe0b19738 Update map tile server settings with suggested copy from DOC-301 (#81835)
* Update map tile server settings with suggested copy from DOC-301

And also include a link to the relevant page in the metabase docs.

* Add a note about not including private keys to the docstring for map-tile-server-url

so that the warning also shows up in the env var docs.
2026-09-10 08:44:01 -07:00
Riley Thompson
a155c1f4ee Document bigquery median behaviour (#82201)
* BigQuery: use PERCENTILE_CONT for median and percentile

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* update docs

* update doc

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 11:42:36 -04:00
Braden Shepherdson
9f48230b57 [PDFs] Respect the text wrapping settings on tables (#77090)
Fixes UXW-4714.

The static viz for tables uses a fixed width, but it was too big for the
PDFs, causing tables with long text in columns to lay out badly.

This PR disables the fixed width of `780px` on tables for PDFs, so that
the tables now lay out correctly.
2026-09-10 15:39:28 +00:00
Ben Grabow
503349c6ae Fix duplicates of the same namespace name (#81974)
* Fix collisions on metabase.notification.payload.core-test namespace name. Lint for future collisions.

* Include .clj-kondo/{src,test} in backend check triggers

* Expect the new project test namespace

* Symbolically reference project test suite namespaces

* Include resources, test_resources, test_config dirs in project checks

* Return [namespace relative-path] pairs.
Skip local/src

* Catch read-file errors and explain why some files may not have ns forms

* Sort paths that collide
2026-09-10 10:24:17 -05:00
Jeff Bruemmer
4d60c4bcf5 docs - nav link check (#82211) 2026-09-10 15:08:17 +00:00
Chris Truter
d9f905b7da Fix H2 migration failures after running transforms (#82135)
* Copy the transform tables in dump-to-h2 and load-from-h2

None of the nine transform_* models were in copy/entities, but metabase_table is,
and it carries a transform_id FK to transform. A table row reached the target
referencing a transform row that never arrived, and the deferred FK check
rejected it at commit.

transform_run_cancelation also goes in entities-without-autoinc-ids, since its
primary key is run_id rather than an autoincrement id.

Adds copied-tables-have-copied-fk-parents-test, which migrates a throwaway H2
database and fails if any copied table's FK parent is not copied.

* Simplify the copy foreign-key regression test

* Clarify the foreign-key coverage test names
2026-09-10 14:42:03 +00:00
Andrei Simionescu
36f273d523 BOT-1790: Redact Metabot chain-of-thought details in embedded sessions (#81872) 2026-09-10 14:01:55 +01:00
Alexander Polyankin
38cda45f69 Type every :any and [:map-of :keyword ...] property in the API (#82196)
* Make defendpoint reject request schemas that reach an open map, a keyword-keyed map-of or :any

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Close the MBQL 5 query and column schemas and declare the keys the query processor adds

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Type the shared schemas requests reach and drop ms/Map and ms/JSONString

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Close every map schema a request can reach

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Regenerate the modules config

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Keep action parameters string-keyed and type lens params and permission graph ids

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Declare the sandbox coercion keys a column's options can carry

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Declare the alias-info and Mongo keys a column can carry and strip internal keys from legacy column metadata

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Carry the Mongo column keys in the serialize test fixture

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Declare the keys the frontend and query processor put on columns, parameters and card embeds

- column metadata: :remapping, a typed :lib/options, the nest-breakouts option key
- query parameters accept the rest of a stored filter declaration
  (sectionId, isMultiSelect, values source config etc.)
- static-list values may be one-tuples; raw-value template tags may
  carry a nil widget-type
- card embed attrs declare chart_href, child_target_id and host_data;
  explore filter refs accept the legacy field_ref the chart column has
- notification card echoes a metric's query_description
- serialization deep-sort orders mixed keyword/string keys
- viz-settings column refs are normalized before matching; a Field
  hydrated with its table can be fingerprinted; broken segment
  definitions read back as nil
- test fixtures: real fingerprints, snippet tag type, http channel
  details, comment content, no min_duration_ms on duration strategies

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Wire the defendpoint check, keep every map single-keyed, and apply the review findings

- defendpoint now calls closed-schemas/check! on every request schema;
  the walker no longer lets :any leak through collections, treats
  map?/:some as :any, skips :=/:enum/:fn values and never skips the
  default entry
- no map mixes keyword and string keys: ms/string-keyed-object gives an
  opaque JSON object string-keyed declared entries; ProseMirror attrs
  (documents, comments, explorations embeds), CSV upload parts, search
  weights and testing query specs use it and their readers use string
  keys; the serdes deep-sort comparator is back to master
- the Metabot context is fully typed from the frontend types instead of
  an opaque default; a draft transform query without a database is
  accepted
- permission graphs, settings PUT and SCIM PATCH reject a body whose
  map-of entries the decoder dropped; ad-hoc query endpoints drop a
  client-sent cache strategy; action parameter values keep collections
  out without nil-ing them; SCIM meta.resourceType is optional; sandbox
  user attributes are LoginAttributes; a metric filter clause carries its
  offset options; explore filter refs are the legacy field_ref the
  chart column has; result_metadata written by older releases and
  hasVariableTemplateTagTarget on parameters are declared; a bare
  map-of on a request path is guarded against scalars

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Close the endpoints tests define and let a column's target and name field be an id reference

The check runs on every defendpoint, the ones test namespaces define included. A column's
:target and :name-field are hydrated Fields on the backend but id references in the
metadata the frontend hands over; the closed column schema nil'd the reference, which
lost the search field of a model's primary key.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Hand an action's query only the parameter values, and fix two fixtures the closed schemas caught

A query action's stored parameters carry the frontend's widget settings; the query gets
the value keys. The Metabot viewing-context tests use ids no card can have, and the
Mongo cache test spells the strategy key the schema does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Declare the table name BigQuery's compiled native form carries on a native stage

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Keep a BigQuery RECORD's sub-field sync metadata off its result column, and fix a binning fixture

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 08:17:08 -04:00
Timofey Kachalov
fc18a66b6c Add remaining data apps sandboxing e2e (#82170) 2026-09-10 15:44:38 +04:00
Chris Vandoodewaard
433561ad5b Move Snyk scans into the Lint Security workflow (#82197)
* Move Snyk scans into the Lint Security workflow

Fold snyk.yml's three jobs into lint.security.yml as snyk-generate-poms,
snyk-frontend-projects, and snyk-maven-projects, and delete snyk.yml.

Snyk now runs on the existing daily 11:00 UTC cron instead of its own
05:00 cron and dependency-file push trigger. The notify job reports Snyk
failures to Slack alongside CodeQL and Trivy, and Snyk's upload-sarif is
bumped from v3 to v4 to match the rest of the workflow.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* add timeouts

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 07:16:23 -04:00
Will Fry
3c23f921e2 GDGT-3132 fix misaligned undo toast (#82045)
* GDGT-3132 fix misaligned undo toast

* migrate UndoListing to from styled components to CSS module

* absolute px -> rem, compact -> compact-md

* fix inconsistent toast height, use line-height instead of measuring the DOM to handle single vs multi line layouts

* strip comments
2026-09-10 11:06:19 +00:00
Oleh K
7f4883cc49 Fix inefficiencies in formatValue (#82103)
* GDGT-3195: Fix inefficiencies in formatValue

formatValue is fine per-cell but pathological in bulk; the "Copy results"
button made this visible, with a 100x2000 grid spending ~4.5s in this path.

- Drop a dead dayjs strict parse. The format literal 'T' is not valid dayjs
  escaping (dayjs wants [T]), so isValid() returned false for every value.
  It sat above the string/number/boolean branches, so every non-date cell
  paid for it.
- Only JSON.parse the value when a markdown_template will consume it,
  instead of on every call.
- Memoize the per-column type predicates (isURL/isEmail/isTime/isDate/
  isNumber/isCoordinate/isBoolean) in a WeakMap keyed on the column. Each
  fans out into recursive type-hierarchy lookups that cross into CLJS, and
  they only depend on the column. Entries snapshot the type fields they
  were computed from, since the custom-viz API hands third-party code
  mutable column objects.
- Skip new URL() construction for values with no ":" in getUrlProtocol.
- Cache Intl.NumberFormat by its constructor options, bounded at 100
  entries with oldest-first eviction.

Also make the value-formatting signatures honest: formatUrl, getLinkText,
getLinkUrl and getRemappedValue take unknown, which is what they actually
receive. getUrlProtocol keeps its string signature, with getLinkUrl
narrowing before the call. This removes both `value as string` casts.

Benchmarked with a synthetic 100x2000 copy path (medians of 5):
full table 4512ms -> 440ms, text 1231 -> 12, currency 637 -> 20,
integer 535 -> 15, boolean 343 -> 5, email 101 -> 4.

Claude-Session: https://claude.ai/code/session_01KUcocQj2bJPwVBi4dXKyEP

* Cleanup

* Revert the createPlainCellFormatter change

Hoisting the options spread out of the per-cell closure is not worth the
churn. Measured in isolation with a realistic 22-key columnSettings, the
spread costs 0.023us per cell against 0.002us to reuse a hoisted
reference, so it saves ~4ms per 200k cells — a rounding error next to the
dead dayjs parse at ~13.5us per cell, and nothing at all for columns with
click behaviour, where both shapes spread per cell anyway.

* Address review feedback

Guard the markdown_template JSON.parse with a typeof check instead of
carrying the placeholder cast comment.

Cover the two changes the review called out as untested:

- numberFormatterForOptions returns the same formatter for equivalent
  options, a separate one for different options, and evicts the oldest
  entry once the cache is full. The eviction test resets the module so
  the 100-entry boundary does not depend on what earlier tests cached.
- formatUrl passes strings and numbers through untouched and renders
  booleans and objects rather than returning them raw.

Both were checked by mutation: breaking the coercion and stubbing the
cache lookup to always miss fails exactly those assertions.
2026-09-10 12:49:27 +02:00
Fraser
667d038d46 Move the upload error modal slot into status (#82242) 2026-09-10 21:18:59 +12:00
Fraser
19df422bbd Move the storage setup provider slot beside its context (#82243) 2026-09-10 17:44:42 +12:00
Fraser
9fff12013e Move the DataReference library pane slot into querying (#81858)
* Move the DataReference library pane slot into querying

DataReference is the slot's only reader and querying owns its props type, so the slot lives next to it as PLUGIN_DATA_REFERENCE.LibraryPane.
The enterprise library plugin registers into it at boot, and plugins/oss/library.ts no longer imports querying's DataReference types.
2026-09-10 17:44:28 +12:00
Fraser
4bc6ccb00c Move the verified search filter slot into search (#81860)
* Move the verified search filter slot into search

SearchSidebar is the only reader of PLUGIN_CONTENT_VERIFICATION.VerifiedFilter, so the field becomes PLUGIN_SEARCH_FILTERS in metabase/search/plugin, next to the other search filter components. The EE content verification plugin registers the filter there from initializePlugin, and the rest of PLUGIN_CONTENT_VERIFICATION stays in plugins without the search import.

* Declare the search filters slot with definePluginSlot

* Import definePluginSlot from the plugins entry point

* Describe the verified filter default without naming its consumer

* Cover enterprise feature gates and plugin reset behaviour

* Remove redundant plugin registration tests
2026-09-10 17:44:12 +12:00
Fraser
81049d6069 Move the entity icon slot into hooks (#81857)
* Move the useGetIcon plugin slot into hooks/use-icon

The hook is the slot's only reader, so the slot and its OSS default live next to it as PLUGIN_ICON.
The enterprise collections plugin registers into it at boot, and plugins/oss/collections.ts no longer imports metabase/hooks/use-icon.

* Declare the entity icon slot with definePluginSlot

* Import definePluginSlot from the plugins entry point

* Cover enterprise feature gates and plugin reset behaviour

* Remove redundant plugin registration tests
2026-09-10 17:43:59 +12:00
Fraser
85ce065045 Remove the stale dashboard selectors side-effect entry (#82252) 2026-09-10 17:43:34 +12:00
Romeo Van Snick
dcb85ae924 Trigger the stats workflows from Run tests, gated on the uberjar artifact (#82244)
* Trigger the stats workflows from Run tests, gated on the uberjar artifact

Both workflows have recorded nothing since 2026-09-03. PR #81238 took the push
trigger off `uberjar.yml`, so master merges reach it only through
`workflow_call`. A reusable workflow reached that way raises no `workflow_run`
event, and both watchers went quiet. 143 master commits went unmeasured.

They now watch "Run tests", which is what builds the jar on a master merge.
Its conclusion is not a usable gate, because it is `failure` on master more
often than `success`, from jobs that have nothing to do with the jar. The
uberjar artifact is the right gate: a new job looks it up without downloading
it, and a docs-only merge that skipped the build finds nothing and stops.

Calling both from `run-tests.yml` would have been lower latency, but a stats
failure would then turn the master run red, and `rerun-workflows.yml` watches
that run and would re-run master CI over it. Keeping them in their own run
keeps a stats problem to itself.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01171Lkmug15JzrcN2aMBLMk

* Let a PR run the size benchmark against its own uberjar

A `workflow_run` workflow always runs the copy on the default branch, so a
change here cannot be tried out before it merges. This matches the trigger
Bundle Load Stats already carries. A called run measures and reports; the
upload step stays gated on the `workflow_run` path, so it writes no row.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01171Lkmug15JzrcN2aMBLMk

* Trim the trigger comments in the stats workflows

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 14:38:31 +10:00
Romeo Van Snick
3403f82c0a Build the dashcard question and metric series from the store (#82250) 2026-09-10 14:32:27 +10:00
Romeo Van Snick
95306c12fc Take metadata options at the store door (#82249)
* Take metadata options at the store door

* Build the conversation detail questions from the store

* Select the test fixtures through the store door
2026-09-10 14:32:17 +10:00
github-automation-metabase
5d1e1ad8f1 Auto-update documentation for master (#82227)
Update generated docs (master)

Co-authored-by: github-actions <github-actions@github.com>
2026-09-10 00:06:10 -04:00
853 changed files with 25119 additions and 8367 deletions

View File

@@ -149,8 +149,7 @@ ms/NonBlankString ;; Non-empty string
ms/BooleanValue ;; String "true"/"false" or boolean
ms/MaybeBooleanValue ;; BooleanValue or nil
ms/TemporalString ;; ISO-8601 date/time string (for REQUEST params only!)
ms/Map ;; Any map
ms/JSONString ;; JSON-encoded string
ms/OpaqueJSONObject ;; JSON object whose keys are not ours to declare; string-keyed
ms/PositiveNum ;; Positive number
ms/IntGreaterThanOrEqualToZero ;; 0 or positive
```

View File

@@ -109,6 +109,7 @@
query-processor
search
settings
users
util
warehouses}
:model-exports #{:model/Action}
@@ -1446,6 +1447,7 @@
transforms
transforms-base
util
warehouse-schema
warehouses}
:model-exports #{:model/AiUsageLog
:model/Metabot
@@ -1596,6 +1598,7 @@
parameters
permissions
premium-features
queries
query-processor
request
session
@@ -1887,6 +1890,7 @@
graph
lib
lib-be
lib-metric
metrics
models
parameters
@@ -2709,6 +2713,7 @@
driver
events
lib
lib-be
model-persistence
models
permissions
@@ -2997,6 +3002,7 @@
query-processor
segments
settings
types
util
warehouse-schema}
:model-imports #{:model/Card

View File

@@ -159,6 +159,8 @@ project_backend_checks:
- "modules/**/*.cljc"
- "modules/**/*.cljs"
- "**deps.edn"
- ".clj-kondo/{src,test}/**/*.{clj,cljc,cljs}"
- "{resources,test_resources,test_config}/**/*.{clj,cljc,cljs}"
- ".clj-kondo/config.edn"
- ".clj-kondo/config/modules/config.edn"
- ".github/team.json"

View File

@@ -200,7 +200,9 @@ export function main() {
// The last plotted point, as slim rows: [{ bundle, kind, rawBytes, gzipBytes, brotliBytes }].
previous: readJson<CacheRow[]>(env.LAST) || [],
threshold: Number(env.MIN_DELTA_PERCENT ?? 1),
date: new Date().toISOString().slice(0, 10), // YYYY-MM-DD
// The commit's own time rather than the day it was measured, so the merges
// of one day keep their order on the chart.
date: new Date(env.COMMIT_TIMESTAMP || Date.now()).toISOString(),
commit: (env.HEAD_SHA || "").slice(0, 12),
commitMessage: (env.COMMIT_MESSAGE || "").split("\n")[0], // subject line only
version: readVersion(env.VERSION_PROPS),

View File

@@ -31,16 +31,20 @@ interface Condition {
interface CommitStamp {
sha: string;
subject: string;
/** ISO 8601, in UTC. */
timestamp: string;
}
type LoadTimeRow = Record<string, string | number>;
function buildRows(
conditions: Condition[],
{ sha, subject }: CommitStamp,
{ sha, subject, timestamp }: CommitStamp,
): LoadTimeRow[] {
return conditions.map((condition) => ({
Date: new Date().toISOString().slice(0, 10),
// The commit's own time rather than the day it was measured, so the merges
// of one day keep their order and a backfilled row lands on its commit.
Date: timestamp,
// Truncated the same way the bundle-size table does, so the two join.
Commit: sha.slice(0, 12),
// The stats table carries a free-text Description column. Populate it with
@@ -77,6 +81,7 @@ async function main() {
const rows = buildRows(conditions, {
sha: process.env.HEAD_SHA || "",
subject: process.env.COMMIT_MESSAGE || "",
timestamp: new Date(process.env.COMMIT_TIMESTAMP || Date.now()).toISOString(),
});
console.table(rows);

View File

@@ -4,25 +4,54 @@ name: Bundle Size Stats
# emitted JS) plus the bundle-stats and embedding-sdk artifacts, measures
# initial/total bundle sizes, and appends them to eng-stats-importer.
# Triggered by "Run tests", which is the workflow that builds the uberjar on a
# master merge.
on:
workflow_run:
workflows: ["Build Uberjar"]
workflows: ["Run tests"]
types: [completed]
# Master only: releases form non-linear lines whose deltas are meaningless,
# so their sizes are backfilled separately rather than logged here.
branches: [master]
workflow_call:
inputs:
commit:
description: "Commit SHA to measure."
type: string
required: false
default: ""
concurrency:
group: bundle-size-stats-${{ github.event.workflow_run.head_sha }}
group: bundle-size-stats-${{ inputs.commit || github.event.workflow_run.head_sha }}
cancel-in-progress: true
jobs:
# "Run tests" concludes `failure` on master more often than `success`, from
# jobs that have nothing to do with the jar, so its conclusion is not a usable
# gate. The artifact is one: the uberjar job publishes it, and a docs-only
# merge that skipped that job publishes none.
uberjar-built:
if: ${{ github.repository == 'metabase/metabase' }}
runs-on: ${{ vars.SLIM_RUNNER_KEY }}
timeout-minutes: 5
outputs:
found: ${{ steps.probe.outputs.fetch-hit }}
steps:
- uses: actions/checkout@v6
- id: probe
uses: ./.github/actions/fetch-artifact
with:
commit: ${{ inputs.commit || github.event.workflow_run.head_sha }}
edition: ee
download: false
bundle-size-stats:
if: ${{ github.event.workflow_run.conclusion == 'success' && github.repository == 'metabase/metabase' }}
needs: [uberjar-built]
if: ${{ needs.uberjar-built.outputs.found == 'true' }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
env:
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
HEAD_SHA: ${{ inputs.commit || github.event.workflow_run.head_sha }}
# Only record a data point when a bundle's as-served size (brotli where the
# build ships .br, else gzip) moved by at least this percent vs the last
# plotted point, keeping the chart to real changes.
@@ -31,12 +60,12 @@ jobs:
- name: Check out the code
uses: actions/checkout@v6
with:
ref: ${{ github.event.workflow_run.head_sha }}
ref: ${{ env.HEAD_SHA }}
- uses: ./.github/actions/prepare-node-bun
- name: Download EE uberjar
uses: ./.github/actions/fetch-artifact
with:
commit: ${{ github.event.workflow_run.head_sha }}
commit: ${{ env.HEAD_SHA }}
edition: ee
extract-path: temp/uberjar
- name: Extract front-end bundles from uberjar
@@ -105,10 +134,11 @@ jobs:
# Passed via env (not interpolated into the shell) so the commit
# message can't inject commands; the script keeps only the subject.
COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
COMMIT_TIMESTAMP: ${{ github.event.workflow_run.head_commit.timestamp }}
run: bun ./.github/scripts/bundle-size-stats-prepare.ts
- name: Import sizes (with deltas) into Stats
id: upload
if: steps.prepare.outputs.significant == 'true'
if: ${{ steps.prepare.outputs.significant == 'true' && inputs.commit == '' }}
env:
ROWS: artifacts/upload-rows.json
ENG_STATS_URL: ${{ secrets.ENG_STATS_URL }}

View File

@@ -32,3 +32,9 @@ jobs:
fail: true
args: docs --config ./.lychee/config.toml --offline
format: markdown
# lychee can't read the YAML nav, so this script renders it as markdown first. lychee is on PATH
# from the step above.
- name: Check nav.yml links
if: ${{ !cancelled() }}
run: docs/util/check-links.sh nav

View File

@@ -36,6 +36,7 @@ jobs:
uses: github/codeql-action/analyze@v4
trivy:
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
@@ -68,8 +69,157 @@ jobs:
sarif_file: trivy-results-${{ matrix.edition }}.sarif
category: trivy-${{ matrix.edition }}
# Generate pom.xml files for all Maven projects
snyk-generate-poms:
name: Generate pom.xml files
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate all pom.xml
run: .github/scripts/write-poms.sh
- name: Upload pom files
uses: actions/upload-artifact@v7
with:
name: pom-files
path: |
pom.xml
modules/drivers/*/pom.xml
# Yarn/NPM projects that don't need pom files
snyk-frontend-projects:
name: ${{ matrix.project.name }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
strategy:
matrix:
project:
- name: Main Frontend (bun w/ yarn.lock)
file: yarn.lock
package-manager: yarn
category: main-frontend-bun
- name: Release Helper
file: release/yarn.lock
package-manager: yarn
category: release-helper
steps:
- uses: actions/checkout@v6
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: 'package.json'
token: ${{ secrets.GITHUB_TOKEN }}
# Snyk doesn't support bun.lock yet, so we generate yarn.lock and scan that.
# Bun has a bug where it normalizes "< 3.0.0" to "< 3" in alias entries
# but not in dependency specs, causing Snyk to fail matching dependencies.
# The sed commands fix this inconsistency. Bun also names aliased entries
# after the aliased package instead of the alias, which the script fixes.
# Both continue on error to let Snyk report parsing issues directly rather
# than failing on the workaround.
- name: Generate yarn.lock
if: matrix.project.file == 'yarn.lock'
run: |
bun install --yarn
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
- name: Generate release/yarn.lock
if: matrix.project.file == 'release/yarn.lock'
run: |
bun install --yarn
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
working-directory: release
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
- name: Run snyk test
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
continue-on-error: true
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=${{ matrix.project.package-manager }} --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
- name: Upload results
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: snyk-${{ matrix.project.category }}.sarif
category: ${{ matrix.project.category }}
# Maven projects that need pom files
snyk-maven-projects:
needs: snyk-generate-poms
name: ${{ matrix.project.name }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
strategy:
matrix:
project:
- name: Main Backend (maven)
file: pom.xml
category: main-backend-maven
- name: Driver - Athena
file: modules/drivers/athena/pom.xml
category: driver-athena
- name: Driver - BigQuery Cloud SDK
file: modules/drivers/bigquery-cloud-sdk/pom.xml
category: driver-bigquery-cloud-sdk
- name: Driver - ClickHouse
file: modules/drivers/clickhouse/pom.xml
category: driver-clickhouse
- name: Driver - Databricks
file: modules/drivers/databricks/pom.xml
category: driver-databricks
- name: Driver - Druid JDBC
file: modules/drivers/druid-jdbc/pom.xml
category: driver-druid-jdbc
- name: Driver - Hive-like
file: modules/drivers/hive-like/pom.xml
category: driver-hive-like
- name: Driver - MongoDB
file: modules/drivers/mongo/pom.xml
category: driver-mongo
- name: Driver - Oracle
file: modules/drivers/oracle/pom.xml
category: driver-oracle
- name: Driver - Presto JDBC
file: modules/drivers/presto-jdbc/pom.xml
category: driver-presto-jdbc
- name: Driver - Redshift
file: modules/drivers/redshift/pom.xml
category: driver-redshift
- name: Driver - Snowflake
file: modules/drivers/snowflake/pom.xml
category: driver-snowflake
- name: Driver - SparkSQL
file: modules/drivers/sparksql/pom.xml
category: driver-sparksql
- name: Driver - SQL Server
file: modules/drivers/sqlserver/pom.xml
category: driver-sqlserver
- name: Driver - Starburst
file: modules/drivers/starburst/pom.xml
category: driver-starburst
- name: Driver - Vertica
file: modules/drivers/vertica/pom.xml
category: driver-vertica
steps:
- uses: actions/checkout@v6
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
- name: Download pom files
uses: actions/download-artifact@v8
with:
name: pom-files
- name: Run snyk test
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
continue-on-error: true
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=maven --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
- name: Upload results
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: snyk-${{ matrix.project.category }}.sarif
category: ${{ matrix.project.category }}
notify:
needs: [codeql, trivy]
needs: [codeql, trivy, snyk-frontend-projects, snyk-maven-projects]
if: ${{ failure() && github.repository == 'metabase/metabase' }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
@@ -94,6 +244,8 @@ jobs:
const scans = [
['CodeQL', '${{ needs.codeql.result }}'],
['Trivy', '${{ needs.trivy.result }}'],
['Snyk (frontend)', '${{ needs.snyk-frontend-projects.result }}'],
['Snyk (maven)', '${{ needs.snyk-maven-projects.result }}'],
];
const failed = scans.filter(([, result]) => result === 'failure').map(([name]) => name);

View File

@@ -0,0 +1,128 @@
name: Update E2E Timings
permissions:
contents: write
pull-requests: write
on:
workflow_dispatch:
inputs:
days_back:
description: "Number of days to look back for timing artifacts"
type: number
default: 7
required: false
schedule:
# Run weekly on Sundays at 6 AM UTC
- cron: "0 6 * * 0"
jobs:
collect-and-average-timings:
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
env:
DAYS_BACK: ${{ inputs.days_back || 7 }}
steps:
- name: Generate GitHub App Token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
- uses: actions/checkout@v6
with:
token: ${{ steps.app-token.outputs.token }}
- name: Setup Node.js
uses: actions/setup-node@v6.4.0
with:
node-version: 22
- name: Collect and average timing data
id: collect-timings
uses: actions/github-script@v9
with:
script: |
const { collectAndAverageTimings } = require('${{ github.workspace }}/.github/scripts/average-e2e-timings.js');
const result = await collectAndAverageTimings({
github,
context,
token: '${{ steps.app-token.outputs.token }}',
daysBack: ${{ env.DAYS_BACK }},
existingTimingsPath: 'e2e/support/timings.json'
});
core.setOutput('artifact-count', result.artifactCount);
- name: Configure git and commit changes
id: commit
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add e2e/support/timings.json
# Check if anything changed before commit/push
if git diff --cached --quiet; then
echo "changed=false" >> "$GITHUB_OUTPUT"
echo "Timing data is unchanged; skipping the pull request"
exit 0
fi
DATE=$(date +%Y%m%d-%H%M%S)
BRANCH_NAME="update-e2e-timings-$DATE"
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
echo "Branch name will be: $BRANCH_NAME"
git checkout -b "$BRANCH_NAME"
git commit -m "update e2e timings $DATE" --no-verify
git push -u origin "$BRANCH_NAME"
echo "changed=true" >> "$GITHUB_OUTPUT"
- name: Create Pull Request
id: create_pr
if: steps.commit.outputs.changed == 'true'
env:
GH_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
run: |
BODY=$(cat <<'EOF'
## Summary
This PR updates the E2E test timing data with averaged values from recent test runs.
## Details
- Collected data from the last **${{ env.DAYS_BACK }} days** of test runs
- Averaged timing data from **${{ steps.collect-timings.outputs.artifact-count }}** test runs
## Generated automatically
🤖 This PR was created automatically by the `update-e2e-timings` workflow.
The timing data helps cypress-split optimize test distribution across parallel jobs.
Co-Authored-By: GitHub Actions <actions@github.com>
EOF
)
URL=$(gh pr create \
--base master \
--head "$BRANCH_NAME" \
--title "[chore] Update E2E test timings with recent data" \
--body "$BODY" \
--label ".CI & Tests" \
--label "no-backport" \
--reviewer metabase/devexp)
PR_NUMBER=${URL##*/}
echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
- name: Approve and Merge the PR
if: steps.commit.outputs.changed == 'true'
env:
# uses a different token than the token that created the PR so we can approve and merge it
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ steps.create_pr.outputs.pr_number }}
shell: bash
run: |
gh pr review --approve "$PR_NUMBER"
gh pr merge --squash --auto "$PR_NUMBER"

View File

@@ -1,165 +0,0 @@
name: "Snyk"
on:
push:
branches:
- "master"
- "release-**"
paths:
- "**/deps.edn"
- "**/package.json"
- ".github/workflows/snyk.yml"
- ".github/scripts/write-poms.sh"
- ".github/scripts/fix-yarn-lock-aliases.ts"
schedule:
- cron: "0 5 * * *"
jobs:
# Generate pom.xml files for all Maven projects
generate-poms:
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
name: Generate pom.xml files
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- uses: actions/checkout@v6
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate all pom.xml
run: .github/scripts/write-poms.sh
- name: Upload pom files
uses: actions/upload-artifact@v7
with:
name: pom-files
path: |
pom.xml
modules/drivers/*/pom.xml
# Yarn/NPM projects that don't need pom files
frontend-projects:
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
name: ${{ matrix.project.name }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
strategy:
matrix:
project:
- name: Main Frontend (bun w/ yarn.lock)
file: yarn.lock
package-manager: yarn
category: main-frontend-bun
- name: Release Helper
file: release/yarn.lock
package-manager: yarn
category: release-helper
steps:
- uses: actions/checkout@v6
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: 'package.json'
token: ${{ secrets.GITHUB_TOKEN }}
# Snyk doesn't support bun.lock yet, so we generate yarn.lock and scan that.
# Bun has a bug where it normalizes "< 3.0.0" to "< 3" in alias entries
# but not in dependency specs, causing Snyk to fail matching dependencies.
# The sed commands fix this inconsistency. Bun also names aliased entries
# after the aliased package instead of the alias, which the script fixes.
# Both continue on error to let Snyk report parsing issues directly rather
# than failing on the workaround.
- name: Generate yarn.lock
if: matrix.project.file == 'yarn.lock'
run: |
bun install --yarn
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
- name: Generate release/yarn.lock
if: matrix.project.file == 'release/yarn.lock'
run: |
bun install --yarn
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
working-directory: release
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
- name: Run snyk test
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
continue-on-error: true
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=${{ matrix.project.package-manager }} --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
- name: Upload results
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: snyk-${{ matrix.project.category }}.sarif
category: ${{ matrix.project.category }}
# Maven projects that need pom files
maven-projects:
needs: generate-poms
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
name: ${{ matrix.project.name }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
strategy:
matrix:
project:
- name: Main Backend (maven)
file: pom.xml
category: main-backend-maven
- name: Driver - Athena
file: modules/drivers/athena/pom.xml
category: driver-athena
- name: Driver - BigQuery Cloud SDK
file: modules/drivers/bigquery-cloud-sdk/pom.xml
category: driver-bigquery-cloud-sdk
- name: Driver - ClickHouse
file: modules/drivers/clickhouse/pom.xml
category: driver-clickhouse
- name: Driver - Databricks
file: modules/drivers/databricks/pom.xml
category: driver-databricks
- name: Driver - Druid JDBC
file: modules/drivers/druid-jdbc/pom.xml
category: driver-druid-jdbc
- name: Driver - Hive-like
file: modules/drivers/hive-like/pom.xml
category: driver-hive-like
- name: Driver - MongoDB
file: modules/drivers/mongo/pom.xml
category: driver-mongo
- name: Driver - Oracle
file: modules/drivers/oracle/pom.xml
category: driver-oracle
- name: Driver - Presto JDBC
file: modules/drivers/presto-jdbc/pom.xml
category: driver-presto-jdbc
- name: Driver - Redshift
file: modules/drivers/redshift/pom.xml
category: driver-redshift
- name: Driver - Snowflake
file: modules/drivers/snowflake/pom.xml
category: driver-snowflake
- name: Driver - SparkSQL
file: modules/drivers/sparksql/pom.xml
category: driver-sparksql
- name: Driver - SQL Server
file: modules/drivers/sqlserver/pom.xml
category: driver-sqlserver
- name: Driver - Starburst
file: modules/drivers/starburst/pom.xml
category: driver-starburst
- name: Driver - Vertica
file: modules/drivers/vertica/pom.xml
category: driver-vertica
steps:
- uses: actions/checkout@v6
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
- name: Download pom files
uses: actions/download-artifact@v8
with:
name: pom-files
- name: Run snyk test
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
continue-on-error: true
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=maven --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
- name: Upload results
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: snyk-${{ matrix.project.category }}.sarif
category: ${{ matrix.project.category }}

View File

@@ -8,17 +8,15 @@ name: Bundle Load Stats
# signed-in user alone, so seeding content would not change a single byte of the
# document this measures.
# Triggered by "Run tests", which is the workflow that builds the uberjar on a
# master merge.
on:
workflow_run:
workflows: ["Build Uberjar"]
workflows: ["Run tests"]
types: [completed]
# Master only: a release forms a non-linear line whose times cannot be
# compared against the commit before it.
branches: [master]
# A `workflow_run` workflow always runs the copy on the default branch, so a
# change here cannot be tried out before it merges. The call lets a PR run
# this branch's copy against the uberjar CI already built. A called run
# measures and reports; it does not write rows to Stats.
workflow_call:
inputs:
commit:
@@ -32,8 +30,28 @@ concurrency:
cancel-in-progress: true
jobs:
# "Run tests" concludes `failure` on master more often than `success`, from
# jobs that have nothing to do with the jar, so its conclusion is not a usable
# gate. The artifact is one: the uberjar job publishes it, and a docs-only
# merge that skipped that job publishes none.
uberjar-built:
if: ${{ github.repository == 'metabase/metabase' }}
runs-on: ${{ vars.SLIM_RUNNER_KEY }}
timeout-minutes: 5
outputs:
found: ${{ steps.probe.outputs.fetch-hit }}
steps:
- uses: actions/checkout@v6
- id: probe
uses: ./.github/actions/fetch-artifact
with:
commit: ${{ inputs.commit || github.event.workflow_run.head_sha }}
edition: ee
download: false
bundle-load-stats:
if: ${{ github.repository == 'metabase/metabase' && (inputs.commit != '' || github.event.workflow_run.conclusion == 'success') }}
needs: [uberjar-built]
if: ${{ needs.uberjar-built.outputs.found == 'true' }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
@@ -102,6 +120,7 @@ jobs:
# Passed via env (not interpolated into the shell) so the commit
# message can't inject commands; the script keeps only the subject.
COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
COMMIT_TIMESTAMP: ${{ github.event.workflow_run.head_commit.timestamp }}
ENG_STATS_URL: ${{ secrets.ENG_STATS_URL }}
API_KEY: ${{ secrets.ENG_STATS_API_KEY }}
run: bun .github/scripts/upload-bundle-load-stats.ts

View File

@@ -1,103 +0,0 @@
name: Update E2E Timings
permissions:
contents: write
pull-requests: write
on:
workflow_dispatch:
inputs:
days_back:
description: "Number of days to look back for timing artifacts"
type: number
default: 7
required: false
schedule:
# Run weekly on Sundays at 6 AM UTC
- cron: "0 6 * * 0"
jobs:
collect-and-average-timings:
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
env:
DAYS_BACK: ${{ inputs.days_back || 7 }}
steps:
- name: Generate GitHub App Token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
- uses: actions/checkout@v6
with:
token: ${{ steps.app-token.outputs.token }}
- name: Setup Node.js
uses: actions/setup-node@v6.4.0
with:
node-version: 22
- name: Collect and average timing data
id: collect-timings
uses: actions/github-script@v9
with:
script: |
const { collectAndAverageTimings } = require('${{ github.workspace }}/.github/scripts/average-e2e-timings.js');
const result = await collectAndAverageTimings({
github,
context,
token: '${{ steps.app-token.outputs.token }}',
daysBack: ${{ env.DAYS_BACK }},
existingTimingsPath: 'e2e/support/timings.json'
});
core.setOutput('artifact-count', result.artifactCount);
- name: Set up git configuration
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
BRANCH_NAME="update-e2e-timings-$(date +%Y%m%d-%H%M%S)"
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
echo "Branch name will be: $BRANCH_NAME"
- name: Create Pull Request
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
token: ${{ steps.app-token.outputs.token }}
branch: ${{ env.BRANCH_NAME }}
base: master
commit-message: |
Update E2E test timings with averaged data
Collected timing data from ${{ env.DAYS_BACK }} days of test runs.
All specs with timing data were included (simple averages).
🤖 Generated automatically by update-e2e-timings workflow
Co-Authored-By: GitHub Actions <actions@github.com>
committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
title: "[chore] Update E2E test timings with recent data"
body: |
## Summary
This PR updates the E2E test timing data with averaged values from recent test runs.
## Details
- Collected data from the last **${{ env.DAYS_BACK }} days** of test runs
- Averaged timing data from **${{ steps.collect-timings.outputs.artifact-count }}** test runs
## Generated automatically
🤖 This PR was created automatically by the `update-e2e-timings` workflow.
The timing data helps cypress-split optimize test distribution across parallel jobs.
Co-Authored-By: GitHub Actions <actions@github.com>
labels: |
.CI & Tests
no-backport
add-paths: e2e/support/timings.json
team-reviewers: |
devexp

View File

@@ -1,5 +1,16 @@
accept = ["200..=204", "429"]
exclude = ["\\.html(#.*)?$"]
exclude = [
"\\.html(#.*)?$",
# Liquid templates ({{page.version}}) in docs/embedding/sdk are rendered by the docs site, not here.
"%7B%7B",
# Bot-blocked: 403 for anything that isn't a browser.
"^https://(www|dev)\\.mysql\\.com/",
"^https://platform\\.deepseek\\.com/",
# Login-walled: redirects forever between console and auth.
"^https://console\\.mistral\\.ai/",
# GitHub renders issue comments client-side, so lychee can't see #issuecomment anchors.
"^https://github\\.com/.+/issues/\\d+#issuecomment-",
]
exclude_path = ["docs/util", "docs/embedding/sdk/api"]
no_progress = true
include_fragments = "full"

View File

@@ -81,7 +81,7 @@
"crc-32": "^1.2.2",
"cron-expression-validator": "^1.0.20",
"cronstrue": "^2.11.0",
"csv-parse": "^5.5.6",
"csv-parse": "^7.0.2",
"csv-stringify": "^6.5.0",
"d3": "^7.9.0",
"d3-scale": "^4.0.2",
@@ -103,7 +103,7 @@
"inflection": "^1.7.1",
"inquirer-toggle": "^1.0.1",
"js-cookie": "3.0.7",
"js-yaml": "^4.3.1",
"js-yaml": "^4.3.2",
"json5": "^2.2.2",
"jspdf": "^4.2.1",
"kbar": "0.1.0-beta.45",
@@ -389,13 +389,13 @@
"debug": "^4.3.4",
"esbuild": "^0.28.1",
"js-cookie": "^3.0.7",
"js-yaml": "^4.3.1",
"js-yaml": "^4.3.2",
"lodash": "^4.18.1",
"on-headers": "^1.1.0",
"prosemirror-model": "^1.25.4",
"prosemirror-state": "^1.4.4",
"prosemirror-view": "^1.40.1",
"qs": "6.15.2",
"qs": "6.16.0",
"redux": "5.0.1",
"webpack": "5.105.0",
},
@@ -2612,7 +2612,7 @@
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"csv-parse": ["csv-parse@5.5.6", "", {}, "sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A=="],
"csv-parse": ["csv-parse@7.0.2", "", {}, "sha512-uKZghv9UmPkMVLYy//KZ9HFAIJsl7wkhoEdIL0+rhuSY9pZQlhaeGEDPIe+/w7eh81MOql8Q/9+inAGWG6ZHYA=="],
"csv-stringify": ["csv-stringify@6.5.0", "", {}, "sha512-edlXFVKcUx7r8Vx5zQucsuMg4wb/xT6qyz+Sr1vnLrdXqlLD1+UKyWNyZ9zn6mUW1ewmGxrpVwAcChGF0HQ/2Q=="],
@@ -2888,7 +2888,7 @@
"es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="],
"es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
@@ -3598,7 +3598,7 @@
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
"js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="],
"js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="],
"jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="],
@@ -4450,7 +4450,7 @@
"qrcode-generator": ["qrcode-generator@2.0.4", "", {}, "sha512-mZSiP6RnbHl4xL2Ap5HfkjLnmxfKcPWpWe/c+5XxCuetEenqmNFf1FH/ftXPCtFG5/TDobjsjz6sSNL0Sr8Z9g=="],
"qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="],
"qs": ["qs@6.16.0", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA=="],
"querystring": ["querystring@0.2.0", "", {}, "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="],
@@ -5886,6 +5886,8 @@
"caching-transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="],
"call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"camel-case/tslib": ["tslib@2.2.0", "", {}, "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="],
@@ -5988,6 +5990,8 @@
"default-require-extensions/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="],
"define-data-property/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"define-data-property/gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="],
"define-properties/has-property-descriptors": ["has-property-descriptors@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.1.1" } }, "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="],
@@ -6038,16 +6042,12 @@
"enhanced-resolve/tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
"es-abstract/es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-abstract/is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
"es-abstract/object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
"es-abstract/which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="],
"es-define-property/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"es-get-iterator/call-bind": ["call-bind@1.0.2", "", { "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="],
"es-get-iterator/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
@@ -6164,8 +6164,6 @@
"formik/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"get-intrinsic/es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"gettext-parser/readable-stream": ["readable-stream@4.4.2", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA=="],
"gettext-parser/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
@@ -6186,6 +6184,8 @@
"handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"has-property-descriptors/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"has-tostringtag/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
"hash-base/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
@@ -6598,6 +6598,8 @@
"public-encrypt/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"qs/side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="],
"randombytes/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"randomfill/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
@@ -7284,6 +7286,8 @@
"data-urls/whatwg-url/tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="],
"deep-equal/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"deep-equal/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
"deep-equal/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
@@ -7316,6 +7320,8 @@
"deep-equal/which-typed-array/gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="],
"define-data-property/es-define-property/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"define-data-property/gopd/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"define-properties/has-property-descriptors/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
@@ -7342,12 +7348,6 @@
"detective-typescript/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
"es-define-property/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
"es-define-property/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
"es-define-property/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
"es-get-iterator/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
"es-get-iterator/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
@@ -7408,6 +7408,8 @@
"global-prefix/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
"has-property-descriptors/es-define-property/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"htmlparser2/domhandler/domelementtype": ["domelementtype@2.2.0", "", {}, "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="],
"htmlparser2/domutils/dom-serializer": ["dom-serializer@1.3.2", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig=="],
@@ -7444,6 +7446,8 @@
"is-typed-array/es-abstract/call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="],
"is-typed-array/es-abstract/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"is-typed-array/es-abstract/es-set-tostringtag": ["es-set-tostringtag@2.0.2", "", { "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" } }, "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q=="],
"is-typed-array/es-abstract/es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="],
@@ -7506,6 +7510,8 @@
"is-typed-array/es-abstract/which-typed-array": ["which-typed-array@1.1.14", "", { "dependencies": { "available-typed-arrays": "^1.0.6", "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.1" } }, "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg=="],
"is-weakset/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"is-weakset/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
"is-weakset/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
@@ -7594,6 +7600,8 @@
"jsdom/whatwg-url/tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="],
"json-stable-stringify/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"json-stable-stringify/call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"json-stable-stringify/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
@@ -7690,6 +7698,8 @@
"oas-resolver/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
"object-is/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"object-is/call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"object-is/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
@@ -7732,6 +7742,8 @@
"public-encrypt/parse-asn1/asn1.js": ["asn1.js@5.4.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" } }, "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA=="],
"qs/side-channel/side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="],
"raw-body/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
"react-docgen/@types/babel__core/@types/babel__traverse": ["@types/babel__traverse@7.14.2", "", { "dependencies": { "@babel/types": "^7.3.0" } }, "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA=="],
@@ -7892,6 +7904,8 @@
"which-typed-array/es-abstract/call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="],
"which-typed-array/es-abstract/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"which-typed-array/es-abstract/es-set-tostringtag": ["es-set-tostringtag@2.0.2", "", { "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" } }, "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q=="],
"which-typed-array/es-abstract/es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="],
@@ -8050,6 +8064,8 @@
"assert/call-bind/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
"assert/object.assign/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"assert/object.assign/call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
"assert/object.assign/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
@@ -8090,6 +8106,12 @@
"deep-equal/regexp.prototype.flags/set-function-name/has-property-descriptors": ["has-property-descriptors@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.1.1" } }, "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="],
"define-data-property/es-define-property/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
"define-data-property/es-define-property/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
"define-data-property/es-define-property/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
"define-data-property/gopd/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
"define-data-property/gopd/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
@@ -8122,6 +8144,12 @@
"fork-ts-checker-webpack-plugin/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
"has-property-descriptors/es-define-property/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
"has-property-descriptors/es-define-property/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
"has-property-descriptors/es-define-property/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
"htmlparser2/domutils/dom-serializer/domelementtype": ["domelementtype@2.0.2", "", {}, "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA=="],
"inquirer-toggle/@inquirer/core/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
@@ -8246,6 +8274,8 @@
"jsx-ast-utils/array-includes/es-abstract/call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="],
"jsx-ast-utils/array-includes/es-abstract/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
"jsx-ast-utils/array-includes/es-abstract/es-set-tostringtag": ["es-set-tostringtag@2.0.2", "", { "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" } }, "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q=="],
"jsx-ast-utils/array-includes/es-abstract/es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="],

View File

@@ -32,8 +32,8 @@
com.clojure-goes-fast/jvm-hiccup-meter {:mvn/version "0.1.1"} ; Monitor GC pauses and other system-induced pauses.
com.draines/postal {:mvn/version "2.0.5" ; SMTP library
:exclusions [com.sun.mail/jakarta.mail]}
com.fasterxml.jackson.core/jackson-core {:mvn/version "2.21.5"} ; pinned: cheshire pulls 2.21.1 which has resource exhaustion vuln
com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.21.5"} ; pinned: snowplow pulls 2.13.3 which has DoS vulns
com.fasterxml.jackson.core/jackson-core {:mvn/version "2.21.6"} ; pinned: cheshire pulls 2.21.1 which has resource exhaustion vuln
com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.21.6"} ; pinned: snowplow pulls 2.13.3 which has DoS vulns
com.fasterxml.woodstox/woodstox-core {:mvn/version "7.1.1"} ; trans dep of commons-codec
; Detect the charset in uploaded CSV files
com.github.albfernandez/juniversalchardet {:mvn/version "2.5.0"}
@@ -161,10 +161,10 @@
org.clojure/tools.namespace {:mvn/version "1.5.0"}
org.clojure/tools.reader {:mvn/version "1.5.2"}
org.clojure/tools.trace {:mvn/version "0.8.0"} ; function tracing
org.eclipse.jetty/jetty-server {:mvn/version "12.1.11"}
org.eclipse.jetty/jetty-unixdomain-server {:mvn/version "12.1.11"}
org.eclipse.jetty.ee9/jetty-ee9-servlet {:mvn/version "12.1.11"}
org.eclipse.jetty.ee9.websocket/jetty-ee9-websocket-jetty-server {:mvn/version "12.1.11"}
org.eclipse.jetty/jetty-server {:mvn/version "12.1.13"}
org.eclipse.jetty/jetty-unixdomain-server {:mvn/version "12.1.13"}
org.eclipse.jetty.ee9/jetty-ee9-servlet {:mvn/version "12.1.13"}
org.eclipse.jetty.ee9.websocket/jetty-ee9-websocket-jetty-server {:mvn/version "12.1.13"}
org.eclipse.jgit/org.eclipse.jgit {:mvn/version "7.3.0.202506031305-r"}; Java implementation of Git version control system
org.flatland/ordered {:mvn/version "1.15.12"} ; ordered maps & sets
org.graalvm.polyglot/js-community {:mvn/version "25.0.1" :extension "pom"} ; JavaScript engine

View File

@@ -33,7 +33,7 @@
(api.macros/defendpoint :get "/preview-card/:id"
"Get HTML rendering of a Card with `id`."
[{:keys [id]} :- [:map
[{:keys [id]} :- [:map {:closed true}
[:id ms/PositiveInt]]]
(let [card (api/read-check :model/Card id)
result (pulse-card-query-results card)]
@@ -51,7 +51,7 @@
This endpoint relies on a custom middleware defined in `metabase.channel.render.core/style-tag-nonce-middleware` to
allow the style tag to render properly, given our Content Security Policy setup."
[{:keys [id]} :- [:map
[{:keys [id]} :- [:map {:closed true}
[:id ms/PositiveInt]]]
(api/read-check :model/Dashboard id)
{:status 200
@@ -68,7 +68,7 @@
(api.macros/defendpoint :get "/preview-card-info/:id"
"Get JSON object containing HTML rendering of a Card with `id` and other information."
[{:keys [id]} :- [:map
[{:keys [id]} :- [:map {:closed true}
[:id ms/PositiveInt]]]
(let [card (api/read-check :model/Card id)
result (pulse-card-query-results card)
@@ -90,9 +90,9 @@
(api.macros/defendpoint :get "/preview-card-png/:id"
"Get PNG rendering of a Card with `id`. Optionally specify `width` as a query parameter."
[{:keys [id]} :- [:map
[{:keys [id]} :- [:map {:closed true}
[:id ms/PositiveInt]]
{:keys [width]} :- [:map
{:keys [width]} :- [:map {:closed true}
[:width {:optional true} [:maybe ms/PositiveInt]]]]
(let [card (api/read-check :model/Card id)
result (pulse-card-query-results card)

View File

@@ -40,7 +40,7 @@
(api.macros/defendpoint :get "/:type/"
"Gets all records of the given type.
Any parameters passed will be used for equals filters"
[{:keys [type]} :- [:map [:type ms/NonBlankString]]
[{:keys [type]} :- [:map {:closed true} [:type ms/NonBlankString]]
query-args]
(filter (fn [obj]
(every? (fn [[query-k query-v]]
@@ -54,7 +54,7 @@
(api.macros/defendpoint :get "/:type/:id"
"Returns an existing record"
[{:keys [type id]} :- [:map
[{:keys [type id]} :- [:map {:closed true}
[:type ms/NonBlankString]
[:id ms/PositiveInt]]]
(-> (api/check-404 (t2/query-one {:select [:id :content]
@@ -65,7 +65,7 @@
(api.macros/defendpoint :post "/:type/"
"Create a new record."
[{:keys [type]} :- [:map
[{:keys [type]} :- [:map {:closed true}
[:type ms/NonBlankString]]
_query-params
body]
@@ -76,7 +76,7 @@
(api.macros/defendpoint :put "/:type/:id"
"Updates an existing record."
[{:keys [type id]} :- [:map
[{:keys [type id]} :- [:map {:closed true}
[:type ms/NonBlankString]
[:id ms/PositiveInt]]
_query-params
@@ -88,21 +88,19 @@
(api.macros/defendpoint :delete "/:type/:id"
"Deletes an existing record."
[{:keys [type id]} :- [:map
[{:keys [type id]} :- [:map {:closed true}
[:type ms/NonBlankString]
[:id ms/PositiveInt]]
_query-params
body]
(api/check-404 (t2/delete! (prototype-table) id))
{:id id})
(api.macros/defendpoint :delete "/:type/all"
"Deletes all records of this type. Helpful for resetting to a clean state."
[{:keys [type]} :- [:map
[{:keys [type]} :- [:map {:closed true}
[:type ms/NonBlankString]]
_query-params
body]
(t2/delete! (prototype-table) :type type)
{:message "All records deleted" :type type})

View File

@@ -0,0 +1,63 @@
(ns metabase.core.namespace-uniqueness-test
"Tests that no namespace is declared by more than one file on a single platform's classpath.
When two files declare the same namespace, `require` loads whichever the classpath reaches first and
the other file's vars never exist. Nothing fails: the shadowed file's tests simply never run.
An EE test that would otherwise take the same `metabase.*` name as its OSS counterpart is named with an
`-ee-test` suffix -- see [[metabase.notification.payload.core-ee-test]] and
[[metabase.notification.payload.execute-ee-test]]."
(:require
[clojure.java.classpath :as classpath]
[clojure.java.io :as io]
[clojure.string :as str]
[clojure.test :refer :all]
[clojure.tools.namespace.file :as ns.file]
[clojure.tools.namespace.find :as ns.find]
[clojure.tools.namespace.parse :as ns.parse]
[metabase.util :as u]))
(set! *warn-on-reflection* true)
(def ^:private project-root
(str (.getCanonicalPath (io/file ".")) "/"))
(defn- relative-path [^java.io.File file]
(let [path (.getCanonicalPath file)]
(if (str/starts-with? path project-root)
(subs path (count project-root))
path)))
(defn- declarations
"Every `[namespace relative-path]` pair `platform` can load from the classpath directories.
`platform` is [[ns.find/clj]] or [[ns.find/cljs]]; each includes `.cljc`, so a `.cljc` file is
reported under both. `local/src` is skipped: the `:dev` profile puts it on the classpath precisely so a
developer can shadow a project namespace locally."
[platform]
(for [dir (remove #(str/starts-with? (relative-path %) "local/")
(classpath/classpath-directories))
file (ns.find/find-sources-in-dir dir platform)
;; The classpath includes source directories we do not control.
:let [decl (try
(ns.file/read-file-ns-decl file (:read-opts platform))
(catch Exception _ nil))]
;; Some classpath .clj files have no ns form, e.g. resources/data_readers.clj.
:when decl]
[(ns.parse/name-from-ns-decl decl) (relative-path file)]))
(defn- collisions
"Namespaces `platform` can load from more than one file, as `{namespace [path ...]}`."
[platform]
(into (sorted-map)
(keep (fn [[ns-symb paths]]
(when (next paths)
[ns-symb (vec (sort paths))])))
(u/group-by first second (declarations platform))))
(deftest ^:parallel no-duplicate-namespaces-test
(doseq [[platform-name platform] {"clj" ns.find/clj, "cljs" ns.find/cljs}]
(testing (str "no namespace is declared by two " platform-name " files\n"
"Rename one of them -- see this namespace's docstring for the convention used when an"
" EE test shadows its OSS counterpart.")
(is (= {} (collisions platform))))))

View File

@@ -20,7 +20,7 @@ For significant feature additions, it is expected that discussion will have take
## Contributor License Agreement
We don't like getting sued, so before merging any pull request, we'll need each person contributing code to sign a [Contributor License Agreement](https://docs.google.com/a/metabase.com/forms/d/1oV38o7b9ONFSwuzwmERRMi9SYrhYeOrkbmNaq9pOJ_E/viewform).
We don't like getting sued, so before merging any pull request, we'll need each person contributing code to sign a [Contributor License Agreement](https://docs.google.com/a/metabase.com/forms/d/e/1FAIpQLSfc9GWyJ3F9U_4NzHLeTblgtog1FKtG3CjLshE4FAAKSdvNoQ/viewform).
## What we're trying to build
@@ -69,7 +69,7 @@ If there are tests missing, code style concerns or specific architectural issues
## Ways to help
The starting point would be to get familiar with Metabase the product, and know your way around. If you're using it at work, that's great! If not, [download Metabase](https://www.metabase.com/start/oss/) and play around with it. Read the docs and generally get a feel for the flow of the product.
The starting point would be to get familiar with Metabase the product, and know your way around. If you're using it at work, that's great! If not, [download Metabase](https://www.metabase.com/start/oss) and play around with it. Read the docs and generally get a feel for the flow of the product.
Here are some ways you can help, in order of increasing coordination + interaction with us:

View File

@@ -28,7 +28,7 @@ Run as a JAR, using Docker, or on [Metabase Cloud](https://store.metabase.com/ch
Once installed, set up your Metabase and connect to your data.
### [Getting started](https://www.metabase.com/learn/metabase-basics/getting-started/index)
### [Getting started](https://www.metabase.com/learn/metabase-basics/getting-started)
With your data connected, get started asking questions, creating dashboards, and sharing your work.
@@ -131,21 +131,21 @@ Metabase's reference documentation.
### Data modeling
- [Data modeling overview](./data-modeling/start.md)
- [Models](./data-modeling/models.md)
- [Model persistence](./data-modeling/model-persistence.md)
- [Metrics](./data-modeling/metrics.md)
- [Table metadata admin settings](./data-modeling/metadata-editing.md)
- [Field types](./data-modeling/semantic-types.md)
- [Formatting defaults](./data-modeling/formatting.md)
- [Working with JSON](./data-modeling/json-unfolding.md)
- [Segments](./data-modeling/segments.md)
- [Models](./data-modeling/models/models.md)
- [Model persistence](./data-modeling/models/model-persistence.md)
- [Metrics](./data-modeling/semantic-layer/metrics.md)
- [Table metadata admin settings](./data-modeling/metadata/metadata-editing.md)
- [Field types](./data-modeling/metadata/semantic-types.md)
- [Formatting defaults](./data-modeling/metadata/formatting.md)
- [Working with JSON](./data-modeling/metadata/json-unfolding.md)
- [Segments](./data-modeling/semantic-layer/segments.md)
### Actions
- [Actions overview](./actions/start.md)
- [Introduction to actions](./actions/introduction.md)
- [Basic actions](./actions/basic.md)
- [Custom actions](./actions/custom.md)
- [Actions overview](./data-modeling/models/actions/start.md)
- [Introduction to actions](./data-modeling/models/actions/introduction.md)
- [Basic actions](./data-modeling/models/actions/basic.md)
- [Custom actions](./data-modeling/models/actions/custom.md)
### AI
@@ -329,8 +329,8 @@ Contribute to the Metabase open source project!
Data jargon explained.
### [Metabase Experts](https://www.metabase.com/partners/)
### [Metabase Experts](https://www.metabase.com/partners)
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners/).
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners).
<!-- bump 2 -->

View File

@@ -23,7 +23,7 @@ Here's a non-exhaustive list of things Metabot can help with:
- [Edit SQL directly in the native editor](#inline-sql-editing).
- [Analyze a chart](#analyze-charts-with-metabot).
- [Fix errors in SQL code](#have-metabot-fix-sql-queries).
- [Generate transforms](../data-studio/transforms/transforms-overview.md#use-metabot-to-generate-code-for-transforms)
- [Generate transforms](../data-modeling/transforms/transforms-overview.md#use-metabot-to-generate-code-for-transforms)
- [Generate charts in documents](../documents/introduction.md)
- [Answer questions from Slack](./metabot-slack.md).

View File

@@ -41,7 +41,7 @@ Supported models:
Credentials:
- **API key** (required). [Where do I find this?](https://console.anthropic.com/settings/keys) You can also set it with the environment variable `MB_LLM_ANTHROPIC_API_KEY`.
- **API key** (required). [Where do I find this?](https://platform.claude.com/settings/keys) You can also set it with the environment variable `MB_LLM_ANTHROPIC_API_KEY`.
- **API base URL** (advanced). Defaults to `https://api.anthropic.com`. You can also set it with the environment variable `MB_LLM_ANTHROPIC_API_BASE_URL`.
## OpenAI
@@ -265,7 +265,7 @@ Metabase lists whichever models your vLLM server is serving, so what you can pic
Credentials:
- **API base URL** (required). Your server's OpenAI-compatible API. It should end in /v1. You can also set it with the environment variable `MB_LLM_VLLM_API_BASE_URL`.
- **API base URL** (required). Your server's OpenAI-compatible API. It should end in /v1. Metabase must be able to reach it: self-hosted, a server on your private network or on this machine needs MB_LLM_ALLOWED_NETWORKS. You can also set it with the environment variable `MB_LLM_VLLM_API_BASE_URL`.
- **API key**. Only needed if you started your server with --api-key. You can also set it with the environment variable `MB_LLM_VLLM_API_KEY`.
## Metabase AI service

View File

@@ -147,7 +147,7 @@ The **Enable Embedded Metabot** toggle turns embedded Metabot on or off. The tog
_Available on both the Internal and Embedded tabs, configured independently._
Admins on Pro and Enterprise plans can tell Metabot to only work with [models](../data-modeling/models.md) and [metrics](../data-modeling/metrics.md) that have been [verified](../exploration-and-organization/content-verification.md).
Admins on Pro and Enterprise plans can tell Metabot to only work with [models](../data-modeling/models/models.md) and [metrics](../data-modeling/semantic-layer/metrics.md) that have been [verified](../exploration-and-organization/content-verification.md).
Restricting Metabot to verified models and metrics (and only models and metrics) helps Metabot produce more reliable answers, since you know someone has at least vetted the data Metabot can use.
@@ -169,7 +169,7 @@ If you're embedding the Metabot component in an app, you can point embedded Meta
Picking **Our analytics** is the same as picking no collection at all, so pick something narrower if you want the scoping to do anything. And once you set a collection, tables drop out of embedded Metabot's search results, so pick a collection with the metrics and models you want people building on.
This setting narrows where embedded Metabot searches; it's _not_ a substitute for setting permissions. Embedded Metabot can still read and query anything the person using it has permissions for. Embedded Metabot can also see the items that person viewed recently, whichever collection those live in. Restricting Metabot to [verified content](#verified-content) narrows those recent items to verified, official, and [Library](../data-studio/library.md) content, but it doesn't confine them to the collection you picked. To control what data people can get to in an embed, set [data permissions](../permissions/embedding.md). See also [Set up AI chat in Metabase](../embedding/ai-chat.md#set-up-ai-chat-in-metabase).
This setting narrows where embedded Metabot searches; it's _not_ a substitute for setting permissions. Embedded Metabot can still read and query anything the person using it has permissions for. Embedded Metabot can also see the items that person viewed recently, whichever collection those live in. Restricting Metabot to [verified content](#verified-content) narrows those recent items to verified, official, and [Library](../data-modeling/semantic-layer/library.md) content, but it doesn't confine them to the collection you picked. To control what data people can get to in an embed, set [data permissions](../permissions/embedding.md). See also [Set up AI chat in Metabase](../embedding/ai-chat.md#set-up-ai-chat-in-metabase).
### Prompt suggestions
@@ -197,9 +197,9 @@ The best thing you can do to improve Metabot's performance is to prep your data
### Add descriptions for your data and content
Add descriptions to your [models](../data-modeling/models.md#add-metadata-to-columns-in-a-model), [metrics](../data-modeling/metrics.md), [dashboards](../dashboards/introduction.md), and [questions](../questions/introduction.md). Write descriptions to provide context, define terms, and explain business logic.
Add descriptions to your [models](../data-modeling/models/models.md#add-metadata-to-columns-in-a-model), [metrics](../data-modeling/semantic-layer/metrics.md), [dashboards](../dashboards/introduction.md), and [questions](../questions/introduction.md). Write descriptions to provide context, define terms, and explain business logic.
Admins can also curate [table metadata](../data-modeling/metadata-editing.md) by adding descriptions for tables and their fields.
Admins can also curate [table metadata](../data-modeling/metadata/metadata-editing.md) by adding descriptions for tables and their fields.
For example, here's a decent description for an ID field that provides additional context for the data:
@@ -213,7 +213,7 @@ You can even ask Metabot to write descriptions for you. But Metabot will only ha
Make sure the semantic types for each field accurately describe the field's "meaning". For example, if you have a field like `created_at`, you'd want the column type to be Creation date.
Metabase will try to set semantic types automatically, but you should confirm that each field has the relevant semantic type. See [Data types and semantic types](../data-modeling/semantic-types.md). You can also set semantic types for [models](../data-modeling/models.md#add-metadata-to-columns-in-a-model).
Metabase will try to set semantic types automatically, but you should confirm that each field has the relevant semantic type. See [Data types and semantic types](../data-modeling/metadata/semantic-types.md). You can also set semantic types for [models](../data-modeling/models/models.md#add-metadata-to-columns-in-a-model).
### Define domain-specific terms in the glossary

View File

@@ -82,7 +82,7 @@ A profile is the configuration Metabot uses for a conversation: which prompt, wh
| `SQL` | SQL writing only. Used by [inline SQL editing](./metabot.md#inline-sql-editing) and similar surfaces. |
| `Slackbot` | The persona behind [Metabot in Slack](./metabot-slack.md). |
| `Embedding` | The Metabot persona used inside [embedded Metabase](../embedding/start.md). |
| `Transforms codegen` | Generates [transform](../data-studio/transforms/transforms-overview.md), SQL, or Python. |
| `Transforms codegen` | Generates [transform](../data-modeling/transforms/transforms-overview.md), SQL, or Python. |
| `Documents` | Generates content inside [Documents](../documents/start.md). |
## Conversations

15460
docs/api.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,7 +14,7 @@ redirect_from:
By default, Metabase will automatically provision a domain name for your Metabase that ends in metabaseapp.com (e.g., yourcompany.metabaseapp.com).
[Pro and Enterprise](https://www.metabase.com/pricing/) plans allow you to add a custom domain. Setting a custom domain will update your instance's [Site URL](../configuring-metabase/settings.md#site-url). The Site URL is used for things like creating links in emails, auth redirects, and in some embedding scenarios.
[Pro and Enterprise](https://www.metabase.com/pricing) plans allow you to add a custom domain. Setting a custom domain will update your instance's [Site URL](../configuring-metabase/settings.md#site-url). The Site URL is used for things like creating links in emails, auth redirects, and in some embedding scenarios.
## Add a custom domain to your Metabase

View File

@@ -12,7 +12,7 @@ redirect_from:
# Limitations of Metabase Cloud
There are some limitations that could impact your migration to Metabase Cloud. These limitations apply to all [Metabase Cloud plans](https://www.metabase.com/pricing/).
There are some limitations that could impact your migration to Metabase Cloud. These limitations apply to all [Metabase Cloud plans](https://www.metabase.com/pricing).
## Metabase Cloud only supports official databases

View File

@@ -67,13 +67,13 @@ Before executing the migration script, you may need to set the environment varia
The script will upload your application data to your new Metabase Cloud instance. If all goes well, the script will print `Done!`.
If anything goes sideways, follow any prompts the script outputs. If you're still stuck, [send us an email](https://www.metabase.com/help/) and we'll help you troubleshoot.
If anything goes sideways, follow any prompts the script outputs. If you're still stuck, [send us an email](https://www.metabase.com/help) and we'll help you troubleshoot.
## After migrating to Metabase Cloud
After a successful upload, some finishing touches and a restart are done automatically in a couple of minutes, and then you can log into your shiny new Metabase Cloud instance. You should see all of your questions and dashboards just as you did in your self-hosted instance.
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.developers.google.com/) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.cloud.google.com/apis/dashboard) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
- **For Pro and Enterprise customers using SAML SSO**, you'll need to update your settings with your identity provider to change the Redirect URL and the Base URL to your new Metabase Cloud URL, otherwise your identity provider will still redirect people to your old (and shut down) Metabase instance. See [Authenticating with SAML](../../people-and-groups/authenticating-with-saml.md).
## Tell your team about the new Metabase address
@@ -92,4 +92,4 @@ We'll take care of your Metabase and keep it up to date from here on out. Welcom
## Need help?
If you have any questions, just [send us an email](https://www.metabase.com/help/).
If you have any questions, just [send us an email](https://www.metabase.com/help).

View File

@@ -76,7 +76,7 @@ If the default version on Metabase Cloud is the same or lower than your current
## Follow up after the migration
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.developers.google.com/) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.cloud.google.com/apis/dashboard) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
- **For Pro and Enterprise customers using SAML SSO**, you'll need to update your settings with your identity provider to change the Redirect URL and the Base URL to your new Metabase Cloud URL, otherwise your identity provider will still redirect people to your old Metabase instance. See [Authenticating with SAML](../../people-and-groups/authenticating-with-saml.md) for details on how to set these URLs.
### Tell your team about the new Metabase address
@@ -93,4 +93,4 @@ If you were self-hosting via a third-party, be sure to clean up and cancel any s
## Need help?
If you run into any trouble, just [send us an email](https://www.metabase.com/help/).
If you run into any trouble, just [send us an email](https://www.metabase.com/help-premium).

View File

@@ -20,7 +20,7 @@ You should follow along with the [migration guide](./guide.md). Once you downloa
## Install Heroku CLI for your OS
To get shell access, follow the instructions for your operating system to [install the Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).
To get shell access, follow the instructions for your operating system to [install the Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli).
### Get shell access to your Heroku server

View File

@@ -30,7 +30,7 @@ Under the hood, Metabase Cloud Storage uses [ClickHouse](https://www.metabase.co
### Writing SQL queries on data stored in Metabase Cloud Storage
For the SQL dialect supported by ClickHouse, check out [ClickHouse's SQL reference](https://clickhouse.com/docs/en/sql-reference).
For the SQL dialect supported by ClickHouse, check out [ClickHouse's SQL reference](https://clickhouse.com/docs/reference/syntax).
## How to get Metabase Cloud Storage
@@ -54,7 +54,7 @@ To add storage to an existing instance, use the following steps.
## Metabase Cloud Storage pricing
Pricing depends on how much data you need to store. See the Storage section on our [pricing page](https://www.metabase.com/pricing/).
Pricing depends on how much data you need to store. See the Storage section on our [pricing page](https://www.metabase.com/pricing).
### Increase Metabase Cloud Storage

View File

@@ -18,7 +18,7 @@ _Admin > Settings > Appearance_
Appearance settings give admins the option to whitelabel Metabase to match your company’s branding.
If you're looking for date, time, number, or currency formatting, see [Formatting defaults](../data-modeling/formatting.md).
If you're looking for date, time, number, or currency formatting, see [Formatting defaults](../data-modeling/metadata/formatting.md).
## Changing Metabase's appearance
@@ -130,9 +130,9 @@ Keep in mind that if you hide documentation links, people using your Metabase mi
### Help link in the settings menu
The Settings menu (the "grid" menu in the upper right of your Metabase) includes a **Help** option that links to a [Metabase help page](https://www.metabase.com/help/) by default. You can change this menu Help item by selecting one of the following options:
The Settings menu (the "grid" menu in the upper right of your Metabase) includes a **Help** option that links to a [Metabase help page](https://www.metabase.com/help) by default. You can change this menu Help item by selecting one of the following options:
- Link to [Metabase help](https://www.metabase.com/help/) (default)
- Link to [Metabase help](https://www.metabase.com/help) (default)
- Hide it (the Settings menu won't display the Help option at all).
- Go to a custom destination. Enter a URL that the Settings menu's Help option should link to. Valid URLs include http, https, and mailto URLs.
@@ -188,6 +188,5 @@ Metabase will display this illustration when searches don't return any results.
## Further reading
- [Customer-facing analytics](https://www.metabase.com/learn/metabase-basics/embedding).
- [Embedding introduction](../embedding/start.md).
- [Brand your Metabase](https://www.metabase.com/docs/latest/configuring-metabase/appearance).

View File

@@ -178,4 +178,4 @@ If you're using Metabase Cloud, cached question results will be saved to Metabas
## Further reading
- [Model persistence](../data-modeling/model-persistence.md)
- [Model persistence](../data-modeling/models/model-persistence.md)

View File

@@ -27,7 +27,7 @@ The map tile server sets the background imagery for pin and grid maps. It's not
To change the map tile server:
1. Go to **Admin > Settings > Maps**.
2. Under **Map tile server URL**, enter the URL template for your tile server.
2. Under **Map tile server public URL**, enter the URL template for your tile server.
### Use a raster tile URL template

View File

@@ -1318,6 +1318,21 @@ When set to `true`, users who log in via LDAP will automatically get a Metabase
The array of last two ISO8601 dates when an admin dismissed the license token missing banner.
### `MB_LLM_ALLOWED_NETWORKS`
- Type: keyword
- Default: `external-only`
- Environment variable only: you can't set this in the Admin settings or in a [configuration file](./config-file.md).
Controls which networks Metabase may connect to for LLM provider base URLs. Set through the environment only; on Metabase Cloud the default applies.
Options:
- external-only (default; only globally reachable public addresses)
- allow-private (external + private networks but NOT loopback or link-local)
- allow-all (no restrictions).
The Metabase AI service and LLM proxy are deployment configuration and may always use private addresses.
Set this when a self-hosted vLLM server is on your private network (allow-private) or on this machine (allow-all). There is no admin UI for it, and a value stored in the application database is ignored. With a JVM-wide HTTP(S) proxy, Metabase checks destination addresses available through local DNS; the deployment proxy must enforce destination restrictions on its outbound connections. Proxy-only DNS is supported. Metabase enforces destination addresses at connection time for direct requests.
### `MB_LLM_ANTHROPIC_API_BASE_URL`
- Type: string
@@ -1628,7 +1643,6 @@ Backed by the openrouter connection in the admin AI settings provider list: read
- Type: json
- Default: `[]`
- [Configuration file name](./config-file.md): `llm-providers`
JSON array of configured LLM provider connections. Each entry has a `key` (a URL-safe slug identifying the connection), a `type` (the provider type, e.g. `anthropic`), a display `name`, and a `config` map of that provider type's credential fields.
@@ -1770,7 +1784,7 @@ Controls which networks Metabase may connect to for map tile servers.
- Default: `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`
- [Configuration file name](./config-file.md): `map-tile-server-url`
The map tile server URL template used in map visualizations, for example from OpenStreetMaps or MapBox.
The map tile server URL template used in map visualizations, for example from OpenStreetMaps or MapBox. This URL is visible to clients, so do not include private keys.
### `MB_MCP_APPS_CORS_CUSTOM_ORIGINS`
@@ -2174,7 +2188,7 @@ Git synchronization type - :read-write or :read-only.
- Default: `null`
- [Configuration file name](./config-file.md): `remote-sync-url`
The location of your git repository, e.g. https://github.com/acme-inco/metabase.git.
The location of your git repository, e.g. `https://github.com/acme-inco/metabase.git`.
### `MB_REPORT_TIMEZONE`
@@ -2500,7 +2514,7 @@ Value for the session cookie's `SameSite` directive.
See [Embedding Metabase in a different domain](../embedding/full-app-embedding.md#embedding-metabase-in-a-different-domain).
Read more about [Full app embedding](../embedding/full-app-embedding.md).
Learn more about [SameSite cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite).
Learn more about [SameSite cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#samesitesamesite-value).
### `MB_SESSION_COOKIES`
@@ -2964,7 +2978,7 @@ Note: Users with row or column security restrictions will never see suggestions.
Controls which networks Metabase may connect to for warehouse connections.
Options:
- external-only (only globally routable public addresses)
- external-only (only globally reachable public addresses)
- allow-private (external + private networks but NOT loopback or link-local)
- allow-all (no restrictions).
Defaults to external-only on Metabase Cloud and allow-all when self-hosted.
@@ -3519,4 +3533,4 @@ Setting `MB_JETTY_SKIP_SNI=true` (the default setting) turns off the Server Name
Type: string<br>
Default: `null`
Base-64 encoded public key for this sites SSL certificate. Specify this to enable HTTP Public Key Pinning. Using HPKP is no longer recommended. See http://mzl.la/1EnfqBf for more information.
Base-64 encoded public key for this sites SSL certificate. Specify this to enable HTTP Public Key Pinning. Using HPKP is no longer recommended. See https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Certificate_Transparency for more information.

View File

@@ -145,5 +145,4 @@ When configuring [guest embeds](../embedding/guest-embedding.md), you can select
## Further reading
- [Customizing Metabase's appearance](./appearance.md)
- [Customer-facing analytics](https://www.metabase.com/learn/metabase-basics/embedding)
- [Embedding documentation](../embedding/start.md)

View File

@@ -16,7 +16,7 @@ Admins can update the localization settings for the instance:
These localization settings allow you to set global language and formatting defaults for dates, times, numbers, and currencies.
People can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/formatting.md).
People can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/metadata/formatting.md).
## Instance settings
@@ -79,7 +79,7 @@ This setting doesn't affect [SQL queries](../questions/native-editor/writing-sql
You can configure the default formatting for dates and times.
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/formatting.md).
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/metadata/formatting.md).
To configure default date and time format settings:
@@ -96,7 +96,7 @@ _Admin > Settings > Localization_
Some people use commas to separate thousands places, and others use periods. You can configure which camp you belong to.
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/formatting.md).
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/metadata/formatting.md).
To configure default separator settings:
@@ -107,7 +107,7 @@ To configure default separator settings:
_Admin > Settings > Localization_
You can choose how currency fields should be displayed by default (you can configure _which_ fields should be displayed as currency in table metadata or in question formatting setting, see [Formatting](../data-modeling/formatting.md))
You can choose how currency fields should be displayed by default (you can configure _which_ fields should be displayed as currency in table metadata or in question formatting setting, see [Formatting](../data-modeling/metadata/formatting.md))
Note that people can also override these localization options for specific fields or questions.

View File

@@ -6,7 +6,7 @@ redirect_from:
# Setting up Metabase
This guide will help you set up Metabase once you’ve gotten it installed. If you haven’t installed Metabase yet, you can [get Metabase here](https://metabase.com/pricing/).
This guide will help you set up Metabase once you’ve gotten it installed. If you haven’t installed Metabase yet, you can [get Metabase here](https://www.metabase.com/pricing).
Start Metabase up for the first time and you’ll see this screen:
![Welcome Screen](images/WelcomeScreen.png)
@@ -60,7 +60,7 @@ For more on connecting to databases, see [Adding and managing databases](../data
If you're self-hosting Metabase on the [Pro](https://www.metabase.com/product/pro) or [Enterprise](https://www.metabase.com/product/enterprise) plan, Metabase will prompt you for your license. This step is just a convenience. You don't need to enter your license here; you can [activate your license](../installation-and-operation/activating-the-enterprise-edition.md) at any time. Just know that all of your Pro and Enterprise features won't work until you've activated your license.
If you're running Pro on [Metabase Cloud](https://www.metabase.com/cloud/), we'll handle this step for you. Your Pro features should already be available.
If you're running Pro on [Metabase Cloud](https://www.metabase.com/cloud), we'll handle this step for you. Your Pro features should already be available.
## Usage data preferences
@@ -90,8 +90,8 @@ The providers you set up in AI settings power Metabase's built-in AI functionali
## Getting started with Metabase
For a tutorial on getting up and running with questions and dashboards, head over to [Learn Metabase](https://www.metabase.com/learn/metabase-basics/getting-started/).
For a tutorial on getting up and running with questions and dashboards, head over to [Learn Metabase](https://www.metabase.com/learn/metabase-basics/getting-started).
---
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners/){:target="\_blank"}.
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners){:target="\_blank"}.

View File

@@ -61,7 +61,7 @@ By default, Metabase attempts to make field and table names more readable by cha
If you re-enable this setting, Metabase will run a [scan](../databases/sync-scan.md#how-database-scans-work) against your database to review your table and column names again.
To manually label field or table names in Metabase, check out the [Table Metadata](../data-modeling/metadata-editing.md) section in your admin panel. Metadata in the Table Metadata can be further curated in [models](../data-modeling/models.md).
To manually label field or table names in Metabase, check out the [Table Metadata](../data-modeling/metadata/metadata-editing.md) section in your admin panel. Metadata in the Table Metadata can be further curated in [models](../data-modeling/models/models.md).
## Enable X-rays

View File

@@ -4,17 +4,17 @@ title: Actions on dashboards
# Actions on dashboards
You can add buttons to dashboards to perform [actions](../actions/start.md) like creating or updating records, and combine them with dashboard [filters](./filters.md).
You can add buttons to dashboards to perform [actions](../data-modeling/models/actions/start.md) like creating or updating records, and combine them with dashboard [filters](./filters.md).
![Dashboard with filter, action button, and detail card view](./images/dashboard-filter-action.png)
## Create an action
To add an action button to a dashboard, you'll first need to create an action on a model. See [Model actions](../actions/introduction.md).
To add an action button to a dashboard, you'll first need to create an action on a model. See [Model actions](../data-modeling/models/actions/introduction.md).
## Add an action button to a dashboard
Once you've [created an action](../actions/introduction.md), you can add a button to a dashboard to perform that action:
Once you've [created an action](../data-modeling/models/actions/introduction.md), you can add a button to a dashboard to perform that action:
1. Visit a dashboard page and click the **pencil** icon to start editing the dashboard.
2. Click on the **box with a mouse pointer** to add an action.
@@ -54,9 +54,9 @@ To connect an action field to a filter on a dashboard:
While you can add actions to dashboards and use them in your Metabase, actions won't work on dashboards accessed via [public links](./introduction.md#sharing-dashboards-with-public-links), or dashboards in guest embeds.
If you want people outside of your Metabase to use an action, you can create a [public form for an action](../actions/custom.md#make-public), or expose actions via [modular embedding](../embedding/modular-embedding.md) with SSO or [full app embedding](../embedding/full-app-embedding.md).
If you want people outside of your Metabase to use an action, you can create a [public form for an action](../data-modeling/models/actions/custom.md#make-public), or expose actions via [modular embedding](../embedding/modular-embedding.md) with SSO or [full app embedding](../embedding/full-app-embedding.md).
## Further reading
- [Actions](../actions/start.md)
- [Actions](../data-modeling/models/actions/start.md)
- [Editable tables](../data-modeling/editable-tables.md)

View File

@@ -265,9 +265,9 @@ To change the operator for a dashboard filter:
You can set a widget to display options as a dropdown menu, search box, or input box.
[Metadata settings](../data-modeling/metadata-editing.md#filtering) for the filtered column, including [variable settings in native queries](../questions/native-editor/filter-widgets.md#dropdown-menu-and-search), can also affect the filter's appearance.
[Metadata settings](../data-modeling/metadata/metadata-editing.md#filtering) for the filtered column, including [variable settings in native queries](../questions/native-editor/filter-widgets.md#dropdown-menu-and-search), can also affect the filter's appearance.
For example, if the column you're connecting a filter to is configured in the [metadata settings](../data-modeling/metadata-editing.md#filtering) to display a search box instead of a dropdown, that metadata setting will take precedence.
For example, if the column you're connecting a filter to is configured in the [metadata settings](../data-modeling/metadata/metadata-editing.md#filtering) to display a search box instead of a dropdown, that metadata setting will take precedence.
To configure filter input type:
@@ -284,8 +284,8 @@ A list of all the possible values in a column. People can use checkboxes to sele
If you're not seeing the **Dropdown list** option and your dashboard filter is based on a column from a:
- Table or model built with the query builder: an admin will need to [enable the dropdown widget](../data-modeling/metadata-editing.md#changing-a-search-box-filter-to-a-dropdown-filter) for that column from Metabase's **Admin settings**.
- Model built with a SQL query: go to your [model's metadata settings](../data-modeling/models.md#add-metadata-to-columns-in-a-model), find your column, and set the **Database column this maps to**.
- Table or model built with the query builder: an admin will need to [enable the dropdown widget](../data-modeling/metadata/metadata-editing.md#changing-a-search-box-filter-to-a-dropdown-filter) for that column from Metabase's **Admin settings**.
- Model built with a SQL query: go to your [model's metadata settings](../data-modeling/models/models.md#add-metadata-to-columns-in-a-model), find your column, and set the **Database column this maps to**.
#### Search box

View File

@@ -80,7 +80,7 @@ Once you select the column that contains the value you want to pass, the sidebar
In the example above, when a user clicks on the **Orders by product category** card, Metabase will pass the clicked `Product -> Category` to the destination dashboard ("Interactive Dashboard"), which will then filter its cards by that `Category`.
You can also send the currently selected value of a dashboard filter on the current dashboard to the destination. In [some plans](https://www.metabase.com/pricing/), you can pass a user attribute provided by SSO to the destination, too. Those user attributes will show up as options when you click on one of the destination's filters (provided the values are compatible with that filter).
You can also send the currently selected value of a dashboard filter on the current dashboard to the destination. In [some plans](https://www.metabase.com/pricing), you can pass a user attribute provided by SSO to the destination, too. Those user attributes will show up as options when you click on one of the destination's filters (provided the values are compatible with that filter).
When displaying questions as tables, you can select different click behaviors for different columns in the table. You can also modify the contents of the cells in a given column, replacing the value with custom text. For example, if you had a column that listed categories, you could change the text in the cell to read: "Click for details about {% raw %}{{Category}}{% endraw %}", where `Category` is the name of your column.

View File

@@ -132,7 +132,7 @@ To provide values for the variable, you'll need to add a filter to the dashboard
## Iframe cards
[Iframes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) allow you to nest one HTML page in another HTML page. With iframe cards in Metabase, you can embed a webpage in your dashboard. You can embed:
[Iframes](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe) allow you to nest one HTML page in another HTML page. With iframe cards in Metabase, you can embed a webpage in your dashboard. You can embed:
- Spreadsheets or surveys for data entry or workflows
- Videos or slides for contextualizing and storytelling on dashboards
@@ -325,7 +325,7 @@ If your Metabase administrator has enabled [public sharing](../embedding/public-
![Share icon](./images/share-icon.png)
Public links can be viewed by anyone, even if they don't have access to Metabase. You can also use the public embedding code to embed your question or dashboard in a simple web page or blog post. Check out examples of simple apps with embedded dashboards in our [embedding-reference-apps repository](https://github.com/metabase/embedding-reference-apps). To learn more about [embedding](../embedding/introduction.md), check out our article on [How to use Metabase to deliver analytics to your customers](https://www.metabase.com/learn/metabase-basics/embedding/overview), as well as an article on how to combine branding, Single Sign-On, full app embedding, and row and column security to deliver [multi-tenant, self-service analytics](https://www.metabase.com/learn/metabase-basics/embedding/multi-tenant-self-service-analytics).
Public links can be viewed by anyone, even if they don't have access to Metabase. You can also use the public embedding code to embed your question or dashboard in a simple web page or blog post. Check out examples of simple apps with embedded dashboards in our [embedding-reference-apps repository](https://github.com/metabase/static-embedding-reference-apps). To learn more about [embedding](../embedding/introduction.md), check out how to combine branding, Single Sign-On, full app embedding, and row and column security to deliver [multi-tenant, self-service analytics](../embedding/tenants.md).
Admins can also [create an account](../people-and-groups/managing.md#creating-an-account) for someone and point them to a specific dashboard or question. On a dashboard or question, click the **Sharing** icon and select **Invite someone to view this**.
@@ -356,7 +356,7 @@ There is one important limitation with the `fullscreen` option: for security rea
## Dashboard version history
For [questions](../questions/start.md), dashboards, and [models](../data-modeling/models.md), Metabase keeps a version history for the previous fifteen versions of that item.
For [questions](../questions/start.md), dashboards, and [models](../data-modeling/models/models.md), Metabase keeps a version history for the previous fifteen versions of that item.
See [History](../exploration-and-organization/history.md).

View File

@@ -17,8 +17,8 @@ You can only link dashboard filters that are wired to database columns (not cust
Filters can only be linked when they're connected to columns that have an explicit relationship in the table metadata. By relationship, we mean that the columns should be either:
- In the same table.
- In two different tables that have a foreign key relationship specified in the [table metadata](../data-modeling/metadata-editing.md).
- In two different tables that have foreign key relationships to one or more intermediate tables, as specified in the [table metadata](../data-modeling/metadata-editing.md).
- In two different tables that have a foreign key relationship specified in the [table metadata](../data-modeling/metadata/metadata-editing.md).
- In two different tables that have foreign key relationships to one or more intermediate tables, as specified in the [table metadata](../data-modeling/metadata/metadata-editing.md).
![Setting up foreign key in table metadata](./images/foreign-key-linked-filters.png)

View File

@@ -2,7 +2,9 @@
title: Data studio
summary: Data Studio provides tools to shape and track your data so everyone can trust the numbers.
redirect_from:
- /docs/latest/data-studio/overview
- /docs/latest/data-studio/start
- /docs/latest/data-modeling/overview
---
# Data Studio
@@ -17,17 +19,17 @@ Data Studio provides tools to shape and track your data so everyone can trust th
## What's in Data Studio
- **[Library](./library.md)**\*: A curated space for your organization's most trusted analytics content—tables, metrics, and SQL snippets that your data team recommends.
- **[Managing tables](./managing-tables.md)**: Add table metadata to make tables easier to work with.
- **[Segments](./segments.md)**: Create saved filters on tables so people can use consistent definitions when building queries.
- **[Measures](./measures.md)**: Create saved aggregations on tables so people can use consistent calculations when building queries.
- **[Schema viewer](./schema-viewer.md)**\*: Visualize relationships between tables as an entity-relationship diagram (ERD).
- **[Dependency graph](./dependencies/graph.md)**\*: A visual map of how your content connects, so you can understand the impact of changes before you make them. To find content with broken dependencies, see [Dependency diagnostics](../monitor/dependency-diagnostics.md).
- **[Replace data sources](./dependencies/replace-data-sources.md)**\*: Swap out a table or model across all content that uses it, in one operation.
- **[Library](semantic-layer/library.md)**\*: A curated space for your organization's most trusted analytics content—tables, metrics, and SQL snippets that your data team recommends.
- **[Managing tables](./metadata/managing-tables.md)**: Add table metadata to make tables easier to work with.
- **[Segments](./semantic-layer/segments.md)**: Create saved filters on tables so people can use consistent definitions when building queries.
- **[Measures](semantic-layer/measures.md)**: Create saved aggregations on tables so people can use consistent calculations when building queries.
- **[Schema viewer](./tools/schema-viewer.md)**\*: Visualize relationships between tables as an entity-relationship diagram (ERD).
- **[Dependency graph](./tools/graph.md)**\*: A visual map of how your content connects, so you can understand the impact of changes before you make them. To find content with broken dependencies, see [Dependency diagnostics](../monitor/dependency-diagnostics.md).
- **[Replace data sources](./tools/replace-data-sources.md)**\*: Swap out a table or model across all content that uses it, in one operation.
- **[Transforms](./transforms/transforms-overview.md)**: Wrangle your data in Metabase, write the query results back to your database, and reuse them in Metabase as sources for new queries.
- **[Glossary](../exploration-and-organization/data-model-reference.md#glossary)**: Define terms relevant to your business, both for people and agents trying to understand your data.
\* Available on [Pro and Enterprise plans](https://www.metabase.com/pricing/).
\* Available on [Pro and Enterprise plans](https://www.metabase.com/pricing).
## Permissions for Data Studio

View File

@@ -73,7 +73,7 @@ If you try to delete a row that has foreign key references from other tables, yo
## Editable table data vs. actions
Metabase offers two ways to modify data in your database: **editable table data** and [actions](../actions/introduction.md).
Metabase offers two ways to modify data in your database: **editable table data** and [actions](../data-modeling/models/actions/introduction.md).
### When to use editable tables
@@ -94,4 +94,4 @@ Use actions to:
- Give non-admins the ability to modify data.
- Add a button to a dashboard to trigger a form or query.
See [actions](../actions/introduction.md).
See [actions](../data-modeling/models/actions/introduction.md).

View File

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

View File

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 617 KiB

After

Width:  |  Height:  |  Size: 617 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View File

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 KiB

View File

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 226 KiB

View File

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

View File

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 232 KiB

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

View File

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

View File

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 226 KiB

View File

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

View File

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 129 KiB

View File

@@ -3,13 +3,14 @@ title: Formatting defaults
summary: Configure how dates, numbers, currencies, and text display in Metabase at global, field, and question levels.
redirect_from:
- /docs/latest/administration-guide/19-formatting-settings
- /docs/latest/data-modeling/formatting
---
# Formatting defaults
People all around the world use Metabase, and everyone has different preferences for how dates, times, numbers, and currencies should be formatted and displayed. Metabase lets you customize these formatting options at three different levels:
1. **Global**. Set global defaults in Admin -> Settings -> [Localization](../configuring-metabase/localization.md).
1. **Global**. Set global defaults in Admin -> Settings -> [Localization](../../configuring-metabase/localization.md).
2. **Field**. Set field (column) defaults in Admin -> Table Metadata. Field defaults override global defaults.
3. **Question**. Set formatting defaults for individual questions in the visualization settings of that question. Question defaults override global and field defaults.
@@ -166,7 +167,7 @@ Lets you put a symbol, word, etc. after this number (e.g., "dollars", "%", "unit
Currency field formatting settings include all the same options as in the global formatting section, as well as all the options that Number fields have.
See [Currency formatting options](../questions/visualizations/table.md#currency-formatting-options).
See [Currency formatting options](../../questions/visualizations/table.md#currency-formatting-options).
## Question-level formatting
@@ -174,17 +175,17 @@ You can also override all formatting settings in any specific saved question or
Formatting options vary depending on the type of visualization:
- [Combo chart](../questions/visualizations/line-bar-and-area-charts.md#combo-charts)
- [Detail](../questions/visualizations/detail.md)
- [Funnel](../questions/visualizations/funnel.md)
- [Gauge](../questions/visualizations/gauge.md)
- [Line, Bar, and area charts](../questions/visualizations/line-bar-and-area-charts.md)
- [Maps](../questions/visualizations/map.md)
- [Numbers](../questions/visualizations/numbers.md)
- [Pie or donut chart](../questions/visualizations/pie-or-donut-chart.md)
- [Pivot table](../questions/visualizations/pivot-table.md)
- [Progress bar](../questions/visualizations/progress-bar.md)
- [Scatter plot or bubble chart](../questions/visualizations/scatterplot-or-bubble-chart.md)
- [Tables](../questions/visualizations/table.md)
- [Trend](../questions/visualizations/trend.md)
- [Waterfall chart](../questions/visualizations/waterfall-chart.md)
- [Combo chart](../../questions/visualizations/line-bar-and-area-charts.md#combo-charts)
- [Detail](../../questions/visualizations/detail.md)
- [Funnel](../../questions/visualizations/funnel.md)
- [Gauge](../../questions/visualizations/gauge.md)
- [Line, Bar, and area charts](../../questions/visualizations/line-bar-and-area-charts.md)
- [Maps](../../questions/visualizations/map.md)
- [Numbers](../../questions/visualizations/numbers.md)
- [Pie or donut chart](../../questions/visualizations/pie-or-donut-chart.md)
- [Pivot table](../../questions/visualizations/pivot-table.md)
- [Progress bar](../../questions/visualizations/progress-bar.md)
- [Scatter plot or bubble chart](../../questions/visualizations/scatterplot-or-bubble-chart.md)
- [Tables](../../questions/visualizations/table.md)
- [Trend](../../questions/visualizations/trend.md)
- [Waterfall chart](../../questions/visualizations/waterfall-chart.md)

View File

@@ -1,6 +1,8 @@
---
title: Working with JSON
summary: Learn how to unfold JSON columns into separate fields that you can filter on in the query builder.
redirect_from:
- /docs/latest/data-modeling/json-unfolding
---
# Working with JSON
@@ -11,32 +13,32 @@ With [some databases](#databases-that-support-json-unfolding), Metabase can unfo
Here is a table with a column that contains JSON.
![A table with a JSON column](./images/table-with-json-column.png)
![A table with a JSON column](../images/table-with-json-column.png)
Metabase can unfold that JSON column so that each key in the JSON object gets its own column in the table. Here are the unfolded fields of the table with the JSON column pictured above:
![Unfolded fields](./images/unfolded-fields.png)
![Unfolded fields](../images/unfolded-fields.png)
And here are the values as seen in the table:
![Unfolded values](./images/unfolded-values.png)
![Unfolded values](../images/unfolded-values.png)
This unfolding allows you to filter for values found in the original JSON object.
Metabase can also unfold nested JSON objects, but it doesn't unfold arrays. If a key contains an array, Metabase keeps that array as a single field.
Metabase will prefix the unfolded column names with the name of the original column that contained the JSON. You can change the column names in **Admin** > [Table metadata](metadata-editing.md), or by creating a [model](./models.md) and editing the column metadata.
Metabase will prefix the unfolded column names with the name of the original column that contained the JSON. You can change the column names in **Admin** > [Table metadata](./metadata-editing.md), or by creating a [model](../models/models.md) and editing the column metadata.
## Databases that support JSON unfolding
- [BigQuery](../databases/connections/bigquery.md): automatically enabled, applies to `STRUCT` types only.
- [BigQuery](../../databases/connections/bigquery.md): automatically enabled, applies to `STRUCT` types only.
If your data is stored in the [STRUCT data type](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type) in BigQuery, you can query the table's nested fields. This is enabled by default. However, Metabase won't unfold JSON stored in BigQuery as the `JSON` type. This is because in BigQuery, nested fields are _part of the table definition itself_, so when Metabase syncs with your BigQuery database, it'll be able to get metadata about any of your tables, including tables with nested fields. Querying nested fields, however, doesn't extend to arrays (REPEATED (STRUCT)) in BigQuery.
- [Druid (JDBC)](../databases/connections/druid.md)
- [MongoDB](../databases/connections/mongodb.md): automatically enabled for all nested fields.
- [MySQL](../databases/connections/mysql.md)
- [PostgreSQL](../databases/connections/postgresql.md)
- [Druid (JDBC)](../../databases/connections/druid.md)
- [MongoDB](../../databases/connections/mongodb.md): automatically enabled for all nested fields.
- [MySQL](../../databases/connections/mysql.md)
- [PostgreSQL](../../databases/connections/postgresql.md)
## Toggling JSON unfolding for a database
@@ -71,7 +73,7 @@ If performance degrades, or you'd rather keep the JSON contained in the original
7. In the **Behavior** section, locate the **Unfold JSON** option and select **Yes** or **No**. If the column was unfolded, Metabase will have hidden this JSON column from view, so if you want the JSON column to be visible again, you'll need to change the column's visibility to **Everywhere**.
8. Scroll to the top and click the **Filter values** button and select **Re-scan this field**.
![Unfolded JSON setting](./images/unfold-json-setting.png)
![Unfolded JSON setting](../images/unfold-json-setting.png)
## For JSON unfolding to work, the column's data type must be JSON
@@ -79,4 +81,4 @@ For example, if you upload a CSV with JSON in it, you might need to update the d
## Filtering JSON
In the [query builder](../questions/query-builder/editor.md), Metabase can't parse JSON in columns, so you can only filter by "Is empty" or "Not empty".
In the [query builder](../../questions/query-builder/editor.md), Metabase can't parse JSON in columns, so you can only filter by "Is empty" or "Not empty".

View File

@@ -2,14 +2,16 @@
title: Managing tables
summary: See all the tables in your Metabase, edit and sync metadata, edit column types, set visibility, publish tables, and more.
redirect_from:
- /docs/latest/data-studio/managing-tables
- /docs/latest/data-studio/data-structure
- /docs/latest/data-modeling/managing-tables
---
# Managing tables
_Data Studio > Tables_
![Data structure](./images/data-structure.png)
![Data structure](../images/data-structure.png)
You can manage table settings metadata to make it easier for people to work with your data in **Data Studio > Tables**.
@@ -40,23 +42,23 @@ You can search for table names, but the search will only match beginnings of wor
You can also filter tables by attributes like owners, visibility, or source - for example, if you wanted to find all hidden tables, or all tables created from CSV uploads.
You can set [table attributes](#table-attributes), [edit metadata](#table-and-field-metadata), [publish the table](#publishing-and-unpublishing-tables) or create [segments](./segments.md) or [measures](./measures.md) on the table. You can also select tables in bulk to publish or assign attributes (including visibility) to multiple tables at once.
You can set [table attributes](#table-attributes), [edit metadata](#table-and-field-metadata), [publish the table](#publishing-and-unpublishing-tables) or create [segments](../semantic-layer/segments.md) or [measures](../semantic-layer/measures.md) on the table. You can also select tables in bulk to publish or assign attributes (including visibility) to multiple tables at once.
## Publishing and unpublishing tables
_Data Studio > Tables > Details_
![Publishing a table from Data structure](./images/data-structure-publish.png)
![Publishing a table from Data structure](../images/data-structure-publish.png)
{% include plans-blockquote.html feature="Publishing tables to the Library" %}
Once you select a table in **Data Studio > Tables**, you can publish the table to add it to the Library. The Library is a special collection that helps you create a source of truth for analytics by providing a centrally managed set of curated content.
See [Publishing tables](./library.md#publishing-tables) in the [Library docs](./library.md).
See [Publishing tables](../semantic-layer/library.md#publishing-tables) in the [Library docs](../semantic-layer/library.md).
## Find and replace tables
You can replace every occurrence of a table as a data source with another table. See [Replace data sources](./dependencies/replace-data-sources.md).
You can replace every occurrence of a table as a data source with another table. See [Replace data sources](../tools/replace-data-sources.md).
## Sync settings
@@ -66,7 +68,7 @@ You can trigger manual re-sync of the table schema in **Data Studio > Tables** i
You can also re-scan field values for the table or discard cached field values, which is useful if you need to retrieve updated values for dropdown filters.
See [syncs and scans](../databases/sync-scan.md) for more information.
See [syncs and scans](../../databases/sync-scan.md) for more information.
## Table attributes
@@ -86,23 +88,23 @@ The **Visibility layer** attribute controls whether people in your Metabase can
The options are:
- **Hidden**: the table isn't available in the query builder and isn't [synced](../databases/sync-scan.md). People with SQL access can still query the table.
- **Hidden**: the table isn't available in the query builder and isn't [synced](../../databases/sync-scan.md). People with SQL access can still query the table.
- **Internal**: table visible in the query builder and synced.
- **Final**: table is visible in the query builder and synced.
Table visibility layer can be used as a tool to improve user experience of people working in your Metabase, and it should _not be used to control access_ - use [data permissions](../permissions/data.md) to control access instead.
Table visibility layer can be used as a tool to improve user experience of people working in your Metabase, and it should _not be used to control access_ - use [data permissions](../../permissions/data.md) to control access instead.
### Entity type
You can use **entity type** to tell people what kind of information is contained in the table, for example "Transaction" or "Event". Metabase will try to detect and automatically assign appropriate entity types (like entity type "Person" for a `Users` table"), but you can always change it later.
Outside Data Studio, entity type determines the record icons in the [details view](../exploration-and-organization/exploration.md#view-details-of-a-record).
Outside Data Studio, entity type determines the record icons in the [details view](../../exploration-and-organization/exploration.md#view-details-of-a-record).
### Source
**Source** describes where the data comes from. It can be useful when you want to identify tables that are, for example, ingested tables, or tables coming from CSV uploads.
Metabase will automatically assign the source "Metabase transforms" to tables created by [Metabase transforms](./transforms/transforms-overview.md), and source "Uploaded data" to tables created by new [CSV uploads](../databases/uploads.md) (CSV uploads that you created before getting Data Studio will not be automatically tagged).
Metabase will automatically assign the source "Metabase transforms" to tables created by [Metabase transforms](../transforms/transforms-overview.md), and source "Uploaded data" to tables created by new [CSV uploads](../../databases/uploads.md) (CSV uploads that you created before getting Data Studio will not be automatically tagged).
## Table and field metadata
@@ -110,19 +112,19 @@ _Data Studio > Tables > Fields_
You can edit field descriptions, types, visibility settings, and formatting. For example, you can choose to display a filter on a field as a dropdown, or display days as `21.03.2026` instead of `03/21/2026`.
See [Table metadata editing](../data-modeling/metadata-editing.md).
See [Table metadata editing](./metadata-editing.md).
## Segments
Segments are saved filters on a table that people can use in the query builder. See [Segments](./segments.md).
Segments are saved filters on a table that people can use in the query builder. See [Segments](../semantic-layer/segments.md).
## Measures
Measures are saved aggregations on a table that people can use in the query builder. See [Measures](./measures.md).
Measures are saved aggregations on a table that people can use in the query builder. See [Measures](../semantic-layer/measures.md).
## Further reading
- [Table metadata editing](../data-modeling/metadata-editing.md)
- [Segments](./segments.md)
- [Measures](./measures.md)
- [Schema viewer](./schema-viewer.md)
- [Table metadata editing](./metadata-editing.md)
- [Segments](../semantic-layer/segments.md)
- [Measures](../semantic-layer/measures.md)
- [Schema viewer](../tools/schema-viewer.md)

View File

@@ -2,21 +2,22 @@
title: "Table metadata editing"
redirect_from:
- /docs/latest/administration-guide/03-metadata-editing
- /docs/latest/data-modeling/metadata-editing
---
# Table metadata editing
> Prefer using [Data Studio > Tables](../data-studio/managing-tables.md) for metadata editing. The page _Admin > Table Metadata_ will be removed in future versions of Metabase.
> Prefer using [Data Studio > Tables](./managing-tables.md) for metadata editing. The page _Admin > Table Metadata_ will be removed in future versions of Metabase.
_Admin > Table metadata_
Metabase lets you add and edit metadata for your tables and columns.
![Table metadata settings](./images/table-metadata-settings.png)
![Table metadata settings](../images/table-metadata-settings.png)
The **Table metadata settings only affect the way Metabase displays the data. None of the settings change the data in your database.**
Admins can grant access to these metadata settings to other groups. See [table metadata permissions](../permissions/data.md#manage-table-metadata-permissions).
Admins can grant access to these metadata settings to other groups. See [table metadata permissions](../../permissions/data.md#manage-table-metadata-permissions).
## Table settings
@@ -28,11 +29,11 @@ You can search for tables, or use the tree navigation to find each of your conne
To edit a table's display name or description in the table metadata tab, click into the box that contains the current table name or description and edit it. Changes will be saved automatically once you click out of the box.
Descriptions are displayed in Metabase's [data reference](../exploration-and-organization/data-model-reference.md) and tooltips when viewing the table. Descriptions help people find the right table for their use case.
Descriptions are displayed in Metabase's [data reference](../../exploration-and-organization/data-model-reference.md) and tooltips when viewing the table. Descriptions help people find the right table for their use case.
### Table sync options
Actions you can take to refresh the schema or field values. For more, check out [syncs and scans](../databases/sync-scan.md).
Actions you can take to refresh the schema or field values. For more, check out [syncs and scans](../../databases/sync-scan.md).
#### Sync table schema
@@ -61,7 +62,7 @@ You can sort the fields in a table in different ways:
You can toggle the visibility of a table by clicking on the **eye** icon next to the table name in the left sidebar navigation tree in the Table metadata tab.
**Hidden tables** won't show up in the [query builder](../questions/query-builder/editor.md) or [data reference](../exploration-and-organization/data-model-reference.md). **But this is not a permissions feature**: hidden tables can still be used in SQL questions if someone knows the name of the table. For example, `SELECT * FROM table_name` from the [SQL editor](../questions/native-editor/writing-sql.md) would return results. To prevent people from writing queries against specific tables, see [data permissions](../permissions/data.md).
**Hidden tables** won't show up in the [query builder](../../questions/query-builder/editor.md) or [data reference](../../exploration-and-organization/data-model-reference.md). **But this is not a permissions feature**: hidden tables can still be used in SQL questions if someone knows the name of the table. For example, `SELECT * FROM table_name` from the [SQL editor](../../questions/native-editor/writing-sql.md) would return results. To prevent people from writing queries against specific tables, see [data permissions](../../permissions/data.md).
To hide **all of the tables in a database** (say, if you've migrated to a new database), click on the **eye** icon next to the database name in the sidebar.
@@ -73,9 +74,9 @@ Fields are also known as Columns (see the [difference between fields and columns
## Field name and description
To change the _global_ display name of a column in Metabase, click on the name of the column. For example, you could display "auth.user" as "User" to make the column more readable. People can also use [models](./models.md) to give columns a display name that's local to the model.
To change the _global_ display name of a column in Metabase, click on the name of the column. For example, you could display "auth.user" as "User" to make the column more readable. People can also use [models](../models/models.md) to give columns a display name that's local to the model.
To add a description, click into the box below the column name. Descriptions are displayed in the [data reference](../exploration-and-organization/data-model-reference.md) to help people interpret the column's values. You should consider adding a description if your column contains:
To add a description, click into the box below the column name. Descriptions are displayed in the [data reference](../../exploration-and-organization/data-model-reference.md) to help people interpret the column's values. You should consider adding a description if your column contains:
- Abbreviations or codes
- Zeroes, nulls, or blank values
@@ -83,7 +84,7 @@ To add a description, click into the box below the column name. Descriptions are
## Field preview
![Field filtering preview](./images/field-filtering-preview.png)
![Field filtering preview](../images/field-filtering-preview.png)
Click the preview button to see sample data from that field.
@@ -116,7 +117,7 @@ If you want Metabase to treat a text or number column as a datetime column, you
For example, say you have a "Created At" column with a string [data type](https://www.metabase.com/learn/grow-your-data-skills/data-fundamentals/data-types-overview) in your database. If you want to:
- Create relative date filters, such as "Created At = Last week".
- Use "Created At" with formulas like [datetimeAdd](../questions/query-builder/expressions/datetimeadd.md).
- Use "Created At" with formulas like [datetimeAdd](../../questions/query-builder/expressions/datetimeadd.md).
You can cast that string to a Date type.
@@ -145,7 +146,7 @@ Casting options include:
- Float->Integer
- Datetime->Date
If Metabase doesn't support the casting option you need, you can [create a SQL question](../questions/native-editor/writing-sql.md#starting-a-new-sql-query) that casts the data and [save it as a model](./models.md#create-a-model-from-a-saved-question), or create a view directly in your database.
If Metabase doesn't support the casting option you need, you can [create a SQL question](../../questions/native-editor/writing-sql.md#starting-a-new-sql-query) that casts the data and [save it as a model](../models/models.md#create-a-model-from-a-saved-question), or create a view directly in your database.
## Field metadata
@@ -153,11 +154,11 @@ _Admin > Table Metadata > Database > Table > Field_
### Semantic type
You can change the [semantic type](../data-modeling/semantic-types.md) to give people more context and enable additional functionality, such as displaying text as an image (if the text is an image URL). Another example: you could set an Integer as a "Score" so people have a better idea what those integers indicate.
You can change the [semantic type](./semantic-types.md) to give people more context and enable additional functionality, such as displaying text as an image (if the text is an image URL). Another example: you could set an Integer as a "Score" so people have a better idea what those integers indicate.
The semantic types you can choose from depend on the data type. If none of the options describe the values in the column, you can set this setting to "No semantic type".
See [semantic types](../data-modeling/semantic-types.md).
See [semantic types](./semantic-types.md).
## Field behavior
@@ -167,23 +168,23 @@ _Admin > Table Metadata > Database > Table > Field_
- **Everywhere**: By default, users can see all of the columns in a table.
- **Only in detail views**: The detail view is the view you see when you expand a single row in a table. This will hide lengthy text from question results. This setting is applied by default if a column's values have an average length of more than 50 characters. For example, you could use this setting on a column like "Customer Comments" if you already have a column for "Customer Rating".
- **Do not include**: Columns won't show up in the query builder or data reference. You can set this option on sensitive columns (such as PII) or irrelevant columns. But this visibility option is a simple omit/hide option; **it's not a permissions feature**. These columns are still accessible for people with native query privileges; they can write `SELECT hidden_column FROM table` or `SELECT * FROM table` in the [SQL editor](../questions/native-editor/writing-sql.md) and they'll be able to view these fields and their values.
- **Do not include**: Columns won't show up in the query builder or data reference. You can set this option on sensitive columns (such as PII) or irrelevant columns. But this visibility option is a simple omit/hide option; **it's not a permissions feature**. These columns are still accessible for people with native query privileges; they can write `SELECT hidden_column FROM table` or `SELECT * FROM table` in the [SQL editor](../../questions/native-editor/writing-sql.md) and they'll be able to view these fields and their values.
To restrict what data people can view and query, see [data permissions](../permissions/data.md).
To restrict what data people can view and query, see [data permissions](../../permissions/data.md).
### Filtering
The **Filtering** setting changes a column's default [filter widget](../dashboards/filters.md). Options include:
The **Filtering** setting changes a column's default [filter widget](../../dashboards/filters.md). Options include:
- **Search box**: Display a search box and suggest autocompletions for values in that column that match the search term(s).
- **A list of all values**: Display a search box, as well as a dropdown menu with checkboxes for values. If the number of distinct values exceeds 1000, however, Metabase will instead display a search box. See [Changing a search box filter to a dropdown filter](#changing-a-search-box-filter-to-a-dropdown-filter).
- **Plain input box**: Display a search box, but don't suggest autocompletions.
The settings here will also affect dashboard filters. For example, if you set this to plain input box, you won't be able to set up a dashboard filter that has a dropdown menu. See [dropdown list](../dashboards/filters.md#dropdown-list).
The settings here will also affect dashboard filters. For example, if you set this to plain input box, you won't be able to set up a dashboard filter that has a dropdown menu. See [dropdown list](../../dashboards/filters.md#dropdown-list).
#### Changing a search box filter to a dropdown filter
The dropdown filter widget can be finicky, because Metabase needs to run a [scan](../databases/sync-scan.md#how-database-scans-work) to get the list of values for the dropdown menu. If you're having trouble:
The dropdown filter widget can be finicky, because Metabase needs to run a [scan](../../databases/sync-scan.md#how-database-scans-work) to get the list of values for the dropdown menu. If you're having trouble:
1. Set the [Semantic type](#semantic-type) to "Category".
2. Set [Filtering](#filtering) to "A list of all values".
@@ -221,4 +222,4 @@ See [Working with JSON](./json-unfolding.md).
## Further reading
- [Keeping your analytics organized](https://www.metabase.com/learn/metabase-basics/administration/administration-and-operation/same-page)
- [Data modeling tutorials](https://www.metabase.com/learn/metabase-basics/getting-started/models)
- [Data modeling tutorials](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/models)

View File

@@ -3,6 +3,7 @@ title: "Data types and semantic types"
redirect_from:
- /docs/latest/users-guide/field-types
- /docs/latest/data-modeling/field-types
- /docs/latest/data-modeling/semantic-types
summary: "Metabase uses both data and semantic types to understand how to format and visualize your data."
---
@@ -10,14 +11,14 @@ summary: "Metabase uses both data and semantic types to understand how to format
Metabase distinguishes between two types of column metadata: data types and field types.
- [**Data types**](#data-types) are the underlying column type as defined in your database, like `Date` or `Text`. Metabase reads the data types during the [database sync process](../databases/sync-scan.md).
- [**Data types**](#data-types) are the underlying column type as defined in your database, like `Date` or `Text`. Metabase reads the data types during the [database sync process](../../databases/sync-scan.md).
- [**Semantic types**](#semantic-types), also called **field types**, are labels that describe how the data should be interpreted. For example, if you have a column with a data type of `Text` that you use to store emails, you can add a semantic type of `Email` to let people (and Metabase) know what kind of text the column stores.
Data and semantic types determine how Metabase formats the data, which charts are available, how the filters work, and other functionality.
## Data types
Data types are the underlying column types as defined in your database. Metabase reads the data types during the [database sync process](../databases/sync-scan.md). Because Metabase connects to many different databases, it uses its own type hierarchy under the hood, so that it can, for example, handle date fields in databases as different as PostgreSQL and MongoDB.
Data types are the underlying column types as defined in your database. Metabase reads the data types during the [database sync process](../../databases/sync-scan.md). Because Metabase connects to many different databases, it uses its own type hierarchy under the hood, so that it can, for example, handle date fields in databases as different as PostgreSQL and MongoDB.
The main data types in Metabase:
@@ -42,7 +43,7 @@ You can think of semantic types as adding meaning and context to a field to comm
- **Entity key.** Used to indicate that the field uniquely identifies each row. Could be a Product ID, serial number, etc.
- **Foreign key.** Used to refer to an Entity key of another table to connect data from different tables that are related. For example, in a Products table, you might have a Customer ID field that points to a Customers table, where Customer ID is the Entity key. If you want to use [linked filters on dashboards](../dashboards/linked-filters.md), you must set up foreign key relationships.
- **Foreign key.** Used to refer to an Entity key of another table to connect data from different tables that are related. For example, in a Products table, you might have a Customer ID field that points to a Customers table, where Customer ID is the Entity key. If you want to use [linked filters on dashboards](../../dashboards/linked-filters.md), you must set up foreign key relationships.
### Semantic types for numeric fields
@@ -95,13 +96,13 @@ You can think of semantic types as adding meaning and context to a field to comm
## Editing data and semantic types
Admins, and people with [permission to manage table metadata](../permissions/data.md#manage-table-metadata-permissions), can cast data types and edit semantic types in the Admin's Table Metadata tab.
Admins, and people with [permission to manage table metadata](../../permissions/data.md#manage-table-metadata-permissions), can cast data types and edit semantic types in the Admin's Table Metadata tab.
### Cast data types
Data types can't be edited in Metabase directly, but you can cast certain [data types to different types](./metadata-editing.md#cast-to-a-specific-data-type) so that, for example, Metabase will interpret a text data type as a date type.
Changes made in Table Metadata apply across your entire Metabase. However, if you build a query in the query builder, you can use type casting custom expressions like [`date()`](../questions/query-builder/expressions-list.md#date) or [`integer()`](../questions/query-builder/expressions-list.md#integer) to cast a string to a different type just in your query.
Changes made in Table Metadata apply across your entire Metabase. However, if you build a query in the query builder, you can use type casting custom expressions like [`date()`](../../questions/query-builder/expressions-list.md#date) or [`integer()`](../../questions/query-builder/expressions-list.md#integer) to cast a string to a different type just in your query.
### Semantic types don't change the data types
@@ -124,8 +125,8 @@ Formatting settings from Table Metadata settings will be applied across your Met
| Latitude/Longitude | Displayed as coordinates, e.g., `0.00000000° N` |
| Email | Display as a `mailto` link |
| URL | Can format as a clickable link |
| Image URL | Can display as an image. See [table format settings](../questions/visualizations/table.md#display-as) |
| Avatar URL | Can display as avatar circle image. See [table format settings](../questions/visualizations/table.md#display-as) |
| Image URL | Can display as an image. See [table format settings](../../questions/visualizations/table.md#display-as) |
| Avatar URL | Can display as avatar circle image. See [table format settings](../../questions/visualizations/table.md#display-as) |
| Field containing JSON | In detail view, display as prettified JSON |
| Entity and Foreign key | Highlighted in table view |
@@ -153,7 +154,7 @@ Additionally, if you use location semantic types:
### Extract values from columns
For some fields, you can quickly extract values from columns using [shortcuts in table view](../questions/visualizations/table.md#extract-domain-subdomain-host-or-path) or in the [custom expression editor](../questions/query-builder/expressions.md) in the query builder:
For some fields, you can quickly extract values from columns using [shortcuts in table view](../../questions/visualizations/table.md#extract-domain-subdomain-host-or-path) or in the [custom expression editor](../../questions/query-builder/expressions.md) in the query builder:
| Group by data type | Extract |
| ------------------- | --------------------------------------- |
@@ -163,11 +164,11 @@ For some fields, you can quickly extract values from columns using [shortcuts in
### X-rays
When you [X-ray](../exploration-and-organization/x-rays.md) a table, model, or entity, Metabase considers both the data type and the field type to display different charts that summarize that data.
When you [X-ray](../../exploration-and-organization/x-rays.md) a table, model, or entity, Metabase considers both the data type and the field type to display different charts that summarize that data.
### Field Filters
Knowing what field types are and how they work is helpful when using [field filters](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/sql-in-metabase/field-filters), as you can only create field filters for [certain field types](../questions/native-editor/field-filters.md#when-to-use-a-field-filter-variable-vs-a-basic-variable).
Knowing what field types are and how they work is helpful when using [field filters](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/sql-in-metabase/field-filters), as you can only create field filters for [certain field types](../../questions/native-editor/field-filters.md#when-to-use-a-field-filter-variable-vs-a-basic-variable).
### JSON unfolding
@@ -175,12 +176,12 @@ See [Working with JSON](./json-unfolding.md).
## Set semantic types in models to enable people to explore results with the query builder
You can set field types for [models](./models.md), which helps Metabase understand how to work with data in models built using SQL. If you set each column type in a SQL model, people will be able to explore that model using the query builder and drill-through menus.
You can set field types for [models](../models/models.md), which helps Metabase understand how to work with data in models built using SQL. If you set each column type in a SQL model, people will be able to explore that model using the query builder and drill-through menus.
With records that include integer entity keys, you can also configure text fields in models to [surface individual records in search](./models.md#surface-individual-records-in-search-by-matching-against-this-column).
With records that include integer entity keys, you can also configure text fields in models to [surface individual records in search](../models/models.md#surface-individual-records-in-search-by-matching-against-this-column).
## Further Reading
- [Exploring data with Metabase's data browser](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/data-browser).
- [Data reference](../../exploration-and-organization/data-model-reference.md).
- [The Table Metadata page: editing metadata](./metadata-editing.md).
- [Field Filters: create smart filter widgets for SQL questions](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/sql-in-metabase/field-filters).

View File

@@ -1,5 +1,7 @@
---
title: Basic actions
redirect_from:
- /docs/latest/actions/basic
---
# Basic actions
@@ -10,7 +12,7 @@ If you only want to give people the option to update a subset of columns, or upd
## Creating basic actions
Once actions are enabled, you can create basic actions on a new or existing [model](../data-modeling/models.md) that only wraps a single database table.
Once actions are enabled, you can create basic actions on a new or existing [model](../../../data-modeling/models/models.md) that only wraps a single database table.
1. Select a model and click on the **info** button, then click on **Model detail**.
2. On the model detail page, click on the **Actions** tab.
@@ -54,7 +56,7 @@ When setting up actions on a dashboard, you can either prompt the person to fill
The Update basic action requires you to pass a value for the entity key.
See [Actions in dashboards](../dashboards/actions.md).
See [Actions in dashboards](../../../dashboards/actions.md).
## Archiving basic actions
@@ -70,4 +72,4 @@ If you have basic actions enabled for a model, you can click on an individual re
- [Introduction to actions](./introduction.md)
- [Custom actions](./custom.md)
- [Actions in dashboards](../dashboards/actions.md)
- [Actions in dashboards](../../../dashboards/actions.md)

View File

@@ -1,5 +1,7 @@
---
title: Custom actions
redirect_from:
- /docs/latest/actions/custom
---
# Custom actions
@@ -12,7 +14,7 @@ Write SQL to update records in your databases.
> You must be in a group with Native query editing access to create an action.
1. First, [create a model](../data-modeling/models.md).
1. First, [create a model](../../../data-modeling/models/models.md).
2. Visit the model and click on the **info** button.
3. Click the **Actions** tab.
@@ -155,4 +157,4 @@ FROM prospects;
- [Introduction to actions](./introduction.md)
- [Basic actions](./basic.md)
- [Actions in dashboards](../dashboards/actions.md)
- [Actions in dashboards](../../../dashboards/actions.md)

View File

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 395 KiB

After

Width:  |  Height:  |  Size: 395 KiB

View File

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View File

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -1,5 +1,7 @@
---
title: Introduction to actions
redirect_from:
- /docs/latest/actions/introduction
---
# Introduction to actions
@@ -12,7 +14,7 @@ title: Introduction to actions
**Actions** are entities in Metabase that let you build custom forms and business logic.
Actions let you write parameterized SQL that writes back to your database. Actions can be attached to [buttons on dashboards](../dashboards/actions.md) to create custom workflows. You can even publicly share the parameterized forms that actions generate to collect data.
Actions let you write parameterized SQL that writes back to your database. Actions can be attached to [buttons on dashboards](../../../dashboards/actions.md) to create custom workflows. You can even publicly share the parameterized forms that actions generate to collect data.
Here are a few ideas for what you can do with actions:
@@ -20,20 +22,20 @@ Here are a few ideas for what you can do with actions:
- Let team members remove redundant data.
- Create a customer feedback form and embed it on your website.
Actions must be added to a [model](../data-modeling/models.md), but actions only run on the raw tables that back those models (so actions will never edit your [model definition](../data-modeling/models.md#edit-a-models-query)).
Actions must be added to a [model](../../../data-modeling/models/models.md), but actions only run on the raw tables that back those models (so actions will never edit your [model definition](../../../data-modeling/models/models.md#edit-a-models-query)).
If you're an admin who just wants to edit data in your tables, check out [Editable table data](../data-modeling/editable-tables.md).
If you're an admin who just wants to edit data in your tables, check out [Editable table data](../../../data-modeling/editable-tables.md).
## Enabling actions for a database
For actions to work, you'll first need to do the following two things:
1. **Enable model actions for the database connection**. To enable actions for a database connection, admins should click on the **grid** icon in the upper right and navigate to **Admin** > **Databases**, then click on the database you want to create actions for. On the right side of the connection settings form, toggle the **Model actions** option. For actions to work, the database user account (the account you're using to connect to the database) must have [write permissions](../databases/users-roles-privileges.md#privileges-to-enable-actions-and-editable-table-data). And for now, actions are only supported on PostgreSQL and MySQL databases.
1. **Enable model actions for the database connection**. To enable actions for a database connection, admins should click on the **grid** icon in the upper right and navigate to **Admin** > **Databases**, then click on the database you want to create actions for. On the right side of the connection settings form, toggle the **Model actions** option. For actions to work, the database user account (the account you're using to connect to the database) must have [write permissions](../../../databases/users-roles-privileges.md#privileges-to-enable-actions-and-editable-table-data). And for now, actions are only supported on PostgreSQL and MySQL databases.
2. **Create at least one model from that database.** Actions are associated with models, so you'll need to have created (or have access to) at least one model before you can start creating actions.
## Who can use actions
- **To create or edit an action**, a person must be in a group with [Native query editing](../permissions/data.md) privileges for the relevant database.
- **To create or edit an action**, a person must be in a group with [Native query editing](../../../permissions/data.md) privileges for the relevant database.
- **To run an action**, all you need is view access to the action's model or dashboard (or a link to a public action).
## Types of actions
@@ -47,9 +49,9 @@ There are two types of actions:
There are multiple ways to run actions:
- [From the model details page](../data-modeling/models.md#model-details) by clicking the **run** button.
- [From the model details page](../../../data-modeling/models/models.md#model-details) by clicking the **run** button.
- From a [public form](./custom.md#make-public) of an action.
- From a [button on dashboard](../dashboards/actions.md).
- From a [button on dashboard](../../../dashboards/actions.md).
## Actions change data in tables, which affect models
@@ -64,10 +66,10 @@ Before using actions in production, consider playing around with actions on some
- If caching is enabled for the relevant table or model, you may not see the effects of an action in Metabase until Metabase refreshes the data (though you can always manually refresh the data).
- When creating records on a table that lacks an automatically generated primary key, you'll need to input an available ID (i.e., an ID not already in use by another record).
- You can't "undo" actions. You can, however, create and run an action to recreate a deleted record, or change an updated record back to its original values (provided you know the original values).
- Actions are unavailable for public dashboards and dashboards in [guest embeds](../embedding/guest-embedding.md). To use actions in embeds, you can use [modular embedding](../embedding/modular-embedding.md) with SSO or [full app embedding](../embedding/full-app-embedding.md).
- Actions are unavailable for public dashboards and dashboards in [guest embeds](../../../embedding/guest-embedding.md). To use actions in embeds, you can use [modular embedding](../../../embedding/modular-embedding.md) with SSO or [full app embedding](../../../embedding/full-app-embedding.md).
## Further reading
- [Basic actions](./basic.md)
- [Custom actions](./custom.md)
- [Actions in dashboards](../dashboards/actions.md)
- [Actions in dashboards](../../../dashboards/actions.md)

View File

@@ -1,7 +1,9 @@
---
title: Actions overview
redirect_from:
- /docs/latest/data-modeling/models/actions/start
- /docs/latest/actions
- /docs/latest/actions/start
---
# Actions overview
@@ -22,6 +24,6 @@ Metabase will create basic actions that auto-track a model's schema.
Write SQL to create new actions.
## [Actions on dashboards](../dashboards/actions.md)
## [Actions on dashboards](../../../dashboards/actions.md)
Add actions on dashboards as buttons that you can pass filter values to.

View File

@@ -1,16 +1,18 @@
---
title: Model persistence
redirect_from:
- /docs/latest/data-modeling/model-persistence
---
# Model persistence
> Prefer [Transforms](../data-studio/transforms/transforms-overview.md) instead of model persistence. Model persistence remains supported for now, but it will be deprecated in future versions of Metabase. You can [convert models to transforms in bulk](../data-studio/transforms/query-transforms.md#convert-models-to-transforms).
> Prefer [Transforms](../transforms/transforms-overview.md) instead of model persistence. Model persistence remains supported for now, but it will be deprecated in future versions of Metabase. You can [convert models to transforms in bulk](../transforms/query.md#convert-models-to-transforms).
Metabase can persist the results of your models so that your models (and the questions based on those models) load faster.
Metabase will store model results in tables in a bespoke schema in your data warehouse (not the Metabase application database). When people ask questions based on your models, Metabase will use the tables with the stored results instead of re-running the model's query.
> Model persistence doesn't work with [row and column security](../permissions/row-and-column-security.md) or [impersonation](../permissions/impersonation.md).
> Model persistence doesn't work with [row and column security](../../permissions/row-and-column-security.md) or [impersonation](../../permissions/impersonation.md).
## Databases that support model persistence
@@ -20,7 +22,7 @@ Currently, model persistence is only available for the following databases:
- MySQL
- Redshift
Model persistence doesn't work with [row and column security](../permissions/row-and-column-security.md) or [impersonation](../permissions/impersonation.md).
Model persistence doesn't work with [row and column security](../../permissions/row-and-column-security.md) or [impersonation](../../permissions/impersonation.md).
## Turn on model persistence in Metabase
@@ -36,7 +38,7 @@ To turn on model persistence for your Metabase, go to **Admin** > **Performance*
You can set models to refresh based on one of the default frequencies (every 1 hour, 2 hours, etc.), or select the **Custom** option to use [cron syntax](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html) to specify your own update frequency.
The cron scheduler uses the [default instance report Timezone](../configuring-metabase/localization.md#set-default-instance-report-timezone) if selected. Otherwise the scheduler will use the System Timezone (which defaults to GMT in [Metabase Cloud](https://www.metabase.com/cloud/)).
The cron scheduler uses the [default instance report Timezone](../../configuring-metabase/localization.md#set-default-instance-report-timezone) if selected. Otherwise the scheduler will use the System Timezone (which defaults to GMT in [Metabase Cloud](https://www.metabase.com/cloud/)).
We recommend scheduling your models to refresh on a frequency that makes sense with how often your source tables update with new data.
@@ -60,7 +62,7 @@ By default, new models on the database will _not_ be persisted. You need to [Tur
{% include plans-blockquote.html feature="Individual model persistence" %}
You can also toggle persistence on or off for individual models. When viewing a model, click on the **...** in the upper right and select **Edit settings**. Toggle **Persist model data** on (you'll need [Curate access](../permissions/collections.md#curate-access) to the model's collection to do this).
You can also toggle persistence on or off for individual models. When viewing a model, click on the **...** in the upper right and select **Edit settings**. Toggle **Persist model data** on (you'll need [Curate access](../../permissions/collections.md#curate-access) to the model's collection to do this).
Toggling persistence for individual models is useful for models with data that updates at different frequencies than the schedule you set for other models in that database, or for models that are used more or less than other models in that database.
@@ -70,11 +72,11 @@ To refresh a model's results, go to the model and click on the three-dot menu (*
## View model persistence logs
You can view the logs for model persistence in **Monitor** > **Model persistence log**. See [Model persistence log](../monitor/model-persistence-log.md).
You can view the logs for model persistence in **Monitor** > **Model persistence log**. See [Model persistence log](../../monitor/model-persistence-log.md).
## Difference between persisted models and caching
Persisted models differ from [cached results](../configuring-metabase/caching.md):
Persisted models differ from [cached results](../../configuring-metabase/caching.md):
- **Models are persisted in your data warehouse; cached results are stored in the application database**. Metabase stores cached results in its application database. Metabase persists models in your connected data warehouse as tables.
- **Metabase refreshes model results and invalidates cached results**. Metabase will refresh results of models according to the schedule you set. That is, Metabase will re-run the model's query and store the results in your data warehouse. For cached results of saved questions and dashboards, Metabase won't run the queries automatically; it will cache results when people view the question or dashboard, and invalidate the cached results according to the caching policy you set.
@@ -82,4 +84,4 @@ Persisted models differ from [cached results](../configuring-metabase/caching.md
## Further reading
- [Models](./models.md)
- [Caching policies](../configuring-metabase/caching.md)
- [Caching policies](../../configuring-metabase/caching.md)

View File

@@ -1,12 +1,13 @@
---
title: "Models"
redirect_from:
- /docs/latest/data-modeling/models
- /docs/latest/users-guide/models
---
# Models
> Consider using [Transforms](../data-studio/transforms/transforms-overview.md) instead of models. You can [convert models to transforms in bulk](../data-studio/transforms/query-transforms.md#convert-models-to-transforms).
> Consider using [Transforms](../transforms/transforms-overview.md) instead of models. You can [convert models to transforms in bulk](../transforms/query.md#convert-models-to-transforms).
Models curate data from one or more tables (from the same database) to anticipate the kinds of questions people will ask of the data. You can think of them as derived tables, or a special kind of saved question meant to be used as the starting point for new questions. You can base a model on a SQL or query builder question, which means you can include custom, calculated columns in your model.
@@ -38,7 +39,7 @@ First, search for models that already exist. If you can't find one that meets yo
- [from scratch](#create-a-model-from-scratch), or
- [from a saved question](#create-a-model-from-a-saved-question).
Models you create are automatically [pinned to the current collection](../exploration-and-organization/collections.md#pinned-items).
Models you create are automatically [pinned to the current collection](../../exploration-and-organization/collections.md#pinned-items).
### Create a model from scratch
@@ -49,7 +50,7 @@ Now choose either the query builder or a native query (if you want to use SQL).
Next, select your data, create your query, and save it.
Models you create are automatically [pinned to the current collection](../exploration-and-organization/collections.md#pinned-items).
Models you create are automatically [pinned to the current collection](../../exploration-and-organization/collections.md#pinned-items).
### Create a model from a saved question
@@ -57,17 +58,17 @@ Models you create are automatically [pinned to the current collection](../explor
2. Save the question.
3. Click on the **...** > **Turn this into a model**.
![Turn a saved question into a model](./images/turn-into-a-model.png)
![Turn a saved question into a model](../../data-modeling/images/turn-into-a-model.png)
## Model details
To view a model's details, visit the model and click on the **info** button in the upper right. Here you'll see several tabs:
- **Overview**: Includes the description, Creator and Last Editor, and the list of fields included in the model. As well as the model's [Entity ID](../installation-and-operation/serialization.md#metabase-uses-entity-ids-to-identify-metabase-items).
- **Overview**: Includes the description, Creator and Last Editor, and the list of fields included in the model. As well as the model's [Entity ID](../../installation-and-operation/serialization.md#metabase-uses-entity-ids-to-identify-metabase-items).
- **History**: Lists changes to the model, and by whom.
- **Relationships**: Lists which questions use the model, and which tables the model is linked to.
- **Actions**: Lists actions created based on the model.
- **Insights**: Info about the [model's usage](../usage-and-performance-tools/usage-analytics.md). Only visible to admins on a [Pro or Enterprise plan](https://www.metabase.com/pricing/).
- **Insights**: Info about the [model's usage](../../usage-and-performance-tools/usage-analytics.md). Only visible to admins on a [Pro or Enterprise plan](https://www.metabase.com/pricing/).
## Add metadata to columns in a model
@@ -91,7 +92,7 @@ For models based on SQL queries, you can tell Metabase if the column has the sam
You can set the [column type][column-type]. The default is "No special type".
If your model is based on a SQL query and you want people to be able to explore the results with the query builder, you'll need to set the [column type](./semantic-types.md) for each column in your model.
If your model is based on a SQL query and you want people to be able to explore the results with the query builder, you'll need to set the [column type](../metadata/semantic-types.md) for each column in your model.
### This column should appear in...
@@ -127,13 +128,13 @@ You can edit a model's query by clicking on the down arrow next to the model's n
When you save changes to a model, Metabase will try to detect whether your changes would break any other entities that depend on that model. For example, if you remove a column from the model, but other questions based on that model rely on that column, Metabase will warn you that those downstream questions will break.
![Check dependencies](./images/check-dependencies.png)
![Check dependencies](../../data-modeling/images/check-dependencies.png)
Currently, Metabase will look for broken column references. If you rename or remove a column, Metabase will likely flag the change as breaking downstream entities. But Metabase can't detect other types of changes like changing the column type or computation logic as breaking changes.
## Model list view
![Viewing a model as a list](./images/model-list.png)
![Viewing a model as a list](../../data-modeling/images/model-list.png)
List view helps you explore records one by one instead of sorting through big tables. You can customize the layout to highlight the most important fields.
@@ -145,11 +146,11 @@ To view a model as a list:
4. Navigate to the **Settings** tab.
5. Under "What should the default view of this data be?", toggle to **List**.
![Model list edit](./images/model-list-edit.png)
![Model list edit](../../data-modeling/images/model-list-edit.png)
### Customize model list view
![Customize list layout](./images/customize-list.png)
![Customize list layout](../../data-modeling/images/customize-list.png)
You can customize how the data appears by clicking **Customize the List layout**.
@@ -174,7 +175,7 @@ Click **Done** to save your changes.
See [asking questions][question].
## [Refer to a model in the SQL query editor](../questions/native-editor/referencing-saved-questions-in-queries.md)
## [Refer to a model in the SQL query editor](../../questions/native-editor/referencing-saved-questions-in-queries.md)
You can refer to a model in a SQL query just like you can refer to a saved question:
@@ -200,19 +201,19 @@ You can also use the data reference sidebar to browse the models available. To o
## Model version history
For [questions](../questions/start.md), [dashboards](../dashboards/start.md), and models, Metabase keeps a version history for the previous fifteen versions of that item. You can view changes and revert to previous versions.
For [questions](../../questions/start.md), [dashboards](../../dashboards/start.md), and models, Metabase keeps a version history for the previous fifteen versions of that item. You can view changes and revert to previous versions.
See [History](../exploration-and-organization/history.md).
See [History](../../exploration-and-organization/history.md).
## Delete a model
You can move outdated or unneeded models to trash, or delete them permanently. Deleting a model will affect questions that use it as a data source.
See [Deleting and restoring items](../exploration-and-organization/delete-and-restore.md).
See [Deleting and restoring items](../../exploration-and-organization/delete-and-restore.md).
## Verifying a model
See [content verification](../exploration-and-organization/content-verification.md).
See [content verification](../../exploration-and-organization/content-verification.md).
## Model persistence
@@ -220,20 +221,20 @@ See [Model persistence](./model-persistence.md)
## Convert a model to a transform
[Transforms](../data-studio/transforms/transforms-overview.md) are the successor to models. Transforms create a persistent table in your database that refreshes on a schedule, instead of running the query live each time. Metabase will be gradually phasing out models in favor of transforms.
[Transforms](../transforms/transforms-overview.md) are the successor to models. Transforms create a persistent table in your database that refreshes on a schedule, instead of running the query live each time. Metabase will be gradually phasing out models in favor of transforms.
If you're an admin, you can convert existing models to transforms one at a time. Conversion creates a transform from the model's query, runs it to produce the output table, and then updates all questions and dashboards that used the model to use the transform's table instead. The model itself becomes a saved question.
See [Convert existing models to transforms](../data-studio/transforms/query-transforms.md#convert-models-to-transforms).
See [Convert existing models to transforms](../transforms/query.md#convert-models-to-transforms).
## Further reading
- [Models in Metabase][learn-models]
- [Troubleshooting models][troubleshooting-models].
[column-type]: ./semantic-types.md
[column-type]: ../metadata/semantic-types.md
[cte]: https://www.metabase.com/learn/sql/working-with-sql/sql-cte
[measures-dimensions]: https://www.metabase.com/learn/grow-your-data-skills/data-fundamentals/dimensions-and-measures
[question]: ../questions/start.md
[learn-models]: https://www.metabase.com/learn/metabase-basics/getting-started/models
[troubleshooting-models]: ../troubleshooting-guide/models.md
[question]: ../../questions/start.md
[learn-models]: https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/models
[troubleshooting-models]: ../../troubleshooting-guide/models.md

View File

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View File

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Some files were not shown because too many files have changed in this diff Show More