Compare commits

..

485 Commits

Author SHA1 Message Date
Nathan Voxland
2881136730 Only update search index if instance was actually updated 2025-05-01 10:05:57 -05:00
Nathan Voxland
10cfe891bb Only update search index if instance was actually updated 2025-04-30 16:58:01 -05:00
Nathan Voxland
8c80c8107f Only update search index if instance was actually updated 2025-04-30 16:39:07 -05:00
bryan
90b9fea551 fix docs bump workflow (#57454) 2025-04-30 20:47:26 +00:00
bryan
8574e882e9 Remove non-doc branches before sending workflow trigger (#57446) 2025-04-30 15:50:42 -04:00
lbrdnk
609807dc33 Fix sorting by aggregation expression with cumulative function works (#57292) 2025-04-30 20:24:30 +02:00
Alex Yarosh
698012db51 Update countif.md (#57373) 2025-04-30 14:12:24 -04:00
Edward Paget
8006d49537 fix: move internal stats for module organization (#57430) 2025-04-30 17:50:33 +00:00
Cam Saul
0c154e49de [Backend modularization] cache module (#57410)
* [Backend modularization] `cache` module

* Update module config

* Update Setting references
2025-04-30 09:43:46 -06:00
Edward Paget
eb3cc6d1cc feat: add prometheus metric for quartz task states (#56994)
* feat: add prometheus metric for quartz task states

Adds a new quartz_task_state metric that will report to prometheus the
states of all quartz jobs running on a metabase instance using a guage.

Each task state is reported as a label and we also report a state for
tasks that are executing.

All hosts on a metabase cluster _should_ report the same value for these
metrics if they are scraped at the same time, and we need to consider if
the additional DB load is okay since this does query the database during
a prometheus scrape to report this metric.

* fixup! add job-name tag and histogram of job time
2025-04-30 13:31:08 +00:00
Nicolò Pretto
af3156b9dd add locale selector to sdk storybook (#57393)
* add locale selector to sdk storybook

* clarify the default value and change to have objects as items
2025-04-30 15:12:40 +02:00
Alexander Polyankin
0f158889c6 Handle submit in dashboard filter widgets (#57388)
* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit

* Handle submit
2025-04-30 08:11:58 -04:00
Alexander Polyankin
85411a4abc Apply filter split button (#57215)
* Add filter add button

* Add filter add button

* Add filter add button

* Add filter add button

* Add filter add button

* Add filter add button

* Add filter add button

* Add filter add button

* Add filter add button

* Fix E2E

* Fix E2E

* Fix E2E

* Fix back button

* Fix back button

* Fix back button

* Fix back button

* Fix back button

* Fix back button

* Fix back button

* Remove extra source abstraction
2025-04-30 06:21:07 -04:00
Timofey Kachalov
1586c15e04 Add Access-Control-Max-Age header to cache CORS preflight requests made by SDK (#57383) 2025-04-30 11:55:52 +04:00
Timofey Kachalov
827c5d8b2e Update Shoppy Sample App Tests to work with App DB Dump (#57250) 2025-04-30 11:17:49 +04:00
Cam Saul
6d588fef7a [Backend modularization] embedding module (#57409)
* Embedding module

* Embedding module

* Fix lint errors

* Fix circular references

* Remove reference to renamed namespace
2025-04-29 16:58:58 -07:00
Cam Saul
c1d7e63ac0 [Backend modularization] Move premium-features API into module and other misc cleanup (#57404)
* [Backend modularization] Move `premium-features` API into module and other misc cleanup

* Fix Search Settings

* Fix

* Fix removed namespace

* Test fix 🔧
2025-04-29 15:30:17 -07:00
Cam Saul
486a5904a4 [Backend modularization] task-history module (#57369)
* [Backend modularization]  module

* Add init namespaces

* Test fix 🔧

* Test fixes 🔧

* [Backend Modularization] `task-history` module

* cljfmt
2025-04-29 14:57:15 -07:00
Noah Moss
b0c1eddc38 Quarantine cypress flakes in download format test + small correctness fix (#57392)
* try to fix cypress download format flakes

* handle unset last_table_download_format

* more test tweaks

* make tests shorter, refactor, and add wait periods

* rearrange more code

* remove the waits, quarantine tests as flaky

* move cy.intercept to right before reload

* skip tests again

* unravel .then calls
2025-04-29 21:38:16 +00:00
Nathan Voxland
ff6f759dbd Delete indexed rows from the search index which correspond to deleted rows (#57086) 2025-04-29 16:29:53 -05:00
Ryan Laurie
06d74f2209 Map settings array on fetch (#57367)
* map array on fetch

* fix types
2025-04-29 15:28:51 -06:00
Case Nelson
b11300d091 feat: Implement multi-catalog for databricks (#57148)
* feat: Implement multi-catalog for databricks

* Fix schema for nil

* Add tests for joins on multi-catalog

* Fix multicatalog driver name

* Remove require

* Alphabetize drivers

* Add changelog

* Fix tests

* Fix tests

* Do not sync system catalogs

* Address review comments

* Update connection properties

* Update example to make clear its a schema
2025-04-29 14:57:36 -06:00
Cam Saul
01b2c8c140 [Backend modularization] settings module (#57366)
* [Backend modularization]  module

* Add init namespaces

* Test fix 🔧

* Test fixes 🔧
2025-04-29 13:32:18 -07:00
Nemanja Glumac
2ab279f7bb Add unit tests coverage for branded export utils (#57358)
* Add basic unit test coverage for export branding utils

* Add tests for `getChartFileName` util
2025-04-29 21:17:07 +02:00
Nathan Voxland
cfd1cd8c3b Handle deleted connections in harbormaster (#57356) 2025-04-29 13:14:35 -05:00
Nathan Voxland
a7ff114fed mb/mb should be able to get an mb_dev_* token (#57363) 2025-04-29 09:10:49 -05:00
Alan Molina
6b5b200b71 Fix typo on collections.md (#52657)
Just removing an additional square bracket in the docs.
2025-04-29 09:09:11 -04:00
metamben
e8acf5e4b1 [SEM-219] Humanize error message even more (#57205)
* [SEM-219] Humanize error message even more

To provide the customized error message, the type check built into the defendpoint framework has to be disabled, which
results in less specific API documentation.

(Malli has an experimental feature we currently don't use for looking up humanized errors from parent schemas, that
would let us configure the error message AND keep the input type information.)
2025-04-29 15:51:34 +03:00
Ryan Laurie
a180c257e1 Refactor Build + Docker Uberjar Job (#57298)
* rewrite uberjar workflow

* test

* fix

* fix

* fix

* fix

* fix

* fixes

* dont make docker sad

* remove test code

* remove metabot shenanigans

* address review comments

* different secrets handling

* remove test code
2025-04-29 06:22:03 -06:00
github-automation-metabase
f990334130 Bump com.gfredericks/test.chuck from 0.2.14 to 0.2.15 (#56651)
Inspect dependency changes here: https://github.com/gfredericks/test.chuck/blob/test.chuck-0.2.15/changes.md

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-29 10:30:07 +00:00
Nemanja Glumac
ebd7ea407f Use custom redux import to remove type casting (#57362)
Resolves PRG-13
2025-04-29 09:46:47 +00:00
lbrdnk
79daf9d2bd Use case statment to filter metrics (#55094)
* Test comparing  case vs filtered ags

* Add test and update case definition

* Add logging to check CI, mark as driver ns

* Remove metadata to see which driver tests run

* add failing op for some drivers

* Use case to filter metric ag

* Filter in case

* Existing tests update

* WIP Respect expression deduplication

* Move transformation right after metric fetch

* Update test

* Aggregation maps to be used in tests

* Simplify metric transform

* New tests

* Cleanup

* Cleanup

* Cleanup

* Fix equality

* Cleanup

* Cleanup equality

* Simplify test

* Tolerate float deviation

* Feature dependent aggregations

* Update test

* Fix value formatting

* Add var to std dev ags

* Update the filtering logic

* Speculate

* Adjust tests

* Update test

* Kondo

* Adjust test for starburst

* Remove debug def

* Apply suggestions from code review

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>

* Adjust naming

* Comment

* fresh-uuids into definition

* Add shortcut for empty condition

* Adjust meta and case default

* Remove now redundant condition

* Docstring

* Indentation

* Remove dev leftover

* Remove dev leftover

* Update tests and distinct-where

* Nullary aggregations map

* Distinct-where feature

* Fix formatting

* Adjust e2e test

---------

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-04-29 09:48:55 +02:00
Sloan Sparger
d8cd6914d6 [Admin] Migrate groups pages + components to TS (#57232)
* convert UnsubscribeUserModal and UnsubscribeUserForm components

* convert UserActivationModal to TS

* convert UserPasswordResetModal to TS

* convert UserSuccessModal to TS

* convert PeopleList and PeopleListingApp components to TS

* convert PeopleListRow to TS

* convert use-people-query to TS

* fix deprecated usages of google_auth and ldap_auth with sso_source field

* fix lint

* convert GroupsListing, GroupsListingApp, and AddRow components to TS

* convert lib/groups, AdminContentTable, and AddMemberRow to TS

* convert GroupDetailApp and GroupDetail to TS

* fix import

* convert GroupSummary to TS, make adjustments to other converted files to make types happy

* remove people/components/SearchInput and convert usage to mantine component to avoid TS migration
2025-04-28 19:09:20 -05:00
Eric Normand
85194c8080 Extend integer() cast function to accept floats (#56817)
* Add float cases to integer cast testing

* Update types of integer mbql expression

* Better messages for tests

* Add rounding test and specialize for redshift

* Don't use extreme values for redshift

* Add e2e tests for float -> integer casts

* Update helper text for integer

* Change test message.

Co-authored-by: appleby <86076+appleby@users.noreply.github.com>

* Helper function to convert to integer

* Appease the kondo

* More accurate comment

* Update arithmetic.cljc

* Refactor to use better ->integer implementation for SQL dbs

* kick ci

* Missed an argument

* Round properly for inline constants

* Add String->Integer and Float->Integer coercion strategies

* Add MongoDB string->integer and float->integer coercions

* Fix types in coercion test

* Also cast in mongodb coercion

* Use NUMBER(p) type in Oracle

* Spark SQL needs explicit round()

* SQLite needs explicit round()

* SQL Server needs explicit round()

* Clickhouse cast to float first

* SQLite needs to cast to float first so it can round

* SQL Server needs to cast to float so it can round

* Mongo needs to cast to float before rounding

* Spark SQL needs to cast to float so it can round

* Revert converting multimethod ->integer to defn

* Remove cast-integer multi-method and restore ->integer

* Update `integer-dbtype` in changelog

* Fix oracle integer type

* Fix spark sql casting

* Databricks driver needs to round

* kick ci

* Use ->integer in coercion

* Helper function for cast to integer with round

* kick ci

* Remove unnecessary ->float implementation

* Fix cljfmt precommmit hook

* Fix clickhouse returning bigdecimal

* Handle raw values in untyped-inline-value

* This came in with the merge

* Allow integer(float) and integer(string)

* Remove stray println

* Work for known types only

* Test for converting literals at compile time

* Update mysql

* Fix timezone test failing on null week-of-year

* Update fe test for float coercion

* Doh! Typo.

---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
Co-authored-by: appleby <86076+appleby@users.noreply.github.com>
2025-04-28 18:34:36 -05:00
Cam Saul
a32c124933 [Backend Modularization] query-analysis module cleanup (#57360)
* Move QueryAnalysis model into `query-analysis` module

* Add `metabase.query-analysis.settings`

* Move `query-analysis-enabled` Setting

* Update modules config
2025-04-28 22:53:20 +00:00
Aleksandr Lesnenko
b0065a0c8e fix invalid tooltip on interpolated values (#57305)
* fix invalid tooltip on interpolated values

* specs, timezone issues for interpolated datums

* fix waterfall, scatter

* update e2e spec after fixing timezone issue

* fix e2e failures

* specs
2025-04-28 18:07:48 -04:00
Aleksandr Lesnenko
a43bdf804d pivot table: show subtotals for a single item (#56988)
* add viz setting fe

* ClJS changes

* Fix up some BE tests

* fix last test

* spec, hint

* specs

* review

---------

Co-authored-by: Noah Moss <noahbmoss@gmail.com>
2025-04-28 21:27:16 +00:00
Edward Paget
3584a5c83b fix: avoid deadlocks by not holding connection (#56524)
Avoid the possiblity of deadlocks during cached query processing by no
taking the connection using with-connection and instead just selecting
the cached result using toucan.

I _think_ this connection holding was introduced under the assumption
that we could 'stream' a binary column from postgresql using the
.getBinaryStreaming jdbc method. However postgres requires binary
columns to be full read and written and so we are unable to stream
results from that column, so this operation ends up being the same as
just querying the column normally.

Because we are not streaming the result in it seems safe to just yeild
the connection back to pool so it can shared with other requests.
2025-04-28 15:52:02 -05:00
Noah Moss
8ccc4df47d Remember last download format in user kv store (#57155)
* initial implementation

* e2e test

* tweaks

* fix e2e test + refactor

* reduce unneeded comments

* clean ns

* fix unit tests

* fix e2e test

* disable userKV when no user is logged in

* fix up a number of unit tests

* refactor out BaseQuestionDownloadPopoverProps with two wrapper components to avoid using the user kv hook in public/embedded contexts

* fix up types

* fix up e2e test

* use ?. syntax
2025-04-28 15:57:13 -04:00
Noah Moss
1a4744e18c Hide email domains for non-admin users without settings access (#57300)
* hide email domains for users without settings access

* fix test

* fix up e2e test

* update BE setting visibility

* Revert "update BE setting visibility"

This reverts commit b3728ad21d.

* remove commented-out line
2025-04-28 19:45:19 +00:00
metamben
75dd83ba81 Prevent falling back on type before cast when qp/ignore-coercion (#57095)
Fixes #56886

This is assuming that qp/ignore-coercion is set to avoid repeated casting.  That means, that we should type is as if
the cast has happened.
2025-04-28 19:36:26 +03:00
Riley Thompson
3e4d4a5116 Disable sqlite for array-query-can-be-cached-test (#57302)
* disable sqlite
2025-04-28 15:58:34 +00:00
Oisin Coveney
e26c89311e Remove Toaster HoC (#57341) 2025-04-28 15:55:49 +00:00
Edward Paget
193cb3819f fix: scheduler state management in cloud migration (#57338)
* fix: scheduler state management in cloud migration

When we create the h2 database to dump a metabase instance to during
cloud migration we need to stop and start the quartz scheduler instance
running on the instance during the migration.

Some liquibase migrations handling quartz job changes expect to control
the scehduler and start/stop it while those migrations run. Recent
changes to guard against this behaviour in testing case these
migrations to throw an exception when they run during the cloud
migration task.

This also fixes an older bug that the quartz scheduler would remain off
on the instance being migrated after the cloud migration task finishes.

* fixup! stop scheduler after all calls to migrate!

* fixup! formatting
2025-04-28 10:55:34 -05:00
Oisin Coveney
7d4053a93e Use redux selectors in Dashboard Leave modal (#55179) 2025-04-28 14:55:07 +00:00
Nicolò Pretto
be5453c13c fix: wrong syntax on if was making 'cross-version-for-breaking-changes' always run (#57339)
* fix: wrong syntax on `if:` was making 'cross-version-for-breaking-changes'
always run

* Update .github/workflows/embedding-sdk.yml

Co-authored-by: Phoomparin Mano <poom@metabase.com>

---------

Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-04-28 16:38:09 +02:00
Romeo Van Snick
f1a4c76719 Remove field parsing hack (#57286)
* Rename OPERATORS in tokenizer to FIELD_PUNCTUATORS to avoid confusion with expression operators

* Rename Reference to Field in tokenizer for consistency

* Allow specifying the string delimiter to unquote

* Reduce state in tokenizer

* Allow the tokenizer to parse field tokens that are missing an opening bracket

* Add more comments and rename variable for clarity

* Implement proper escaping in field tokenizer

* Remove duplicate OPEN_BRACKET from punctuators

* Simplify lexifier now that tokenizer returns the correct token for fields

* Reorder loop to reduce duplication

* Simplify lexifier now that tokenizer returns the correct token for fields

* Add unit tests for unquoting with specific character

* Make invalid token error message more precise

* Punctuation

* Typo

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>

---------

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2025-04-28 16:31:56 +02:00
Romeo Van Snick
976ba29134 Add custom error message for zero-arg functions (#57332) 2025-04-28 15:45:25 +02:00
Kamil Mielnik
9044b07a76 SEM-218 Offer to update the log configuration from the admin panel (#57022)
* Add endpoints to allow admins to override log levels at runtime

Fixes SEM-219

* Add types and RTK query mappings for logger endpoints

* Add a TODO

* Add isErrorWithMessage and isErrorWithMessageResponse guards

* Add

* Add readOnly prop to CodeBlock

* Add duration inputs

* Stop returning undo-task and document return value shapes

* Add delete endpoint, return nothing when adjusting

* Make sure empty adjustments are idempotent

* Fix API documentation

* Add preset dropdown

* Add preset menu

* Update icon

* Use new reset endpoint, update API paths

* Extract DurationInput

* Extract PresetPicker

* Update preset name

* Update menu width

* Translate

* Make CodeBlock fill its parent

* Improve error handling

* Extract utils

* Hide nanoseconds

* Move code

* Simplify code

* Format code

* Extract CodeEditor

* Remove CodeBlock

* Update comment

* Rename

* Add logger mocks

* Add LogLevelsModal unit tests boilerplate

* Fix closing, scrolling, and add info icon

* Add tests

* Lint

* Revert "Lint"

This reverts commit b8339873c2.

* Hide options microseconds and milliseconds

* Fix circular import

* Add missing import

* Fix tests

* Rename TimeUnit to LoggerDurationUnit

* Use NumberInput

* Use existing getResponseErrorMessage

* Use utils from metabase/forms

---------

Co-authored-by: Tamás Benkő <tamas@metabase.com>
2025-04-28 19:57:14 +07:00
Romeo Van Snick
135f97a0df Make CumulativeCount a window function and Sum an aggregation (#57323) 2025-04-28 14:28:43 +02:00
Nemanja Glumac
decbc2e2a2 Introduce Metabase branding to PDF exports (#57266)
Resolves PRG-1 by introducing the branding content to the dashboard PDF exports
Resolves PRG-7 by making the branding content clickable

Additionally resolves PRG-14
2025-04-28 14:20:47 +02:00
github-automation-metabase
fddd39230b Bump cider/cider-nrepl from 0.54.0 to 0.55.4 (#57312)
Inspect dependency changes here: https://github.com/clojure-emacs/cider-nrepl/blob/v0.55.4/CHANGELOG.md

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-28 10:33:40 +00:00
Oisin Coveney
448bdd0569 TS Conversion: DashboardData (#57074) 2025-04-28 10:10:14 +01:00
Mahatthana (Kelvin) Nomsawadi
ac02214b9c Prevent path-to-regexp from breaking when a libary require v6+ (#57242) 2025-04-28 06:44:49 +01:00
Oleksandr Yakushev
ebaaae8bec [dashboard-templates] Use more efficent every? implementation (#56948) 2025-04-28 01:28:41 +03:00
Filip Hric
b8da46c9d8 ci: run changed e2e specs only when only e2e specs changed (#55319)
* run e2e tests only when e2e tests are changed

* sparse checkout

* revert skip build logic

* fix path

* fix path

* add logging

* fix pattern

* fix pattern again

* add tests and cleanup

* cleanup

* handle flaky group

* Revert "handle flaky group"

This reverts commit cd4f996669.

* pass multiple specs

* simplify patten handling

* logs

* play with checkout

* again

* wip

* wip

* if there are other files than e2e, run all tests

* run flaky group only when specs not passed

* optimize flaky group

* make it string

* temp disable build

* temp disable build

* one more time

* more logs

* logs

* arrrgh

* please work

* now?

* step by step

* revert flaky dependency on build

* tests

* oh

* oh 2

* oh 3

* address review

* fix paths

* fix paths

* fix paths

* fix paths

* fix paths

* fix paths

* add wildcard

* fix paths

* fix paths

---------

Co-authored-by: Uladzimir Havenchyk <uladzimir.dev@gmail.com>
Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2025-04-27 15:06:58 +03:00
Sloan Sparger
38b3b0f2fc [Admin] Migrate people pages + components to TS (#57207)
* convert UnsubscribeUserModal and UnsubscribeUserForm components

* convert UserActivationModal to TS

* convert UserPasswordResetModal to TS

* convert UserSuccessModal to TS

* convert PeopleList and PeopleListingApp components to TS

* convert PeopleListRow to TS

* convert use-people-query to TS

* fix deprecated usages of google_auth and ldap_auth with sso_source field

* fix lint
2025-04-25 22:29:22 +00:00
Eric Normand
67ef0e3962 Float tier 2 integration (#56982)
* float() tests + tier 1 (postgres)

* Add more parsing test.

* Better float comparison

* Add expression/float feature

* Add float function to config

* Add float help text

* Add e2e test for float()

* Add `:expressions/float` to list of feature flags

* Only allow casting text to float (not number)

* Better test message

* Refactor for nicer code

* `float()` for snowflake (#56927)

* Implement float() for snowflake

Also add text and date feature keys because somehow they were left off.

* Don't use Long/MAX_VALUE in tests because it breaks some dbs.

* Fix copy-paste error

* kick ci

* Implement float() for mysql (#56919)

Also, add :expressions/date and :expressions/text features that were missing somehow.

* Cast and split custom expression functions for Clickhouse (#56924)

* Implement integer() for clickhouse

ClickHouse is recently tier 2!

* Implement float() for clickhouse

* Implement text() for clickhouse

* Add date() to clickhouse

* Implement splitPart() for clickhouse

* Cast to Date32 after parsing date

* Use a nullable type

* Use nullable types for casts

* Try parseDateTime instead to avoid null

* Use case sensitive function names

* Fix argument order of splitByString()

* Don't use Long/MAX_VALUE in Clickhouse

* Clickhouse needs a lot of type hints!

* Cast position to int

* Better tests for split part

* Negative indexes should return empty string

* kick ci

* Convert index to long (for ClickHouse)

* `float()` implementation for BigQuery (#56920)

* Add float() support for bigquery.

Also add features for date and text that mistakenly got left out.

* Correct argument order for parse_date

* Refactor ->float

* Remove cast-float implementations

* Reinstate Clickhouses' cast to float function.

* Remove specialized :float functions for sql drivers

Replace them with a single :sql implementation

* kick ci

* More refactoring to get rid of questionable recursion

* Fix three tests

* Add null case for literal ->float compilation

* Add type info

* Revert making typed? public (don't need it no more)

* Revert converting multimethod ->float to defn

Also, use a new function called `coerce-float` that does the work.

* Try clickhouse using cast() instead of toFloat64()

* Revert presto jdbc ->float implementation

* Use keyword type name for float-dbtype

* Revert removing ->float method from bigquery clickhouse and starburst

* Add `float-dbtype`, `cast-float`, and `:expressions/float` to changelog

* Remove cast-float multimethod and redundant ->float methods

* REmove mt/dataset test-data from split-part tests.

Is it really necessary?

* Revert qpt changes

* Properly handle NULL in clickhouse cast to float

* Fix presto and starburst

With an improved safe-denominator function

* Change to double as default sql type for casting

* Fix test for casting to double

* Use ->float instead of coerce-float for coercion

* Use DOUBLE PRECISION for Vertica driver

* Use BINARY_DOUBLE for oracle

* Use float for sqlserver

---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2025-04-25 17:00:36 -05:00
github-actions[bot]
c3c706604d Update translations 2025-04-22 (#57002)
* Update translation sources 2025-04-22

* Update translations

---------

Co-authored-by: github-actions <github-actions@github.com>
2025-04-25 14:45:47 -06:00
Nemanja Glumac
a19342a4ce Add clarity to the subscription filter tooltip copy (#57299)
Resolves PRG-15

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-04-25 20:27:32 +00:00
John Swanson
93b36bddbe Add permissions_group.magic_group_type (#56881)
and use it as the source of truth for whether a group is the "All Users"
or "Administrators" group, instead of just the name.

This is a unique field, but it's nullable. H2, MariaDB, MySQL, and
Postgres all treat `null` values as unequal, so it's fine to have many
permissions groups without a `magic_group_type`, but any row *with* a
`magic_group_type` must be distinct from the others. In other words, we
can have lots of non-magic groups and exactly one magic group of each
type.

For now, we'll just have the same Administrators and All Users groups
and the names won't change. At some point, when tenants are enabled,
we'll want to rename "All Users" to "All Internal Users" and create a
separate "All External Users" group.
2025-04-25 12:36:40 -07:00
Braden Shepherdson
407172b445 [refs] Don't backfill :result_metadata on read; strip idents instead (#57273)
Fixes QUE-989, QUE-905.

Stop backfilling idents in `result_metadata` on reading cards. That's costly and recursive, and was the source
of the perf issues on stats.

We're planning instead to support optional, best-effort idents for a longer period, and let the background job do
the work.
2025-04-25 19:34:27 +00:00
Alex Yarosh
a7a413a1dc docs: add casting section to list of custom expressions (#56689)
* add casting section

* Update docs/questions/query-builder/expressions-list.md

* Revert "add casting section"

* Update docs/questions/query-builder/expressions-list.md

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>

* Apply suggestions from code review

---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-04-25 18:39:42 +00:00
Anton Kulyk
d103f4b875 Close table header popover on second click (#57282)
* Un-skip and update repro test

* Close table header popover on subsequent click
2025-04-25 19:01:50 +01:00
Nathan Voxland
cbae9e265c Renamed /api/ee/gsheets/folder to /api/ee/gsheets/connection (#57239) 2025-04-25 12:59:15 -05:00
Braden Shepherdson
ea655a010d [refs] Fix annotate so model idents are only applied to source columns (#57274)
Fixes QUE-904.

With (1) a fresh column like an aggregation, and (2) when the source was a model:
`annotate` was wrapping the column's ident as if it came from the source model, but that's incorrect.

This adjusts the order of operations so that only columns inherited from the source get their idents
wrapped with the source model.
2025-04-25 17:23:08 +00:00
Adithya Vardhan
9b87335e1b fix: increase flex basis to avoid wrapping in bigger screens (#56733) 2025-04-25 18:02:03 +01:00
bryan
d1a2dce450 Use mage for clj-kondo and cljfmt in GitHub Actions workflow (#57229) 2025-04-25 10:53:46 -06:00
Tyler Plude
8a42850c4f Improve Table Static Viz Text Wrapping Column Widths (#56991)
* Updating text wrap and minibar logic to gracefully handle structure of column widths; updated fallback column width when no width is present in viz settings

* removing inline defs
2025-04-25 09:48:09 -07:00
Alexander Solovyov
cd07ef0afa uberjar.yml should upload my containers (#57270) 2025-04-25 10:43:28 -06:00
Nick Fitzpatrick
e85940a30c Keyboard Shortcut Polish (#57212)
* updating shortcuts, adding shortcut in profile menu, add hotkeys to close shortcut modal and sidesheets

* updating tests

* no one will know

* updating to use mantine hooks
2025-04-25 21:38:44 +05:30
Riley Thompson
0b9e27d15a Enable query caching in flaky test (#57226) 2025-04-25 11:55:49 -04:00
bryan
b3cce298ba Enable equals-true Kondo linter and teach Claude about Clojure (#56573)
* teach claude how to write backend code

* Add solid instructions for calling into the repl

* teach it how to behave when there's no repl

* remove mcp stuff for now

* add lint pr quick command

* fix: Add missing docstrings in mage/be_dev.clj

Added docstrings to parse-int, nrepl-port, and nrepl-eval functions to fix clj-kondo linting warnings.

* flesh out Lint PR quick command

* feat: enable equals-true Kondo linter and fix warnings

This change enables the `:equals-true` warning in the clj-kondo linter configuration,
which identifies code patterns where `(= true x)` is used instead of the more idiomatic
`(true? x)` form in Clojure.

Key changes:
- Enable `:equals-true` linter with warning level in .clj-kondo/config.edn
- Fix all instances of `(= true x)` throughout the codebase, replacing with `(true? x)`
- Add a new utility to check balanced parentheses in Clojure forms
- Add a new mage command `-balance-parens-check` to validate balanced parentheses
- Update CLAUDE.md with documentation about the balanced parentheses utility

This change improves code quality by promoting idiomatic Clojure usage and adds
a helpful tool for ensuring proper Clojure syntax when editing code.

* fix: update code to resolve equals-true Kondo linter warnings

This commit addresses the newly enabled equals-true linter warnings by:
- Adding #_{:clj-kondo/ignore [:equals-true]} to are forms that legitimately need to test both true/false values
- Replacing (= true x) with (true? x) and (= false x) with (false? x) in test assertions where appropriate

🤖 Generated with [Claude Code](https://claude.ai/code)

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

* fix more, refine claude instructions

* fix more = true -> true? linter errors automatically

* fix remaining (= true x) -> (true? x) linter warnings by adding clj-kondo ignores

We need the ignores for 'are' macro clj-kondo tests where (= expected (fn x)) is the idiomatic pattern.

🤖 Generated with [Claude Code](https://claude.ai/code)

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

* move the linter to the things-we-use section

* update claude.md from github copliot's review

* balanced-parens? -> is-readable-code?

- Returns explicit errors, usually with line numbers.

* update claude.md (mostly formatting)

* Fix kondo-updated when there are no matching files

* Update CLAUDE.md to replace -balance-parens-check with -code-is-readable

* Refactor mage -eval to mage -repl with improved usability and reliability

The implementation uses eval and read-string strategically to control when and where code is evaluated:

1. The code from the command line must first be transported as a string to the running REPL server
2. read-string allows parsing the code without executing it
3. eval then executes the code in the correct namespace context
4. This creates a "REPL inside a REPL" where namespace switching and evaluation happen in a controlled environment
5. This approach prevents premature evaluation and ensures code runs in the intended scope

* -check-readable task naming

* cleanup -check-readable

* fix output + fix user.clj

* shuffle code around

* Update CLAUDE.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-25 15:55:31 +00:00
bryan
446c01c5f8 fix stack traces + task! (#57160) 2025-04-25 15:39:53 +00:00
Kamil Mielnik
9ff33ca64f Fix - Cannot schedule automatic value scanning for postgres database (#57256)
* Fix #57198

* Use proper setter

* Repro #57198
2025-04-25 15:26:19 +00:00
Alexander Polyankin
42065b3426 Add parameter default options in subscriptions (#57188) 2025-04-25 11:02:29 -04:00
John Swanson
6ca51d16a1 Hide Schemas for dest DBs (#56853)
Is this the only schema filter? Kind of confused that it's
postgres-specific...
2025-04-25 08:00:15 -07:00
Sloan Sparger
8ad62ccfd5 Sticky footer for database connection modal (#56997) 2025-04-25 09:55:29 -05:00
Ryan Laurie
793e17b386 Fix inefficient regex (#57218)
* Update dom.unit.spec.js

* Update dom.js

* add more tests

---------

Co-authored-by: mmmsssttt404 <931121963@qq.com>
2025-04-25 08:39:27 -06:00
Jeff Bruemmer
5d669bbc5d docs - env var update (#57260)
* update env vars

* update api

* config template
2025-04-25 09:55:07 -04:00
Alexander Solovyov
66cc680762 fix flakey check for duration (#57254)
also hunting for that cache test flake
2025-04-25 13:49:00 +00:00
Sébastien
34a054d0e0 Closes VIZ-332 no more dupes in y-axis ticks (#56910)
* closes VIZ-332 no more dupes in y- ticks

* copy

* lint
2025-04-25 14:00:17 +02:00
Romeo Van Snick
6c366b8e71 Clean up resolver (#56962)
* Use Resolver type from resolver module

* Move getKindForType to resolver

* Inline compileDimension

* Simplify resolver and make data flow requirements more obvious

* Avoid fetching unused dimensions

* Cache metadata displayInfo while resolving

* Move compiler-based resolver tests to compiler

* Rename variables to be more generic

* Refactor resolver

* Merge ExpressionType and MBQLClauseReturnType

* Add tests for resolver

* Be more precise in the resolver error messages

* Be more specific about expected field type in errors

* Add tests for unknown dimensions

* Rename any_ to any

* Add tests for mixed case matching

* Allow matching column names case-insensitively

* Replace ResolveError with CompilerError in resolver

* Use expressionMode in tests

* Fix types

* Remove cast in test

* Add more comments

* Add e2e tests for field matching

* Fix lint

* Rename Field to column in resolver error messages

* Remove TODO's and replace them with comments

* Fix error message in e2e test
2025-04-25 12:30:53 +02:00
Phoomparin Mano
6b427efbfc fix(sdk): clicking on "and X more" in chart legend throws error (#57175) 2025-04-25 17:07:57 +07:00
Alexander Solovyov
d2a3ef856a fix flakey identity-hash tests everywhere (#57245) 2025-04-25 09:29:45 +00:00
Romeo Van Snick
2c8a5bd7ef Add check to prevent double comma's in the custom expression editor (#57199)
* Add check to prevent double comma's

* Rename checkDoubleComma to checkDoubleCommas
2025-04-25 11:04:24 +02:00
Timofey Kachalov
92506a847b docs(sdk): Add generation of embeddable .md tables for Embedding SDK components (#56990) 2025-04-25 12:51:21 +04:00
Nemanja Glumac
4b33f7157e Introduce Metabase branding to PNG downloads (#57088)
Resolves PRG-2

This commit adds Metabase branding to the PNG downloads 
for instances that **do not** have the whitelabel feature flag.

Even though it is possible to download the dark mode PNG, 
this commit does not fully resolve PRG-6 because it doesn't 
turn the text white.
2025-04-25 10:07:19 +02:00
Romeo Van Snick
bf2d148954 Fix expression diagnostic for mismatched siblings (#57170)
* Check all mismatched sibling tokens, not just missing comma's

* Rename siblings check to checkMismatchedSiblings

* Merge imports

* Also catch call expressions
2025-04-25 09:50:57 +02:00
Romeo Van Snick
0ea88ad4d5 Add min-width to popover (#57181)
* Add minimum width to description popover

* Add repro for metabase#57132
2025-04-25 09:50:37 +02:00
Ngoc Khuat
8544c33213 Fix send once alerts repeatedly sending (#57164) 2025-04-25 02:38:39 +00:00
William
47da0a3d1e Drills use column data from lib/returned-columns (#56894)
result_metadata for a query on a model returns the underlying columns, not the model's columns.  This was causing
drills to break in certain circumstances, because the query processor was trying to cast a particular value twice.
Making drills default to using the column from lib/returned-columns fixes the issue.
2025-04-24 22:45:32 +00:00
bryan
da77b1cc6c Doc update detection (#56330) 2025-04-24 22:03:49 +00:00
Uladzimir Havenchyk
bce438f8b0 test: await for data in temporal unit spec (#57178) 2025-04-24 21:48:29 +00:00
bryan
85f05af834 lint migrations file from babashka (#56611) 2025-04-24 21:37:52 +00:00
Sloan Sparger
3ccadd4160 [DB Routing] Callout db routing enabled on permissions page (#57070)
* callout db routing enabled on permissions pages

* add e2e tests
2025-04-24 15:55:40 -05:00
Sloan Sparger
f396378f43 [DB Routing] Polish db routing (#56901)
* update copy w/ description, update db routing docs link, impl prefill for new destination dbs, fix bug where editing db details would not let you tab through the form

* fixes

* make no user attributes error message link to people page, db routing section expanded by default if feature enabled

* pull out fix for edit db form not being tab-able

* fix failing tests

* copy feedback
2025-04-24 15:55:23 -05:00
Noah Moss
546a40bb49 Change wording for default view map button (#57211) 2025-04-24 16:53:21 -04:00
Nick Fitzpatrick
5638ee1c81 Updating entity-id cards in sidesheets (#57052)
* updating entity cards

* adjusting unit test

* PR feedback
2025-04-25 01:36:01 +05:30
Sloan Sparger
e17f0eb452 Make edit db form tab-able (#56902) 2025-04-24 20:05:15 +00:00
dpsutton
93bd0995b9 More robust checking for timeout exceptions (#56737)
* wip

* More robust checking for timeout exceptions

Overview:
We enumerate items in the database and then we want to see which ones
the user can actually run queries against. To do this we run a query
like `select false from TABLE where 1 != 1 limit 0`. The hope is that
the query analyzer realizes it only needs to do permission checks and
doesn't try to satisfy these conditions (either because limit says no
rows, or 1 != 1 is easily proven to filter all rows). So we _usually_
get very quick feedback if we can select from the table or not.

Snowflake seems to not do this on views. If a view takes a long time to
query, snowflake seems to take a long time to query. The original fix
was to add a 15 second timeout to the query. The expectation here is
that Snowflake can quickly fail if there are no permissions for the
table or view, but might take a long time to run the probe query. But we
can interpret a timeout as a successful permission check.

The original way we checked for timeouts was a very naive check for
`java.sql.SQLTimeoutException`. It seems basically no one uses this when
you do:

```clojure
(with-open [stmt (...)]
  (doto stmt
    (.setQueryTimeout 15)
    (.execute)))
```

For instance, here's some logs from Snowflake:

```
WARN net.snowflake.client.core.StmtUtil Cancelling query 0e8987ee-2d22-40f9-b30d-0129d38ce976 with reason TIMEOUT
INFO metabase.driver.sql-jdbc.sync.describe-database <schema>:<table-name>: Assuming no SELECT privileges: caught exception,net.snowflake.client.jdbc.SnowflakeSQLException: SQL execution canceled,	at ...
```

Note It's a regular `net.snowflake.client.jdbc.SnowflakeSQLException`.
Here's a true permissions failure for comparison:

```
sync.describe-database <schema>:<table>: Assuming no SELECT privileges: caught exception,net.snowflake.client.jdbc.SnowflakeSQLException: SQL compilation error:,Failure during expansion of view 'SOME_VIEW': SQL compilation error:,Object 'DB.SCHEMA.TABLE' does not exist or not authorized.,
```

So we use some regex checks against the messages to try to detect when
we have a permissions failure (cannot select) vs a timeout of the
probe (presumably can select).

And a reminder of the balances here: it's better to show someone a table
that they get an error if they try to query than to hide a table that
they can query. So this change should bias towards reporting can-select
in cases where it might not be clear.

* Only run tests when classes are present

if you don't have :drivers on classpath it would fail

* ensure boolean is returned

tests assert false? on a nil

* CI fails based on the indentation of comments

* empty commit for CI

* Move postgres test into postgres test namespace

* Replace ex-msg matching with sqlerrorcode/sqlstate

Use jdbc error codes and sql state matching to figure out if a
SQLException is caused by user action canceling the request (essentially
how setQueryTimeout works). This adds a multimethod dispatching off the
driver keyword to match up either the SQLState code or the SQLErrorCode
with the appropriate value for a given database driver. Some of these
were found by looking how QueryTimeoutException is implemented in
Hibernate and others were found from JDBC driver source code or documentation.

* fixup! handle multiple codes for mariadb

* fixup! add partial query timeout test

* fixup! split apart sql timeout tests

* fixup! use correct sqlstate for snowflake timeout

* fixup! remove split out tests

* fixup! remove when-class

* fixup! snowflake sql state

* fixup! move query-canceled? into driver code

Removes the jdbc-exceptions namespace and instead makes query-canceled a
driver multimethod that extracts and dispatches on the SQLException
class within the sql-jdbc driver.

Non-jdbc drivers can implement this method, but it is only used for
handling errors in the cluster lock using the appdb and for the sql-jdbc
describe-database sync task.

Co-Authored-By: Nathan Voxland <nathan@metabase.com>

* fixup! update driver changelog add default method

* fixup! merge mysql/mariadb methods

* fixup! add added metadata

* fixup! make test throw instead of is false

---------

Co-authored-by: Edward Paget <ed.paget@gmail.com>
Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: Nathan Voxland <nathan@metabase.com>
2025-04-24 20:01:52 +00:00
Case Nelson
0df7a6a8d4 fix: improve database status metric (#56469)
* fix: improve database status metric

* Format line better

* Fix tests and kondo

* Remove unhealthy counter too
2025-04-24 14:00:46 -06:00
Nick Fitzpatrick
9daf822736 add patch to kbar for tinykeys update (#57116) 2025-04-25 01:11:47 +05:30
Aleksandr Lesnenko
fe3085dc88 remove react 19 as a limitation (#57158) 2025-04-24 14:55:20 -04:00
Braden Shepherdson
163269fda0 [refs] Turn bad :idents in result_metadata into a warning (#57189)
There are at least two cases right now where the idents are bad or
missing that need debugging, but throwing errors is breaking things.
2025-04-24 17:44:15 +00:00
Case Nelson
052474813d fix: snowflake rsa doesn't work with hostname (#57157)
* fix: snowflake rsa doesn't work with hostname

* update account if present
2025-04-24 11:37:28 -06:00
Nicolò Pretto
8e8314cc7e ci: make cross versions tests run only if the pr is against a release (#57197)
branch
2025-04-24 18:23:22 +02:00
Case Nelson
6552bcd10f fix: snowflake key fails when editing unrelated details (#57156)
* fix: snowflake key fails when editing unrelated details

* Fix test comment

* Compare byte arrays
2025-04-24 10:07:04 -06:00
Ryan Laurie
3fa1acbdcf prevent non-admins from calling admin-only gsheets endpoints (#57186) 2025-04-24 09:23:51 -06:00
Alexander Polyankin
30e0b718f4 PoC for using dataset columns with MBQL lib type checking functions (#57140) 2025-04-24 10:40:45 -04:00
John Swanson
f152b8e5c3 Fix two bugs in DB Routing (#56931)
* Fix deleting a DB with database routing on

* Fix database sync with a user attribute set

When an admin has the relevant user attribute set and tries to sync the
database schema, we use `(with-database-routing-off ...)` to explicitly
turn off database routing for the purposes of sync. However, there are
two problems here:

First, this is just informational for the purposes of error checking, it
didn't actually turn off database routing, it just made us throw an
exception if a driver touched a mirror database (in dev).

Second, during query processing, when we're actually doing the database
routing "swap" to replace the router with the mirror DB, we were doing
`with-database-routing-on`. This essentially means that if you do

```
(with-db-routing-off
 (qp/process-query query rff))
```

you *don't* actually turn off DB routing. 🤦

Both underlying issues get fixed by the same change: if database-routing
is OFF, don't DO any database routing in the QP middleware. This seems
more reasonable to me anyway.

* CR resp
2025-04-24 07:22:59 -07:00
Nicolò Pretto
24debc3158 add ttag/no-module-declaration rule (#56848)
* add ttag/no-module-declaration rule + eslint ignore comments

* change the reference to github issue instead of linear

* add new ignores after rebase

* remove formatting changes from eslint files

* fix eslint rule mising from a file

* convert one field to getter as that got added after I opened the codemod
pr and it's failing the check here

* more //eslint-disable-next-line
2025-04-24 15:50:46 +02:00
lbrdnk
5242b6d15e Fix sync for 66K tables db (#57066)
* Fix 66k statement params in sync-table-privileges and sync-fks

* Test for privileges

* Test privileges

* Update and test set-initial-table-sync-complete-for-db!
2025-04-24 14:04:05 +02:00
Nicolò Pretto
28c0e9458d ci: remove ready_for_review as trigger type (#57134) 2025-04-24 13:07:35 +02:00
Timofey Kachalov
e9fb8e782f Temporarily disable Shoppy sample app tests (#57167) 2025-04-24 13:58:24 +04:00
Phoomparin Mano
dd76006c42 fix(sdk): use background color in sankey chart text outline (#57135)
* use bg-white instead of white

* add visual test

* fixed storybook stories

* add loki snapshot
2025-04-24 16:39:37 +07:00
appleby
c96816b0fc Move :expression-literals aggregation tests into expressions_test.clj (#57144)
* Move :expression-literals aggregation tests into expressions_test.clj

These tests all use :basic-aggregations not :expression-aggregations, so move them into expressions_test.clj to
consolidate the :expression-literals tests in one place.

* Add clause with top-level boolean literal in case-with-literal-expression-test
2025-04-23 15:38:39 -07:00
Alexander Polyankin
3e8400f143 Check for axis type instead of Category (#57128)
* Check for axis type

* Check for axis type
2025-04-23 18:35:23 -04:00
Luiz Arakaki
8b1d0548b1 only track database routing as enabled if there is at least one routing db (#57117) 2025-04-23 20:51:02 +00:00
Luiz Arakaki
adb4c4a5de rename starburst to startburst (trino) to help customers understand that starburst is trino compatible (#56891) 2025-04-23 16:48:58 -03:00
Noah Moss
4f9ced2fda Share pivot export code between XSLX/CSV instead of using native Excel pivots (#56622)
* Prototype sharing CSV pivot export code with Excel instead of Excel native pivots

* Cleanup some code, fix reflection warnings

* clean ns

* halfway to getting native excel formatting working

* native formatting working, but no auto-sizing

* fix up formatting, get auto-sizing working (+ refactor)

* Fix BE tests

* remove an old test case no longer needed

* lint

* remove final broken tests which is no longer needed

* lint, and clean up/refactor CSV code a bit

* clean up/refactor XLSX code

* remove debug symbol

* fix whitespace

* address feedback
2025-04-23 15:22:34 -04:00
Edward Paget
163528e95c fix: test flake in jetty stats (#57141) 2025-04-23 18:26:02 +00:00
Uladzimir Havenchyk
8f62a989d7 ci: run linting when e2e specs are changed (#57118)
* ci: run linting when e2e specs are changed

* fixup
2025-04-23 17:51:31 +00:00
Renaud Joly
d56e0511d2 Documentation: fix typo in funnel link (#56761) 2025-04-23 13:01:58 -04:00
github-automation-metabase
ea566a0a2e Bump io.github.weavejester/cljfmt from c87493e54bdc30c104d75b95ce2a2ce5e7403430 to 7de286008766127128a156275b9add3bf443d7e5 (#56655)
Inspect dependency changes here: c87493e54b...7de2860087

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-23 09:59:21 -07:00
Edward Paget
f7a66b2fac fix: request max time stat reports seconds (#57121)
Forgot to divide millis by 1000 before saving so this stat was reporting
some silly numbers on stats. Also adds tests around this metric
2025-04-23 16:36:26 +00:00
Alexander Polyankin
1fcabbe944 Replace Category with has_field_values check when computing columns compatible with a parameter AND enable card sources for numeric parameters (#56825) 2025-04-23 11:53:08 -04:00
Oisin Coveney
af0188ade1 fix(sdk): Ensure that questions don't flicker when fetching entity IDs (#57073) 2025-04-23 15:36:19 +00:00
Jeff Bruemmer
bcc7bd2cda fix link (#57122) 2025-04-23 11:06:44 -04:00
Phoomparin Mano
520c64839c Use viewFooter variant in view footer's download icon (#57105)
* tweak IconButton variants

* remove variant=subtle as it is applied by default
2025-04-23 21:51:15 +07:00
Nathan Voxland
6214e2896a [Sheets] Allow "Sync Now" (#54940)
---------

Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2025-04-23 09:47:58 -05:00
Nemanja Glumac
2761c8dd36 Revert "Use a deterministic identifier for chart downloads (#57058)" (#57112)
This reverts commit b5363f3a7e.
2025-04-23 16:13:31 +02:00
Ryan Laurie
81058dea6a replace ee-extra release step (#57120) 2025-04-23 08:02:14 -06:00
Uladzimir Havenchyk
447a73372d chore: fix linting issue (#57115) 2025-04-23 13:18:41 +00:00
Romeo Van Snick
2ba02a78dd Clean up diagnostics (#56984)
* Add missing t to error messages

* Pull out lexification from diagnoseSyntaxChecks

* Add hooks to compiler

* Define diagnose and diagnoseAndCompile using compiler hooks

* Add maybe helper to throw the first error

* Use maybe helper to make sure parsing and lexifying throws

* Remove throwOnError argument to parser

* Add error hook

* Use error hook to make lexifier and parser throw

* Pass token and source in object

* Return position information for mismatching parenthesis

* Add length to Token

* Handle unknown string quotes

* Simplify lexifier

* Move malformed number check to diagnostics

* Move malformed string check to diagnostics

* Move malformed field name check to diagnostics

* Move bad token check to diagnostics

* Stop returning errors from lexifier

* Merge nodes when unopened bracket occurs

* Add error helper for diagnostics

* Use error helper for diagnostics

* Remove unused helpers

* Remove unused ParseError

* Remove errors fuzz test

* Add default hooks to parser

* Remove maybe helper

* Split up checks into syntax and expression folders
2025-04-23 15:13:59 +02:00
Romeo Van Snick
e038159085 Rename regexextract to regexExtract (#57013)
* Rename regexextract to regexExtract

* Fix regexExtract examples in docs

* Fix references to regexExtract in tests
2025-04-23 15:13:46 +02:00
Uladzimir Havenchyk
6bad11bfeb test: move flaky test to jail (#57091) 2025-04-23 11:22:39 +00:00
Romeo Van Snick
e3e81e4da8 Format zero-arity functions with parens (#56835)
* Format no-argument expression clauses with empty ()

* Suggest no-arg clauses with empty ()

* Remove fallback for non-arg functions in resolver

* Fix unit tests

* Fix e2e test

* Add test for no-arg suggestion completions

* Update examples in docs

* Render parens for no-arg clauses in helptext header

* Make function browser insert parens for no-arg functions

* Do not show help text when a function call is not made

* Add repro for metabase#55300

* Fix function browser e2e test

* Remove unnecessary branch

* Remove fallback for non-arg functions in resolver

* Add () to now in one more location in docs

* Fix unit tests
2025-04-23 09:27:07 +02:00
Noah Moss
587c5e0a6f Exclude nil card IDs for preemptive caching reruns (#57082)
* Exclude nil card IDs for preemptive caching reruns

* Update enterprise/backend/src/metabase_enterprise/task/cache.clj

Co-authored-by: bryan <bryan.maass@gmail.com>

---------

Co-authored-by: bryan <bryan.maass@gmail.com>
2025-04-23 02:59:54 +00:00
Noah Moss
632777c91a Fix inaccurate row collapsing for pivot exports (#56998)
* fix for inaccurate collapsed rows in export

* add unit tests

* fix test

* lint

* edit docstring, skip roundtripping on cljs

* address feedback
2025-04-22 22:47:55 -04:00
Alexander Polyankin
436c0804fa Fix click behavior reset (#57053) 2025-04-22 23:35:57 +00:00
Fraser
1bb8bd14fe Add development-mode setting and banner (#56579)
* Add development-mode setting and banner
2025-04-23 10:13:10 +12:00
Riley Thompson
82cde67228 Upgrade ClickHouse JDBC driver to 0.8.4 (#57055)
* upgrade to 0.8.4

* add test

* update clickhouse contributors
2025-04-22 21:40:48 +00:00
Braden Shepherdson
bde4df5206 [MBQL lib] Gracefully handle invalid :fields refs in joins (#57078)
Fixes #56434.

A join clause's `:fields` might contain refs to columns that no longer exist on the joined table/card.

Before this change, a malformed column was being passed to `with-join-alias`, causing it to throw.
Now the bad fields are dropped from `returned-columns`, and if they all get dropped then it is treated as `:all`.
2025-04-22 21:13:48 +00:00
Timofey Kachalov
d676b8a2ca Properly handle non-pr context for notify-pull-request action (#57081) 2025-04-23 01:08:08 +04:00
Uladzimir Havenchyk
ed132646b0 ci: use variant for trunk to distinguish tests from matrix (#57069)
* ci: use variant for trunk to distinguish tests from matrix

* group e2e

---------

Co-authored-by: Ryan Laurie <iethree@gmail.com>
2025-04-23 00:02:42 +03:00
Nemanja Glumac
b5363f3a7e Use a deterministic identifier for chart downloads (#57058)
Resolves PRG-10.

This commit keeps the DOM node that we use for downloads
deterministic, while ensuring that we always target the correct
chart in the dashboard.

The same question can be added to the dashboard multiple times
so the only unique identifier we can use is the dashcard id.

But this brings us to the weird situation that the node we're sending
to the canvas to render before downloading is different when we're
downloading the chart from a dashboard vs when we're downloading
it directly from the question page.

This pseudo DOM code shows what we did before:

Dashboard:
```
dashcard-id <--- we were grabbing this
    visualization-root
        card-id
```

Question:
```
div
    visualization-root
        card-id <-- we were grabbing this
```

Compare that to what we're doing now

Dashboard:
```
dashcard-id
    visualization-root
        card-id <--- we are now grabbing this*
```
* but only when it is under the specific dashcard-id

Question:
```
div
    visualization-root
        card-id <-- we continue grabbing this like before
```
2025-04-22 23:01:57 +02:00
Jeff Bruemmer
5b4ed4413c remove bulk filter modal docs (#57083) 2025-04-22 21:00:41 +00:00
Anton Kostenko
bc4517243c Replace SDK and iframe response status metrics to export non-grouped status codes (#56976)
* Replace SDK and iframe response status  metrics to export non-grouped status codes
2025-04-22 20:55:00 +00:00
appleby
111908b790 Enable :expression-literals for sqlserver and oracle (#56942)
* Fix literal-expressions-inside-nested-and-filtered-aggregations-test

* Use mt/formatted-rows in order-by-integer-literal-expression-test

* Support selecting an empty string literal in select-clause-deduplicate-aliases

For drivers like Oracle that inherit from ::sql.qp.empty-string-is-null/empty-string-is-null, if a user adds an empty
string as a custom literal expression, that literal "" value will get compiled to nil, so ensure that
select-clause-deduplicate-aliases can handle such nil values in the :fields list.

Basically, we want to ensure that a query like

  {:expressions {"empty": [:value ""]},
   :fields      [[:expression "empty"]]
   :limit       1}

gets compiled to

  SELECT NULL [AS] "EMPTY" ...

* Add sql.qp.expression-literals/boolean->comparison abstract driver

This is similar in spirit to the existing sql.qp.empty-string-is-null driver and can be used for drivers like oracle
and sqlserver that require booleans to be converted to comparison expressions in logical operators like :and, :or, and
:not, and in the top-level of a :filter clause.

* Enable :expression-literals for sqlserver

* Enable :expression-literals for oracle

* Review feedback: not -> nil?

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>

* Implement ->honeysql :sum-where and :distinct-where in terms of :case for :sql driver

Change the ->honeysql methods for :sum-where and :distinct-where to build an MBQL :case form and compile that, rather
than building a honeysql :case form directly. In this way, drivers that need special handling for :case will get
:sum-where and :distinct-where for free. Note that :count-where was already implemented this way. See, e.g. the
:metabase.driver.sql.query-processor.expression-literals/boolean->comparison abstract driver which converts booleans
in the case conditions to equivalent := expressions.

* Fix typo in test: case clause -> expression

* Rename boolean->comparison abstract driver to boolean-is-comparison

Rename

  ::sql.qp.expression-literals/boolean->comparison to
  ::sql.qp.boolean-is-comparison/boolean-is-comparison

This makes it clear that the namespace should only contain the abstract driver, and is also more consistent with the
existing driver in sql.qp.empty-string-is-null.

---------

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-04-22 13:47:39 -07:00
Edward Paget
e1266af965 fix: use a shared lock for report_card updates (#57040)
the view_count and last_view_at updates of report cards can deadlock
against each other, so introduce a shared keyword they can use to each
take a cluster lock when updating these values to prevent the deadlocks.
2025-04-22 13:11:09 -07:00
Sébastien
e19c9f9013 closes VIZ-400 dashboard parameters panel background FF (#56906) 2025-04-22 20:12:37 +02:00
metamben
254b87fd5f Add endpoints to allow admins to override log levels at runtime (#56973)
* Add endpoints to allow admins to override log levels at runtime

Fixes SEM-219
2025-04-22 17:37:28 +00:00
lbrdnk
7cdf5d3116 Add schema, table and field to missing database type to base type mapping (#56843)
* Adjust missing base type logging for jdbc drivers

* Adjust base type logging for Athena

* Add schema and table to missing base type logging

* Comments

* Update test

* Drop only preceding nils
2025-04-22 18:40:18 +02:00
Uladzimir Havenchyk
a9c878d2b2 test: sign in as admin for external db (#56963) 2025-04-22 18:23:31 +03:00
Kamil Mielnik
163d5afe2a SEM-111 Support sorting by duration, start and end time (#56791)
* Use Mantine instead of styled components

* Fix centering

* Add task and status params

* Add TaskStatusPicker

* Make picker clearable

* Add task picker

* Put filters and pagination together

* Translate task status

* Break down logic

* Move loading and error state

* Always render something

* Make task picker searchable

* Add empty state to the table

* Fix clear button being transparent

* Add useUrlState

* Use useUrlState in TasksApp

* Move UrlState to its own file

* Sort

* Rename file

* Rename

* Clean invalid query params on mount

* Prettier

* Use Action

* Ignore invalid pages

* Reuse variable

* Fix tests

* Add test

* Add label to clear button

* Remove redundant condition

* Add assertions

* Improve typing

* Be explicit about empty string handling

* Add sorting params to ListTasksRequest

* Add sorting params to url state

* Render icon for the first column

* Add SortableColumnHeader

* Extract TasksTable

* Move use-url-state to its own directory

* Add unit tests for useUrlState

* Add test

* Refactor

* Add more tests

* Fix missing import

* Add task endpoints mocks

* Add TasksApp tests boilerplate

* Add pagination test

* Add tests for filters

* Add more tests

* Tmp

* Make SortColumn generic

* Use SortingOptions

* Remove unused type

* Make BaseItemsTableProps non-generic

* Integrate sortingOptions

* Prevent CLS

* Prevent table content from disappearing on sort or filter

* Improve typing

* Use isLoading

* Get fresh data

* Update comment

* Reset page on sorting change

* Update tests

* Add tests for page reset

* Update tests

* Mark test as flaky

* Reuse SortingOptions

* Extract getFirstParamValue
2025-04-22 22:00:28 +07:00
Luis Paolini
d92762277c add a note to okta scim (#57032)
Adding the header, which is coming often
2025-04-22 11:21:18 -03:00
github-automation-metabase
6c5c5e409f Bump cheshire/cheshire from 5.13.0 to 6.0.0 (#56950)
Inspect dependency changes here: https://github.com/dakrone/cheshire/blob/6.0.0/ChangeLog.md

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-22 12:54:24 +00:00
Phoomparin Mano
2b3f6833e7 fix(sdk): css variables leak from Mantine to the host app (#56985)
* add tests for mb-wrapper leaks

* revert me - temporarily check diffs

* Revert "revert me - temporarily check diffs"

This reverts commit f474fe7b25.

* only apply mb-wrapper when in the sdk

* use cy.log to show e2e messages

---------

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-04-22 19:08:23 +07:00
Uladzimir Havenchyk
5e9d964237 test: add timeout after dragging tab to avoid flakiness (#57019) 2025-04-22 11:45:46 +00:00
Uladzimir Havenchyk
81c0d0b0fa test: move flaky tests to jail (#56964)
* test: move flaky tests to jail

* two more tests

* one more
2025-04-22 14:21:19 +03:00
Romeo Van Snick
6734dbaa02 Fix metric tests (#56965)
* Allow metrics to show up in tests

* Unskip metric test

* Unskip metric test
2025-04-22 12:55:14 +02:00
Uladzimir Havenchyk
f0b61b8aeb test: make admin test more reliable (#56967) 2025-04-22 13:53:07 +03:00
Luis Paolini
09790c4c6e Remove ed25519 dep (#56940)
Not needed since
https://github.com/apache/mina-sshd/pull/639

Will also remove one security alert due to https://github.com/advisories/GHSA-p53j-g8pw-4w5f
2025-04-22 07:30:26 -03:00
Timofey Kachalov
624a6c53db Adjust CI on exposed internal types from Embedding SDK (#57014) 2025-04-22 14:09:26 +04:00
Romeo Van Snick
d7ae787f0e Remove legacy expression helpers (#56813)
* Remove legacy expression in the return type from compiler

* Move test cases to formatter tests

* Move op and opt helpers to test utils

* Move value helper to test utils

* Rewrite compiler tests to use expression parts

* Remove unused test helpers

* Use actual invalid metadata instead of broken references

* Remove Lib.legacyExpressionForExpressionClause and Lib.expressionClauseForLegacyExpression

* Remove unused mock in fuzz test

* Remove legacy-expression-for-expression-clause and expression-clause-for-legacy-expression helpers

* Merge __support__ and test folders

* Reuse query from shared testing data

* Remove legacy-expression-for-expression-clause and expression-clause-for-legacy-expression tests

* Fix import

* Rename util to utils
2025-04-22 11:45:59 +02:00
Romeo Van Snick
bb5c6874de Remove unused properties in expression compiler (#56993)
* Remove unused parser properties

* Remove custom AssertionError class

* Remove unused WS token

* Remove unused skip property
2025-04-22 11:39:11 +02:00
Romeo Van Snick
0e2edd80e6 Fix infinite loop in native editor (#57012)
* Use _.isEqual to check if ranges are equal

* Add back in reproduction for metabase#53649
2025-04-22 11:38:57 +02:00
Nicolò Pretto
6720fb7987 run codemod to convert t calls on module level to getters when possible (#56793)
* ran the codemod, lets see if it greens out on ci

* manually remove some changes as not-needed or risky

* remove other createEntity
2025-04-22 10:53:35 +02:00
Romeo Van Snick
8df5d81d69 Replace all references of StartRule with Lib.ExpressionMode (#56970) 2025-04-22 10:46:05 +02:00
Timofey Kachalov
3a5bde5087 Fail CI on exposed internal types from Embedding SDK (#56958) 2025-04-22 11:25:21 +04:00
Kamil Mielnik
f81d576487 Improve SortColumn typing (#56907)
* Make SortColumn generic

* Use SortingOptions

* Remove unused type

* Make BaseItemsTableProps non-generic
2025-04-22 14:20:08 +07:00
Kamil Mielnik
9a4f9cc59d Fix - Filtering the foreign key dropdown randomly works (#56916)
* Fix #56839

* Repro #56839

* Update log
2025-04-22 14:19:53 +07:00
github-automation-metabase
33a444d442 Bump djblue/portal from 0.58.5 to 0.59.0 (#56954)
Inspect dependency changes here: https://github.com/djblue/portal/blob/0.59.0/CHANGELOG.md

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-21 16:03:46 -07:00
github-automation-metabase
17476b91f5 Bump io.github.weavejester/cljfmt from fc3340da3c8344b3fbb336d190ce696ef40e42d4 to c87493e54bdc30c104d75b95ce2a2ce5e7403430 (#56354)
Inspect dependency changes here: fc3340da3c...c87493e54b

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-21 15:59:12 -07:00
Nathan Voxland
38e1e87c87 Dowgraded postgresql driver until liquibase fix is released (#56981) 2025-04-21 15:55:57 -05:00
Eric Normand
cc3f0a5d59 float() tests + tier 1 (postgres) (#56814)
* float() tests + tier 1 (postgres)

* Add more parsing test.

* Better float comparison

* Add expression/float feature

* Add float function to config

* Add float help text

* Add e2e test for float()

* Add `:expressions/float` to list of feature flags

* Only allow casting text to float (not number)

* Better test message

* Refactor for nicer code

---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2025-04-21 20:40:15 +00:00
Romeo Van Snick
61860a1d1a Remove unused expression helpers (#56974)
* Inline only use of isCaseOrIfOperator

* Remove unused matchers

* Rename matchers module to literals

* Rename arguments
2025-04-21 19:26:24 +02:00
Edward Paget
656b31eddb fix: add cluster lock around view count update (#56977)
To avoid deadlocks on postgresql appdbs caused by overlapping ids in the
in clause of these updates.

I also had to change the `call-count` implementation for one of the
tests to spy on t2/query instead. The call-count pipeline middleware
will register either 2 or 4 depending on if we need to insert rows into
the lock table or not.
2025-04-21 12:24:47 -05:00
Aleksandr Lesnenko
e53749f67c Fix column resizing (#56898)
* fix column resizing

* comments

* specs

* change column measurement approach

* repro

* move pagination issue to a separate PR

* fix specs

* fix unit specs

* specs

* unnecessary dependency

* extract a hook and fix failing specs

* adjust to latest master branch updates

* fix types

---------

Co-authored-by: Sébastien <sebastien@metabase.com>
2025-04-21 16:35:00 +00:00
metamben
601217f9f9 Discourage changing jdbc-data-warehouse-unreturned-connection-timeout-seconds (#56749)
Fixes QUE-755

Since killing connections this way is the mechanism we use to terminate long running JDBC driver queries, this timeout
shouldn't differ from the db-query-timeout-minutes setting.
2025-04-21 18:57:48 +03:00
Romeo Van Snick
cb2c515dc6 Allow passing strings to isEmpty and notEmpty (#56855)
* Allow strings to be passed to isEmpty

* Add repro for metabase#55687

* Add be test for is-empty and not-empty

* Use Emptyable var
2025-04-21 17:09:47 +02:00
Edward Paget
0d35a0ac4c fix: broken test after ident change (#56941) 2025-04-21 14:44:01 +00:00
Nathan Voxland
c137105f73 Don't update the "active" index table from the "reindex" job (#56671) 2025-04-21 09:26:53 -05:00
bryan
d7130ed448 replaces 4 = true.. w/ true? (#56935) 2025-04-18 22:11:10 +00:00
bryan
83941fea48 introduce the no-auto-issue-links label (#56923) 2025-04-18 14:21:55 -07:00
Alex Yarosh
59644bf378 Update field-types.md (#56938) 2025-04-18 21:06:32 +00:00
Gustavo Saiani
508dcaeacc Update links in docs (#56930)
* Update link

* Update links
2025-04-18 15:48:03 -04:00
Timofey Kachalov
3df44a9c5e docs(sdk): Remove remaining internal types from being exposed (#56895) 2025-04-18 16:47:10 +04:00
Romeo Van Snick
344b722f49 Merge resolver into compiler (#56647)
* Resolve dimensions while compiling

* Use resolver in pratt compiler instead of resolver pass

* Remove legacy resolver

* Add missing imports

* Add startRule to compiler in test

* Use helper to calculate argtype

* Provide a default implementation of argType

* Return expressionParts from compiler

* Convert resolver tests to use compiler

* Remove superflouous comment

* Convert MAP_TYPE to a function

* Rename field-resolver to resolver

* Simplify resolver check

* Move resolver-related code into resolver module
2025-04-18 13:33:17 +02:00
Nick Fitzpatrick
db1aaa49c8 Pinned items moderation status (#56668)
* pinned questions show moderated status, handle their own caption title

* unit tests, description

* fixing grid spacing

* e2e test adjustments

* fix for verified skeletons

* update quetion embed test, dashboard embed test
2025-04-18 10:43:16 +05:30
Alexander Polyankin
fbe7122dc5 Fix pivot metadata (#56786) 2025-04-18 02:02:39 +00:00
Ryan Laurie
1e303ea32f Refactor Upload Settings to use RTK + Mantine (#55780)
* Refactor Upload Settings to use RTK + Mantine
2025-04-17 22:38:33 +00:00
Oleksandr Yakushev
7a0bd60c94 [test] Speed up metabase.pulse.send-test tests (#56336)
* perf: Optimize duplicate-model-ids and search/ingestion functions

* [test] Mock javascript-visualization in m.pulse.send-test to speed up tests
2025-04-18 01:30:48 +03:00
Braden Shepherdson
0a4d7039ad [refs] Return :idents in QP annotate; save in :result_metadata (#56244)
Fixes [QUE-701](https://linear.app/metabase/issue/QUE-701), [QUE-778](https://linear.app/metabase/issue/QUE-778),  [QUE-777](https://linear.app/metabase/issue/QUE-777),  [QUE-776](https://linear.app/metabase/issue/QUE-776),  [QUE-703](https://linear.app/metabase/issue/QUE-703),  [QUE-704](https://linear.app/metabase/issue/QUE-704).

### Description

Directly implements `:ident` calculation for legacy MBQL in the QP!

Also changes the spelling of compound idents to eg. `join[JoinClauseIdent]__InnerColumnIdent`, `native[CardEntityId]__COLUMN_NAME`, etc. The advantage of this is that NanoIDs cannot contain `[]`, whereas they do contain `_`s. Then we can make sure there's no missing `entity_id`s (a common issue) by looking for `native[]`. `native____` might have happened by accident is the NanoID started with two underscores.

This is an unfortunately large PR, but I don't think much can be done to help that.
The output of `annotate` becomes `Card.result_metadata`, which is a key **input** to
`annotate`. So we have to tackle legacy metadata end to end to produce a healthy PR.

(A prior attempt to use the lib and match up the results turned into a cluster of hacks,
and required half of these changes anyway, so this direct approach seems more sound.)

Most of this logic lives in the `annotate` post-processing middleware, with
some support from `add-source-metadata` pre-processing.


#### Idents

This generates correct idents for proper fields, expressions,
aggregations, breakouts, explicit and implicit joins, native queries and
models (native and MBQL).

#### Safety checks and Guarantees

Also adds and strengthens several safety checks in the library and
elsewhere. The guarantees I hope we can count on at this point are:
- Cards are saved with correct `:ident`s in their `:result_metadata`.
- Cards with old `:result_metadata` get (correct) `:ident`s added on read.
- Lib can now rely on getting correct idents for all input cards!
- Therefore the lib (BE + FE) can compute the ident for **every column**.

#### Placeholder idents

For native queries, we can only get `result_metadata` from executing them.
The usual flow is:
- Write the query
- Send it as an ad-hoc `/api/dataset` request
- Get back `result_metadata`
- Save it, passing the `result_metadata` back to the BE.

We need a card `entity_id` to create idents for a native query, but an ad-hoc
query doesn't have a card yet! The BE now generates a placeholder `entity_id`,
which gets replaced on save with the new card's actual `entity_id`. These
placeholders contain (1) illegal NanoID characters, and (2) a NanoID, which
means they cannot be mistaken for non-placeholder NanoID, and that they are
still globally unique, so there's no caching concerns.
2025-04-17 20:55:23 +00:00
Romeo Van Snick
66ba50cfea Convert diagnostics to lib (#56646)
* Move diagnostics to separate dir

* Use correct type for startRule arg

* Split up diagnostics into sepearate files per check

* Use throw for checks that don't yet

* Pull out syntax checks into separate function

* Split up lib.diagnoseExpression into helper

* Return expressionParts from compiler

* Add vist helper that walks Lib.ExpressionParts

* Convert check-known-functions to use Lib.ExpressionParts

* Convert check-supported-functions to use Lib.ExpressionParts

* Convert check-comparison-operator-args to use Lib.ExpressionParts

* Convert check-arg-count to use Lib.ExpressionParts

* Convert check-case-or-if-arg-count to use Lib.ExpressionParts

* Convert check-arg-validators to use Lib.ExpressionParts

* Remove legacy visitor

* Also pass expression clause to diagnostics

* Use pMBQL in diagnose-expression

* Stop passing expression to diagnostic checkers

* Rename visit to visitor
2025-04-17 21:53:10 +02:00
Timofey Kachalov
3764616d8c Setup app cleanup for sample-app runner (#56866) 2025-04-17 23:12:10 +04:00
Timofey Kachalov
9bb5e3ec50 feat(sdk): Use public types for Dashboard/Collection/User and other entities (#56875) 2025-04-17 23:11:31 +04:00
Phoomparin Mano
ebcdfddf7e Improve PDF and results download button UI in static embedding (#56541)
* replace the export button in dashboard header

* use the same download button style for both

* add styles for compact download button

* change the compact export button style

* add download button logic

* update data-testid

* update dashboard tests in public-resource-downloads

* use getDashboardCard helper instead

* move question result download to header

* remove PDF export localized test

* add PublicOrEmbeddedDashboardView loki diffs

* use text-primary instead of text-dark for download icons

* simplify downloadAndAssert embed logic

* simplify classnames merging

* revert ExportPdfMenuItem

* cleanup TitleAndDescriptionContainer

* revert LegendCaption

* show the header if headerButtons is not null

* standalone question download results only shows up on card hover

* always show header if there is a header button

* add floating headers when title is hidden

* add comment on floating header buttons

* use accessible label selectors instead of data-testid

* replace question-results-download-button testid with accessible label

* cleanup downloadAndAssert logic

* update tests

* support shared selector

* update unit test for PublicOrEmbeddedDashboardPage.enterprise

* update unit test for PublicOrEmbeddedDashboardPage.premium

* update unit test for PublicOrEmbedded

* update localization tests

* localize aria-label and re-add label tests

* make aria-label "Download as PDF" for all instances

* fix question tests on locale hash params

* fix tests on disabling downloads

* add realHover case to downloadAndAssert

* update testid in LegendDescriptionIcon

* update public-resource-downloads cypress test

* use visibility checks in tests

* restore ellipsis button size

* restore hover parent state to standalone question

* update localization tests that referenced PDF export button

* remove eslint-disable directives

* update ChartSkeleton

* update ChartSkeleton

* lift spacing to LegendCaption

* use lighter colors for dashcard downloads

* add new loki snapshots

* use the auto refresh text for locale tests as pdf export text is gone

* use the lighter color for all download icons

* add new loki snapshots

* update test assertions for locale tests
2025-04-18 00:50:23 +07:00
appleby
3b3d9229a2 Add missing docsPage links to custom expression HELPER_TEXT_STRINGS (#56818) 2025-04-17 10:28:53 -07:00
Tyler Plude
daf6c948e6 Fixing division by zero for minibar columns (#56871) 2025-04-17 10:20:45 -07:00
bryan
eb06aa0d79 use the branch in mage cljfmt-updated <branch> (#56868) 2025-04-17 16:07:01 +00:00
Nicolò Pretto
88a88270be fix(sdk): use instance locale if no locale is passed (#56683)
* fix(sdk): use instance locale if no locale is passed

* update docs

* we do support country codes, we have tests for it

* Update e2e/test-component/scenarios/embedding-sdk/locale-on-provider.cy.spec.tsx

Co-authored-by: Phoomparin Mano <poom@metabase.com>

* remove manual fallback to "en", site-locale is never undefined as it has
a default

---------

Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-04-17 16:06:05 +00:00
Timofey Kachalov
fe1df8df88 feat(sdk): Export public plugin and icon types (#56851) 2025-04-17 19:30:24 +04:00
Sloan Sparger
3c539e3626 [Permissions] Skip fetching of table fields when updating db permissions (#56859) 2025-04-17 15:09:24 +00:00
Edward Paget
5ed1cf1a2d fix: make enhance table stats a single query (#56738)
Avoids hitting the postgresql query parameter limit when there are more
than MAX_UINT16 tables in a database, also should be more efficient to
fetch this in a single query.
2025-04-17 07:47:12 -07:00
Kamil Mielnik
98f9c39437 SEM-173 Allow filtering logs on specific namespaces (#56772)
* Use Mantine instead of styled components

* Fix centering

* Add task and status params

* Add TaskStatusPicker

* Make picker clearable

* Add task picker

* Put filters and pagination together

* Translate task status

* Break down logic

* Move loading and error state

* Always render something

* Make task picker searchable

* Add empty state to the table

* Fix clear button being transparent

* Add useUrlState

* Use useUrlState in TasksApp

* Move UrlState to its own file

* Sort

* Rename file

* Rename

* Clean invalid query params on mount

* Prettier

* Use Action

* Ignore invalid pages

* Reuse variable

* Fix tests

* Add test

* Add label to clear button

* Remove redundant condition

* Add assertions

* Improve typing

* Be explicit about empty string handling

* Add url state to logs

* Add download button

* Disable the button instead of hiding it

* Add query input

* Add clear button

* Improve copy

* Typo

* Fix unit tests setup

* Improve empty state message

* Support location in setup

* Add a test for empty state message when filtering

* Add a test

* Add download button assertions

* Add e2e tests

* Simplify assertion

* Remove redundant element

* Add debounce

* Fix timezone issue

* Extract TasksTable

* Move use-url-state to its own directory

* Add unit tests for useUrlState

* Add test

* Refactor

* Add more tests

* Fix missing import

* Add task endpoints mocks

* Add TasksApp tests boilerplate

* Add pagination test

* Add tests for filters

* Add more tests

* Update tests

* Update tests

* Add more assertions
2025-04-17 21:34:36 +07:00
Romeo Van Snick
04973ca224 Clean up unused code in the expression parser (#56706)
* Remove unused hooks

* Simplify error creation in pratt parser

* Simplify CompileError construction and remove unused data
2025-04-17 16:24:59 +02:00
Kamil Mielnik
b8f0117f5f SEM-110 Support filtering of tasks list by status and task name (#56664)
* Use Mantine instead of styled components

* Fix centering

* Add task and status params

* Add TaskStatusPicker

* Make picker clearable

* Add task picker

* Put filters and pagination together

* Translate task status

* Break down logic

* Move loading and error state

* Always render something

* Make task picker searchable

* Add empty state to the table

* Fix clear button being transparent

* Add useUrlState

* Use useUrlState in TasksApp

* Move UrlState to its own file

* Sort

* Rename file

* Rename

* Clean invalid query params on mount

* Prettier

* Use Action

* Ignore invalid pages

* Reuse variable

* Fix tests

* Add test

* Add label to clear button

* Remove redundant condition

* Add assertions

* Improve typing

* Be explicit about empty string handling

* Extract TasksTable

* Move use-url-state to its own directory

* Add unit tests for useUrlState

* Add test

* Refactor

* Add more tests

* Fix missing import

* Add task endpoints mocks

* Add TasksApp tests boilerplate

* Add pagination test

* Add tests for filters

* Add more tests
2025-04-17 20:57:38 +07:00
lbrdnk
2a827d4448 Add memory usage logging to sync steps (#56834) 2025-04-17 13:04:23 +02:00
Timofey Kachalov
764b236601 feat(sdk): Export more public SDK types (#56838) 2025-04-17 13:55:31 +04:00
Nicolò Pretto
6999843d4c fix: run cross-version-for-breaking-changes only on pull requests to (#56794)
make it pass on master
2025-04-17 09:32:10 +02:00
lbrdnk
7cb3445541 Add sorting capabilities to GET /task/ endpoint (#56795)
* Add sorting

* Add test

* Adjust ordering for h2

* Use merge instead of union

* kondo

* Undefined nil ordering among various app dbs
2025-04-17 08:58:44 +02:00
Nick Fitzpatrick
9aec86abce Snowplow tracking for shortcuts (#56744)
* temo

* enable tracking for shortcuts

* amending e2e test
2025-04-17 05:17:11 +00:00
Nick Fitzpatrick
bf27059a98 Disabled shortcuts when a modal is open on the page (#56806)
* Disabled shortcuts when a modal is open on the page

* fix context check

* removing irrelevant test
2025-04-16 19:35:25 +00:00
Uladzimir Havenchyk
3dd6b40c80 test: release healthy specs from jail (#56764) 2025-04-16 22:33:52 +03:00
Romeo Van Snick
633a4565ff Convert compiler to lib (#56426)
* Convert pratt compiler to use ExpressionParts

* Simplify compile by using compileNode helper

* Add todo's about casts

* Simplify error creation

* Make assertions more consistent and translate error messages

* Remove any check

* Simplify compiler by moving stuff into infix/unary helpers

* Remove unused assertions

* Remove casts on constant operator names

* Add assertions for operators

* Wrap top-level literals in a value clause

* Handle bigints in pratt compiler

* Accept ExpressionParts in Lib.expressionClause

* Remove null from ExpressionArgs

* Add field and metric to expression operator

* Simplify pratt compiler types

* Add more tests for equivalent clauses

* Return metadata objects directly from field-resolver

* Add more operators to type

* Create type for field type

* Remove resolverPass

* Convert resolver to Lib.ExpressionParts

* Convert compiler to expressionParts

* Fix syntax error

* Fix types

* Remove unused passes

* Fix resolver tests

* Add types to top-level literals

* WIP: convert untagged expression-parts from #js

* Manually unwrap field, segment and metric metadata

* Unwrap options in pratt compiler

* Remove empty options

* Handle normalized expression when diagnosing

* Allow customizing field resolver

* Fix fuzz tests

* Add value to ExpressionOperator

* Remove unused TODO's

* Use constants in test so types match

* Wrap clauses in defineClause and extract list of defined clauses

* Forbid setting name on clause config

* Use defined clause name as ExpressionOperator

* Use getClauseDefinition helper to get clause definitions

* Ignore type in filters

* Move expression-parts transformation to lib.js

* Add type-of method implementations for field, metrics and segments

* Trigger change when fast setting custom expression

* Remove superflouous casts

* Simplify resolver return type

* Use reference for top-level fields

* Be more specific about types in compiler

* Convert operator to string

* Add unit test for specific expressions

* Fix literals icons

* Remove unused matchers

* Remove unused option from compiler

* Negate number literals directly in compiler

* Add expression-clause implementation that takes one argument

* Use single-arg version of Lib.expressionParts

* Remove TODO

* Use helper to compile top level literal

* Add effective-type to top-level literals

* Remove unused MBQLCLauseMap type

* Remove unused import

* Add two-argument version of expressionClause

* Wait for button to be visible

* Add operator to invalid operator assertion

* Remove incorrect operator check

* Add more specific type to clause name

* Always throw if function name is not found

* Add overloads to getDefinedClause for known function names

* Document the allowFastSet typing hack

* Lift operator check

* Convert nil to {} in body

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>

* Make expression-parts js conversion more clear

* Pass through lib.metadata.calculation/type-of for the type-of implementations

* Always throw assertion errors

* Use helper to check query invariants

* Remove lib.schema.expression/type-of methods

* Add test for normalization of uppercase keyword arguments

* Allow some normalizers to ignore case

* Use threading for lowercase converter

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>

* Structure test better

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>

* Remove unused var

---------

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-04-16 20:52:26 +02:00
Nick Fitzpatrick
6a782d5eb4 Update navigation shortcuts to be key sequences (#56798)
* adjusting keyboard shortcuts, event names

* adding viewing context to dashboard shortcuts

* adding unit tests for enforce some sanity
2025-04-16 12:26:27 -06:00
Uladzimir Havenchyk
fa896cbe1c ci: extract build-matrix script (#56773)
* ci: extract build-matrix script

* fixup

* fixup

* add a test

* make executable?

* checkout

* fix path

* add tests from .github to file-path

* fixup
2025-04-16 20:24:27 +03:00
appleby
50e2c32603 Log metric data for failures in qp.middleware.metrics/adjust (#56747)
* Log metric data for failures in qp.middleware.metrics/adjust

When qp.middleware.metrics/adjust fails to expand a metric, log the metric's name and dataset_query, not just the
metric id.

Closes QUE-862

* Update test to assert that metric data is present in ExceptionInfo
2025-04-16 09:36:35 -07:00
bryan
8bb6ef90d7 fix missing deps.edn checksum (#56800) 2025-04-16 12:36:03 -04:00
Alexander Polyankin
781af5af39 Temporal units translation fix (#56792) 2025-04-16 16:30:44 +00:00
Kamil Mielnik
ec25a3ac4a yarn remove use-debounce (#56784) 2025-04-16 21:25:56 +07:00
Nicolò Pretto
5d9bb5985a POC of cross version tests to detect breaking changes (#56130)
* wip script to build the frankenjar

* build/run/test functions that seem to be working

* preparing for ci

* wip ci workflow

* need to run the job "manually" at least one to be able to dispatch it
from the gh cli

* add workflow_call

* bash instead of sh to solve issue of illegal option -o pipefail?

* use correct version of node

* prepare backend

* more envs to ci

* make jar run on the background in ci

* trying to run a list of specs in ci, tagging with tags probably won't
work as tags potentially need to be there on "older" versions of the
test

* fewer tests so it maybe doesn't timeout

* run on prs targerting the pr branch and the target base one
:wq

* clean up

* fix: without --env it wasn't really using the grepTags param:wq

* refactor: check for the actual files instead of doing ls*

* add back some more test files

* add log for ci

* remove colors as they're not shown in ci

* test: wait for data to load in a flaky test

* test: wait for data to load in a flaky test

* make sure we're building the EE jar

* skip licnese step as we don't need it

* move script out of embedding-sdk folder

* make curl -s to spam less in ci

* refactor: move jops to keep the result job last

---------

Co-authored-by: Uladzimir Havenchyk <uladzimir.dev@gmail.com>
2025-04-16 16:09:17 +02:00
Riley Thompson
49f744375c Revert "Revert "Remove partner drivers"" (#56575) 2025-04-16 09:43:29 -04:00
lbrdnk
22f176f81b Address remarks for status and task filtering in GET /task endpoint (#56774)
* Docstring

* Support :unknown task

* Add tasks-count

* Use tasks-count in the API definition

* Rename to total

* Add and update tests

* docstring
2025-04-16 15:06:38 +02:00
metamben
21b29f3965 Add diagnostics for expressions with illegal nested aggregations (#56741)
Fixes QUE-822
2025-04-16 15:52:36 +03:00
Ngoc Khuat
88e251c441 Guard notification pool for exhaustion (#56766) 2025-04-16 11:23:22 +00:00
github-automation-metabase
4bdc21b1aa Bump com.google.guava/guava from 33.4.5-jre to 33.4.6-jre (#55972)
Inspect dependency changes here:

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-16 07:30:20 +00:00
Uladzimir Havenchyk
008973b814 test: move flaky mongo test to jail (#56753) 2025-04-16 09:28:51 +03:00
Alexander Polyankin
01eb3ac384 Remove dead code from FieldValuesWidget (#56739) 2025-04-15 22:52:41 -04:00
Fraser
43d5939a64 Convert Updates tab to new components (#55979)
* Convert Updates tab to new components
2025-04-16 11:14:42 +12:00
Alex Yarosh
cbacd7048e docs: semantic types (#56703)
* semantic types

* Apply suggestions from code review

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>

* feedback

---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-04-15 16:53:41 -04:00
Eric Normand
21e1ca15c6 Correct output for dashboard filter variables (#56619)
* Correct output for dashboard filter variables

* Whitespace

* Add node script for testing clojurescript

* Enhance format-unit and add parse-unit.

parse-unit is new.

format-unit now works with moment (cljs) or java.time (clj) values, not just strings and numbers. I also added two new
units (:day-of-week-abbrev and :month-of-year-full).

* Refactor to use time/parse-unit and time/format-unit
2025-04-15 14:42:20 -05:00
Ngoc Khuat
5f47d1cbd3 Less ambiguous notification logs (#56701) 2025-04-15 20:31:03 +03:00
Nicolò Pretto
fd25c7efcc add comment to explain why we need isDashboard to Visualization (#56709) 2025-04-15 18:47:43 +02:00
Uladzimir Havenchyk
4c59fc665f test: fix another flakiness (#56711)
* test: fix another flakiness

* another assert

* add comment back and remove flaky
2025-04-15 16:29:25 +00:00
bryan
38bb58583d indent files with mage from lint-staged (#56303) 2025-04-15 09:09:36 -06:00
Timofey Kachalov
1eeaec0e94 docs(sdk): Improve typedoc output and plugins (#56712) 2025-04-15 18:38:26 +04:00
Alexander Polyankin
6985eca2b3 Remove unused endpoints from services.js (#56735) 2025-04-15 14:37:12 +00:00
Alexander Solovyov
b211f68ec7 fix identity-hash-test flakes (#56728)
this happens because we're not hashing `now` in this case, but what is coming from DB; which is OffsetDateTime and can
have slightly different precision, leading to different hash.
2025-04-15 13:49:39 +00:00
Alexander Solovyov
c6488e7fc6 use big number mode for apache compress (#56719)
possibly fixes a problem we're seeing in #53354
2025-04-15 13:37:22 +00:00
metamben
f786d876bb Wait a bit longer in util.queue tests to let them pass in CI (#56681)
* Wait a bit longer in util.queue tests to let them pass in CI
2025-04-15 13:32:41 +00:00
Alexander Polyankin
f74bf7fac2 Use MultiAutocomplete in FieldValuesWidget - multiples values only (#56461) 2025-04-15 09:22:53 -04:00
Alexander Polyankin
a3da9834be Rename date picker labels (#56699) 2025-04-15 13:13:52 +00:00
Timofey Kachalov
3dff6bef19 Run build job for SDK on any FE code change (#56718) 2025-04-15 17:07:46 +04:00
Alexander Polyankin
30ca07666d Fix the filter input placeholder for remapping cases (#56691) 2025-04-15 09:04:11 -04:00
Alexander Polyankin
67de26fc3f Fix native model perms (#56697) 2025-04-15 09:04:02 -04:00
Oisin Coveney
b7a74d02c7 feat(sdk): Automatically set a sensible display to interactive questions (#56584) (#56667)
Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-04-15 11:19:17 +01:00
Alex Yarosh
d001543d0e Update connecting.md (#56708) 2025-04-15 05:23:22 -04:00
Timofey Kachalov
51d772c85b Fix redirect from internal module, replace metadata description via a plugin (#56614)
Co-authored-by: Timofei Kachalov <timofei@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-04-15 12:24:54 +04:00
Timofey Kachalov
f9c6432297 Remove Embedding SDK API generated doc files from repo (#56637) 2025-04-15 12:07:36 +04:00
Fraser
8afc62789e Replace confirm content in use-confirmation hook (#55247)
* Replace confirm content in use-confirmation hook

* Ensure modal closes after confirmation

* Update to mantine popover

* Toggle closeOnClickOutside when modal is open/closed
2025-04-15 18:32:42 +12:00
Jeff Bruemmer
8ee568053a docs - expression casing (#56695) 2025-04-14 22:32:32 +00:00
Uladzimir Havenchyk
cabe5b28f8 test: fix flakiness in action creator unit tests (#56672) 2025-04-14 20:30:58 +03:00
Nicolò Pretto
f78b415927 make the sdk docs check not required so we can merge things (#56685) 2025-04-14 18:04:11 +01:00
Alexander Polyankin
363c87a8af MultiAutocomplete + remapping (#56621) 2025-04-14 12:33:30 -04:00
metamben
5472a21887 Parse BigQuery timestamp values with microsecond precision (#56626)
Fixes #51175

BigQuery sometimes returns timestamp values as floating point values (as strings, of course). We used to pass the
parsed double value to java-time.api/instant, but that seems to have microsecond precision. In this change we use
Java's built-in Instant construction function to keep the full precision.
2025-04-14 19:31:29 +03:00
Alex Yarosh
90b57b895a docs: mention supabase (#56676)
* mention supabase

* Update docs/databases/connections/postgresql.md

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>

---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-04-14 16:18:37 +00:00
Jeff Bruemmer
74f24399e1 fix typo (#56678) 2025-04-14 16:09:36 +00:00
Romeo Van Snick
dfc753e0f6 Fix dissappearing string escapes (#56605)
* Add repro for #56596

* Allow escaping backslash

* Use unquoteString everywhere to parse strings and references

* Do string quoting and unquoting more consistently

* Add repro for #56596

* Make string parsing more straightforward and consistent

* Use quoteString to find errors with quoting

* Type string helpers more strictly

* Add fuzz tests for string quoting

* Move fuzz helper to test folder

* Make string fuzzing repeatable

* Add sanity check

* Fuzz all three quoting modalities

* Add [-quote tests

* Rename quote to delimiter

* Fix path for lexifier fuzz testing

* Fix name for compiler fuzz testing

* Use constant to store delimiter pairs

* Fix option name in formatter

* Add more cases around half-quoted strings

* Rename quote to delimiter in comment

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>

---------

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2025-04-14 15:30:05 +00:00
Alexander Solovyov
330f2c0a3c mage jar-download now can see newer releases (#56669)
since we don't tag v1.* anymore or something?
2025-04-14 18:27:29 +03:00
Nemanja Glumac
6c0ae49c2d Create the "Product Growth" team (#56674) 2025-04-14 17:19:48 +02:00
Romeo Van Snick
bd3ef171a8 Convert formatter to mbql (#55468)
* Add isExpressionParts helper to check

* Export Lib.isColumnMetadata

* Add Lib.isColumnMetadata to check

* Mark is-column-metadata as Single use instead of smelly

* Add is-metric-metadata helper

* Add is-segment-metadata helper

* Add isSegmentMetadata and isMetricMetadata to checks

* Use expressionParts and expressionClause in formatter

* Avoid stringifying the ast

* Allow passing literals to filter-clause

* Simplify test case for now

* Handle [:value x] in formatter

* Unnest expression-parts

* Add metric-clause? and segment-clause? helpers

* Handle metric and segment clauses in expression-parts

* Flatten case/if statement args in expression-parts

* Remove special case for case/if in formatter

* Support keywords in expression-parts

* Fix duplicate negation test case

* Prefer desctructuring over get

Co-authored-by: Braden Shepherdson <braden@metabase.com>

* Use set to match case and if

Co-authored-by: Braden Shepherdson <braden@metabase.com>

* Fix typo

* Use conditional threading in maybe-expand-*-expression

* Use destructuring to match case/if clauses

* Use cond-> instead of maybe-expand- helpers

* Fix literal in formatter tests

* Rename is-*-metadata to *-metadata?

* Swap test case order

* Use multi-method for expression-parts

* Inline recurse fn

* Accept ExpressionClause in the formatter

* Pass expression clause in HighlightExpression

* Build expressionParts for examples manually

* Be more strict in formatter typing

* Be more strict in formatter typing

* Fix FunctionBrowser example

* Add test case for 1 + 1

* Pass expression clause to format in Editor

* Add docstring to expression-parts-method

* Remove superflouous check

* Use threading macro in column-metadata-from-ref

* Unwrap case/if into pairs and a fallback argument

* Remove reference to unknown function

* Add stage-index-less version of expression-parts

* Add MetricMetadata and SegmentMetadata to ExpressionArg

* Fix case/if expansion not to have nil argument when fallback is nil

* Add test for case and if

* Fix case/if defop

* Add more test cases to case and if test

* Add ExpressionArg type

* Allow passing Expressionable to formatter

* Add more tests for case and if

* Move case and if conversions to fe_util

* Deduplicate case-or-if matcher

* Document case-or-if helpers more

* Be more precise in the type of ExpressionParts args

* Fix args for expression-clause in exclude-date-filter

* Remove faulty test

* Add test for nested parts

* Move fix-expression into ->op-arg

* Move ensure-uuid into fix-expression

* Wrap operator in keyword

* Correctly recurse through expression-parts

* Add test for nested case parts round-trip

* Add source-field to test data

* Comment out broken test case

* Add source-field to ReferenceOptions type

* Remove unused imports

* Allow more arguments to expression-parts

* Use expression-parts in filter test

* Handle bigint in formatter

* Add missing import

* Remove unused import

* Normalize mbql

* Allow lib.expression/expression as arg to expression-clause

* Handle expression refs

* Add tests for unknown fields, metrics and segments

* Add metrics to formatting tests

* Handle non-existent metrics and segments

* Add workaround for unknown fields

* Use cond-> and destructuring for unknown field

Co-authored-by: Braden Shepherdson <braden@metabase.com>

* Remove superflouous call to lib.field/extend-column-metadata-from-ref

* Inline segment-metadata-from-ref and metric-metadata-from-ref

* Collapse all identity expression-parts-methods in a doseq

* Call expression-parts instead of expression-parts-method

* Use multi-method to handle case and if

* Pull out temporal expression expansion into separate multimethod

* Move check closer to where it is used

* Remove constant conditional

* Use threading macro in expression-parts

* Move nested case/if test out of deftest

* Fix formatting

* Fix metadata method when metric is not found

* Add display-name to unknown field stub

* Use lib.metadata helpers directly for field, metric and segments in expression-parts

* Fix e2e test

* Handle segments in filter parts directly

* Fix e2e test

* Add TODO

* Use doseq in literals test

* Add test for bigint value clause in expression-parts

* Remove TODO

* Use id from sample database

* Use vec

Co-authored-by: Braden Shepherdson <braden@metabase.com>

* Fix types

* Use simpler assertion helper

* Move metric to aggregations tests

* Do not wrap value clauses in parentheses

* Return metric metadata from expression-parts

* Emit expression reference in the case of expressions

* Strip expression-name from columns metadata in expression-parts

* Add e2e test for nested references

* Return stub metric metadata if metric is not found

* Use expression-name from the reference

* Add tests for field reference in expression-parts

* Add tests for segment reference in expression-parts

* Add tests for metric reference in expression-parts

* Add tests for expression reference in expression-parts

---------

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2025-04-14 15:58:36 +02:00
Romeo Van Snick
93831828e4 Fix native editor sidebar (#56594)
* Fix issue where toolbar is being pushed off screen

* Add repro for metabase#56570
2025-04-14 12:11:00 +02:00
Kamil Mielnik
922cda5ec0 SEM-114 Improve pagination in tasks page (#56491)
* Add pagination to URL in tasks

* Add tests
2025-04-14 13:40:26 +07:00
Nick Fitzpatrick
53093f8c1a Query builder keyboard shortcuts (#56610)
* Query builder keyboard shortcuts

Query builder shortcuts

* PR feedback, remove download question shortcut
2025-04-14 07:48:43 +05:30
lbrdnk
a4ba2acd4b Add filtering capabilities to /task/ endpoint and add/task/unique_tasks endpoint (#56451)
* Adjust /task enpoint to handle status filtering

* Update GET /task endpoint

* Update test

* Unique tassk endpoint and filter nad schema

* Tests

* chore

* Review remarks

* Simplify

* Fix schema

* typo
2025-04-13 09:44:23 +02:00
lbrdnk
a54de86b39 Speculative OOM fix: partition index updates, update logging for index sync (#55866)
* Adjust logging

* Speculative OOM fix

* Update partitioning logic of sync-all-indexes!

* Add test

* Use bigger partitions

* Adjust tests

* Remarks
2025-04-13 09:43:52 +02:00
Oleksandr Yakushev
5d97d19781 [metrics] Fix race condition in jvm-hiccup/alloc-rate metrics (#56528) 2025-04-12 21:54:30 +03:00
appleby
97387d0942 Enable expression-literals for redshift and vertica (#56534)
* Support drivers that need special handling for literal string expressions

* Enable the :expression-literals feature for vertica

* Enable the :expression-literals feature for redshift

* Review feedback: lift comment about inlined literals from h2 to sql driver
2025-04-11 16:33:52 -07:00
bryan
63198734e2 properly address metabase's bb executable (#56606)
- if you have bb on your path, then this would never be hit.

Testing by uninstalling bb will not uncover this issue if you have
repo/path/metabase/bin on your PATH!
2025-04-11 22:54:27 +00:00
appleby
2a4e8d1c69 Enable expression-literals for sqlite and starburst (#56533)
* Rename True and False expressions in literal expression tests

Speculative fix for sqllite failing the tests.

* Update literal expression tests to work with drivers that treat empty string as null

* Add empty-string-literal-expression-test and remove empty string form standard-literal-expression-defs

* Fix logical merge conflicts in case-with-literal-expression-test

* Enable the :expression-literals feature for sqlite and starburst

* Review feedback: drop format-nil->empty-str

As pointed out by metamben in code review `(str nil)` is already the empty string. In fact, the culprit here was a
missing `format-nil-values?` arg to `format-rows-by`.
2025-04-11 15:03:52 -07:00
Uladzimir Havenchyk
de8c20bf55 test: use mousemove instead of realHover for echart tooltip (#56583) 2025-04-12 00:44:57 +03:00
Alexander Polyankin
ba131b1abd Close the MultiAutocomplete dropdown on Esc, preventing the outer Popover from closing (#56562) 2025-04-11 15:39:31 -04:00
Nick Fitzpatrick
452dbefda4 Add route prop to disable command palette, Disable in setup routes (#56507)
* Add route prop to disable command palette, Disable in setup routes

* increase wait timeout

* refresh user on setup

* Lets try a unit test instead

* removing refresh user from UserStep
2025-04-12 00:09:12 +05:30
Ryan Laurie
fd7c0db61f fix frontend test flake (#56597) 2025-04-11 08:50:04 -06:00
Uladzimir Havenchyk
5e19281112 test: fix a broken entity picker test (#56586) 2025-04-11 17:27:37 +03:00
Jeff Bruemmer
50df68482e docs - note on quotes (#56520)
* note on quotes

* edit

* tags

* format

* spacing

* edit
2025-04-11 14:25:41 +00:00
Noah Moss
c17c259d79 Remove a workaround which is no longer needed due to update of Apache POI (#56572)
* Remove a workaround which is no longer needed due to update of Apache POI

* clean ns
2025-04-11 13:33:23 +00:00
metamben
3be8f6ab2b Require only id and value for parameters when running questions (#56565)
This is the BE part of #51813
2025-04-11 15:40:41 +03:00
Sébastien
50664531b3 closes metabase#56307: faint line on tooltip arrow in FF (#56588) 2025-04-11 13:43:56 +02:00
Oisin Coveney
1f19dee6c5 Fail SDK unit tests when there are console errors #55529 2025-04-11 11:16:54 +01:00
William
c3c5edc272 Calculate and cache entity_ids on select (#54411)
We need to ensure that we consistently have entity-ids in metadata (and potentially elsewhere) even before we've finished backfilling them in.  To do this, we check for entity-ids in the field/table/database/card after-select and run calculation/deduplication logic to get them when necessary.  We then cache the results (because these calculations can be slow), and a separate job then drains the cache and writes the results back to the db.
2025-04-11 00:19:38 +00:00
John Swanson
728fa82bc2 Feature: Database Routing (#54648)
* Migrations for database sandboxing (#53125)

Two changes here:

- add a self-referential foreign key,
`metabase_database.router_database_id`, to allow marking a mirror
database's router database. Databases with this set are mirror
databases, databases without it are primary databases.

- add a `db_sandbox` table with only three columns:

  - `id`, primary ID,

  - `db_id`, the `metabase_database.id` this sandbox is for, and

  - `user_attribute`, the user attribute used to map users to a
    particular mirror database.

* CRUD API for database routing (#54102)

* Migrations for database sandboxing

Two changes here:

- add a self-referential foreign key,
`metabase_database.primary_database_id`, to allow marking a mirror
database's primary database. Databases with this set are mirror
databases, databases without it are primary databases.

- add a `db_sandbox` table with only three columns:

  - `id`, primary ID,

  - `db_id`, the `metabase_database.id` this sandbox is for, and

  - `user_attribute`, the user attribute used to map users to a
    particular mirror database.

* Bulk endpoint for creating mirror dbs

The error case is a bit wonky right now, it just returns the errors for
the details that failed... without the details or name.

Co-authored-by: Ed Paget <ed@metabase.com>

* Add endpoint for marking a database as a RouterDB

Co-authored-by: Ed Paget <ed@metabase.com>

* Rebase fixes

* Exclude mirrordbs from regular db endpoints

* kondo fixes

* mark `DatabaseRouter` as not serialized

* serdes fix

* copy fix

* delete and update routers

Also reorganized things to be a bit less cattywompus.

Now we have:

- `POST api/ee/database-routing/mirror-database` to create a new mirror database
- `POST api/ee/database-routing/router` to create a new router using an
  existing database
- `PUT api/ee/database-routing/router/:id` to update a router to use a
  new user attribute
- `DELETE api/ee/database-routing/router/:id` to delete a router and all
  of the associated mirror databases.

* GET endpoint for mirrors of a particular router db

* Don't test database conn for mirror dbs

---------

Co-authored-by: Ed Paget <ed@metabase.com>

* Modify the API - don't care about database routers (#55036)

* Modify the API - don't care about database routers

Add a `router_user_attribute` to the `GET /api/database/:id` API
endpoint.

Modifies the database routing API to address only by the database ID.
There's now just two endpoints:

- POST /ee/database-routing/mirror-database to create a mirror database

- PUT /ee/database-routing/router-database/:id to change the
`user_attribute` used for routing an existing database. Can be set to
`null` to turn of database routing for the database.

* fix test

* kondo

* DB Routing: Sloan's API improvements (#55438)

* router_user_attribute on `/database/`

* unique database names for mirror dbs

* Don't delete mirror databases when deleting router

* query param to check conn details

* no making a mirror a router

* Require `:manage-database` perms to get dest dbs

(rather than superuser.)

* set `visible-if`, NA on dest dbs

* Add conditions when making db router

* fix db migrations

* fix tests

* kondo

* reorder migrations for mysql/mariadb

* Implement database routing (#55053)

* Swap DB for DB routing

Caching should work, field values does not currently.

* Rename the metadata replacement dynamic var

for clarity. Since we're using it outside of tests now.

* Refactor Advanced Field Values

Previously we had 3 types of Advanced field values:

- sandbox,
- impersonation,
- and linked-filter

Each of these three had their own function, `hash-key-for-*`, and the
caller of this function was responsible for generating the correct hash
key for the field provided.

For example, `hash-key-for-advanced-field-values` took a `fv-type` and
called either `hash-key-for-linked-filters` or `hash-key-for-sandbox` or
`hash-key-for-impersonation` depending on the type.

The big problem here is that the hash keys aren't composable. You can
see this being an issue in `hash-key-for-linked-filters`, where the
enterprise version needs to also check whether the field is sandboxed,
and if so, include sandboxing data in the generated hash as well as the
linked filter data.

If we add more orthogonal things to the hash (like database routing) we
would end up with a rat's nest where each hashing function partially
implements a bunch of other hashing functions to make things work. E.g.
`hash-key-for-database-routing` might check if the field is sandboxed,
and if so include data about the sandbox, but also
`hash-key-for-linked-filters` should check if the field is
sandboxed *or* impersonated *or* subject to db-routing and include data
about those, and ...

Instead, I've replaced all these functions with `hash-input-for-*`
functions, which return self-contained maps that reflect
their *internal* knowledge of what should/should not be cached.

For example, the `hash-input-for-sandbox` function returns either
`nil` (if the field is not sandboxed for the current user) or
`{:sandbox-attributes {<the user attributes used for the sandbox>}}` (if
it is).

`hash-input-for-field-values` simply merges all of these together into
one lump.

To tell whether we're generating a `full` or `advanced` field value, we
can just check to see whether the hash input has any data other than the
field ID.

The one downside here is that we'll no longer be able to look at the DB
and distinguish between different types of FieldValues. As far as I can
tell, the code itself does not ever do this, so I think this is an
acceptable tradeoff.

* database routing for field vals

* move things around a bit

* fix tests

* Lint

* WIP: database routing

* fix test

* more tests, caching tests

* kondo

* stray #p

* Exclude mirror databases from search

* Exclude mirror databases from sync

* Do not create permissions for mirror databases

* fix more tests

* lint

* Add another e2e test for field values

* Don't grab database from query in h2 driver

* Fix my rebase error

* [DB Routing] Implement UI (#55132)

* save

* wip

* wip

* lots of progress

* iteration

* more progress, add delete mirror modal

* type clean up, bug fixes, code organization

* address lots of TODOs

* prevent configuring uploads to routed dbs, prevent db routing if db is upload destination db, replace all usages of routed database and mirror database in favor of destination database

* clean up url usage, add health check to destination database lists

* support hidden fields for database details

* fix types and TODOs

* render warning that model features can not be enabled when db routing is enabled, add unit tests for DestinationDatabasesList

* add e2e coverage for db routing CRUD

* move db routing e2e to a new file, make tests nicer, add test coverage for not showing destination databases outside of database settings

* test that db routing can not be enabled if other conflicting features are enabled

* finish e2e tests as much as possible, add feature token to session properties payload

* move more code into enterprise folder, add redirects and permissions checks for destination db routes, handle no user attributes on instance state, fix failing unit tests, make alerts tooltips when features cant be enabled based on other features being enabled

* test fixes, impl error states kyle provided

* split up tests by ee and oss

* error state updates, fix failing e2e tests

* fix failing oss e2e test, beef up db management perms test

* PR feedback

* impl more feedback

* Fix BE tests

* another be test

* pr feedback

* fix one of the failing e2e tests

* include_mirror_databases -> router_database_id

* skip test

---------

Co-authored-by: John Swanson <john.swanson@metabase.com>

* fix deletion of router dbs with dest dbs (#55831)

* Don't require superuser perms to get dest db (#55754)

* [DB Routing] Database pages tech debt - RTKQuery + TS migrations (#55744)

* convert DatabaseList to typescript

* make DatabaseEditApp use rtkquery, remove old initialize approach, remove related redux code, port code to use api db rather than metabase lib Database class

* remove dismissDatabaseSyncSpinner redux code in favor of rtkquery

* fix some mistakes causes tests to fail

* port DatabaseList to typescript

* port adding sample database to rtkquery

* misc fixes

* fix failing unit test

* convert admin/databases/database.js and admin/databases/selectors.js to TS

* editParamsForUserControlledScheduling.js to editParamsForUserControlledScheduling.ts

* remove all usages of metabase lib Database class from Database pages

* fix type errors

* fix failing e2e

* prettier

* [DB Routing] Port Admin DB page components to Mantine (#55811)

* port components to mantine for admin db pages

* fix failing tests

* remove unused comment

* fix type issue

* Require opt in/out of database routing (#55841)

I was considering possible errors here and I think this will work well
as a safety harness.

In dev/testing (non-prod) environments, let's add an assertion to the
JDBC driver that if we're about to connect to a database. Either:

- we're *explicitly* trying to only connect to Router Databases. For
example, sync should *never* connect to mirror databases or go through
Database Routing. OR

- we've enabled Database Routing, and we *don't* want to access the
Router Database (unless of course DB routing has been configured to send
us there)

Another way of putting this is that there are two obvious ways for this
feature to go sideways: we accidentally sync a mirror database or do
something else that shouldn't work for mirror databases, OR we
accidentally skip the Database Routing process and connect to the router
database when we shouldn't.

Of course, we can't guarantee that all drivers will call
`(database-routing/check-allowed-access!)` before connecting! But we can
just call it from the JDBC router and that should be sufficient to catch
any issues in development in the vast vast majority of cases.

* [DB Routing] UI feedback part 1 (#55893)

* make dest db validate on creation, invalidate cache of user attributes after user is updated

* add test coverage for updates and uncomment e2e tests parts that were previously failing

* fix type issue

* Fix audit/query logging for DB routing (#56103)

[ADM-585: Handle audit logging and query logging](https://linear.app/metabase/issue/ADM-585/handle-audit-logging-and-query-logging)

* exclude destination dbs from serialization (#56076)

* Decrease the pool size for mirror DBs (#56104)

DB metadata seems like an odd thing - it's the Metabase Database
converted to a snake-hating map, so `router_database_id` becomes
`router-database-id`.

We can't write a function of `:model/Database` that decides whether
we're looking at a mirror database (because we're not looking at a
`:model/Database` here). So we're reduced to just checking the key.
Feels weird, but I think the cleanest way available here?

* Fix sandbox on a routed DB with question as filter (#56393)

This only affected turning on sandboxing, and was not an error for
sandboxing itself.

When we configure sandboxing, we want to make sure the column types for
the query we're using match the columns in the sandboxed table.

As part of this, we ran the query anonymously with
`(request/with-current-user nil ...)`. With Database Routing, however,
we added a new constraint: you can't run any queries against a database
with routing configured anonymously.

Instead just run the query as a superuser. This is effectively the same,
and it's consistent with what we do when actually *enforcing* the row
level restrictions anyway: we preprocess the source query as an admin
and then splice it into the user's query.

The one thing that gives me pause: I'm not really sure why we would have
done `(request/with-current-user nil ...)` in the first place here.

* Add database-router usage e2e tests (#56255)

* Improve error messages and UI for config (#56392)

* Improve error messages and UI for config

- improve error messages when a dest db can't be found

- improve the admin UI for configuring DB routing: https://metaboat.slack.com/archives/C07L6VCCYQL/p1744044752380479

* changes suggested by Jeff

* fix error msg tests

* disable linting for DB Routing description

* fix getting a destination db

db `can-read/write?` use router DB if necessary, since destination
databases don't actually have permissions saved.

* i18n for errors

* spelling 😁

* fix tests

---------

Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
Co-authored-by: Ryan Laurie <iethree@gmail.com>

* Fix options for Destination DBs (#56450)

* Fix options for Destination DBs

This may still require a bit of frontend work.

* Set destination-database=true for destination db modal

---------

Co-authored-by: Fraser McIntosh <fraser@metabase.com>

* Fix impersonation with Database Routing (#56503)

* Fix impersonation with Database Routing

Database routing was not working with impersonation, because by the time
the driver calls `set-role-if-supported!` the router database (which is
configured for impersonation) has already been swapped out for the
mirror database (which is not).

To fix this, have a new impersonation middleware set a dynamic var,
`*impersonation-role*`, which is preferred by `set-role-if-supported!`
if set. This way, in queries, `set-role-if-supported!` will use the
pre-calculated role (which seems better than computing it twice anyway).

Co-authored-by: Ed Paget <ed@metabase.com>

* Add impersonation tests

* Add sandbox question test

---------

Co-authored-by: Ed Paget <ed@metabase.com>
Co-authored-by: Fraser McIntosh <fraser@metabase.com>

* keep metadata store on metadata provider swap (#56502)

* keep metadata store on metadata provider swap

Before, we would blow away the existing QP store entirely when using
`*DANGER-allow-replacing-metadata-provider* to swap out the existing
metadata provider.

Instead we can only initialize the QP store when it was truly
uninitialized, and replace *only* the metadata provider when we're
trying to do that.

This is just in case something in QP post-processing needs data from the
original store, e.g. something that was stored with
`qp.store/store-miscellaneous-value!`.

Co-authored-by: Ed Paget <ed@metabase.com>

* only allow replacing md provider once

---------

Co-authored-by: Ed Paget <ed@metabase.com>

---------

Co-authored-by: Ed Paget <ed@metabase.com>
Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
Co-authored-by: Fraser <fraser@metabase.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
Co-authored-by: Ryan Laurie <iethree@gmail.com>
2025-04-10 13:21:23 -07:00
Alexander Polyankin
9eb88c3478 Pass missing props in MultiAutocomplete (#56506) 2025-04-10 15:15:22 -04:00
Uladzimir Havenchyk
24b79c324c test: fix another flakiness (#56563) 2025-04-10 22:04:51 +03:00
Konstantin Darutkin
c3e6655d45 fix: controlled column reordering in datagrid (#56543) 2025-04-10 19:40:08 +01:00
Aleksandr Lesnenko
8f57a69882 fix incorrect series colors in static viz (#56415)
* fix static charts may have incorrect series colors

* use hex colors in static viz
2025-04-10 14:02:08 -04:00
Timofey Kachalov
067057efda Add CI job checking outdated Embedding SDK API documentation (#56452) 2025-04-10 21:54:31 +04:00
Nick Fitzpatrick
98c2872f2b Adm 505 collection and everywhere shortcuts (#56457)
* rest of global, and some collection shortcuts

* adjust collection item commands, e2e tests

* adjust e2e test

* remove bulk move
2025-04-10 16:32:56 +00:00
Timofey Kachalov
10b7df74e9 docs(sdk): Add generated documentation files for @metabase/embedding-sdk-react (#56367) 2025-04-10 20:18:59 +04:00
Edward Paget
b46ae17a3b feat: upgrade ring-jetty to 1.14.1 (#55921)
* feat: upgrade ring-jetty to 1.14.1

Moves us onto Jetty 12 which has some features (pthreading, QoSHanlder)
that we may want to take advantage of.

* fixup! customize jetty metrics

* fixup! license info for jetty ee9

* fixup! make a var private

* fixup! don't use deprecated method

* fixup! create custom statistics handler

Replicate the Jetty 11 statistics handler that is able to report on
asynchronously handled requests separately from synchronously handled
ones. Also ports it to directly report statistics to our prometheus
rather than needing to build a connector between the stats handler
object and our metrics reporting

Co-Authored-By: John Swanson <john.swanson@metabase.com>

* fixup! fix race condition in stats test

* fixup! missing private annotation

* fixup! use normal jetty release with logging fix

---------

Co-authored-by: John Swanson <john.swanson@metabase.com>
2025-04-10 16:16:23 +00:00
Timofey Kachalov
b373500c04 docs(sdk): Setup automatic documentation generation for @metabase/embedding-sdk package (#56366)
Co-authored-by: jeff bruemmer <jeff.bruemmer@gmail.com>
2025-04-10 20:06:06 +04:00
Uladzimir Havenchyk
31f31e59f0 ci: simulate slow network in stress test (#56464)
* ci: simulate slow network in stress test

* fixup
2025-04-10 19:04:08 +03:00
Nick Fitzpatrick
cf806ce408 Growing entity picker (#56462)
* resize observer entity picker

* adding e2e test

* e2e adjustments
2025-04-10 21:08:01 +05:30
Aleksandr Lesnenko
baab33ecca fix bars width on dst timezone data (#56466)
* fix bars width on dst timezone data

* specs
2025-04-10 11:06:17 -04:00
metamben
acea8921ab Support binning by column with a single numerical value (#56517)
Fixes #53521

--

Co-authored with lyulifeng (lyulifengg@gmail.com)
2025-04-10 14:43:02 +00:00
Timofey Kachalov
4d38da9476 Refactor Embedding SDK CI workflow and improve notify-pull-request action (#56545) 2025-04-10 18:24:38 +04:00
Gustavo Saiani
231d159585 Improve links (#56549) 2025-04-10 11:06:45 -03:00
Nicolò Pretto
59bd5a5905 call e2e-component-tests-embedding-sdk-cross-version from (#56454)
* call e2e-component-tests-embedding-sdk-cross-version from
embedding-sdk.yml

* add e2e-component-tests-embedding-sdk-cross-version to the tests-results
so it needs to pass (or be skipped)
2025-04-10 13:34:29 +00:00
John Swanson
6d647bccde Reset all errored triggers to WAITING on startup (#55769)
* Reset all errored triggers to `WAITING` on startup

Co-authored-by: Ed Paget <ed@metabase.com>

* Add explanatory comments

---------

Co-authored-by: Ed Paget <ed@metabase.com>
2025-04-10 05:44:56 -07:00
lbrdnk
c198bc44e7 Make category semantic type available for all types (#56505)
* Make Category semantic type available for all types

* Update test
2025-04-10 12:56:32 +02:00
lbrdnk
20e9cd8fc1 Fix percentile with expression argument on Clickhouse (#56488)
* Fix percentile honeysql generation on Clickhouse

* Fix lib/case arities

* Add test

* Whitespace
2025-04-10 09:05:32 +02:00
Riley Thompson
76241f7db7 Revert "Remove partner drivers (#56403)" (#56529)
This reverts commit 44274c63ad.
2025-04-10 01:51:38 +00:00
Aleksandr Lesnenko
722fc1a45f fix dashboard empty state for no query creation users (#56340)
* fix dashboard empty state for no query creation users

* fix unit specs
2025-04-09 22:03:35 +00:00
Edward Paget
d20183be8e fix: allow metabase jars to start on JVM 24 and up (#56518)
Metabase jars would crash when running on JVM 24 because the getReourse
method on the ClassLoader object was changed to return null if there is
no file at the provided path. This adds a ".keep-me" file to the
resources directory that Metabase can use to check if it is running in a
jar.
2025-04-09 21:17:50 +00:00
Riley Thompson
b626947efb Document athena permissions (#56525) 2025-04-09 21:11:35 +00:00
Nathan Voxland
c583ae13e6 Added include_metadata argument to search API (#56397) 2025-04-09 15:01:38 -05:00
Case Nelson
a8ecef4802 fix: resolve snowflake sync cost issue (#56337)
* fix: resolve snowflake sync cost issue

Using information_schema queries will cause snowflake to wake an
instance and thus incur costs. Using `show` queries will not do so.

In addition this adds a new multi-method for manipulating the results of
`describe-fields-sql`.

* Fix database-position and sorting

* Fix kondo

* Add order-by to mysql describe-fields

* Sort deps

* Use identity not map identity

* Fix databricks

* Address PR comments
2025-04-09 13:49:57 -06:00
Nick Fitzpatrick
c1062d680a remove duplicate function, translate dates (#56449) 2025-04-10 00:47:41 +05:30
Nathan Voxland
1762ab78d5 Created queue listener and updated search to use it (#55069) 2025-04-09 13:16:00 -05:00
Ryan Laurie
10890aee1f update CI config for automatic translation update (#56500) 2025-04-09 12:02:43 -06:00
Phoomparin Mano
87bbb5b9a1 Expose PDF and dashcard result download toggles in the embedding modal (#56211)
* scaffold separate download options for dashboard static embeds

* parse the display options to hash options

* add toggles to the embed preview

* workaround for duplicate types

* cleanup the dashboard workaround

* cleanup the dashcard workaround

* downloads parameter should not show up on OSS

* replace the download button tests

* update existing tests

* fix test for Download buttons

* remove unnecessary fallback

* add a new snowplow schema

* update unit tests

* fix snowplow test assertions

* add snowplow tests

* use results instead of dashcard for consistency

* make the JSON schema backwards-compatible

* split download settings into two components

* use downloadsEnabled.results instead

* snowplow type must be results, not dashcard

* revert StaticEmbedSetupPane changes as it is unused

* create a new field for snowplow tracking
2025-04-10 00:06:29 +07:00
Nick Fitzpatrick
cfb87dc8a1 Remove copy and move shortcuts from dashboards (#56493)
* Remove copy shortcut from dashboards

* Also remove mod+m shortcuts
2025-04-09 22:26:18 +05:30
Raphael Krut-Landau
9fc01e8dc6 (mini-PR) Remove irrelevant msgctxt from error diagnostic modal (#56484)
Like it says on the tin
2025-04-09 09:33:23 -04:00
Jeff Bruemmer
cc4202abde docs - data picker entities (#56448)
* entity types for data picker

* dropdown and sidebar

* separate page

* note on metrics

* notes

* edit

* table
2025-04-09 09:20:22 -04:00
Kamil Mielnik
c3ec3d1a90 Fix - Column sorting does not work well with predefined column orders (#56486)
* Fix loading state shown after change

* Repro #56482

* Repro #56482

* Revert 69a7c65c99

* Add extra assertion
2025-04-09 20:17:42 +07:00
Eric Normand
6658efa2f9 Allow lhs and rhs columns to be selected in existing join (#56446)
* Allow lhs and rhs columns to be selected in existing join

* Only mark selected if there is a current selection (tests)

Also simplify the test.
2025-04-09 08:05:00 -05:00
Kamil Mielnik
d703d1a3e7 SEM-113 Format the visualization of the task results (#56383)
* Add new buttons

* Move TaskModal to its own dir

* CopyButton

* Rename

* Download

* Fix setTimeout usage in CopyButton

* Style code

* Styling

* See logs link

* Improve styling

* Format code

* Improve comment

* Extract formatTaskDetails

* Rename

* Extract getFilename

* Improve comment

* Fix text selection

* Add unit tests boilerplate

* Add test

* Remove unit test

* Remove unused function

* Test downloading

* Test task details

* Comments

* Remove useMemo

* Simplify props

* Clean up timeouts
2025-04-09 17:53:28 +07:00
Kamil Mielnik
971252a066 Fix - In some circumstances the type dropdown is not visible in full on table metadata page (#56442)
* Fix #56428

* Repro #56442

* Make vertical padding same as horizontal
2025-04-09 08:25:45 +00:00
Ngoc Khuat
2390fca3af Fix flaky unsubscribe test (#56472) 2025-04-09 08:14:05 +00:00
Uladzimir Havenchyk
db87251a3a test: several fixes for flaky tests (#56441)
* test: wait for data to load in a flaky test

* fix two more tests

* fix one more test
2025-04-09 08:36:07 +03:00
appleby
64dcfe501e Enable expression literals on additional drivers (#56334)
* Enable expression literals on drivers that pass tests

Closes QUE-780

* Update .devcontainer/Dockerfile for java 21 and node 22

This Dockerfile is apparently used by the "metabase assembler", which in turn is used by
.github/workflows/presto-kerberos-integration-test.yml to run the Presto Kerberos tests.

* Add case-with-literal-expression-test

* Review feedback: remove extra whitespace

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>

---------

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-04-08 17:20:36 -07:00
metamben
23db3d6618 Preserve non-default effective type of column in field-ref metadata (#56453)
Fixes #55171
2025-04-09 01:58:21 +03:00
github-actions[bot]
785db78108 Update translations 2025-04-08 (#56418)
* Update translation sources 2025-04-08

* Update translations

---------

Co-authored-by: github-actions <github-actions@github.com>
2025-04-08 22:04:39 +00:00
metamben
11239d8d7b Support formatting postgres and oracle concatenation operator (#56331)
Fixes #55961
2025-04-08 23:32:18 +03:00
Riley Thompson
44274c63ad Remove partner drivers (#56403) 2025-04-08 16:31:57 -04:00
Alexander Polyankin
9c8720bc0a New MultiAutocomplete for inline editing (#56195) 2025-04-08 19:01:15 +00:00
Edward Paget
6fb0244736 feat: make cluster locking reusable (#56310)
* feat: make cluster locking reusable

Builds a more generic interface for cluster locking using our existing
retry mechanism and jdbc level timeouts that will work with any database
rather than just postgresql.

* fixup! handle alt error text on mysql/mariadb

* fixup! don't lock on h2

* fixup! move malli annotations to retry
2025-04-08 16:18:52 +00:00
Romeo Van Snick
95afcd14b1 Allow selecting multiple ranges and running those in native editor (#56420)
* Store all native editor selected ranges in redux

* Pass all selected ranges to redux

* Add repro for metabase#54799

* Fix unit tests

* Fix typo

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>

* Do not intersperse space in when running selected text

---------

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2025-04-08 16:59:34 +02:00
Ryan Laurie
1abbfdd637 Move toast handling into useAdminSetting Hook (#56406)
* move toast to useAdminSetting hook

* update tests

* circular import or something
2025-04-08 07:50:48 -06:00
Edward Paget
f6fbcab4d0 fix: mock time to middle of a utc day (#56296)
This test was flaking if it was run close to the boundary of a UTC day
where the models could be created one day and then the clock ticked over
to a new day before the query ran.
2025-04-08 13:49:00 +00:00
Edward Paget
b4bcdb65d3 feat: add basic schema for sso saml settings api (#56318) 2025-04-08 13:44:04 +00:00
Nathan Voxland
0ac5d0bf7f Don't update report_card.result_metadata if it has not changed (#56314)
* Don't update card metadata if it has not changed

* Store stored-metadata as a different field on info

* Fixed failing tests

* Update src/metabase/query_processor/middleware/results_metadata.clj

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>

* Addressed review comments

* Update src/metabase/query_processor/middleware/results_metadata.clj

Co-authored-by: Braden Shepherdson <braden@metabase.com>

* Addressed review comments

* Update src/metabase/query_processor/middleware/results_metadata.clj

Co-authored-by: Braden Shepherdson <braden@metabase.com>

* Addressed review comments

* fixup! exclude info map from legacy normalization

* fixup! test that metadata equality skips update

* fixup! make adding the info map conditional

* fixup! use qp.store instead of adding to info map

* fixup! remove #p

* fixup! remove cyclic dep

* fixup! move load and store fns to same ns

* fixup! test name

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: Braden Shepherdson <braden@metabase.com>
Co-authored-by: Edward Paget <ed.paget@gmail.com>
2025-04-08 08:27:48 -05:00
Braden Shepherdson
ba72e829bf [revisions] Include card_schema in revisions; default to 20 (#56394)
The new `:card_schema` field on `:model/Card` was wrongly excluded from Revisions.

This PR includes them, and adds a default value for old Revisions which predate `:card_schema`.
2025-04-08 13:08:09 +00:00
Sébastien
f4511c2b97 closes VIZ-613 caret on readonly input in FF (#56380) 2025-04-08 13:45:33 +02:00
github-automation-metabase
ed9e654155 Bump net.snowflake/snowflake-jdbc from 3.23.1 to 3.23.2 (#56363)
Inspect dependency changes here:

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-08 11:44:05 +03:00
github-automation-metabase
c92fe37769 Bump io.netty/netty-common from 4.1.118.Final to 4.2.0.Final (#56362)
Inspect dependency changes here:

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-08 11:38:36 +03:00
Filipe Silva
e1fd2d1cdd devex: add claude tooling (#56391) 2025-04-08 09:37:04 +01:00
Oleksandr Yakushev
89f7b64763 [metrics] Add hiccup and allocation rate metrics (#56345) 2025-04-08 11:17:52 +03:00
Nick Fitzpatrick
2621458071 Adm 504 shortcut viewer and dashboard shortcuts (#55945)
* most dashbaord actions, shortcut side drawer

* fix build error

* converting back to modal. start setting up shortcut grouping

* Shortcut Glossary

* most global actions

* modal polish, adding shortcut context

* shortcuts e2e tests

* remove commented code

* check for context in hook, PR feedback

* fix error

* linter 🙄
2025-04-08 00:53:41 -03:00
Uladzimir Havenchyk
cbcf698e30 test: wait for data to load in a flaky test (#56409) 2025-04-08 00:40:25 +03:00
Riley Thompson
d6b7f86354 Prevent Athena sync failing due to catalog (#56038) 2025-04-07 14:35:48 -04:00
Ryan Laurie
be9cffd831 Convert General Settings Page to use new components (#55064) 2025-04-07 12:22:49 -06:00
Case Nelson
ba40a8354e fix: snowflake can-connect with ssh without touching other drivers (#56325)
* fix: snowflake can-connect with ssh without touching other drivers

* Adjust host-and-port for can-connect without calling incorporate-ssh-tunnel-details
2025-04-07 12:15:26 -06:00
Aleksandr Lesnenko
ee794794ca change table cells vertical align to top instead of center for wrapping (#56256) 2025-04-07 13:52:27 -04:00
Nathan Voxland
c409a653c5 Don't need to be running "configure the scheduler" liquibase tasks during testing (#56176) 2025-04-07 12:45:34 -05:00
Case Nelson
830be48c20 fix: dont log db-details (#56386)
We were inadvertently logging db-details in the rarely used
`maybe-test-and-migrate-details`. This changes to more of a data
diff where we can still get important information on how it changed.
2025-04-07 11:41:11 -06:00
Aleksandr Lesnenko
2dba03a0d0 fix readability of map buttons (#56341) 2025-04-07 13:10:41 -04:00
Romeo Van Snick
10fff67c18 Split up expression resolver (#56350)
* Rename checkCompiledExpression to diagnoseExpression

* Add tests for arg count validation

* Add arg validator tests

* Add test for unsupported functions to diagnostics

* Add isCallExpression matcher

* Add visit helper

* Move unsupported function check to diagnostics

* Move arg validator to diagnostics

* Move arg count validation to diagnostics

* Remove EQUIVALENT_CLAUSES since we have them in config.js

* Remove database argument where no longer needed

* Add COMPARISON_OPERATORS to config

* Add LOGICAL_OPS to config

* Add NUMBER_OPERATORS to config

* Add FIELD_MARKERS to config

* Move comparison validator to diagnostics

* Simplify resolver

* Move checkers before Lib.diagnoseExpression

* Fix diagnoseExpression return type

* Move case or if operator argument check to diagnostics

* Remove unused tokenName

* Make expression types more specific

* Convert resolver to typescript

* Add test for multi-arg infix operators

* Add checker for unknown functions

* Add more tests for coalesce typing

* Add more tests for comparison operator resolving

* Add test for number operators

* Add test for logic operators

* Remove branches that are handled in the config already

* Allow mbql clause config to define the arg types

* Allow case/if to define argType too

* Move getNode and getToken to utils

* Make resolver fn required

* Validate field names in resolver

* Move trim into getMBQLName

* Fix top-level literals

* Handle expression refs

* Allow number operators to be multiple

* Add more tests for custom arg validators

* Test operator resolvers more

* Add more tests for multi arg functions with options

* Use better formatting in test

* Be more generic in getNode and getToken

* Use correct location for errors
2025-04-07 18:40:55 +02:00
Sébastien
c375e64c2d Closes VIZ-579: jarring layout change in object detail view (#56287)
* fixed console warning

* closes VIZ-579 object detail layout no longer jumps

* e2e
2025-04-07 18:26:28 +02:00
Ryan Laurie
0601021d0c use PAT for repository dispatch (#56335) 2025-04-07 10:07:11 -06:00
metamben
796a3c8290 Make mr/def assert that the docstring is a compile time string (#56381)
This is to make adding typos more difficult.
2025-04-07 15:52:27 +00:00
Vamsi Peri
2b577eb3f5 New entry for metabot team (#56384) 2025-04-07 14:46:26 +00:00
github-automation-metabase
1f197ad4cd Bump dev.weavejester/hashp from 0.3.0 to 0.4.0 (#56353)
Inspect dependency changes here: https://github.com/weavejester/hashp/compare/0.3.0...0.4.0

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-07 17:41:53 +03:00
Ryan Laurie
5d102ec856 Move Enterprise settings types to general types file (#56174)
* move Enterprise settings types to general types file

* not so fancy
2025-04-07 08:17:57 -06:00
Kamil Mielnik
a14ebf5f29 SEM-223 Show database type instead of MBQL type in UI (#56374)
* Show db type instead of semantic type

* Update unit tests

* Fix flaky test
2025-04-07 21:14:35 +07:00
Eric Normand
54b509bf2f Fix relative-time-view rendering (#56326) 2025-04-07 09:10:27 -05:00
Noah Moss
e2fbe3142f Retain formatting for links with no URL (#56327)
* Retain formatting for links with no URL

* Rework approach to fix tests
2025-04-07 13:34:33 +00:00
Nick Fitzpatrick
e3ba446fbd switch css rule for <FileInput /> component (#56349) 2025-04-07 10:14:50 -03:00
github-automation-metabase
83d3bc708d Bump cider/cider-nrepl from 0.53.2 to 0.54.0 (#56351)
Inspect dependency changes here: https://github.com/clojure-emacs/cider-nrepl/blob/v0.54.0/CHANGELOG.md

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
2025-04-07 15:28:28 +03:00
lbrdnk
56aaaa96d7 Invalidate card's cache on PUT (#56365)
* Invalidate card cache on put

* Add test
2025-04-07 14:16:29 +02:00
Kamil Mielnik
3196d30a33 Fix - Field order sidesheet loading state breaks metadata page layout (#56369)
* Revert "Revert "Prevent CLS""

This reverts commit 043ea8a9e7.

* Add loading and error handling

* Add tests

* Refactor

* Rename tests

* Add issue tags
2025-04-07 18:42:56 +07:00
Anton Kulyk
146c4dd8df Fix goal line doesn't appear on a normalized stacked bar chart (#56298)
* Normalize goal line value

* Add visual test
2025-04-07 11:41:40 +01:00
Kamil Mielnik
117785089c SEM-220 Show the data type above the Field Type dropdown (#56289)
* Make it work

* Use Mantine

* Update tests

* Display db type instead of mbql type

* Show db type instead of semantic type

* Revert "Show db type instead of semantic type"

This reverts commit 5a51c5abca.

* Update tests

* Prevent CLS

* Revert change

* Revert "Prevent CLS"

This reverts commit f74b6e80af.
2025-04-07 10:10:54 +00:00
Kamil Mielnik
216212b27a SEM-156 Extract column sorting into a separate control (#56060)
* SEM-156 Extract column sorting into a separate control (#55696)

* Add new 'Table settings' button
- remove unused CSS classes

* Add 'Edit column order' button

* Update sort_arrows icon

* Update header

* Update header

* Remove global CSS classes from MetadataHeader

* Prevent button from shrinking

* Styling

* Drop inline styles from MetadataHeader

* Add FieldOrderSidesheet & FieldOrderDropdown boilerplate

* Connect FieldOrderDropdown

* Make the sort_arrows icon math-perfect

* Sort attributes

* Lift state

* Use Select instead of Menu

* Rename FieldOrderDropdown to FieldOrderPicker

* Sort props

* Avoid using t in top level context

* Fix outline being cut off

* Add onUpdateFieldOrder prop

* Drop connect usage

* Add SortableField boilerplate

* Add inner components

* Handle disabled drag

* Remove copypasta

* Styling

* Icons

* Remove comment

* Fix dnd

* Remove redundant key prop

* useDragOverlay

* Prevent flicker

* Remove old sort button

* Keep sidesheet in sync when closed

* Drop SortableColumn

* Remove SortableList from MetadataTableColumnList

* Improve spacing

* Simplify SortableField interface

* Fix state issues

* Update unit tests

* Update unit tests

* Make focus state match border radius of the content

* Add comment

* Update e2e tests

* Remove comment

* Use useDisclosure

* Add a comment

* Reduce sorting complexity

* Rename

* Simplify logic
2025-04-07 14:47:30 +07:00
Noah Moss
f231f3b519 Disable indefinite vertical panning on leaflet maps, and enable smooth horizontal wrapping (#56329) 2025-04-04 23:34:34 -04:00
Tyler Plude
4126202645 Hide trend line widget when multiple series present (#54107)
* Hide trend line widget when multiple series present

* Adding unit test for trend line hidden state

* Prettier
2025-04-04 17:32:59 -07:00
Tyler Plude
d8705ab9b9 Fixing typo in embed type ui (#56116) 2025-04-04 16:25:36 -07:00
Aleksandr Lesnenko
88ce89e065 fix bar width on non-linear x-axis scales (#56265) 2025-04-04 22:05:04 +00:00
Oleksandr Yakushev
6e957d4ab7 perf: Optimize available-drivers-info (#55970) 2025-04-05 01:02:06 +03:00
bryan
c9d926e018 Do not enforce table cruftiness during updates (#56312)
* do not enforce table cruftiness during updates

- matches original behavior

* add test
2025-04-04 14:25:30 -06:00
Nemanja Glumac
d186e5d0e8 Empty states for visualizations (#55706)
This commit introduces empty states for visualizations 
in order to help less experienced users create their first chart. 

These new empty states come in two flavors:
1. With a "Summarize" button CTA that will open the summarize sidebar
2. With a link to our helpful documentation (for more complex charts)

We have been previously relying on the `placeholderSeries` dummy data to display a greyed out chart preview when we cannot render a chart. That functionality is now replaced with a new property called `hasEmptyState`.

`checkRenderable()` util will try to render a chart based on the series and settings. If it is unable to do so, it will throw a `ChartSettingsError`. This, in combination with hasEmptyState and a few other properties, is a cue to render a new, empty state for that visualization.
2025-04-04 21:34:37 +02:00
Case Nelson
304da4aba7 Revert "fix: properly test snowflake ssh connection details" (#56315)
This reverts commit 0fc5cbe7dc.
2025-04-04 13:14:06 -06:00
Luis Paolini
9e10b9c131 Add note about allowtcpforwarding (#56320) 2025-04-04 19:11:12 +00:00
Raphael Krut-Landau
a65865fce2 Test that sandboxing fails closed when misconfigured (#56110) 2025-04-04 15:04:58 -04:00
Aleksandr Lesnenko
3a93e08dbe skip loki flaky table test (#56305)
* skip loki flaky table test

* Update Loki Snapshots

---------

Co-authored-by: Metabase Automation <github-automation@metabase.com>
2025-04-04 18:27:41 +00:00
Riley Thompson
921e0a4ffc Replace - with _ in Mongo join aliases (#56185) 2025-04-04 18:18:09 +00:00
appleby
3c40ebd387 Expression literals milestone 2 (#56254)
* Initial BE changes for custom expression literals (#55206)

* Empty

* Add `value` support in the expression editor (#55203)

* Literals in filters tests (#55283)

* E2E tests for literals in custom columns (#55288)

* BE changes for :value wrapped expression literals

* Extend BE test with more literal values

* Add float value to qp test for expression literals

* Add Float and Boolean cases to literal-expression-test

* Remove ^:internal from value clause

:value clauses are now generated by the frontend when creating a top-level expression literal and preserved when
converting legacy <-> pMBQL.

* Add some lib.convert tests for literal custom expressions

* Add legacy schema tests for literal custom expressions

* Add normalize / canonicalize tests for literal custom expressions

* Remove vestigial "date" expression from fields clause in query-with-literal-custom-expression-test

* Fix literal-expression-test for cljs

CLJS parses 1.00 as 1 and hence :type/Integer not :type/Float

* Fix js_test expression-clause-<->-legacy-expression-test for wrapped literals

* Move QP tests into expressions_test.clj and add more tests

* Remove commented out :value and update comment in stage-expressions->legacy-MBQL

* Restrict QP literal expressison tests to supported drivers

* Update boolish->bool to accept BigDecimal inputs

Apparently some DBs return BigDecimal results for boolean expressions.

* Temporarily remove literal-expression-case-test

Needs more debugging

* Move aggregations tests into expression_aggregations_test.clj

* Add some basic filter tests to QP expressions_test.clj

* E2E tests for literal custom columns in other clauses and fixes (#55295)

* E2E tests for literal custom columns in other clauses and fixes (#55295)

* Move changes from the FE branch

* Move changes from the FE branch

* Move changes from the FE branch

* Fix filter schema and false = false filter (#55417)

* Fix date/string literals effective type (#55427)

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix date/string literals effective type

* Fix malformed order-by clauses

* Remove tests for offset expressions as non-aggregation expressions

These tests were initially added in #42302, but we disabled offset in custom columns in #43224.

Remove these tests so we can re-enabled nest-expressions when expressions appear in an order-by clause.

https://metaboat.slack.com/archives/C0645JP1W81/p1742317450874479

* Add order-by to the list of places to check in should-nest-expressions?

This is to support order-by of custom expressions, in particular literal custom expressions.

https://metaboat.slack.com/archives/C0645JP1W81/p1742317450874479

* Rename round-trip-expression-literal-test and move it next to existing literal tests in the same file

* Uncomment filter-literal-boolean-expression-with-no-operator-test

The schema was relaxed in bd82763beb, so now the test passes.

* Uncomment filter-literal-expression-with-and-or-test

* Add round-trip-filter-expression-test

* Add more cases to legacy schema filter-test

* Remove unused import

* Review feedback: set/difference -> disj

* Add :expression-literals driver feature (#55662)

* Add the :expression-literals database feature

And enabled it for postgres, mysql, bigquery, and snowflake.

These are the tier 1 and tier 2 DBs, minus redshift which is currently failing some tests.

* Add lib.metadata/database-supports? helper

* Check if :expression-literals feature is enabled in diagnose-expression

* Use standard-literal-expression-values in order-by test expectation

* Add comment about compiler warning to boolish->bool

* Add breakout-by-literal-expression-test

* Add expression-literals-test to nested-queries-test

* Add compound expressions involving literal custom columns to e2e filters tests

* Use lib.schema.common/is-clause? to detect :value expr in diagnose-expression

* Review feedback: fix order-by-integer-literal-expression-test

* Review feedback: conj -> vector

---------

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>

* Add explicit CAST when compiling string literal expressions in H2 driver (#55920)

* Add explicit CAST when compiling string literal expressions in H2 driver

Closes QUE-726

* Add e2e test for nested question with literal custom columns

* Add :expression-literals feature to various mock providers used in tests

* Update diagnose-expression tests

* Ensure legacy :value options are normalized in mbql.normalize

Values coming from the FE in expression-clause-for-legacy-expression call normalize and expect to have :value options
converted from strings to keywords.

* Add base_type to value literals in adjustTopLevelLiteral

* Consistent spelling of base_type

* Use lib.metadata/database-supports? to check for database :features (#56114)

* Use lib.metadata/database-supports? to check for database :features

Closes QUE-836

* Convert a couple more tests to use meta/updated-metadata-provider

* Add e2e test to ensure that sandboxing on literal custom column fails closed (#56190)

* Add e2e test to ensure that sandboxing on literal custom column fails closed

Closes QUE-844

* Review feedback: dedup CustomColumnType definition

---------

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2025-04-04 11:02:06 -07:00
bryan
260a02887e Mage jar download finds latest major version (#56309)
* scrape releases page to find latest major version

e.g.:

```
$./bin/mage jar-download 50
Warning: JARS not found in env.
Looking for latest version of 50 on release page 1
Downloading from: https://downloads.metabase.com/enterprise/v1.50.35/metabase.jar
              to: /Users/bcm/dv/mb/metabase/jars/metabase_1.50.35.jar ...
Downloaded 1.50.35.jar to /Users/bcm/dv/mb/metabase/jars
```

* better feedback
2025-04-04 12:00:43 -06:00
Sébastien
c03a20dae7 Closes VIZ-588 wrong hover index (#55910)
* closes VIZ-588 wrong hover index

* test

* type
2025-04-04 17:54:34 +02:00
github-actions[bot]
9a521649a3 Update translations 2025-04-01 (#56045)
* Update translation sources 2025-04-01

* Update translations

---------

Co-authored-by: github-actions <github-actions@github.com>
2025-04-04 15:21:36 +00:00
Kamil Mielnik
89153b5504 SEM-210 Show database and table of each segment in the segment admin list (#56151)
* Make segment name clickable

* Upadte e2e test

* Convert SegmentItem to TS

* Modernize SegmentItem

* Add cells

* Add TableBreadcrumbs component

* Use TableBreadcrumbs in SegmentEditor

* Use real data

* Improve data handling

* Handle ellispis

* Add tests

* Add test for no schema

* Rename

* Prettier

* Update icon color

* Fix icon shrinking

* Use TableBreadcrumbs in SegmentItem

* Fix icon shrinking

* Update max width

* Update tests

* Sort

* Remove css file
2025-04-04 14:51:06 +00:00
Eric Normand
c4749ad880 Implement text() and date() on bigquery (#56180) 2025-04-04 14:33:22 +00:00
Eric Normand
dcaeb12485 Implement text() and date() on mysql (#56177) 2025-04-04 14:31:31 +00:00
Eric Normand
c1ae2a738a text() and date() on snowflake (#56178) 2025-04-04 14:31:07 +00:00
Kamil Mielnik
eec2e8034a SEM-211 Show database name for the segment's table in the editing screen (#56213)
* Add TableBreadcrumbs component

* Use TableBreadcrumbs in SegmentEditor

* Use real data

* Improve data handling

* Handle ellispis

* Add tests

* Add test for no schema

* Rename

* Prettier

* Update icon color

* Fix icon shrinking

* Remove css file
2025-04-04 14:13:21 +00:00
Uladzimir Havenchyk
18f5b5282b test: scroll in the virtual table (#56269)
* test: scroll in the virtual table

* fix linting issues

* revert assert back
2025-04-04 14:02:03 +00:00
Jeff Bruemmer
e8ba2da551 drop leading equals operator (#56294) 2025-04-04 09:53:06 -04:00
Jeff Bruemmer
631bb25266 add metabase logo (#56292) 2025-04-04 13:40:44 +00:00
Mahatthana (Kelvin) Nomsawadi
8aa1b56dc6 Deploy SDK with Metabot (#56282) 2025-04-04 14:36:46 +01:00
Kamil Mielnik
d1ce4b64a2 Fix product screenshot link in README (#56268) 2025-04-04 19:48:35 +07:00
Uladzimir Havenchyk
29c361e150 test: wait for data in a flaky test (#56248)
* test: wait for data in a flaky test

* one more check

* set smaller viewport

* add wait

* add a helper
2025-04-04 19:45:16 +07:00
github-automation-metabase
a8463d2a47 Update Readme version references and published npm version to 0.55.1-nightly (#56277) 2025-04-04 12:28:45 +00:00
Mahatthana (Kelvin) Nomsawadi
a54b7ed035 Fix wrong default cell background color on SDK (#55669) 2025-04-04 12:24:56 +01:00
Phoomparin Mano
2725e33502 ci(sdk): set the nightly version in master to 55 (#56273) 2025-04-04 18:23:28 +07:00
Phoomparin Mano
8a8e0c6e5b Enable PDF and card result downloads individually in static and public embedding (#56131)
* scaffold setting up individual downloads

* use downloadsEnabled as boolean for result downloads

* allow SDK to use a single withDownloads props for compatibility

* sdk static dashboard should continue to support single withDownloads prop

* update downloads prop to be string compatible

* fix the areDownloadsEnabled matcher

* refactor download plugin matcher

* do not modify EmbedDisplayParams for now

* fix misleading types

* remove ConnectedDashboard default

* undo LookAndFeelSettings

* revert embed flow and analytics changes

* add test cases for public resource downloads

* add test cases for public question download

* do not support PDF downloads on questions

* remove redundant showDashboardCardActions

* create types for download results

* rename cardResult to dashcard

* replace cardResult with dashcard

* add downloadsEnabled to storybook

* update unit test for areDownloadsEnabled

* update unit test for no-token case

* update unit test for oss case

* try to disable downloads in storybook

* update story defaults

* make downloadsEnabled a component default

* add default to downloadsEnabled in PublicOrEmbeddedDashboardView for loki

* revert changes as loki diffs seems good now

* fix loki diff issue in stories
2025-04-04 17:24:21 +07:00
Aleksandr Lesnenko
1d819fac28 skip tooltip loki specs (#56250) 2025-04-03 23:10:40 +00:00
Oreon Lothamer
4b6ed446b2 add additional fields to payload for create-release-issues (#55956) 2025-04-03 09:44:31 -10:00
Eric Normand
ce99b5c4f5 Integration branch for generalizing cast tests (#55952)
* Empty

* Date generalized tests (#55953)

* Centralize and generalize tests for `integer()`

Also make room for other casting functions to be similarly tested

* Remove unsued imports

* Move postgres date cast test into cast_test.clj

* Rename :cast to :expressions/date

* Remove old imports

* Remove unused features

* Remove more!

* Fix test files

* Centralize and generalize tests for `integer()` (#55950)

* Centralize and generalize tests for `integer()`

Also make room for other casting functions to be similarly tested

* Remove unsued imports

* Example tests for integer()

* Remove empty line

* Use field type

* Appease the Kondo

* Check for Number instead of Integer

* Cast to big-integer before comparing (for snowflake)

* Remove split-part-test. It doesn't belong in this branch.

* Rename :cast to :expressions/integer

* Fix parens after merge

* Unified text() tests

* Appease the kondo

* Appease the whitespace demons

* Oops, wasn't filtering for drivers

* Use literal string for redshift
2025-04-03 13:16:15 -05:00
Nathan Voxland
0eff2ec6de Support for individual google sheets (#54938)
Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2025-04-03 12:52:58 -05:00
Jeff Bruemmer
832be65250 docs - various changes (#56230)
* path

* add firebolt driver

* remove api description
2025-04-03 17:50:41 +00:00
Phoomparin Mano
c5d31e8ba2 fix(sdk): fix dataset endpoint being called on every re-render (#56100)
* fix missing useMemo in ad-hoc question

* add a test case for EMB-288

* fix test case for interactive dashboard
2025-04-03 23:43:36 +07:00
Uladzimir Havenchyk
5546d00759 test: use dynamic data for referencing columns and tables instead of static (#56139) 2025-04-03 14:31:51 +00:00
Raphael Krut-Landau
d02f98c519 (mini-PR) Localize string in sidesheet (#56221)
Let's localize the string "Learn more" in the question info sidesheet
2025-04-03 10:26:07 -04:00
Edward Paget
23ffd1ce0a fix: make saml issuer identity required in FE (#56154) 2025-04-03 09:08:46 -05:00
Timofey Kachalov
1bb78814cf feat(sdk): Use dts rollup to generate a single .d.ts file with types (#56205) 2025-04-03 17:47:56 +04:00
Kamil Mielnik
103a64f3ad Fix - When DB is stuck in a Sync Loop, DB List in Native Editor Blinks Constantly (#55995)
* Add a repro for #55951

* Fix typos

* Refactor repro

* Fix #55951

* Remove unused components

* Use 'loading'

* Format code

* Fix test setup

* Rename isLoading back to isSearchLoading since it indicates Search.loadList usage

* Use 1 /search API call instead of 2

* Get rid of rawData

* Update unit tests
2025-04-03 20:27:21 +07:00
dpsutton
45c30a4676 Changelog for api/card/:card-id/query/export-format (#56189)
Examples in 52:
-----

```
52:

WORKS (form data)
curl 'http://localhost:3002/api/card/119/query/csv' \
  -H "x-api-key: $KEY_52" \
  -H 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8' \
  --data-raw 'parameters=%5B%7B%22id%22%3A%227c1e5d79-453a-490e-a507-ffba548aa071%22%2C%22type%22%3A%22id%22%2C%22value%22%3A%5B%225%22%5D%2C%22target%22%3A%5B%22dimension%22%2C%5B%22template-tag%22%2C%22param%22%5D%5D%7D%5D&format_rows=true&pivot_results=false'

WORKS (query param)
curl 'http://localhost:3002/api/card/119/query/csv?parameters=%5B%7B%22id%22%3A%227c1e5d79-453a-490e-a507-ffba548aa071%22%2C%22type%22%3A%22id%22%2C%22value%22%3A%5B%225%22%5D%2C%22target%22%3A%5B%22dimension%22%2C%5B%22template-tag%22%2C%22param%22%5D%5D%7D%5D&format_rows=true&pivot_results=false' \
  -X POST \
  -H "x-api-key: $KEY_52"

DOES NOT WORK (json body)
curl 'http://localhost:3002/api/card/119/query/csv' \
  -H "x-api-key: $KEY_52" \
  -H 'Content-Type: application/json' \
  --data-raw '{"parameters": [{"id":"7c1e5d79-453a-490e-a507-ffba548aa071","type":"id","value":["5"],"target":["dimension",["template-tag","param"]]}], "format_rows": true}'
```

Examples for 53:
---------
```
53:
WORKS
curl 'http://localhost:3003/api/card/113/query/csv' \
  -H 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8' \
  -H "x-api-key: $KEY_53" \
  --data-raw 'parameters=%5B%7B%22id%22%3A%229971a99a-32cb-4b6c-8339-584884e3b3e2%22%2C%22type%22%3A%22id%22%2C%22value%22%3A%5B%225%22%5D%2C%22target%22%3A%5B%22dimension%22%2C%5B%22template-tag%22%2C%22param%22%5D%5D%7D%5D&format_rows=true&pivot_results=false'

WORKS:
curl 'http://localhost:3003/api/card/113/query/csv' \
  -H "x-api-key: $KEY_53" \
  -H 'Content-Type: application/json' \
  --data-raw '{"parameters": [{"id":"9971a99a-32cb-4b6c-8339-584884e3b3e2","type":"id","value":["5"],"target":["dimension",["template-tag","param"]]}], "format_rows": true}'

DOES NOT WORK
curl 'http://localhost:3003/api/card/113/query/csv?parameters=%5B%7B%22id%22%3A%229971a99a-32cb-4b6c-8339-584884e3b3e2%22%2C%22type%22%3A%22id%22%2C%22value%22%3A%5B%225%22%5D%2C%22target%22%3A%5B%22dimension%22%2C%5B%22template-tag%22%2C%22param%22%5D%5D%7D%5D&format_rows=true&pivot_results=false' \
  -X POST \
  -H "x-api-key: $KEY_53"
```
2025-04-03 08:25:21 -05:00
Oisin Coveney
6d7ae96779 fix(sdk): Add questionProps to dashboard components (#55993) 2025-04-03 16:23:31 +03:00
Romeo Van Snick
4187e57c4a Multi line help text (#56155)
* Allow detecting enclosing function in multiline expressions

* Add repro for metabase#56152
2025-04-03 15:07:10 +02:00
Alex Yarosh
8bd3844525 update api and anv var docs (#56198) 2025-04-03 08:48:49 -04:00
Kamil Mielnik
bff123bb45 SEM-212 Allow clicking on the Segment's name to navigate to its edit screen (#56146)
* Make segment name clickable

* Upadte e2e test
2025-04-03 15:18:11 +07:00
Chris Truter
b63e596d37 Revert search engine default to in-place (#56199) 2025-04-03 06:08:59 +00:00
Edward Paget
2600de0663 fix: deadlock in last used at (#56173)
* fix: deadlock in last used at

This prevents bulk updates to last used at from deadlocking by creating
a new table in metabase's database that can be used by instances to take
cluster wide locks. It adds an initial implementation of a customizeable
db-based locking mechanism.

For the last_used_at update, a metabase instance will first set a
session variable to control locking timesout then take a cluster lock
using SELECT * FROM metabase_cluster_lock WHERE lock_name = 'name' then
execute the update_at.

If another table is holding this lock metabase will wait .5s for the
lock to be released then timeout its SQL transaction, sleep the Thread
for 1s then retry taking the lock. This makes sure we're not holding DB
connections waiting for locks.

* fixup! kondo

* Update resources/migrations/001_update_migrations.yaml

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>

* Update src/metabase/query_processor/middleware/update_used_cards.clj

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>

* fixup! finish method rename

---------

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2025-04-02 20:47:20 -05:00
Riley Thompson
5f7b7cb812 Fix MySQL JSON decimals (#56102) 2025-04-03 00:17:04 +00:00
Tyler Plude
e04d00c264 Fix formatter support for field id or name col settings (#55067)
* Fix formatter support for when both field ids and col names are used in viz settings

* Apply fix in qp common as well, which date formatter consumes

* Addressing PR feedback and breaking up large test

* Fixing or->merge reversion; adding datetime formatter tests

* Improving viz setting merges based on types of field_ref and column setting keys

* Addressing PR feedback
2025-04-02 14:48:52 -07:00
Jeff Bruemmer
d2bcabb33c docs - remove partner drivers (#56184) 2025-04-02 21:35:17 +00:00
Eric Normand
e1c7441569 Unified tests for splitPart() (#55941)
* Unified tests for `splitPart()`

* Remove postgres specific split-part-test

* Remove Redshift split-part-test

* Remove snowflake split-part-test

* Remove mysql split-part-test

* Remove bigquery-specific split-part test

* Fix MySQL implementation of splitPart()

* Only allow string literals for 2nd and 3rd args of replace()

* Only allow non-empty string for delimiter of splitPart()

* Better non-blank string

* Make position in splitPart() positive literal or numeric expression

* WIP new examples tests + corner cases

* Oops, go back to non-empty string

* Improve tests

* Improve test message

* Empty string on non-positive position in splitPart() for mysql and postgre

* Fix Redshift error

* Snowflake: return empty string with non-positive position

* Also test zero position

* Correct misplaced paren

* Fix `splitPart()` for snowflake

* Nicer comment on weird mysql implementation

* Rename positive-integer schema

* Clearer parameter comments
2025-04-02 21:01:55 +00:00
eliotmetabase
8ff8ed3494 Change decimal field for Number question to only accept positive integers and update E2E test to cover edge cases (#56112) 2025-04-02 13:03:47 -07:00
Oleksandr Yakushev
f0ba0e628a perf: Optimize settings retrieval (#55969) 2025-04-02 22:52:57 +03:00
bryan
8d5baa6a73 dont skip mage tests when BE job is skipped (#56170)
* dont skip mage tests when BE job is skipped

* checkout metabase for mage tests

* make mage tests its own thing

* add mage test workflow

* if it aint broke dont fix it

* remove dupe mage test from backend workflow
2025-04-02 19:50:37 +00:00
Jeff Bruemmer
dbefc5643a docs - table viz updates (#56162)
* paginate table on dashcards
2025-04-02 15:03:08 -04:00
Eric Normand
d1a4eb463e Rename :cast in tier 2 databases (#56158)
* Empty

* Rename :cast in tier 2 databases
2025-04-02 13:23:36 -05:00
Case Nelson
273ecb3b63 fix: attempt #2 to skip adding non-existent partner jars (#56171) 2025-04-02 11:49:45 -06:00
Edward Paget
bc2c0b2fa7 fix: correct setting name check for static stats (#56145)
* fix: correct setting name check for static stats

also fix namespace for the defenterprise in token check to load the
embedding stats module

* fixup! use get-raw-value

* fixup! use-get-value-of-type
2025-04-02 17:37:54 +00:00
Case Nelson
3f6b4e3938 fix: ee-build should skip adding jars when there are none (#56166) 2025-04-02 11:18:44 -06:00
Eric Normand
e2ae5b91a8 Split :cast into three features (#56153)
* Split :cast into three features

* Update frontend feature names

* Update changelog

* PoC

---------

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2025-04-02 17:01:19 +00:00
Jeff Bruemmer
073300b47e docs - mention config file on api keys page (#56150) 2025-04-02 12:45:37 -04:00
Riley Thompson
74b62202b9 Make mongo between condition inclusive (#56087) 2025-04-02 12:13:44 -04:00
Noah Moss
f07d1810ea Remove opacity from viz settings gear icon (#56143)
* remove opacity from view button icon

* remove reference to ViewButtonIcon CSS module
2025-04-02 11:28:01 -04:00
Braden Shepherdson
9cd41f0b6f Fix chain filters on public dashboards (#56096)
Fixes [QUE-838](https://linear.app/metabase/issue/QUE-838/linked-filters-are-not-working-on-public-dashboards).

Query params were getting parsed incorrectly to a map like `{:17fdc812 ...}`
with a keyword rather than a string. These failed to match any of the
dashboard's parameters (which are keyed by strings like `"17fdc812"`)
and returned no values (but did not throw any errors in prod).
2025-04-02 13:12:00 +00:00
Kamil Mielnik
acacf330ec Fix - Visibility explanation copy is the same across all 3 options (#56081)
* Fix #56077

* Repro #56077
2025-04-02 19:06:10 +07:00
Mahatthana (Kelvin) Nomsawadi
a9a62e5b82 Fix storybook not working with MetabotQuestion (#56127) 2025-04-02 12:47:43 +01:00
Alexander Solovyov
1020b3dcee fix testing and CDPATH issues with mage (#56125)
also make script code a bit simpler with early breaks
2025-04-02 13:40:45 +03:00
Ngoc Khuat
339b7d1dd4 Flaky test fix: unsubscribe-receive-email-test (#56123) 2025-04-02 09:26:37 +00:00
lbrdnk
e0e833aa52 Add String->Float coercion strategy (#55863)
* Implement string to decimal coercion

* Use float coercion

* Add coercion to mongo

* Use float8

* Update dataset def

* Update coercion to float

* Temp dynamic-dataset-loading

* Comment

* Use ->float multimethod

* Rename dataset

* Enable test for dbs with preloaded datasets
2025-04-02 11:13:32 +02:00
Ngoc Khuat
0dc44b4551 Add job context for all quartz jobs (#55889) 2025-04-02 03:44:47 +00:00
Ryan Laurie
8ef81c9a91 revert #56007 (#56111) 2025-04-01 16:11:44 -06:00
Uladzimir Havenchyk
641e170996 test: add native query test to flaky group (#56093) 2025-04-01 21:01:08 +00:00
John Swanson
3f78551385 Add ./bin/mage start-maildev command (#56074)
* Add `./bin/mage start-maildev` command

```
$ ./bin/mage start-maildev
Killing existing `mb-maildev` container...
Running: docker run -d -p 1080:1080 -p 1025:1025 --name mb-maildev maildev/maildev
8b01ba798a18192d02d1fdc3e7874fd03586f91063069db017d44baf30a38c47
Configure Metabase to send emails using localhost:1025
View Maildev UI at http://localhost:1080
```

* Update bb.edn

Co-authored-by: bryan <bryan.maass@gmail.com>

---------

Co-authored-by: bryan <bryan.maass@gmail.com>
2025-04-01 13:12:03 -07:00
Case Nelson
e5ed289651 task: update ee-extra to understand noop from registry (#55934) 2025-04-01 13:59:28 -06:00
Luiz Arakaki
ff42a7c926 Update usage analytics to 54 (#55908)
Closes #55568
Resolve field entity-ids
Adds is_verified to the content model
Adds status to the tasks model
Minor changes to the content
2025-04-01 15:00:38 -03:00
Jeff Bruemmer
94abd0f302 docs - note on caching and permissions (#56034)
* note on caching and permissions

* differentiate caching

* clarify caching

* remove impersonation note
2025-04-01 13:54:14 -04:00
William
a4ee7f4eb7 Bigquery handles nested fields in nested queries appropriately (#56033)
Before, when you had an outer query referring to something in a nested field from the inner query, the query processor
would assume the field is still nested and generate invalid sql.  Now, it will just refer to the alias.
2025-04-01 12:06:54 -05:00
Aleksandr Lesnenko
2aa82343e2 fix scatter charts freeze (#56016) 2025-04-01 11:48:16 -04:00
Nicolò Pretto
ebc59ff5fd ci: run sample app tests and sdk cross version tests on draft prs (#56008) 2025-04-01 15:43:05 +00:00
Uladzimir Havenchyk
90f1364fe2 test: add a fix for flaky test but move to jail anyway (#56071) 2025-04-01 15:29:58 +00:00
Arkadi Yaroslavtsev
bb58f77a79 Add cloud-ops as codeowners of prometheus.clj (#56073)
So that cloud-ops can verify new metrics are sound and usable for cloud o11y. 

See https://www.notion.so/metabase/Implementing-a-Prometheus-metric-for-your-feature-14569354c901804b97a3dfcf2fecfc22?pvs=4#15169354c90180a7a4daf6b43820cdd8
2025-04-01 10:12:43 -04:00
Stas Gavrylov
0f094446f1 WRK-213: Adjust available intervals for 'by the minute' schedule option (#56068) 2025-04-01 16:21:53 +03:00
Ngoc Khuat
a582ad33c4 [Notification] Improve memory usage for alerts (#55896) 2025-04-01 11:29:17 +00:00
Uladzimir Havenchyk
83ebdb8afd test: move flaky test to jail (#56039) 2025-04-01 14:13:20 +03:00
lbrdnk
0eec5c335f Fix coercion for model (#55870)
* Fix coercion for model

* Add test

* Update test
2025-04-01 11:03:25 +02:00
Kamil Mielnik
f541df16f8 Global scrollIntoView & scrollBy mocks (#55983)
* Remove redundant mocks

* Use jest.fn

* Remove scrollIntoViewMock from setup

* Remove mockScrollIntoView

* Remove mockScrollTo and mockScrollBy

* Introduce getScrollIntoViewMock

* Remove remaining scrollIntoView mocks
2025-04-01 08:57:18 +00:00
Sébastien
08a13afd28 Closes VIZ-289 duplicated cards never ending loading state (#55256)
* closes VIZ-289 duplicated cards never ending loading state

* added test
2025-04-01 10:37:44 +02:00
Oisin Coveney
49cec30f3f Fix console.warn message (#56004) 2025-04-01 11:36:27 +03:00
Romeo Van Snick
f6cecc0960 Fix overflow in expression editor suggestions (#55986)
* Fix overflow in custom expression suggestions

* Add repro for #55984

* Use isScrollableHorizontally helper

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>

* Use isScrollableHorizontally helper

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>

* Don't allow icon to shrink

* Allow suggestion names to break

---------

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2025-04-01 08:17:25 +00:00
Nemanja Glumac
d9779da94a Respect whitelabeling when showing the instructional video (#55987) 2025-04-01 10:26:49 +03:00
Oisin Coveney
f2b5cf8fcb QueryDownloadPopover -> QuestionDownloadWidget + QueryDownloadWidget -> QuestionDownloadPopover (#55894) 2025-04-01 10:01:28 +03:00
Romeo Van Snick
1e48077705 Merge expression tokenizer and lexer (#55916)
* Move the lexifier to it's own file

* Remove duplicate type union member

* Remove unused typeinferencer

* Add ParseError type to errors

* Lexify straight in to pratt.Token

* Remove unused TOKEN type

* Use pratt.Token type everywhere

* Fix type

* Remove unused __support__/expressions helper file

* Ignore END_OF_INPUT when matching suggestions
2025-04-01 08:33:53 +02:00
Tyler Plude
00527b55c0 Add display-as image support for table static viz (#55388)
* Add display-as image support for table static viz

* Adding table unit test for view-as image setting
2025-03-31 16:42:07 -07:00
Ryan Laurie
f62755dc9b Add Important Info to Pull Requests (#56007) 2025-03-31 16:34:02 -06:00
Uladzimir Havenchyk
1a990b898b test: fix flake caused by popover appearance order (#55989)
* test: fix flake caused by popover appearance order

* put back flaky tag
2025-04-01 00:23:13 +03:00
Uladzimir Havenchyk
0bebb404eb test: fix flake caused by data not loaded on slow network (#55998) 2025-04-01 00:22:30 +03:00
Braden Shepherdson
eef8dd149b [refs] Fixing Audit DB init and audit content export to handle idents (#56032)
Fixes #55929. (Requires a new export for 54 that also gets backported.)

Adds a new setting `install-analytics-database` that skips loading the
database at all, if set to false. That allows the dev instance that
exports the analytics content to have no real audit DB, and therefore to
generate the right `entity_id` hashes for the audit export!

Existing audit DBs are fine; the checksum will see these new entity_ids
in the export and overwrite any existing content.
2025-03-31 21:17:55 +00:00
Alexander Polyankin
b86d92d156 E2E repro for "Custom Expression having a date function between 2 aggregation functions returning dates doesn't work" (#55930) 2025-03-31 19:04:01 +00:00
Alexander Polyankin
a1b5478734 Show a more user-friendly error message when there are incompatible types (#55927) 2025-03-31 18:56:53 +00:00
Eric Normand
edd33406f7 Implement splitPart() for BigQuery (#55918)
* Implement splitPart() for BigQuery

* Always return string instead of null

* Better test failure message

It's running fine on my machine ;)

* Use coalesce instead
2025-03-31 12:46:31 -05:00
Alexander Polyankin
eb303b3596 Fix compilation of case with clauses that need pre-processing (#55958) 2025-03-31 13:40:31 -04:00
Nathan Voxland
13f81f354f Limit tsvector inserts to 1048575 bytes (#55954) 2025-03-31 12:36:19 -05:00
Case Nelson
8135a2f41f fix: Ensure that local timestamps params work (#55931)
* fix: Ensure that local timestamps params work

Fixes #53371

By filtering a timestamp or date column on an OffsetDateTime it results
in an index being missed since the lhs needs to be upcast by the db engine
to a `timestamp with timezone`.

This ensures we only pass OffsetDateTime to `timestamp with timezone`
columns.

Context about decision here:
https://metaboat.slack.com/archives/C0645JP1W81/p1743111964032089

* Handle sending a datetime range rather than just a date

* Feature gate to dynamic dataset loading

* Fix kondo

* Remove comment
2025-03-31 11:35:15 -06:00
Eric Normand
8737a30d70 splitPart() test for Redshift (#55938) 2025-03-31 11:43:14 -05:00
Eric Normand
004ba66176 splitPart() on Snowflake (#55935) 2025-03-31 11:41:12 -05:00
Eric Normand
9fed60a967 splitPart() for MySQL and MariaDB (#55914)
* Remove commented code from postgres test

* Add splitPart() to MySQL
2025-03-31 11:37:39 -05:00
Alex Yarosh
37b8a235ca docs: can't permanently delete collections (#56014)
* Update delete-and-restore.md

* format

* Update delete-and-restore.md

---------

Co-authored-by: jeff bruemmer <jeff.bruemmer@gmail.com>
2025-03-31 12:15:51 -04:00
Jeff Bruemmer
f4eeb43daf scan section in sparksql (#56015) 2025-03-31 15:51:29 +00:00
Romeo Van Snick
c38c533c72 Case-sensitivity arg name vs example disambiguation (#55965)
* Rename caseInsensitive to caseSensitivity

* Use literal string for case-insensitive template

* Update argument description to be more clear

* Support inline expression highlights

* Render help text description with Markdown

* Add more markdown to help text strings

* Use markdown code blocks to mark code in help text descriptions

* Highlight argument references in help text descriptions

* Fix arg alignment

* Fix HelpText unit tests

* Fix FunctionBrowser tests

* Render FunctionBrowser descriptions using Markdown too

* Mark true

* Fix e2e tests

* Fix e2e tests

* Remove commented-out code

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>

---------

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2025-03-31 17:18:02 +02:00
Riley Thompson
1d70e07d79 Fix Snowflake casted date field relative time filters (#55225) 2025-03-31 11:09:01 -04:00
Jeff Bruemmer
a2f38e43de formatting (#56009) 2025-03-31 14:38:44 +00:00
Edward Paget
ba9c2face3 fix: typo in token check stats name (#55999) 2025-03-31 14:13:41 +00:00
Jeff Bruemmer
4da41fc578 docs - add ClickHouse and Starburst to list of supported databases (#56001) 2025-03-31 10:00:44 -04:00
Riley Thompson
e7dda8b9ff Mark Mongo binData as a text like type during sync (#55792) 2025-03-31 09:40:00 -04:00
Aleksandr Lesnenko
babdb67fb5 Fix table row heights with rich content (#55960)
* allow wrapping links

* fix image rendering, add specs

* update wrapping setting validation and visibility
2025-03-31 09:05:22 -04:00
Oisin Coveney
63dadf79d5 docs(sdk): Add docs for dashboard types (#55988)
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-03-31 11:36:52 +00:00
2599 changed files with 262071 additions and 190211 deletions

View File

@@ -11,6 +11,7 @@
:def-fn {:level :warning}
:dynamic-var-not-earmuffed {:level :warning}
:equals-expected-position {:level :warning, :only-in-test-assertion true}
:equals-true {:level :warning}
:keyword-binding {:level :warning}
:main-without-gen-class {:level :warning}
:minus-one {:level :warning}
@@ -42,7 +43,6 @@
#_:docstring-leading-trailing-whitespace
#_:equals-false
#_:equals-true
#_:used-underscored-binding
;;
@@ -275,6 +275,7 @@
compojure.core/context {:message "Use metabase.api.util.handlers/route-map-handler instead of compojure.core/context, it is much faster and supports OpenAPI spec generation"}
compojure.core/defroutes {:message "Use metabase.api.util.handlers/defroutes instead of compojure.core/routes, it supports OpenAPI spec generation."}
compojure.core/routes {:message "Use metabase.api.util.handlers/routes instead of compojure.core/routes, it supports OpenAPI spec generation."}
clojurewerkz.quartzite.jobs/defjob {:message "Use metabase.task/defjob instead of clojurewerkz.quartzite.jobs/defjob"}
fipp.edn/pprint {:message "Use metabase.util.log instead of fipp.edn/pprint"}
honeysql.core/call {:message "Use hx/call instead because it is Honey SQL 2 friendly"}
honeysql.core/raw {:message "Use hx/raw instead because it is Honey SQL 2 friendly"}
@@ -300,7 +301,7 @@
honeysql.types {:message "Use Honey SQL 2. Honey SQL 1 is removed as a dependency in Metabase 49+."}
honeysql.util {:message "Use Honey SQL 2. Honey SQL 1 is removed as a dependency in Metabase 49+."}}
:discouraged-tag {p {:message "You can use it, but don't commit it." }}
:discouraged-tag {p {:message "You can use it, but don't commit it."}}
:unresolved-var
{:exclude
@@ -346,6 +347,7 @@
metabase-enterprise.audit-app.pages.common common
metabase-enterprise.sandbox.api.table table
metabase-enterprise.sandbox.api.util sandbox.api.util
metabase-enterprise.database-routing.core database-routing
metabase-enterprise.test met
metabase.analytics.sdk sdk
metabase.analytics.stats stats
@@ -415,13 +417,11 @@
metabase.model-persistence.core model-persistence
metabase.models.dependency dependency
metabase.models.interface mi
metabase.models.setting setting
metabase.notification.core notification
metabase.notification.payload.core notification.payload
metabase.notification.test-util notification.tu
metabase.permissions.core perms
metabase.plugins.initialize plugins.init
metabase.public-settings public-settings
metabase.public-sharing.core public-sharing
metabase.premium-features.core premium-features
metabase.pulse.core pulse
@@ -464,6 +464,7 @@
metabase.server.core server
metabase.server.protocols server.protocols
metabase.sso.core sso
metabase.settings.core setting
metabase.sync.analyze.fingerprint sync.fingerprint
metabase.sync.field-values sync.field-values
metabase.sync.interface i
@@ -548,14 +549,10 @@
metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info clojure.core/fn
metabase.models.collection-test/with-collection-in-location clojure.core/let
metabase.models.json-migration/def-json-migration clj-kondo.lint-as/def-catch-all
metabase.models.setting/defsetting clj-kondo.lint-as/def-catch-all
metabase.models.setting.multi-setting/define-multi-setting clojure.core/def
metabase.models.util.spec-update/define-spec clojure.core/def
metabase.notification.test-util/with-temp-notification clojure.core/let
metabase.notification.test-util/with-card-notification clojure.core/let
metabase.notification.test-util/with-system-event-notification! clojure.core/let
metabase.public-settings.premium-features/defenterprise-schema clj-kondo.lint-as/def-catch-all
metabase.public-settings.premium-features/define-premium-feature clojure.core/def
metabase.premium-features.core/defenterprise-schema clj-kondo.lint-as/def-catch-all
metabase.premium-features.core/define-premium-feature clojure.core/def
metabase.premium-features.defenterprise/defenterprise-schema clj-kondo.lint-as/def-catch-all
@@ -567,9 +564,14 @@
metabase.query-processor.middleware.process-userland-query-test/with-query-execution! clojure.core/let
metabase.query-processor.setup/with-qp-setup clojure.core/let
metabase.search.api-test/do-test-users clojure.core/let
metabase.settings.core/defsetting clj-kondo.lint-as/def-catch-all
metabase.settings.core/define-multi-setting clojure.core/def
metabase.settings.models.setting/defsetting clj-kondo.lint-as/def-catch-all
metabase.settings.models.setting.multi-setting/define-multi-setting clojure.core/def
metabase.sso.ldap/with-ldap-connection clojure.core/fn
metabase.sync.util/sum-for clojure.core/for
metabase.sync.util/with-emoji-progress-bar clojure.core/let
metabase.task/defjob clojure.core/defn
metabase.test.data.interface/defdataset clojure.core/def
metabase.test.data.interface/defdataset-edn clojure.core/def
metabase.test/defdataset clojure.core/def
@@ -632,10 +634,6 @@
metabase.api.common.internal-test/with-jetty-server hooks.common/with-one-binding
metabase.api.dashboard-test/with-chain-filter-fixtures hooks.common/let-one-with-optional-value
metabase.api.dashboard-test/with-simple-dashboard-with-tabs hooks.common/with-one-binding
metabase.api.embed-test/do-response-formats hooks.common/with-two-bindings
metabase.api.embed-test/with-chain-filter-fixtures! hooks.common/let-one-with-optional-value
metabase.api.embed-test/with-temp-card hooks.common/let-one-with-optional-value
metabase.api.embed-test/with-temp-dashcard hooks.common/let-one-with-optional-value
metabase.api.macros/defendpoint hooks.metabase.api.macros/defendpoint
metabase.api.user-test/with-temp-user-email! hooks.common/with-one-binding
metabase.channel.template.handlebars-helper/defhelper hooks.metabase.channel.template.handlebars-helper/defhelper
@@ -645,6 +643,10 @@
metabase.driver.bigquery-cloud-sdk-test/calculate-bird-scarcity hooks.metabase.query-processor-test.expressions-test/calculate-bird-scarcity
metabase.driver.oracle-test/with-temp-user hooks.common/let-one-with-optional-value
metabase.driver/register! hooks.metabase.driver/register!
metabase.embedding.api.embed-test/do-response-formats hooks.common/with-two-bindings
metabase.embedding.api.embed-test/with-chain-filter-fixtures! hooks.common/let-one-with-optional-value
metabase.embedding.api.embed-test/with-temp-card hooks.common/let-one-with-optional-value
metabase.embedding.api.embed-test/with-temp-dashcard hooks.common/let-one-with-optional-value
metabase.legacy-mbql.schema.macros/defclause hooks.metabase.legacy-mbql.schemas.macros/defclause
metabase.lib.schema.mbql-clause/define-catn-mbql-clause hooks.metabase.lib.schema.mbql-clause/define-mbql-clause
metabase.lib.schema.mbql-clause/define-mbql-clause hooks.metabase.lib.schema.mbql-clause/define-mbql-clause
@@ -661,9 +663,6 @@
metabase.models.dashboard-test/with-dash-in-collection! hooks.common/with-three-bindings
metabase.models.interface/define-batched-hydration-method hooks.metabase.models.interface/define-hydration-method
metabase.models.interface/define-simple-hydration-method hooks.metabase.models.interface/define-hydration-method
metabase.models.setting.multi-setting/define-multi-setting hooks.metabase.models.setting/define-multi-setting
metabase.models.setting.multi-setting/define-multi-setting-impl hooks.metabase.models.setting/define-multi-setting-impl
metabase.models.setting/defsetting hooks.metabase.models.setting/defsetting
metabase.permissions.core/allow-changing-all-users-group-members hooks.common/do*
metabase.permissions.core/disable-perms-cache hooks.common/do*
metabase.plugins.classloader/require hooks.clojure.core.require/lint-require
@@ -687,6 +686,12 @@
metabase.search.api-test/with-search-items-in-collection hooks.metabase.search.api-test/with-search-items-in-collection
metabase.search.api-test/with-search-items-in-root-collection hooks.common/do*
metabase.server.streaming-response-test/with-start-execution-chan hooks.common/with-one-binding
metabase.settings.core/define-multi-setting hooks.metabase.settings.models.setting/define-multi-setting
metabase.settings.core/define-multi-setting-impl hooks.metabase.settings.models.setting/define-multi-setting-impl
metabase.settings.core/defsetting hooks.metabase.settings.models.setting/defsetting
metabase.settings.models.setting.multi-setting/define-multi-setting hooks.metabase.settings.models.setting/define-multi-setting
metabase.settings.models.setting.multi-setting/define-multi-setting-impl hooks.metabase.settings.models.setting/define-multi-setting-impl
metabase.settings.models.setting/defsetting hooks.metabase.settings.models.setting/defsetting
metabase.stale-test/with-stale-items hooks.toucan2.tools.with-temp/with-temp
metabase.test.data.datasets/test-driver hooks.metabase.test.data.datasets/test-driver
metabase.test.data.datasets/test-drivers hooks.metabase.test.data.datasets/test-drivers
@@ -746,41 +751,43 @@
metabase.xrays.api.automagic-dashboards-test/with-indexed-model! hooks.metabase.xrays.api.automagic-dashboards-test/with-indexed-model!}
:macroexpand
{clojurewerkz.quartzite.jobs/build macros.quartz/build-job
clojurewerkz.quartzite.schedule.cron/schedule macros.quartz/schedule
clojurewerkz.quartzite.schedule.simple/schedule macros.quartz/simple-schedule
clojurewerkz.quartzite.triggers/build macros.quartz/build-trigger
metabase-enterprise.impersonation.util-test/with-impersonations! macros.metabase-enterprise.impersonation.util-test/with-impersonations!
metabase-enterprise.query-reference-validation.api-test/with-test-setup! macros.metabase-enterprise.query-reference-validation.api-test/with-test-setup!
metabase-enterprise.sandbox.test-util/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase-enterprise.serialization.test-util/with-world macros.metabase-enterprise.serialization.test-util/with-world
metabase-enterprise.test/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase-enterprise.test/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase.api.card-test/with-ordered-items macros.metabase.api.card-test/with-ordered-items
metabase.api.collection-test/with-collection-hierarchy! macros.metabase.api.collection-test/with-collection-hierarchy!
metabase.api.collection-test/with-some-children-of-collection! macros.metabase.api.collection-test/with-some-children-of-collection!
metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing! macros.metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing!
metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing! macros.metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing!
metabase.lib.common/defop macros.metabase.lib.common/defop
metabase.lib.filter/deffilter macros.metabase.lib.filter/deffilter
metabase.models.params.chain-filter-test/chain-filter macros.metabase.models.params.chain-filter-test/chain-filter
metabase.models.params.chain-filter-test/chain-filter-search macros.metabase.models.params.chain-filter-test/chain-filter
metabase.models.query-analysis-test/with-test-setup macros.metabase.models.query-analysis-test/with-test-setup
metabase.models.user-test/with-groups macros.metabase.models.user-test/with-groups
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing!
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing!
metabase.query-analysis.task.test-setup/with-test-setup! macros.metabase.query-analysis.task.test-setup/with-test-setup!
metabase.query-processor.streaming/streaming-response macros.metabase.query-processor.streaming/streaming-response
metabase.test.data.users/with-group-for-user macros.metabase.test.data.users/with-group-for-user
metabase.test.util/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
metabase.test.util/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
metabase.test/with-group-for-user macros.metabase.test.data.users/with-group-for-user
metabase.test/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
metabase.test/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
metabase.util.namespaces/import-fn macros.metabase.util.namespaces/import-fn
metabase.xrays.domain-entities.malli/define-getters-and-setters macros.metabase.xrays.domain-entities.malli/define-getters-and-setters
metabase.xrays.related-test/with-world macros.metabase.xrays.related-test/with-world}}
{clojurewerkz.quartzite.jobs/build macros.quartz/build-job
clojurewerkz.quartzite.schedule.cron/schedule macros.quartz/schedule
clojurewerkz.quartzite.schedule.simple/schedule macros.quartz/simple-schedule
clojurewerkz.quartzite.triggers/build macros.quartz/build-trigger
metabase-enterprise.database-routing.e2e-test/with-temp-dbs! macros.metabase-enterprise.database-routing.e2e-test/with-temp-dbs!
metabase-enterprise.impersonation.util-test/with-impersonations! macros.metabase-enterprise.impersonation.util-test/with-impersonations!
metabase-enterprise.query-reference-validation.api-test/with-test-setup! macros.metabase-enterprise.query-reference-validation.api-test/with-test-setup!
metabase-enterprise.sandbox.test-util/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase-enterprise.serialization.test-util/with-world macros.metabase-enterprise.serialization.test-util/with-world
metabase-enterprise.test/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase-enterprise.test/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
metabase.api.card-test/with-ordered-items macros.metabase.api.card-test/with-ordered-items
metabase.api.collection-test/with-collection-hierarchy! macros.metabase.api.collection-test/with-collection-hierarchy!
metabase.api.collection-test/with-some-children-of-collection! macros.metabase.api.collection-test/with-some-children-of-collection!
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-card-referencing! macros.metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-card-referencing!
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing! macros.metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing!
metabase.lib.common/defop macros.metabase.lib.common/defop
metabase.lib.filter/deffilter macros.metabase.lib.filter/deffilter
metabase.models.params.chain-filter-test/chain-filter macros.metabase.models.params.chain-filter-test/chain-filter
metabase.models.params.chain-filter-test/chain-filter-search macros.metabase.models.params.chain-filter-test/chain-filter
metabase.models.user-test/with-groups macros.metabase.models.user-test/with-groups
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing!
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing!
metabase.query-analysis.models.query-analysis-test/with-test-setup macros.metabase.query-analysis.models.query-analysis-test/with-test-setup
metabase.query-analysis.task.test-setup/with-test-setup! macros.metabase.query-analysis.task.test-setup/with-test-setup!
metabase.query-processor.streaming/streaming-response macros.metabase.query-processor.streaming/streaming-response
metabase.server.statistics-handler-test/with-server macros.metabase.server.statistics-handler-test/with-server
metabase.test.data.users/with-group-for-user macros.metabase.test.data.users/with-group-for-user
metabase.test.util/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
metabase.test.util/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
metabase.test/with-group-for-user macros.metabase.test.data.users/with-group-for-user
metabase.test/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
metabase.test/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
metabase.util.namespaces/import-fn macros.metabase.util.namespaces/import-fn
metabase.xrays.domain-entities.malli/define-getters-and-setters macros.metabase.xrays.domain-entities.malli/define-getters-and-setters
metabase.xrays.related-test/with-world macros.metabase.xrays.related-test/with-world}}
:config-in-comment
{:linters {:unresolved-symbol {:level :off}}}

View File

@@ -30,11 +30,12 @@
;; ## Tips
;;
;; PRO TIP: Check out the [[dev.deps-graph]] namespace for helpful tools to see where a module is used externally, and
;; for tools for calculating this config.
;; for tools for calculating this config -- you can use [[dev.deps-graph/print-kondo-config-diff]] to see what updates
;; you need to make
{:metabase/modules
{actions
{:api #{metabase.actions.api metabase.actions.core}
:uses #{analytics api driver legacy-mbql lib model-persistence models query-processor search util}}
:uses #{analytics api driver legacy-mbql lib model-persistence models query-processor search settings util}}
activity-feed
{:api #{metabase.activity-feed.api metabase.activity-feed.init}
@@ -53,8 +54,7 @@
internal-stats
models
premium-features
public-settings
server
settings
util}}
analyze
{:api #{metabase.analyze.core metabase.analyze.query-results}
@@ -62,12 +62,12 @@
api
{:api #{metabase.api.auth
metabase.api.cache
metabase.api.card
metabase.api.collection
metabase.api.common
metabase.api.common.validation
metabase.api.dashboard
metabase.api.database
metabase.api.dataset
metabase.api.field
metabase.api.macros
@@ -80,8 +80,9 @@
metabase.api.util.handlers}
:uses :any}
audit {:api #{metabase.audit}
:uses #{db models}}
audit
{:api #{metabase.audit}
:uses #{db settings}}
auth-provider
{:api #{metabase.auth-provider}
@@ -91,6 +92,12 @@
{:api #{metabase.bookmarks.api}
:uses #{api db models util}}
cache
{:api #{metabase.cache.api
metabase.cache.core
metabase.cache.init}
:uses #{api config db events models premium-features settings util}}
channel
{:api #{metabase.channel.api
metabase.channel.core
@@ -113,7 +120,7 @@
notification
permissions
premium-features
public-settings
settings
query-processor
timeline
types
@@ -123,13 +130,13 @@
{:api #{metabase.cloud-migration.api
metabase.cloud-migration.core
metabase.cloud-migration.init}
:uses #{api cmd config db models premium-features util}}
:uses #{api cmd config db models premium-features settings task util}}
cmd
{:api #{metabase.cmd
metabase.cmd.copy
metabase.cmd.dump-to-h2}
:uses #{api config db legacy-mbql models plugins query-processor search util}}
:uses #{api config db legacy-mbql models plugins query-processor search settings util}}
;; technically this 'uses' `enterprise/core` and `test` since it tries to load them to see if they exists so we know
;; if EE/test code is available; however we can ignore them since they're not real usages.
@@ -146,6 +153,10 @@
{:api #{metabase.core.initialization-status}
:uses :any}
database-routing
{:api #{metabase.database-routing.core}
:uses #{premium-features}}
db
{:api #{metabase.db metabase.db.metadata-queries metabase.db.query metabase.db.setup}
:uses #{auth-provider config connection-pool driver legacy-mbql lib plugins query-processor task util}}
@@ -175,9 +186,11 @@
metabase.driver.sync
metabase.driver.util}
:uses #{actions
api
auth-provider
config
connection-pool
database-routing
db
legacy-mbql
lib
@@ -186,29 +199,44 @@
notification
plugins
premium-features
public-settings
settings
pulse
query-processor
sync
task
upload
util}}
eid-translation
{:api #{metabase.eid-translation.core}
:uses #{}}
:uses #{settings util}}
embed
{:api #{metabase.embed.settings metabase.embed.app-origins-sdk}
:uses #{analytics models premium-features tiles util}}
embedding
{:api #{metabase.embedding.api
metabase.embedding.app-origins-sdk
metabase.embedding.init
metabase.embedding.settings}
:uses #{analytics
api
config
driver
eid-translation
events
models
notification
premium-features
public-sharing
query-processor
settings
tiles
util}}
events
{:api #{metabase.events metabase.events.init metabase.events.notification}
:uses #{api channel driver models notification premium-features util}}
:uses #{api channel driver models notification premium-features task-history util}}
formatter
{:api #{metabase.formatter}
:uses #{models public-settings query-processor types util}}
:uses #{models settings query-processor types util}}
indexed-entities
{:api #{metabase.indexed-entities.api metabase.indexed-entities.init}
@@ -216,10 +244,10 @@
integrations
{:api #{metabase.integrations.slack}
:uses #{events models util}}
:uses #{events settings util}}
internal-stats
{:api #{metabase.internal-stats}
{:api #{metabase.internal-stats.core}
:uses #{db models}}
legacy-mbql
@@ -267,11 +295,11 @@
metabase.lib.util
metabase.lib.util.match
metabase.lib.walk}
:uses #{config driver legacy-mbql models types util}}
:uses #{config legacy-mbql models settings types util}}
lib-be
{:api #{metabase.lib-be.init}
:uses #{models task util}}
:uses #{models settings task util}}
logger
{:api #{metabase.logger metabase.logger.init}
@@ -281,19 +309,18 @@
{:api #{metabase.login-history.api
metabase.login-history.core
metabase.login-history.init}
:uses #{analytics api channel models request util}}
:uses #{analytics api channel request settings util}}
model-persistence
{:api #{metabase.model-persistence.api
metabase.model-persistence.core
metabase.model-persistence.init}
:uses #{api db driver events lib models premium-features public-settings query-processor request task util}}
:uses #{api db driver events lib models premium-features settings query-processor request task task-history util}}
models
{:api #{metabase.models.api-key
metabase.models.application-permissions-revision
metabase.models.audit-log
metabase.models.cache-config
metabase.models.card
metabase.models.card.metadata
metabase.models.collection
@@ -315,23 +342,17 @@
metabase.models.moderation-review
metabase.models.native-query-snippet
metabase.models.native-query-snippet.permissions
metabase.notification.models
metabase.models.params
metabase.models.params.chain-filter
metabase.models.params.custom-values
metabase.models.params.field-values
metabase.models.params.shared
metabase.models.query
metabase.models.query-analysis
metabase.models.query.permissions
metabase.models.resolution
metabase.models.secret
metabase.models.serialization
metabase.models.setting
metabase.models.setting.cache
metabase.models.setting.multi-setting
metabase.models.table
metabase.models.task-history
metabase.models.user
metabase.models.user-parameter-value
metabase.models.util.spec-update
@@ -341,6 +362,7 @@
analyze
api
audit
cache
channel
config
db
@@ -353,20 +375,17 @@
permissions
plugins
premium-features
public-settings
settings
public-sharing
pulse
query-analysis
query-processor
request
search
server
setup
sync
task
types
util
enterprise/advanced-permissions}}
util}}
moderation
{:api #{metabase.moderation}
@@ -377,7 +396,9 @@
metabase.notification.core
metabase.notification.init
metabase.notification.models
metabase.notification.payload.core}
metabase.notification.api.notification
metabase.notification.payload.core
metabase.notification.send}
:uses #{analytics
api
channel
@@ -387,10 +408,11 @@
models
permissions
premium-features
public-settings
settings
query-processor
request
task
task-history
util}}
permissions
@@ -400,7 +422,7 @@
metabase.permissions.models.permissions
metabase.permissions.models.permissions-group
metabase.permissions.util}
:uses #{api audit config db models plugins premium-features request server util}}
:uses #{api audit config db models plugins premium-features request server settings util}}
pivot
{:api #{metabase.pivot.core}
@@ -411,19 +433,17 @@
:uses #{config driver util}}
premium-features
{:api #{metabase.premium-features.core
{:api #{metabase.premium-features.api
metabase.premium-features.core
metabase.premium-features.init
metabase.premium-features.token-check}
:uses #{config db internal-stats models plugins util}}
public-settings
{:api #{metabase.public-settings}
:uses #{api config models premium-features util}}
:uses #{api config db internal-stats plugins settings util}}
public-sharing
{:api #{metabase.public-sharing.api
metabase.public-sharing.core
metabase.public-sharing.init}
:uses #{actions analytics api db events lib models query-processor request tiles util}}
:uses #{actions analytics api db events lib models query-processor request settings tiles util}}
pulse
{:api #{metabase.pulse.api
@@ -431,12 +451,12 @@
metabase.pulse.init
metabase.pulse.task.send-pulses}
:uses #{api channel config db driver events integrations models notification permissions plugins premium-features
query-processor request task util
query-processor request task task-history util
enterprise/advanced-config enterprise/advanced-permissions enterprise/sandbox}}
query-analysis
{:api #{metabase.query-analysis.core metabase.query-analysis.init}
:uses #{config driver legacy-mbql lib public-settings query-processor task util}}
:uses #{config driver legacy-mbql lib query-processor settings task util}}
query-processor
{:api #{metabase.query-processor
@@ -477,8 +497,8 @@
analyze
api
audit
cache
config
db
driver
events
formatter
@@ -489,7 +509,7 @@
permissions
pivot
premium-features
public-settings
settings
request
server
types
@@ -497,7 +517,7 @@
request
{:api #{metabase.request.core}
:uses #{api config models permissions public-settings util}}
:uses #{api config models permissions settings util}}
revisions
{:api #{metabase.revisions.api metabase.revisions.core metabase.revisions.init}
@@ -516,7 +536,7 @@
metabase.search.ingestion
metabase.search.init
metabase.search.spec}
:uses #{analytics api audit config db driver models permissions premium-features public-settings request task util}}
:uses #{analytics api audit config db driver models permissions premium-features settings request task util}}
segments
{:api #{metabase.segments.api}
@@ -527,14 +547,21 @@
metabase.server.middleware.json
metabase.server.middleware.session
metabase.server.streaming-response}
:uses #{analytics api config core db driver embed models premium-features public-settings session request util enterprise/sso}}
:uses #{analytics api config core db driver embedding models premium-features settings session request util enterprise/sso}}
session
{:api #{metabase.session.core
metabase.session.api
metabase.session.init
metabase.session.models.session}
:uses #{api channel config db driver events login-history models public-settings request sso task util}}
:uses #{api channel config db driver events login-history models settings request sso task util}}
settings
{:api #{metabase.settings.api
metabase.settings.core
metabase.settings.deprecated-grab-bag
metabase.settings.init}
:uses #{api config db events models plugins premium-features server util enterprise/advanced-permissions}}
setup
{:api #{metabase.setup.api metabase.setup.core}
@@ -543,13 +570,10 @@
channel
config
db
embed
events
integrations
models
permissions
premium-features
public-settings
settings
request
session
util}}
@@ -558,7 +582,7 @@
{:api #{metabase.sso.api
metabase.sso.core
metabase.sso.init}
:uses #{api models permissions premium-features util}}
:uses #{api models permissions premium-features settings util}}
sync
{:api #{metabase.sync.api
@@ -567,32 +591,41 @@
metabase.sync.schedules
metabase.sync.task.sync-databases
metabase.sync.util}
:uses #{analyze api audit config db driver events lib models plugins query-processor task util}}
:uses #{analyze api audit config db driver events lib models query-processor settings task task-history util}}
task
{:api #{metabase.task
metabase.task.bootstrap
metabase.task.init
metabase.task.notification}
metabase.task.init}
:uses #{analytics
channel
config
db
driver
integrations
models
notification
plugins
premium-features
public-settings
query-processor
settings
task-history
util
enterprise/task}}
task-history
{:api #{metabase.task-history.api
metabase.task-history.core
metabase.task-history.init}
:uses #{api
models
permissions
premium-features
request
task
util}}
tiles
{:api #{metabase.tiles.api
metabase.tiles.init}
:uses #{api legacy-mbql models query-processor util}}
:uses #{api legacy-mbql query-processor settings util}}
timeline
{:api #{metabase.timeline.api metabase.timeline.core}
@@ -604,7 +637,7 @@
upload
{:api #{metabase.upload}
:uses #{analytics api driver events legacy-mbql lib model-persistence models permissions public-settings sync util}}
:uses #{analytics api driver events legacy-mbql lib model-persistence models permissions settings sync util}}
user-key-value
{:api #{metabase.user-key-value.api metabase.user-key-value.init}
@@ -612,24 +645,25 @@
util
{:api :any
:uses #{config driver legacy-mbql lib models plugins premium-features public-settings}}
:uses #{config db driver legacy-mbql lib models plugins settings}}
xrays
{:api #{metabase.xrays.api metabase.xrays.core}
:uses #{analyze api db driver legacy-mbql lib models public-settings query-processor util}}
{:api #{metabase.xrays.api
metabase.xrays.core
metabase.xrays.init}
:uses #{analyze api driver legacy-mbql lib models settings query-processor util}}
enterprise/advanced-config
{:api #{metabase-enterprise.advanced-config.api.logs
metabase-enterprise.advanced-config.models.pulse-channel
metabase-enterprise.advanced-config.file
metabase-enterprise.advanced-config.crufty}
:uses #{api db driver models permissions premium-features setup sync util}}
metabase-enterprise.advanced-config.file}
:uses #{api db driver models permissions premium-features setup settings sync util}}
enterprise/advanced-permissions
{:api #{metabase-enterprise.advanced-permissions.api.routes
metabase-enterprise.advanced-permissions.common
metabase-enterprise.advanced-permissions.models.permissions.group-manager}
:uses #{api audit driver enterprise/impersonation lib models permissions premium-features query-processor util enterprise/sandbox}}
:uses #{api enterprise/impersonation lib models permissions premium-features query-processor util}}
enterprise/airgap
{:api #{}
@@ -652,6 +686,7 @@
plugins
premium-features
query-processor
settings
sync
util
enterprise/serialization}}
@@ -665,8 +700,8 @@
:uses #{api premium-features util}}
enterprise/cache
{:api #{metabase-enterprise.cache.strategies}
:uses #{api models premium-features query-processor util}}
{:api #{metabase-enterprise.cache.init}
:uses #{cache premium-features query-processor task util}}
enterprise/content-verification
{:api #{metabase-enterprise.content-verification.api.routes}
@@ -674,40 +709,47 @@
enterprise/core
{:api #{metabase-enterprise.core.init}
:uses #{enterprise/enhancements}}
:uses :any}
enterprise/dashboard-subscription-filters
{:api #{}
:uses #{premium-features}}
enterprise/data-editing
{:api #{metabase-enterprise.data-editing.api}
:uses #{api actions util}}
enterprise/database-routing
{:api #{metabase-enterprise.database-routing.api}
:uses #{api config database-routing events lib models premium-features query-processor settings util}}
enterprise/enhancements
{:api #{metabase-enterprise.enhancements.init}
:uses #{models premium-features sso util enterprise/sso}}
:uses #{models premium-features settings sso util enterprise/sso}}
enterprise/gsheets
{:api #{metabase-enterprise.gsheets.api}
:uses #{api analytics enterprise/harbormaster models premium-features server util}}
:uses #{api analytics premium-features settings util enterprise/harbormaster}}
enterprise/harbormaster
{:api #{metabase-enterprise.harbormaster.client}
:uses #{api cloud-migration models util}}
:uses #{api cloud-migration util}}
enterprise/impersonation
{:api #{metabase-enterprise.impersonation.core
metabase-enterprise.impersonation.api}
:uses #{api audit driver enterprise/sandbox lib models permissions premium-features query-processor util}}
{:api #{metabase-enterprise.impersonation.api}
:uses #{api audit driver lib models premium-features query-processor util enterprise/sandbox}}
enterprise/internal-stats
{:api #{metabase-enterprise.internal-stats}
:uses #{models premium-features}}
{:api #{}
:uses #{premium-features settings}}
enterprise/llm
{:api #{metabase-enterprise.llm.api}
:uses #{analytics analyze api models query-processor util}}
:uses #{analytics analyze api query-processor settings util}}
enterprise/query-reference-validation
{:api #{metabase-enterprise.query-reference-validation.api}
:uses #{api models public-settings request util}}
:uses #{api models query-analysis request util}}
enterprise/sandbox
{:api #{metabase-enterprise.sandbox.api.routes
@@ -724,12 +766,11 @@
query-processor
request
util
enterprise/impersonation
enterprise/api}}
enterprise/scim
{:api #{metabase-enterprise.scim.api metabase-enterprise.scim.routes}
:uses #{analytics api models permissions public-settings server util enterprise/serialization}}
:uses #{analytics api models permissions settings server util enterprise/serialization}}
enterprise/search
{:api #{}
@@ -739,7 +780,7 @@
{:api #{metabase-enterprise.serialization.api
metabase-enterprise.serialization.cmd
metabase-enterprise.serialization.v2.backfill-ids}
:uses #{analytics api config db legacy-mbql lib logger models plugins premium-features public-settings setup util}}
:uses #{analytics api config db legacy-mbql lib logger models plugins premium-features settings setup util}}
enterprise/snippet-collections
{:api #{}
@@ -749,23 +790,19 @@
{:api #{metabase-enterprise.sso.api.routes
metabase-enterprise.sso.integrations.sso-settings
metabase-enterprise.sso.integrations.sso-utils}
:uses #{api channel embed events models premium-features public-settings request session sso util enterprise/scim}}
:uses #{api channel embedding events premium-features request session settings sso util enterprise/scim}}
enterprise/stale
{:api #{metabase-enterprise.stale.routes}
:uses #{analytics api embed models premium-features public-settings request util}}
:uses #{analytics api embedding models premium-features request settings util}}
enterprise/stats
{:api #{}
:uses #{driver premium-features enterprise/advanced-config enterprise/scim enterprise/sso}}
enterprise/data-editing
{:api #{}
:uses #{api actions util}}
enterprise/task
{:api #{metabase-enterprise.task.truncate-audit-tables}
:uses #{premium-features query-processor task util enterprise/cache}}
:uses #{premium-features}}
enterprise/upload-management
{:api #{metabase-enterprise.upload-management.api}

View File

@@ -74,11 +74,6 @@
metabase.models.field-values/create-or-update-full-field-values!
metabase.models.moderation-review/create-review!
metabase.models.on-demand-test/add-dashcard-with-parameter-mapping!
metabase.models.setting-test/test-user-local-allowed-setting!
metabase.models.setting-test/test-user-local-only-setting!
metabase.models.setting.cache/restore-cache!
metabase.models.setting/set!
metabase.models.setting/validate-settings-formatting!
metabase.permissions.models.permissions/grant-application-permissions!
metabase.permissions.models.permissions/grant-collection-read-permissions!
metabase.permissions.models.permissions/grant-collection-readwrite-permissions!
@@ -97,6 +92,11 @@
metabase.query-processor.streaming.interface/finish!
metabase.query-processor.streaming.interface/write-row!
metabase.sample-data/try-to-extract-sample-database!
metabase.settings.models.setting-test/test-user-local-allowed-setting!
metabase.settings.models.setting-test/test-user-local-only-setting!
metabase.settings.models.setting.cache/restore-cache!
metabase.settings.models.setting/set!
metabase.settings.models.setting/validate-settings-formatting!
metabase.setup.core/create-token!
metabase.sso.ldap-test-util/start-ldap-server!
metabase.sync.core/sync-database!

View File

@@ -1,4 +1,4 @@
(ns macros.metabase.api.embed-test)
(ns macros.metabase.embedding.api.embed-test)
(defmacro with-embedding-enabled-and-temp-card-referencing!
[table-kw field-kw [card-binding] & body]

View File

@@ -1,4 +1,4 @@
(ns macros.metabase.models.query-analysis-test)
(ns macros.metabase.query-analysis.models.query-analysis-test)
(defmacro with-test-setup [& body]
`(let [~'card-id 1

View File

@@ -0,0 +1,9 @@
(ns macros.metabase.server.statistics-handler-test)
(defmacro with-server
[_ _ [connector chan-start-handle chan-finish-handle chan-done-request] & body]
`(let [~connector nil
~chan-start-handle nil
~chan-finish-handle nil
~chan-done-request nil]
~@body))

View File

@@ -0,0 +1,5 @@
(ns macros.metabase-enterprise.database-routing.e2e-test)
(defmacro with-temp-dbs! [bindings & body]
`(let [~@(interleave bindings (repeat nil))]
~@body))

View File

@@ -1,4 +1,4 @@
(ns hooks.metabase.models.setting
(ns hooks.metabase.settings.models.setting
(:require
[clj-kondo.hooks-api :as hooks]
[hooks.common :as common]))
@@ -207,7 +207,7 @@
anon-binding (hooks/map-node options-list)])
(hooks/reg-keyword! (-> (hooks/keyword-node (keyword (hooks/sexpr setting-name)))
(with-meta (meta setting-name)))
'metabase.models.setting/defsetting)
'metabase.settings.models.setting/defsetting)
getter-node
setter-node))
(with-meta (meta node)))}))

View File

@@ -81,268 +81,271 @@
throttle.core/with-throttling [[:block 1]]
;; the rest of the stuff in this list is generated automatically based on `:style/indent` specs
;; by running [[dev.generate-cljfmt-config/specs]]... use that code to update this list
metabase-enterprise.impersonation.util-test/with-impersonations! [[:inner 0]]
metabase-enterprise.cache.config-test/with-temp-persist-models [[:block 1]]
metabase-enterprise.sandbox.test-util/with-gtaps! [[:inner 0]]
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! [[:inner 0]]
metabase-enterprise.sandbox.test-util/with-user-attributes [[:block 2]]
metabase-enterprise.serialization.test-util/with-dbs [[:inner 0]]
metabase-enterprise.serialization.test-util/with-random-dump-dir [[:block 1]]
metabase-enterprise.serialization.test-util/with-world [[:block 0]]
metabase-enterprise.sso.integrations.jwt-test/with-users-with-email-deleted [[:block 1]]
metabase-enterprise.test/with-gtaps! [[:inner 0]]
metabase-enterprise.test/with-gtaps-for-user! [[:inner 0]]
metabase-enterprise.test/with-user-attributes [[:block 2]]
metabase.actions.actions-test/with-actions-test-data-and-actions-permissively-enabled [[:block 0]]
metabase.actions.test-util/with-actions [[:block 1]]
metabase.actions.test-util/with-actions-disabled [[:block 0]]
metabase.actions.test-util/with-actions-enabled [[:block 0]]
metabase.actions.test-util/with-actions-test-data [[:inner 0]]
metabase.actions.test-util/with-actions-test-data-and-actions-enabled [[:block 0]]
metabase.actions.test-util/with-actions-test-data-tables [[:block 1]]
metabase.actions.test-util/with-empty-db [[:inner 0]]
metabase.actions.test-util/with-temp-test-data [[:inner 0]]
metabase.api.card-test/with-cards-in-readable-collection [[:block 1]]
metabase.api.card-test/with-cards-in-writeable-collection [[:block 1]]
metabase.api.card-test/with-ordered-items [[:inner 0]]
metabase.api.card-test/with-temp-native-card! [[:block 1]]
metabase.api.card-test/with-temp-native-card-with-params! [[:block 1]]
metabase.api.collection-test/with-collection-hierarchy [[:block 1]]
metabase.api.collection-test/with-french-user-and-personal-collection [[:block 2]]
metabase.api.collection-test/with-some-children-of-collection [[:block 1]]
metabase.api.common/check [[:default]]
metabase.api.common/define-routes [[:block 0]]
metabase.api.common/let-404 [[:block 1]]
metabase.api.embed-test/do-response-formats [[:block 1]]
metabase.api.embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing [[:block 3]]
metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing [[:block 3]]
metabase.api.embed-test/with-new-secret-key [[:block 0]]
metabase.api.embed-test/with-temp-card [[:block 1]]
metabase.api.embed-test/with-temp-dashcard [[:block 1]]
metabase.api.preview-embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
metabase.api.preview-embed-test/with-new-secret-key [[:block 0]]
metabase.cmd.copy/step [[:block 1]]
metabase.cmd.copy/with-connection-rollback-only [[:block 1]]
metabase.cmd.copy/with-disabled-db-constraints [[:block 2]]
metabase.config/build-type-case [[:block 0]]
metabase.dashboard-subscription-test/with-link-card-fixture-for-dashboard [[:block 2]]
metabase.db.liquibase/with-liquibase [[:block 1]]
metabase.db.liquibase/with-scope-locked [[:block 1]]
metabase.db.schema-migrations-test.impl/test-migrations [[:block 2]]
metabase.db/with-application-db [[:inner 0]]
metabase.driver.bigquery-cloud-sdk.query-processor/with-temporal-type [[:default]]
metabase.driver.druid.client/DELETE [[:default]]
metabase.driver.druid.client/GET [[:default]]
metabase.driver.druid.client/POST [[:default]]
metabase.driver.druid.query-processor-test/druid-query [[:block 0]]
metabase.driver.druid.query-processor-test/druid-query-returning-rows [[:block 0]]
metabase.driver.mongo.query-processor/mongo-let [[:block 1]]
metabase.driver.sql-jdbc.actions/with-jdbc-transaction [[:block 1]]
metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection [[:block 1]]
metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info [[:block 1]]
metabase.driver.sql.query-processor/apply-top-level-clause [[:default]]
metabase.driver/with-driver [[:block 1]]
metabase.lib.binning/with-binning [[:default]]
metabase.lib.core/with-binning [[:default]]
metabase.lib.core/with-join-alias [[:default]]
metabase.lib.core/with-join-conditions [[:default]]
metabase.lib.join/with-join-alias [[:default]]
metabase.lib.join/with-join-conditions [[:default]]
metabase.lib.test-util.macros/$ids [[:inner 0]]
metabase.lib.test-util.macros/mbql-query [[:inner 0]]
metabase.lib.util.match/match [[:inner 0]]
metabase.lib.util.match/match-one [[:inner 0]]
metabase.lib.util.match/replace [[:inner 0]]
metabase.lib.util.match/replace-in [[:inner 0]]
metabase.models.collection-test/with-collection-hierarchy [[:block 1]]
metabase.models.collection-test/with-current-user-perms-for-collections [[:block 1]]
metabase.models.collection-test/with-personal-and-impersonal-collections [[:block 1]]
metabase.models.dashboard-test/with-dash-in-collection [[:inner 0]]
metabase.models.interface/define-batched-hydration-method [[:inner 0]]
metabase.models.interface/define-simple-hydration-method [[:inner 0]]
metabase.models.params.chain-filter-test/with-clean-field-values-for-field [[:block 1]]
metabase.models.params.chain-filter-test/with-fk-field-to-field-remapping [[:block 0]]
metabase.models.params.chain-filter-test/with-human-readable-values-remapping [[:block 0]]
metabase.models.setting.multi-setting/define-multi-setting [[:inner 0]]
metabase.models.setting/defsetting [[:block 1]]
metabase.models.task-history/with-task-history [[:block 1]]
metabase.permissions.core/allow-changing-all-users-group-members [[:block 0]]
metabase.permissions.core/disable-perms-cache [[:block 0]]
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing [[:block 3]]
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing [[:block 3]]
metabase.public-sharing.api-test/with-temp-public-card [[:block 1]]
metabase.public-sharing.api-test/with-temp-public-dashboard [[:block 1]]
metabase.public-sharing.api-test/with-temp-public-dashboard-and-card [[:block 1]]
metabase.pulse.api.alert-test/with-alert-in-collection [[:block 1]]
metabase.pulse.models.pulse-test/with-dashboard-subscription-in-collection [[:block 1]]
metabase.pulse.models.pulse-test/with-pulse-in-collection [[:inner 0]]
metabase.query-processor-test.pipeline-queries-test/pmbql-query [[:block 1]]
metabase.query-processor-test.pipeline-queries-test/run-pmbql-query [[:block 1]]
metabase.query-processor.debug/debug> [[:block 0]]
metabase.query-processor.error-type/deferror [[:block 1]]
metabase.query-processor.middleware.cache-backend.interface/with-cached-results [[:block 4]]
metabase.query-processor.middleware.process-userland-query-test/with-query-execution [[:block 1]]
metabase.query-processor.store/cached [[:block 1]]
metabase.query-processor.store/with-metadata-provider [[:inner 0]]
metabase.query-processor.streaming/streaming-response [[:block 1]]
metabase.query-processor.test-util/format-rows-by [[:default]]
metabase.request.core/as-admin [[:block 0]]
metabase.request.core/with-current-request [[:inner 0]]
metabase.request.core/with-current-user [[:inner 0]]
metabase.request.core/with-limit-and-offset [[:inner 0]]
metabase.request.session/as-admin [[:block 0]]
metabase.request.session/with-current-user [[:inner 0]]
metabase.sample-data-test/with-temp-sample-database-db [[:block 1]]
metabase.search.api-test/do-test-users [[:block 1]]
metabase.server.middleware.session/as-admin [[:block 0]]
metabase.server.middleware.session/with-current-user [[:inner 0]]
metabase.server.streaming-response-test/with-streaming-response-thread-pool [[:block 0]]
metabase.server.streaming-response-test/with-test-driver-db! [[:block 0]]
metabase.server.streaming-response/streaming-response [[:block 2]]
metabase.session.api/http-401-on-error [[:block 0]]
metabase.sync.fetch-metadata/log-if-error [[:block 1]]
metabase.sync.sync-metadata.fields-test/with-test-db [[:block 0]]
metabase.sync.util/do-with-start-and-finish-debug-logging [[:default]]
metabase.sync.util/sum-for [[:block 1]]
metabase.sync.util/sync-operation [[:block 3]]
metabase.sync.util/with-db-logging-disabled [[:default]]
metabase.sync.util/with-duplicate-ops-prevented [[:default]]
metabase.sync.util/with-emoji-progress-bar [[:block 1]]
metabase.sync.util/with-error-handling [[:block 1]]
metabase.sync.util/with-start-and-finish-logging [[:default]]
metabase.sync.util/with-start-and-finish-logging* [[:default]]
metabase.sync.util/with-sync-events [[:default]]
metabase.task/rerun-on-error [[:block 1]]
metabase.test/$ids [[:inner 0]]
metabase.test/as-admin [[:inner 0]]
metabase.test/dataset [[:inner 0]]
metabase.test/discard-setting-changes [[:block 1]]
metabase.test/format-rows-by [[:default]]
metabase.test/let-url [[:block 1]]
metabase.test/mbql-query [[:inner 0]]
metabase.test/native-query [[:block 0]]
metabase.test/query [[:block 1]]
metabase.test/run-mbql-query [[:inner 0]]
metabase.test/test-driver [[:inner 0]]
metabase.test/test-drivers [[:inner 0]]
metabase.test/test-helpers-set-global-values! [[:block 0]]
metabase.test/throw-if-called! [[:block 1]]
metabase.test/with-actions [[:block 1]]
metabase.test/with-actions-disabled [[:block 0]]
metabase.test/with-actions-enabled [[:block 0]]
metabase.test/with-actions-test-data [[:inner 0]]
metabase.test/with-actions-test-data-and-actions-enabled [[:block 0]]
metabase.test/with-actions-test-data-tables [[:block 1]]
metabase.test/with-additional-premium-features [[:block 1]]
metabase.test/with-current-user [[:inner 0]]
metabase.test/with-driver [[:block 1]]
metabase.test/with-empty-db [[:inner 0]]
metabase.test/with-empty-h2-app-db [[:block 0]]
metabase.test/with-metadata-provider [[:inner 0]]
metabase.test/with-premium-features [[:block 1]]
metabase.test/with-temp [[:inner 0]]
metabase.test/with-temp-copy-of-db [[:block 0]]
metabase.test/with-temp-scheduler [[:block 0]]
metabase.test/with-temp-test-data [[:inner 0]]
metabase.test/with-temp-vals-in-db [[:block 3]]
metabase.test/with-test-user [[:inner 0]]
metabase.test/with-user-in-groups [[:inner 0]]
metabase.test.data/$ids [[:inner 0]]
metabase.test.data/dataset [[:inner 0]]
metabase.test.data/mbql-query [[:inner 0]]
metabase.test.data/native-query [[:block 0]]
metabase.test.data/query [[:block 1]]
metabase.test.data/run-mbql-query [[:inner 0]]
metabase.test.data/with-empty-h2-app-db [[:block 0]]
metabase.test.data/with-temp-copy-of-db [[:block 0]]
metabase.test.data.datasets/test-driver [[:inner 0]]
metabase.test.data.datasets/test-drivers [[:inner 0]]
metabase.test.data.one-off-dbs/with-blank-db [[:block 0]]
metabase.test.data.one-off-dbs/with-blueberries-db [[:block 0]]
metabase.test.data.users/with-test-user [[:inner 0]]
metabase.test.util/discard-setting-changes [[:block 1]]
metabase.test.util/let-url [[:block 1]]
metabase.test.util/throw-if-called! [[:block 1]]
metabase.test.util/with-temp-scheduler [[:block 0]]
metabase.test.util/with-temp-vals-in-db [[:block 3]]
metabase.test.util/with-user-in-groups [[:inner 0]]
metabase.test.util.public-settings/with-additional-premium-features [[:block 1]]
metabase.test.util.public-settings/with-premium-features [[:block 1]]
metabase.test.util.thread-local/test-helpers-set-global-values! [[:block 0]]
metabase.timeseries-query-processor-test.util/test-timeseries-drivers [[:block 0]]
metabase.timeseries-query-processor-test/run-mbql-query [[:inner 0]]
metabase.upload-test/with-upload-table! [[:inner 0]]
metabase.upload.types/with-currency [[:default]]
metabase.upload.types/with-parens [[:default]]
metabase.util/auto-retry [[:block 1]]
metabase.util/case-enum [[:block 1]]
metabase.util/ignore-exceptions [[:block 0]]
metabase.util/or-with [[:block 1]]
metabase.util/profile [[:block 1]]
metabase.util/prog1 [[:inner 0]]
metabase.util/varargs [[:inner 0]]
metabase.util/with-us-locale [[:block 0]]
metabase.util.async/cancelable-thread [[:block 0]]
metabase.util.date-2/with-time-zone-same-instant [[:default]]
metabase.util.encryption-test/with-secret-key [[:block 1]]
metabase.util.honey-sql-2/with-database-type-info [[:default]]
metabase.util.i18n/deferred-trs [[:default]]
metabase.util.i18n/deferred-tru [[:default]]
metabase.util.i18n/trs [[:default]]
metabase.util.i18n/trsn [[:default]]
metabase.util.i18n/tru [[:default]]
metabase.util.i18n/trun [[:default]]
metabase.util.jvm/auto-retry [[:block 1]]
metabase.util.jvm/varargs [[:block 1]]
metabase.util.jvm/with-us-locale [[:block 0]]
metabase.util.malli/disable-enforcement [[:block 0]]
metabase.util.malli/with [[:default]]
metabase.util.malli/with-api-error-message [[:default]]
metabase.util.namespaces/import-fns [[:default]]
metabuild-common.core/exit-when-finished-nonzero-on-exception [[:block 0]]
metabuild-common.core/step [[:block 1]]
metabuild-common.entrypoint/exit-when-finished-nonzero-on-exception [[:block 0]]
metabuild-common.steps/step [[:block 1]]
methodical.core/defmethod [[:inner 0]]
methodical.core/defmulti [[:inner 0]]
methodical.core/with-dispatcher [[:default]]
methodical.core/with-method-table [[:default]]
methodical.core/with-prefers [[:default]]
methodical.interface/with-dispatcher [[:default]]
methodical.interface/with-method-table [[:default]]
methodical.interface/with-prefers [[:default]]
methodical.macros/defmethod [[:inner 0]]
methodical.macros/defmulti [[:inner 0]]
saml20-clj.sp.response/validate-confirmation-datas [[:block 1]]
toucan2.connection/with-transaction [[:block 1]]
toucan2.core/build [[:block 0]]
toucan2.core/compile [[:block 0]]
toucan2.core/debug [[:block 0]]
toucan2.core/define-after-insert [[:inner 0]]
toucan2.core/define-after-select [[:inner 0]]
toucan2.core/define-after-update [[:inner 0]]
toucan2.core/define-before-delete [[:inner 0]]
toucan2.core/define-before-insert [[:inner 0]]
toucan2.core/define-before-select [[:inner 0]]
toucan2.core/define-default-fields [[:inner 0]]
toucan2.core/define-named-query [[:block 1]]
toucan2.core/deftransforms [[:block 1]]
toucan2.core/with-transaction [[:block 1]]
toucan2.tools.after/define-after-impl [[:default]]
toucan2.tools.after-insert/define-after-insert [[:inner 0]]
toucan2.tools.after-select/define-after-select [[:inner 0]]
toucan2.tools.after-update/define-after-update [[:inner 0]]
toucan2.tools.before-delete/define-before-delete [[:inner 0]]
toucan2.tools.before-insert/define-before-insert [[:inner 0]]
toucan2.tools.before-select/define-before-select [[:inner 0]]
toucan2.tools.compile/build [[:block 0]]
toucan2.tools.compile/compile [[:block 0]]
toucan2.tools.compile/resolved [[:block 0]]
toucan2.tools.debug/debug [[:block 0]]
toucan2.tools.default-fields/define-default-fields [[:inner 0]]
toucan2.tools.named-query/define-named-query [[:block 1]]
toucan2.tools.simple-out-transform/define-out-transform [[:inner 0]]
toucan2.tools.transformed/deftransforms [[:block 1]]
toucan2.tools.with-temp/with-temp [[:inner 0]]
toucan2.util/try-with-error-context [[:inner 0]]}}
metabase-enterprise.cache.config-test/with-temp-persist-models [[:block 1]]
metabase-enterprise.impersonation.util-test/with-impersonations! [[:inner 0]]
metabase-enterprise.sandbox.test-util/with-gtaps! [[:inner 0]]
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! [[:inner 0]]
metabase-enterprise.sandbox.test-util/with-user-attributes [[:block 2]]
metabase-enterprise.serialization.test-util/with-dbs [[:inner 0]]
metabase-enterprise.serialization.test-util/with-random-dump-dir [[:block 1]]
metabase-enterprise.serialization.test-util/with-world [[:block 0]]
metabase-enterprise.sso.integrations.jwt-test/with-users-with-email-deleted [[:block 1]]
metabase-enterprise.test/with-gtaps! [[:inner 0]]
metabase-enterprise.test/with-gtaps-for-user! [[:inner 0]]
metabase-enterprise.test/with-user-attributes [[:block 2]]
metabase.actions.actions-test/with-actions-test-data-and-actions-permissively-enabled [[:block 0]]
metabase.actions.test-util/with-actions [[:block 1]]
metabase.actions.test-util/with-actions-disabled [[:block 0]]
metabase.actions.test-util/with-actions-enabled [[:block 0]]
metabase.actions.test-util/with-actions-test-data [[:inner 0]]
metabase.actions.test-util/with-actions-test-data-and-actions-enabled [[:block 0]]
metabase.actions.test-util/with-actions-test-data-tables [[:block 1]]
metabase.actions.test-util/with-empty-db [[:inner 0]]
metabase.actions.test-util/with-temp-test-data [[:inner 0]]
metabase.api.card-test/with-cards-in-readable-collection [[:block 1]]
metabase.api.card-test/with-cards-in-writeable-collection [[:block 1]]
metabase.api.card-test/with-ordered-items [[:inner 0]]
metabase.api.card-test/with-temp-native-card! [[:block 1]]
metabase.api.card-test/with-temp-native-card-with-params! [[:block 1]]
metabase.api.collection-test/with-collection-hierarchy [[:block 1]]
metabase.api.collection-test/with-french-user-and-personal-collection [[:block 2]]
metabase.api.collection-test/with-some-children-of-collection [[:block 1]]
metabase.api.common/check [[:default]]
metabase.api.common/define-routes [[:block 0]]
metabase.api.common/let-404 [[:block 1]]
metabase.cmd.copy/step [[:block 1]]
metabase.cmd.copy/with-connection-rollback-only [[:block 1]]
metabase.cmd.copy/with-disabled-db-constraints [[:block 2]]
metabase.config/build-type-case [[:block 0]]
metabase.dashboard-subscription-test/with-link-card-fixture-for-dashboard [[:block 2]]
metabase.db.liquibase/with-liquibase [[:block 1]]
metabase.db.liquibase/with-scope-locked [[:block 1]]
metabase.db.schema-migrations-test.impl/test-migrations [[:block 2]]
metabase.db/with-application-db [[:inner 0]]
metabase.driver.bigquery-cloud-sdk.query-processor/with-temporal-type [[:default]]
metabase.driver.druid.client/DELETE [[:default]]
metabase.driver.druid.client/GET [[:default]]
metabase.driver.druid.client/POST [[:default]]
metabase.driver.druid.query-processor-test/druid-query [[:block 0]]
metabase.driver.druid.query-processor-test/druid-query-returning-rows [[:block 0]]
metabase.driver.mongo.query-processor/mongo-let [[:block 1]]
metabase.driver.sql-jdbc.actions/with-jdbc-transaction [[:block 1]]
metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection [[:block 1]]
metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info [[:block 1]]
metabase.driver.sql.query-processor/apply-top-level-clause [[:default]]
metabase.driver/with-driver [[:block 1]]
metabase.embedding.api.embed-test/do-response-formats [[:block 1]]
metabase.embedding.api.embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-card-referencing [[:block 3]]
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing [[:block 3]]
metabase.embedding.api.embed-test/with-new-secret-key [[:block 0]]
metabase.embedding.api.embed-test/with-temp-card [[:block 1]]
metabase.embedding.api.embed-test/with-temp-dashcard [[:block 1]]
metabase.embedding.api.preview-embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
metabase.embedding.api.preview-embed-test/with-new-secret-key [[:block 0]]
metabase.lib.binning/with-binning [[:default]]
metabase.lib.core/with-binning [[:default]]
metabase.lib.core/with-join-alias [[:default]]
metabase.lib.core/with-join-conditions [[:default]]
metabase.lib.join/with-join-alias [[:default]]
metabase.lib.join/with-join-conditions [[:default]]
metabase.lib.test-util.macros/$ids [[:inner 0]]
metabase.lib.test-util.macros/mbql-query [[:inner 0]]
metabase.lib.util.match/match [[:inner 0]]
metabase.lib.util.match/match-one [[:inner 0]]
metabase.lib.util.match/replace [[:inner 0]]
metabase.lib.util.match/replace-in [[:inner 0]]
metabase.models.collection-test/with-collection-hierarchy [[:block 1]]
metabase.models.collection-test/with-current-user-perms-for-collections [[:block 1]]
metabase.models.collection-test/with-personal-and-impersonal-collections [[:block 1]]
metabase.models.dashboard-test/with-dash-in-collection [[:inner 0]]
metabase.models.interface/define-batched-hydration-method [[:inner 0]]
metabase.models.interface/define-simple-hydration-method [[:inner 0]]
metabase.models.params.chain-filter-test/with-clean-field-values-for-field [[:block 1]]
metabase.models.params.chain-filter-test/with-fk-field-to-field-remapping [[:block 0]]
metabase.models.params.chain-filter-test/with-human-readable-values-remapping [[:block 0]]
metabase.permissions.core/allow-changing-all-users-group-members [[:block 0]]
metabase.permissions.core/disable-perms-cache [[:block 0]]
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing [[:block 3]]
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing [[:block 3]]
metabase.public-sharing.api-test/with-temp-public-card [[:block 1]]
metabase.public-sharing.api-test/with-temp-public-dashboard [[:block 1]]
metabase.public-sharing.api-test/with-temp-public-dashboard-and-card [[:block 1]]
metabase.pulse.api.alert-test/with-alert-in-collection [[:block 1]]
metabase.pulse.models.pulse-test/with-dashboard-subscription-in-collection [[:block 1]]
metabase.pulse.models.pulse-test/with-pulse-in-collection [[:inner 0]]
metabase.query-processor-test.pipeline-queries-test/pmbql-query [[:block 1]]
metabase.query-processor-test.pipeline-queries-test/run-pmbql-query [[:block 1]]
metabase.query-processor.debug/debug> [[:block 0]]
metabase.query-processor.error-type/deferror [[:block 1]]
metabase.query-processor.middleware.cache-backend.interface/with-cached-results [[:block 4]]
metabase.query-processor.middleware.process-userland-query-test/with-query-execution [[:block 1]]
metabase.query-processor.store/cached [[:block 1]]
metabase.query-processor.store/with-metadata-provider [[:inner 0]]
metabase.query-processor.streaming/streaming-response [[:block 1]]
metabase.query-processor.test-util/format-rows-by [[:default]]
metabase.request.core/as-admin [[:block 0]]
metabase.request.core/with-current-request [[:inner 0]]
metabase.request.core/with-current-user [[:inner 0]]
metabase.request.core/with-limit-and-offset [[:inner 0]]
metabase.request.session/as-admin [[:block 0]]
metabase.request.session/with-current-user [[:inner 0]]
metabase.sample-data-test/with-temp-sample-database-db [[:block 1]]
metabase.search.api-test/do-test-users [[:block 1]]
metabase.server.middleware.session/as-admin [[:block 0]]
metabase.server.middleware.session/with-current-user [[:inner 0]]
metabase.server.streaming-response-test/with-streaming-response-thread-pool [[:block 0]]
metabase.server.streaming-response-test/with-test-driver-db! [[:block 0]]
metabase.server.streaming-response/streaming-response [[:block 2]]
metabase.session.api/http-401-on-error [[:block 0]]
metabase.settings.core/define-multi-setting [[:inner 0]]
metabase.settings.core/defsetting [[:block 1]]
metabase.settings.models.setting.multi-setting/define-multi-setting [[:inner 0]]
metabase.settings.models.setting/defsetting [[:block 1]]
metabase.sync.fetch-metadata/log-if-error [[:block 1]]
metabase.sync.sync-metadata.fields-test/with-test-db [[:block 0]]
metabase.sync.util/do-with-start-and-finish-debug-logging [[:default]]
metabase.sync.util/sum-for [[:block 1]]
metabase.sync.util/sync-operation [[:block 3]]
metabase.sync.util/with-db-logging-disabled [[:default]]
metabase.sync.util/with-duplicate-ops-prevented [[:default]]
metabase.sync.util/with-emoji-progress-bar [[:block 1]]
metabase.sync.util/with-error-handling [[:block 1]]
metabase.sync.util/with-start-and-finish-logging [[:default]]
metabase.sync.util/with-start-and-finish-logging* [[:default]]
metabase.sync.util/with-sync-events [[:default]]
metabase.task-history.models.task-history/with-task-history [[:block 1]]
metabase.task/rerun-on-error [[:block 1]]
metabase.test.data.datasets/test-driver [[:inner 0]]
metabase.test.data.datasets/test-drivers [[:inner 0]]
metabase.test.data.one-off-dbs/with-blank-db [[:block 0]]
metabase.test.data.one-off-dbs/with-blueberries-db [[:block 0]]
metabase.test.data.users/with-test-user [[:inner 0]]
metabase.test.data/$ids [[:inner 0]]
metabase.test.data/dataset [[:inner 0]]
metabase.test.data/mbql-query [[:inner 0]]
metabase.test.data/native-query [[:block 0]]
metabase.test.data/query [[:block 1]]
metabase.test.data/run-mbql-query [[:inner 0]]
metabase.test.data/with-empty-h2-app-db [[:block 0]]
metabase.test.data/with-temp-copy-of-db [[:block 0]]
metabase.test.util.public-settings/with-additional-premium-features [[:block 1]]
metabase.test.util.public-settings/with-premium-features [[:block 1]]
metabase.test.util.thread-local/test-helpers-set-global-values! [[:block 0]]
metabase.test.util/discard-setting-changes [[:block 1]]
metabase.test.util/let-url [[:block 1]]
metabase.test.util/throw-if-called! [[:block 1]]
metabase.test.util/with-temp-scheduler [[:block 0]]
metabase.test.util/with-temp-vals-in-db [[:block 3]]
metabase.test.util/with-user-in-groups [[:inner 0]]
metabase.test/$ids [[:inner 0]]
metabase.test/as-admin [[:inner 0]]
metabase.test/dataset [[:inner 0]]
metabase.test/discard-setting-changes [[:block 1]]
metabase.test/format-rows-by [[:default]]
metabase.test/let-url [[:block 1]]
metabase.test/mbql-query [[:inner 0]]
metabase.test/native-query [[:block 0]]
metabase.test/query [[:block 1]]
metabase.test/run-mbql-query [[:inner 0]]
metabase.test/test-driver [[:inner 0]]
metabase.test/test-drivers [[:inner 0]]
metabase.test/test-helpers-set-global-values! [[:block 0]]
metabase.test/throw-if-called! [[:block 1]]
metabase.test/with-actions [[:block 1]]
metabase.test/with-actions-disabled [[:block 0]]
metabase.test/with-actions-enabled [[:block 0]]
metabase.test/with-actions-test-data [[:inner 0]]
metabase.test/with-actions-test-data-and-actions-enabled [[:block 0]]
metabase.test/with-actions-test-data-tables [[:block 1]]
metabase.test/with-additional-premium-features [[:block 1]]
metabase.test/with-current-user [[:inner 0]]
metabase.test/with-driver [[:block 1]]
metabase.test/with-empty-db [[:inner 0]]
metabase.test/with-empty-h2-app-db [[:block 0]]
metabase.test/with-metadata-provider [[:inner 0]]
metabase.test/with-premium-features [[:block 1]]
metabase.test/with-temp [[:inner 0]]
metabase.test/with-temp-copy-of-db [[:block 0]]
metabase.test/with-temp-scheduler [[:block 0]]
metabase.test/with-temp-test-data [[:inner 0]]
metabase.test/with-temp-vals-in-db [[:block 3]]
metabase.test/with-test-user [[:inner 0]]
metabase.test/with-user-in-groups [[:inner 0]]
metabase.timeseries-query-processor-test.util/test-timeseries-drivers [[:block 0]]
metabase.timeseries-query-processor-test/run-mbql-query [[:inner 0]]
metabase.upload-test/with-upload-table! [[:inner 0]]
metabase.upload.types/with-currency [[:default]]
metabase.upload.types/with-parens [[:default]]
metabase.util.async/cancelable-thread [[:block 0]]
metabase.util.date-2/with-time-zone-same-instant [[:default]]
metabase.util.encryption-test/with-secret-key [[:block 1]]
metabase.util.honey-sql-2/with-database-type-info [[:default]]
metabase.util.i18n/deferred-trs [[:default]]
metabase.util.i18n/deferred-tru [[:default]]
metabase.util.i18n/trs [[:default]]
metabase.util.i18n/trsn [[:default]]
metabase.util.i18n/tru [[:default]]
metabase.util.i18n/trun [[:default]]
metabase.util.jvm/auto-retry [[:block 1]]
metabase.util.jvm/varargs [[:block 1]]
metabase.util.jvm/with-us-locale [[:block 0]]
metabase.util.malli/disable-enforcement [[:block 0]]
metabase.util.malli/with [[:default]]
metabase.util.malli/with-api-error-message [[:default]]
metabase.util.namespaces/import-fns [[:default]]
metabase.util.queue-test/await-test-while [[:block 1]]
metabase.util/auto-retry [[:block 1]]
metabase.util/case-enum [[:block 1]]
metabase.util/ignore-exceptions [[:block 0]]
metabase.util/or-with [[:block 1]]
metabase.util/profile [[:block 1]]
metabase.util/prog1 [[:inner 0]]
metabase.util/varargs [[:inner 0]]
metabase.util/with-us-locale [[:block 0]]
metabuild-common.core/exit-when-finished-nonzero-on-exception [[:block 0]]
metabuild-common.core/step [[:block 1]]
metabuild-common.entrypoint/exit-when-finished-nonzero-on-exception [[:block 0]]
metabuild-common.steps/step [[:block 1]]
methodical.core/defmethod [[:inner 0]]
methodical.core/defmulti [[:inner 0]]
methodical.core/with-dispatcher [[:default]]
methodical.core/with-method-table [[:default]]
methodical.core/with-prefers [[:default]]
methodical.interface/with-dispatcher [[:default]]
methodical.interface/with-method-table [[:default]]
methodical.interface/with-prefers [[:default]]
methodical.macros/defmethod [[:inner 0]]
methodical.macros/defmulti [[:inner 0]]
saml20-clj.sp.response/validate-confirmation-datas [[:block 1]]
toucan2.connection/with-transaction [[:block 1]]
toucan2.core/build [[:block 0]]
toucan2.core/compile [[:block 0]]
toucan2.core/debug [[:block 0]]
toucan2.core/define-after-insert [[:inner 0]]
toucan2.core/define-after-select [[:inner 0]]
toucan2.core/define-after-update [[:inner 0]]
toucan2.core/define-before-delete [[:inner 0]]
toucan2.core/define-before-insert [[:inner 0]]
toucan2.core/define-before-select [[:inner 0]]
toucan2.core/define-default-fields [[:inner 0]]
toucan2.core/define-named-query [[:block 1]]
toucan2.core/deftransforms [[:block 1]]
toucan2.core/with-transaction [[:block 1]]
toucan2.tools.after-insert/define-after-insert [[:inner 0]]
toucan2.tools.after-select/define-after-select [[:inner 0]]
toucan2.tools.after-update/define-after-update [[:inner 0]]
toucan2.tools.after/define-after-impl [[:default]]
toucan2.tools.before-delete/define-before-delete [[:inner 0]]
toucan2.tools.before-insert/define-before-insert [[:inner 0]]
toucan2.tools.before-select/define-before-select [[:inner 0]]
toucan2.tools.compile/build [[:block 0]]
toucan2.tools.compile/compile [[:block 0]]
toucan2.tools.compile/resolved [[:block 0]]
toucan2.tools.debug/debug [[:block 0]]
toucan2.tools.default-fields/define-default-fields [[:inner 0]]
toucan2.tools.named-query/define-named-query [[:block 1]]
toucan2.tools.simple-out-transform/define-out-transform [[:inner 0]]
toucan2.tools.transformed/deftransforms [[:block 1]]
toucan2.tools.with-temp/with-temp [[:inner 0]]
toucan2.util/try-with-error-context [[:inner 0]]}}

View File

@@ -1,11 +1,11 @@
FROM mcr.microsoft.com/vscode/devcontainers/java:11
FROM mcr.microsoft.com/vscode/devcontainers/java:21
# Set up nodesource, install node, yarn, fontconfig for static viz, rlwrap for dev ergonomics
RUN ( curl -fsSL https://deb.nodesource.com/setup_18.x | bash ) \
RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash ) \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-key adv --refresh-keys --keyserver keyserver.ubuntu.com \
&& apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig
# install Clojure
RUN curl https://download.clojure.org/install/linux-install-1.11.1.1262.sh | bash
RUN curl https://download.clojure.org/install/linux-install-1.12.0.1488.sh | bash

View File

@@ -6,7 +6,7 @@
// can use this flag to enable it. This is set to true in CI
const shouldLintCssModules =
process.env.LINT_CSS_MODULES === "true" || process.env.CI;
const plugins = ["react", "no-only-tests"];
const plugins = ["react", "no-only-tests","ttag"];
if (shouldLintCssModules) {
plugins.push("postcss-modules");
}

2
.github/CODEOWNERS vendored
View File

@@ -7,7 +7,7 @@ frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion @metabase/embed
frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard @metabase/embedding
frontend/src/metabase/ui @metabase/core-frontend-admin-webapp
# snowplow/* @metabase/data
src/metabase/analytics/prometheus.clj @metabase/cloud-ops
.github @metabase/devexp
.clj-kondo @metabase/devexp
deps.edn @metabase/backend-developers

View File

@@ -1,116 +0,0 @@
name: Build ee-extra
description: Build Metabase Enterprise Edition with extra features
inputs:
java-version:
required: true
default: 21
iam-role:
description: "The IAM role to assume"
required: true
runs:
using: composite
steps:
- name: Prepare Java
uses: actions/setup-java@v3
with:
java-version: ${{ inputs.java-version }}
distribution: 'temurin'
- name: Reveal its original version.properties
run: jar xf ./bin/docker/metabase.jar version.properties && cat version.properties
shell: bash
- name: get major version
id: major_version
run: echo "major_version=$(cat version.properties | grep 'tag=' | cut -d'.' -f2)" >> $GITHUB_OUTPUT
shell: bash
- name: get drivers registry
run: |
curl -OL https://raw.githubusercontent.com/metabase/metabase-registry/main/registry.yaml
shell: bash
- uses: actions/setup-node@v4
with:
node-version: lts/Jod # 22.x.x
- run: rm package.json && npm install yaml
shell: bash
- name: parse drivers registry
uses: actions/github-script@v7
id: drivers_registry
with:
script: | # js
const { parse } = require('yaml');
const fs = require('fs');
const registry = parse(fs.readFileSync('registry.yaml', 'utf8'));
const drivers = registry.drivers;
const majorVersion = '${{ steps.major_version.outputs.major_version }}';
const getDriverUrl = (driverName) => {
const driver = drivers.find(driver => driver.name === driverName);
if (!driver) {
throw new Error(`Driver ${driverName} not found in the registry`);
}
const driverUrl = driver.versions[majorVersion] ?? driver.versions.default;
if (!driverUrl) {
throw new Error(`Driver ${driverName} version ${majorVersion} not found in the registry`);
}
return driverUrl;
};
const extraDrivers = {
firebolt: getDriverUrl('firebolt'),
starburst: getDriverUrl('starburst'),
clickhouse: getDriverUrl('clickhouse'),
materialize: getDriverUrl('materialize'),
};
console.log(extraDrivers);
return extraDrivers;
- name: Download Firebolt driver
run: |
curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).firebolt }}
working-directory: modules
shell: bash
- name: Download Starburst driver
run: |
curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).starburst }}
shell: bash
working-directory: modules
- name: Download Clickhouse driver
run: |
curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).clickhouse }}
shell: bash
working-directory: modules
- name: Download Materialize driver
run: |
curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).materialize }}
shell: bash
working-directory: modules
- name: Bundle additional drivers into the Uberjar
run: jar uf bin/docker/metabase.jar modules/*.jar
shell: bash
- name: Launch uberjar
run: >-
java --add-opens java.base/java.nio=ALL-UNNAMED -jar ./bin/docker/metabase.jar &
shell: bash
- name: Wait for Metabase to start
run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
shell: bash
- name: Kill the java process
run: pkill -f metabase.jar
shell: bash
- name: configure aws credentials
if: ${{ github.ref_name == 'master' }}
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ inputs.iam-role }}
role-session-name: GitHub_to_AWS_via_FederatedOIDC
aws-region: us-east-1
- name: Login to Amazon ECR
if: ${{ github.ref_name == 'master' }}
uses: aws-actions/amazon-ecr-login@v2

View File

@@ -1,5 +1,13 @@
name: Notify Pull Request
inputs:
remove-previous-comment:
required: false
type: boolean
default: false
add-new-comment:
required: false
type: boolean
default: true
message:
required: true
include-log:
@@ -9,7 +17,44 @@ inputs:
runs:
using: "composite"
steps:
- uses: actions/github-script@v7
- name: Remove previous pull-request comment
uses: actions/github-script@v7
if: ${{ inputs.remove-previous-comment == 'true' && always() && github.event_name == 'pull_request' }}
with:
script: |
const pr = context.payload.pull_request ?? context.payload.issue;
if (!pr) {
console.error("This action can only be run on pull requests");
return;
}
const { owner, repo } = context.repo;
const { data: comments } = await github.rest.issues.listComments({
owner,
repo,
issue_number: pr.number,
}).catch(console.error);
if (!comments) {
return;
}
const message = "${{ inputs.message }}";
const comment = comments.find((comment) => comment.body.includes(message));
if (comment) {
await github.rest.issues.deleteComment({
owner,
repo,
comment_id: comment.id,
});
}
- name: Notify pull-request
uses: actions/github-script@v7
if: ${{ inputs.add-new-comment == 'true' && always() && github.event_name == 'pull_request' }}
id: notify-pull-request
with:
result-encoding: string
@@ -21,7 +66,7 @@ runs:
return;
}
const message = "${{ inputs.message }}"
const message = "${{ inputs.message }}";
const shouldIncludeLog = ${{ inputs.include-log }}.toString() === "true";
const author = context.payload.sender.login;

View File

@@ -18,6 +18,9 @@ inputs:
required: true
trunk-api-token:
required: true
variant:
required: false
default: ''
runs:
using: "composite"
@@ -49,6 +52,7 @@ runs:
uses: trunk-io/analytics-uploader@main
with:
junit-paths: ${{ inputs.input-path }}
variant: ${{ inputs.variant || inputs.output-name }}
org-slug: metabase
token: ${{ inputs.trunk-api-token }}
continue-on-error: true

View File

@@ -33,13 +33,14 @@ frontend_sources: &frontend_sources
- ".nvmrc"
frontend_embedding_sdk_sources:
- "enterprise/frontend/src/embedding-sdk/**"
- *frontend_sources
frontend_specs: &frontend_specs
- *shared_specs
- "frontend/test/**"
- "frontend/**/tests/**"
- "frontend/**/*.unit.*"
- ".github/**/*.unit.spec.*"
- "jest.config.js"
- "jest.tz.unit.conf.json"
@@ -109,9 +110,6 @@ e2e_ci: &e2e_ci
e2e_specs: &e2e_specs
- "**/*.cy.*.js"
- "**/*.cy.*.ts"
- "e2e/runner/**"
- "e2e/support/**"
- "e2e/snapshot*/**"
e2e_cross_version: &e2e_cross_version
- ".github/workflows/e2e-cross-version.yml"
@@ -122,12 +120,14 @@ e2e_all:
- *e2e_ci
- *sources
- *e2e_specs
- "e2e/**"
snowplow:
- ".github/workflows/snowplow.yml"
- "snowplow/**"
documentation:
- ".typedoc/**"
- "docs/**"
- "**/*.md"

84
.github/scripts/build-e2e-matrix.js vendored Executable file
View File

@@ -0,0 +1,84 @@
// This script is used in .github/workflows/e2e-matrix-builder.yml
// its aim is to split the e2e test matrix into multiple jobs
// grouping some specific tests together, other tests are split into chunks
const DEFAULT_SPEC_PATTERN = "./e2e/test/scenarios/**/*.cy.spec.*";
const EMBEDDING_SDK_SPEC_PATTERN =
"./e2e/test/scenarios/embedding-sdk/**.cy.spec.*";
const specialTestConfigs = [
{
name: "embedding-sdk",
specs: EMBEDDING_SDK_SPEC_PATTERN,
},
{
name: "oss-subset",
edition: "oss",
tags: "@OSS @smoke+-@EE",
specs: DEFAULT_SPEC_PATTERN,
},
{ name: "mongo", tags: "@mongo", specs: DEFAULT_SPEC_PATTERN },
];
/**
*
* @param {*} inputSpecs - specs, which were changed in the PR, separated by comma
* .e.g e2e/test/scenarios/onboarding/command-palette.cy.spec.js,e2e/test/scenarios/question/document-title.cy.spec.js
* or a pattern like DEFAULT_SPEC_PATTERN
*/
function buildMatrix(options, inputSpecs, inputChunks) {
const { java, defaultRunner } = options;
// number of specs per chunk when running specific specs
const SPECS_PER_CHUNK = 5;
const defaultOptions = {
"java-version": java,
runner: defaultRunner,
edition: "ee",
};
const isDefaultSpecPattern =
inputSpecs === "" || inputSpecs === DEFAULT_SPEC_PATTERN;
console.log("Processed specs value:", inputSpecs);
console.log("Is default pattern:", isDefaultSpecPattern);
let regularChunks;
if (isDefaultSpecPattern) {
regularChunks = inputChunks - specialTestConfigs.length;
} else {
// when pattern is not default, it means we passed some custom list of the changed specs
// so we need to calculate how many chunks we need to run
const matchingSpecsCount = inputSpecs.split(",").length;
regularChunks = Math.max(
1,
Math.ceil(matchingSpecsCount / SPECS_PER_CHUNK),
);
}
const regularTests = new Array(regularChunks).fill(1).map((files, index) => ({
name: `e2e-group-${index + 1}`,
// works when specs less than 5, otherwise seems all chunks will contain
// same specs
...(!isDefaultSpecPattern && {
specs: inputSpecs
.split(",")
.slice(SPECS_PER_CHUNK * index, SPECS_PER_CHUNK * (index + 1))
.join(","),
}),
}));
const testSets = isDefaultSpecPattern
? regularTests.concat(specialTestConfigs)
: regularTests;
const config = testSets.map((options) => ({
...defaultOptions,
...options,
}));
return { config, regularChunks, isDefaultSpecPattern };
}
module.exports = { buildMatrix };

View File

@@ -0,0 +1,97 @@
const { buildMatrix } = require("./build-e2e-matrix");
describe("buildMatrix", () => {
const options = {
java: "11",
defaultRunner: "ubuntu-22.04",
};
const testBuildMatrix = (entry, chunks) =>
buildMatrix(options, entry, chunks);
it("should calculate correct regular chunks with default parameters", () => {
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 30);
expect(result.regularChunks).toBe(27);
});
it("should create correct number of configuration objects", () => {
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 10);
expect(result.config.length).toBe(10);
});
it("should apply default specs path when empty entry is provided", () => {
const result = testBuildMatrix("", 5);
expect(result.regularChunks).toBe(2);
expect(result.config.length).toBe(5);
});
it("should name regular test groups sequentially", () => {
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 10);
const regularTests = result.config.filter((cfg) =>
cfg.name.startsWith("e2e-group-"),
);
regularTests.forEach((test, index) => {
expect(test.name).toBe(`e2e-group-${index + 1}`);
});
});
it("should handle case when input chunks equals special tests count", () => {
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 3);
expect(result.regularChunks).toBe(0);
expect(result.config.length).toBe(3);
expect(result.config[0].name).toBe("embedding-sdk");
expect(result.config[1].name).toBe("oss-subset");
expect(result.config[2].name).toBe("mongo");
});
it("should correctly calculate regularChunks for non-default spec pattern", () => {
const entry = "file.cy.spec.js,".repeat(12).slice(0, -1);
const result = testBuildMatrix(entry, 10);
// For 12 matching specs with SPECS_PER_CHUNK=5, we expect ceil(12/5) = 3 chunks
expect(result.regularChunks).toBe(3);
const firstGroupSpecs = result.config[0].specs.split(",").length;
const secondGroupSpecs = result.config[1].specs.split(",").length;
const thirdGroupSpecs = result.config[2].specs.split(",").length;
expect(firstGroupSpecs).toBe(5);
expect(secondGroupSpecs).toBe(5);
expect(thirdGroupSpecs).toBe(2);
});
it("should return isDefaultSpecPattern as true when empty or default value is provided", () => {
let result = testBuildMatrix("", 5);
expect(result.isDefaultSpecPattern).toBe(true);
result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 5);
expect(result.isDefaultSpecPattern).toBe(true);
});
it("should return isDefaultSpecPattern as false when non-default spec pattern is provided", () => {
const result = testBuildMatrix("test1.cy.spec.js,test2.cy.spec.js", 1);
expect(result.isDefaultSpecPattern).toBe(false);
});
it("should return special test configs when default spec pattern is provided", () => {
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 50);
expect(result.config[47].name).toBe("embedding-sdk");
expect(result.config[48].name).toBe("oss-subset");
expect(result.config[49].name).toBe("mongo");
});
it("should not return special test configs when non-default spec pattern is provided", () => {
const result = testBuildMatrix("test1.cy.spec.js,test2.cy.spec.js", 50);
expect(result.config.length).toBe(1);
expect(result.config[0].name).toBe("e2e-group-1");
});
});

View File

@@ -75,6 +75,14 @@ async function link_issues(github) {
console.log('PR Info:\n' + JSON.stringify(prInfo, null, 2) + "\n");
if (prInfo &&
prInfo.data &&
prInfo.data.labels &&
prInfo.data.labels.some(label => label.name === "no-auto-issue-links")) {
console.log('PR has "no-auto-issue-links" label, skipping...');
return;
}
const prUrl = prInfo.data.html_url;
console.log(`Processing PR: ${prUrl}`);
@@ -153,7 +161,9 @@ async function link_issues(github) {
// Generate closing references
const closingRefs = issueNumbersToAdd.map(num => `closes #${num}`).join(' ');
newBody = `<!-- Added by 'Add Issue References to PR' GitHub Action -->${closingRefs}\n` + newBody;
const messagePreamble = "<!-- Added by 'Add Issue References to PR' GitHub Action. To disable linking, add 'no-auto-issue-links' label to your PR. -->"
newBody = `${messagePreamble} ${closingRefs}\n` + newBody;
// Update PR body with new closing references
await github.rest.issues.update({

12
.github/team.json vendored
View File

@@ -86,6 +86,18 @@
"camsaul",
"escherize"
]
},
{
"name": "Metabot",
"label": ".Team/Metabot",
"members": [
"somtom"
]
},
{
"name": "Product Growth",
"label": ".Team/ProductGrowth",
"members": ["nemanjaglumac"]
}
]
}

View File

@@ -24,7 +24,7 @@ jobs:
with:
m2-cache-key: 'kondo'
- name: Run clj-kondo
run: ./bin/kondo.sh
run: ./bin/mage kondo
be-linter-eastwood:
if: ${{ !inputs.skip }}
@@ -40,27 +40,6 @@ jobs:
- run: clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:eastwood
name: Run Eastwood linter
mage-tests:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
name: Mage
steps:
- uses: actions/checkout@v4
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: 'kondo'
- name: Setup Babashka
uses: turtlequeue/setup-babashka@v1.7.0
with:
babashka-version: 1.12.197
- name: Check bb runs
run: bb --version
- name: bb task list
run: bb tasks
- name: Run mage tests
run: bb ./test/mage/core_test.clj
be-tests:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
@@ -206,7 +185,7 @@ jobs:
with:
m2-cache-key: 'cljfmt'
- name: Run cljfmt
run: clojure -T:cljfmt check
run: ./bin/mage cljfmt-all --force-check
be-tests-result:
needs:

View File

@@ -18,7 +18,6 @@ jobs:
timeout-minutes: 3
outputs:
frontend_all: ${{ steps.changes.outputs.frontend_all }}
e2e_specs: ${{ steps.changes.outputs.e2e_specs }}
steps:
- uses: actions/checkout@v4
- name: Test which files changed

View File

@@ -13,6 +13,9 @@ on:
type: string
commit:
type: string
release:
type: string
default: 'true'
workflow_dispatch:
inputs:
artifact-name:
@@ -56,7 +59,7 @@ jobs:
const version = "${{ inputs.tag }}".split('-')[0];
if (!isValidVersionString(version)) {
return "linux/amd64";
return "linux/amd64,linux/arm64";
}
// versions before 53 need to be handled differently
const buildInfo = getBuildRequirements(version);
@@ -66,8 +69,8 @@ jobs:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_RELEASE_USERNAME }}
password: ${{ secrets.DOCKERHUB_RELEASE_TOKEN }}
username: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_USERNAME || secrets.DOCKERHUB_USERNAME }}
password: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_TOKEN || secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
if: contains(steps.platforms.outputs.result, 'arm')
uses: docker/setup-qemu-action@v3
@@ -103,8 +106,8 @@ jobs:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_RELEASE_USERNAME }}
password: ${{ secrets.DOCKERHUB_RELEASE_TOKEN }}
username: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_USERNAME || secrets.DOCKERHUB_USERNAME }}
password: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_TOKEN || secrets.DOCKERHUB_TOKEN }}
- name: Pull the container image
run: docker pull ${{ inputs.repo }}:${{ inputs.tag }}
- name: Launch container
@@ -123,8 +126,8 @@ jobs:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_RELEASE_USERNAME }}
password: ${{ secrets.DOCKERHUB_RELEASE_TOKEN }}
username: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_USERNAME || secrets.DOCKERHUB_USERNAME }}
password: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_TOKEN || secrets.DOCKERHUB_TOKEN }}
- name: Pull the container image
run: docker pull ${{ inputs.repo }}:${{ inputs.tag }}
- name: Launch container

View File

@@ -0,0 +1,34 @@
name: Docs Bump Detected
on:
pull_request:
paths:
- 'docs/**'
jobs:
push_workflow_to_docs_metabase_github_io_job:
runs-on: ubuntu-latest
steps:
- name: Report changed docs files exist
run: |
echo "A change in the docs directory was detected."
- name: Trigger repo dispatch
uses: actions/github-script@v7
env:
BRANCH_NAME: ${{ github.head_ref || github.ref }}
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: | #js
if (process.env.BRANCH_NAME === "master" ||
/^release-x\.\d+\.x$/.test(process.env.BRANCH_NAME)) {
github.rest.repos.createDispatchEvent({
owner: "${{ github.repository_owner }}",
repo: "docs.metabase.github.io",
event_type: "docs_update",
client_payload: { branch_name: process.env.BRANCH_NAME
}
});
} else {
console.log("Branch name is not to be published: ", process.env.BRANCH_NAME);
}

View File

@@ -12,33 +12,6 @@ concurrency:
cancel-in-progress: true
jobs:
be-tests-h2:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
name: H2
steps:
- uses: actions/checkout@v4
- name: Test H2 driver
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-h2'
test-args: >-
:only-tags [:mb/driver-tests]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-athena-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
@@ -108,6 +81,53 @@ jobs:
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-clickhouse-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
DRIVERS: clickhouse
MB_CLICKHOUSE_TEST_HOST: localhost
MB_CLICKHOUSE_TEST_PORT: 8123
MB_CLICKHOUSE_TEST_OLD_PORT: 8124
MB_CLICKHOUSE_TEST_NGINX_PORT: 8127
name: Clickhouse
steps:
- uses: actions/checkout@v4
- name: Add ClickHouse TLS instance to /etc/hosts
run: |
sudo echo "127.0.0.1 server.clickhouseconnect.test" | sudo tee -a /etc/hosts
- name: Start ClickHouse in Docker
uses: hoverkraft-tech/compose-action@v2.0.0
with:
compose-file: "modules/drivers/clickhouse/docker-compose.yml"
down-flags: "--volumes"
services: |
clickhouse
clickhouse_tls
clickhouse_older_version
clickhouse_cluster_node1
clickhouse_cluster_node2
nginx
- name: Test Clickhouse driver
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-clickhouse-ee'
test-args: >-
:only-tags [:mb/driver-tests]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-druid-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
@@ -143,6 +163,41 @@ jobs:
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-druid-jdbc-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
DRIVERS: druid-jdbc
services:
druid:
image: metabase/druid:29.0.1-json-no-ingestion
ports:
- "8888:8888"
env:
CLUSTER_SIZE: nano-quickstart
name: Druid (JDBC)
steps:
- uses: actions/checkout@v4
- name: Test Druid JDBC driver
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-druid-jdbc-ee'
test-args: >-
:only-tags [:mb/driver-tests]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-databricks-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
@@ -177,27 +232,54 @@ jobs:
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-druid-jdbc-ee:
be-tests-databricks-multi-catalog-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
DRIVERS: druid-jdbc
services:
druid:
image: metabase/druid:29.0.1-json-no-ingestion
ports:
- "8888:8888"
env:
CLUSTER_SIZE: nano-quickstart
name: Druid (JDBC)
DRIVERS: databricks
MB_DATABRICKS_TEST_MULTI_LEVEL_SCHEMA: true
MB_DATABRICKS_TEST_HOST: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HOST }}
MB_DATABRICKS_TEST_HTTP_PATH: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HTTP_PATH }}
MB_DATABRICKS_TEST_TOKEN: ${{ secrets.MB_DATABRICKS_JDBC_TEST_TOKEN }}
MB_DATABRICKS_TEST_CATALOG: 'metabase_ci'
MB_DATABRICKS_TEST_CLIENT_ID: ${{ secrets.MB_DATABRICKS_JDBC_TEST_CLIENT_ID }}
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
name: Databricks (Multi-Catalog)
steps:
- uses: actions/checkout@v4
- name: Test Druid JDBC driver
- name: Test Databricks driver with multi-catalog
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-druid-jdbc-ee'
junit-name: 'be-tests-databricks-multi-catalog-ee'
test-args: >-
:only-tags [:mb/driver-tests]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-h2:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
name: H2
steps:
- uses: actions/checkout@v4
- name: Test H2 driver
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-h2'
test-args: >-
:only-tags [:mb/driver-tests]
- name: Upload Test Results
@@ -1004,53 +1086,6 @@ jobs:
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
be-tests-clickhouse-ee:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
DRIVERS: clickhouse
MB_CLICKHOUSE_TEST_HOST: localhost
MB_CLICKHOUSE_TEST_PORT: 8123
MB_CLICKHOUSE_TEST_OLD_PORT: 8124
MB_CLICKHOUSE_TEST_NGINX_PORT: 8127
name: Clickhouse
steps:
- uses: actions/checkout@v4
- name: Add ClickHouse TLS instance to /etc/hosts
run: |
sudo echo "127.0.0.1 server.clickhouseconnect.test" | sudo tee -a /etc/hosts
- name: Start ClickHouse in Docker
uses: hoverkraft-tech/compose-action@v2.0.0
with:
compose-file: "modules/drivers/clickhouse/docker-compose.yml"
down-flags: "--volumes"
services: |
clickhouse
clickhouse_tls
clickhouse_older_version
clickhouse_cluster_node1
clickhouse_cluster_node2
nginx
- name: Test Clickhouse driver
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-clickhouse-ee'
test-args: >-
:only-tags [:mb/driver-tests]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
drivers-tests-result:
needs:
# if you add a driver job, you must add it to this list for it to be a required check

View File

@@ -1,13 +1,7 @@
name: E2E Cross-version Component Tests for Embedding SDK
on:
push:
branches:
- "release-**"
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
branches:
- "release-**"
workflow_call:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
@@ -66,8 +60,7 @@ jobs:
build:
needs: [files-changed, get-build-requirements]
if: |
!cancelled() &&
github.event.pull_request.draft == false
!cancelled()
runs-on: ubuntu-22.04
timeout-minutes: 25
env:

View File

@@ -2,6 +2,10 @@ name: E2E Component Tests for Embedding SDK
on:
workflow_call:
inputs:
cached-embedding-sdk-dist-artifact-name:
required: true
type: string
jobs:
files-changed:
@@ -88,45 +92,11 @@ jobs:
with:
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar
build-embedding-sdk:
needs: [files-changed, get-build-requirements]
if: |
!cancelled() &&
needs.files-changed.outputs.e2e_all == 'true'
runs-on: ubuntu-22.04
timeout-minutes: 15
env:
MB_EDITION: ee
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: "cljs"
- name: Compile CLJS
run: yarn build-pure:cljs
shell: bash
- name: Build Embedding SDK package
run: yarn build-embedding-sdk
- name: Upload Embedding SDK artifact
uses: actions/upload-artifact@v4
with:
name: embedding-sdk-build
path: resources/embedding-sdk
e2e-tests:
needs: [get-build-requirements, build-uberjar, build-embedding-sdk]
needs: [get-build-requirements, build-uberjar]
if: |
!cancelled() &&
needs.build-uberjar.result == 'success' &&
needs.build-embedding-sdk.result == 'success'
needs.build-uberjar.result == 'success'
runs-on: ubuntu-22.04
timeout-minutes: 45
strategy:
@@ -179,11 +149,11 @@ jobs:
with:
m2-cache-key: "cljs"
- name: Download Embedding SDK artifact
- name: Retrieve Embedding SDK dist artifact
uses: actions/download-artifact@v4
with:
name: embedding-sdk-build
path: resources/embedding-sdk
name: ${{ inputs.cached-embedding-sdk-dist-artifact-name }}
path: ${{ github.workspace }}/resources/embedding-sdk
- name: Run Metabase
run: node e2e/runner/run_cypress_ci.js start

View File

@@ -0,0 +1,69 @@
name: E2E Cross-version Tests
on:
workflow_dispatch:
inputs:
fe-ref:
description: "Frontend git ref to use"
type: string
required: true
default: "master"
be-ref:
description: "Backend git ref to use"
type: string
required: true
default: "master"
workflow_call:
inputs:
fe-ref:
description: "Frontend git ref to use"
type: string
required: true
be-ref:
description: "Backend git ref to use"
type: string
required: true
jobs:
cross-version-for-breaking-changes:
runs-on: ubuntu-22.04
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Prepare frontend environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: cross-version-uberjar
- name: Build jar with different frontend and backend version
env:
MB_EDITION: ee
CYPRESS_CI: true
run: |
bash bin/backward-compatibility-test.sh \
${{ inputs.fe-ref }} ${{ inputs.be-ref }} \
build
- name: Prepare Cypress environment
id: cypress-prep
uses: ./.github/actions/prepare-cypress
- name: Run the tests
env:
MB_EDITION: ee
CYPRESS_ALL_FEATURES_TOKEN: ${{ secrets.ENTERPRISE_TOKEN }}
CYPRESS_NO_FEATURES_TOKEN: ${{ secrets.E2E_STARTER_TOKEN }}
CYPRESS_CI: true
run: |
bash bin/backward-compatibility-test.sh \
${{ inputs.fe-ref }} ${{ inputs.be-ref }} \
start > /dev/null & \
bash bin/backward-compatibility-test.sh \
${{ inputs.fe-ref }} ${{ inputs.be-ref }} \
test

View File

@@ -7,11 +7,17 @@ on:
required: true
type: number
default: 30
specs:
required: false
type: string
default: "./e2e/test/scenarios/**/*.cy.spec.*"
outputs:
matrix:
value: ${{ jobs.build-matrix.outputs.matrix }}
regularChunks:
value: ${{ jobs.build-matrix.outputs.regularChunks }}
isDefaultSpecPattern:
value: ${{ jobs.build-matrix.outputs.isDefaultSpecPattern }}
jobs:
build-matrix:
@@ -20,53 +26,38 @@ jobs:
outputs:
matrix: ${{ steps.matrix.outputs.config }}
regularChunks: ${{ steps.matrix.outputs.regularChunks }}
isDefaultSpecPattern: ${{ steps.matrix.outputs.isDefaultSpecPattern }}
steps:
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
with:
node-version: '22.x'
- uses: actions/github-script@v7
sparse-checkout: |
.github
sparse-checkout-cone-mode: false
- uses: actions/setup-node@v4
with:
node-version: lts/Jod # 22.x.x
- name: Build e2e matrix
uses: actions/github-script@v7
id: matrix
env:
chunks: ${{ inputs.chunks }}
with:
script: | # js
const { buildMatrix } = require('${{ github.workspace }}/.github/scripts/build-e2e-matrix.js');
const inputSpecs = "${{ inputs.specs }}";
const inputChunks = Number(process.env.chunks);
const java = 21;
const defaultRunner = "ubuntu-22.04";
const defaultOptions = {
"java-version": java,
runner: defaultRunner,
edition: "ee",
const options = {
java,
defaultRunner,
};
const allSpecs = "./e2e/test/scenarios/**/*.cy.spec.*";
// see config.js function getSplittableSpecs for logic that excludes some tests from auto splitting
const specialTests = [
{ name: "embedding-sdk", specs: "./e2e/test/scenarios/embedding-sdk/**.cy.spec.*" },
{ name: "oss-subset", edition: 'oss', tags: "@OSS @smoke+-@EE", specs: allSpecs },
{ name: "mongo", tags: "@mongo", specs: allSpecs },
];
const inputChunks = Number(process.env.chunks);
const regularChunks = inputChunks - specialTests.length;
const regularTests = new Array(regularChunks).fill(1)
.map((files, index) => ({
name: `e2e-group-${index + 1}`,
}));
// regular chunks need to come before special chunks
const testSets = [...regularTests, ...specialTests];
const config = testSets.map((options) => ({
...defaultOptions,
...options,
}));
const { config, regularChunks, isDefaultSpecPattern } = buildMatrix(options, inputSpecs, inputChunks);
core.setOutput("regularChunks", JSON.stringify(regularChunks));
core.setOutput("config", JSON.stringify({ include: config }));
core.setOutput("isDefaultSpecPattern", JSON.stringify(isDefaultSpecPattern));
console.log({ regularChunks });
console.log("matrix config", config);
console.log("isDefaultSpecPattern", isDefaultSpecPattern);

View File

@@ -6,7 +6,7 @@ on:
- "master"
- "release-**"
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
types: [opened, synchronize, reopened]
branches:
- "master"
- "release-**"
@@ -24,8 +24,8 @@ env:
[
"shoppy-e2e"
]
SAMPLE_APP_MAIN_BRANCH_NAME: 'main'
SAMPLE_APP_STABLE_RELEASE_BRANCH_NAME_SUFFIX: 'stable'
SAMPLE_APP_MAIN_BRANCH_NAME: "main"
SAMPLE_APP_STABLE_RELEASE_BRANCH_NAME_SUFFIX: "stable"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
@@ -150,7 +150,6 @@ jobs:
needs: [files-changed, get-build-requirements, get-sample-apps-data]
if: |
!cancelled() &&
github.event.pull_request.draft == false &&
needs.files-changed.outputs.e2e_all == 'true' &&
fromJSON(needs.get-sample-apps-data.outputs.matrix)[0] != null
runs-on: ubuntu-22.04
@@ -219,8 +218,9 @@ jobs:
TZ: US/Pacific # to make node match the instance tz
# Sample Apps testing variables
CYPRESS_CI: true
TEST_SUITE: ${{ matrix.test_suite }}
SAMPLE_APP_BRANCH_NAME: ${{ needs.get-sample-apps-data.outputs.branch_name }}
permissions:
id-token: write
steps:
- uses: actions/checkout@v4
@@ -246,6 +246,7 @@ jobs:
- name: Check if sample app branch exists
id: check-sample-app-branch
run: |
TEST_SUITE="${{ matrix.test_suite }}"
REPO_NAME="${TEST_SUITE%-e2e}"
REPO_URL="https://github.com/metabase/${REPO_NAME}.git"
echo "Checking if branch '${SAMPLE_APP_BRANCH_NAME}' exists in ${REPO_URL}..."
@@ -255,9 +256,29 @@ jobs:
echo "sample_app_branch_exists=false" >> $GITHUB_OUTPUT
fi
- name: Prepare and launch Sample Apps
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' }}
run: npx tsx ./e2e/runner/start-sample-app-containers/start-ci.ts
- name: Configure AWS credentials
if: ${{ matrix.test_suite == 'shoppy-e2e' }}
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.SHOPPY_IAM_ROLE }}
role-session-name: GitHub_to_AWS_via_FederatedOIDC
aws-region: us-east-1
- name: Download Shoppy's App DB PostgreSQL dump from S3
if: ${{ matrix.test_suite == 'shoppy-e2e' }}
run: |
aws s3 cp s3://${{ secrets.SHOPPY_METABASE_APP_DB_S3_BUCKET }}/${{ secrets.SHOPPY_METABASE_APP_DB_S3_KEY }} ./e2e/tmp/db_dumps/shoppy_metabase_app_db_dump.sql
- name: Prepare and launch Sample Apps for shoppy-e2e test suite
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && matrix.test_suite == 'shoppy-e2e' }}
env:
METABASE_APP_DB_USER: ${{ secrets.SHOPPY_METABASE_APP_DB_USER }}
METABASE_APP_DB: ${{ secrets.SHOPPY_METABASE_APP_DB_DATABASE }}
run: npx tsx ./e2e/runner/start-sample-app-containers/start-ci.ts shoppy-e2e
- name: Prepare and launch Sample Apps for other test suites
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && matrix.test_suite != 'shoppy-e2e' }}
run: npx tsx ./e2e/runner/start-sample-app-containers/start-ci.ts ${{ matrix.test_suite }}
- name: Run e2e tests for Sample App
id: run-e2e-tests

View File

@@ -30,6 +30,11 @@ on:
- none
- sql
- mongo
enable_network_throttling:
description: "Enable network throttling simulation (4g slow like in chrome dev tools)"
type: boolean
required: false
default: true
jobs:
workflow-summary:
@@ -46,6 +51,7 @@ jobs:
echo '- `burn_in`: ${{ inputs.burn_in }}' >> $GITHUB_STEP_SUMMARY
echo '- `grep`: "${{ inputs.grep }}"' >> $GITHUB_STEP_SUMMARY
echo '- `qa_db`: "${{ inputs.qa_db }}"' >> $GITHUB_STEP_SUMMARY
echo '- `enable_network_throttling`: "${{ inputs.enable_network_throttling }}"' >> $GITHUB_STEP_SUMMARY
echo '' >> $GITHUB_STEP_SUMMARY
echo 'triggered by: @${{ github.event.sender.login }}' >> $GITHUB_STEP_SUMMARY
@@ -62,6 +68,7 @@ jobs:
MB_SNOWPLOW_AVAILABLE: true
MB_SNOWPLOW_URL: "http://localhost:9090" # Snowplow micro
MB_EDITION: ${{ inputs.mb_edition }}
CYPRESS_ENABLE_NETWORK_THROTTLING: ${{ inputs.enable_network_throttling }}
TERM: xterm
TZ: US/Pacific # to make node match the instance tz
steps:
@@ -106,10 +113,12 @@ jobs:
# For all options and fine-grained control, take a look at the documentation
# https://github.com/cypress-io/cypress/tree/develop/npm/grep
- name: Stress-test ${{ github.event.inputs.spec }} ${{ github.event.inputs.burn_in }} times
env:
GREP: ${{ github.event.inputs.grep }}
run: |
node e2e/runner/run_cypress_ci.js e2e \
--spec '${{ github.event.inputs.spec }}' \
--env burn=${{ github.event.inputs.burn_in }},grep='${{ github.event.inputs.grep }}' \
--env burn=${{ github.event.inputs.burn_in }} \
--config-file e2e/support/cypress-stress-test.config.js \
--browser ${{ steps.cypress-prep.outputs.chrome-path }}

View File

@@ -49,6 +49,7 @@ jobs:
CYPRESS_PULL_REQUEST_ID: ${{ github.event.pull_request.number || '' }}
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message || github.event.head.sha }}
MB_EXPERIMENTAL_SEARCH_BLOCK_ON_QUEUE: true
MB_SEARCH_ENGINE: appdb
MB_SNOWPLOW_AVAILABLE: true
MB_SNOWPLOW_URL: "http://localhost:9090" # Snowplow micro
TZ: US/Pacific # to make node match the instance tz
@@ -156,6 +157,7 @@ jobs:
with:
input-path: ./target/junit
output-name: e2e-${{ inputs.name }}
variant: e2e-tests
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}

View File

@@ -6,6 +6,10 @@ on:
skip:
type: boolean
default: false
specs:
type: string
required: false
default: ""
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-e2e
@@ -16,6 +20,7 @@ jobs:
uses: ./.github/workflows/e2e-matrix-builder.yml
with:
chunks: 50
specs: ${{ inputs.specs }}
# if this is a test on a release branch, we need to check the build requirements
get-build-requirements:
@@ -75,7 +80,7 @@ jobs:
- name: Build uberjar with ./bin/build.sh
timeout-minutes: 10
run: ./bin/build.sh
run: ./bin/build.sh
shell: bash
- name: Prepare uberjar artifact
@@ -139,14 +144,16 @@ jobs:
flaky-e2e-tests:
name: Flaky e2e Tests
uses: ./.github/workflows/e2e-test.yml
needs: build
needs:
- build
- e2e-matrix-builder
# skip flaky test run if only e2e specs changed as an optimization
if: |
!cancelled() && needs.build.result == 'success'
!cancelled() && needs.build.result == 'success' && needs.e2e-matrix-builder.outputs.isDefaultSpecPattern == 'true'
secrets: inherit
with:
name: Flaky
tags: "@flaky"
specs: "./e2e/test/scenarios/**/*.cy.spec.*"
e2e-tests-result:
needs:

View File

@@ -6,7 +6,7 @@ on:
- "master"
- "release-**"
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
types: [opened, synchronize, reopened]
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
@@ -29,11 +29,14 @@ jobs:
token: ${{ github.token }}
filters: .github/file-paths.yaml
embedding-sdk-cli-snippets-type-check:
needs: [ files-changed ]
if: needs.files-changed.outputs.frontend_embedding_sdk_sources == 'true'
build:
needs: [files-changed]
if: |
!cancelled() &&
(needs.files-changed.outputs.frontend_embedding_sdk_sources == 'true' ||
needs.files-changed.outputs.documentation == 'true')
runs-on: ubuntu-22.04
timeout-minutes: 20
timeout-minutes: 25
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
@@ -42,44 +45,114 @@ jobs:
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: "cljs"
- name: Compile CLJS
run: yarn build-pure:cljs
shell: bash
- name: Build Embedding SDK package
run: yarn build-embedding-sdk
- name: Prepare Embedding SDK artifact
uses: actions/upload-artifact@v4
with:
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
path: resources/embedding-sdk
embedding-sdk-cli-snippets-type-check:
needs: [files-changed, build]
if: |
needs.files-changed.outputs.frontend_embedding_sdk_sources == 'true' &&
needs.build.result == 'success'
runs-on: ubuntu-22.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Retrieve Embedding SDK dist artifact
uses: actions/download-artifact@v4
with:
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
path: ${{ github.workspace }}/resources/embedding-sdk
- name: Run frontend embedding SDK snippets type check
run: yarn run embedding-sdk:cli-snippets:type-check
embedding-sdk-docs-snippets-type-check:
needs: [ files-changed ]
if: needs.files-changed.outputs.documentation == 'true'
needs: [files-changed, build]
if: |
needs.files-changed.outputs.documentation == 'true' &&
needs.build.result == 'success'
runs-on: ubuntu-22.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Retrieve Embedding SDK dist artifact
uses: actions/download-artifact@v4
with:
m2-cache-key: "cljs"
- name: Compile CLJS
run: yarn build-pure:cljs
shell: bash
- name: Build Embedding SDK package
run: yarn build-embedding-sdk
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
path: ${{ github.workspace }}/resources/embedding-sdk
- name: Run frontend embedding SDK snippets type check
run: yarn run embedding-sdk:docs-snippets:type-check
embedding-sdk-no-exposed-internal-types-validate:
needs: [files-changed, build]
if: |
needs.files-changed.outputs.frontend_embedding_sdk_sources == 'true' &&
needs.build.result == 'success'
runs-on: ubuntu-22.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Retrieve Embedding SDK dist artifact
uses: actions/download-artifact@v4
with:
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
path: ${{ github.workspace }}/resources/embedding-sdk
- name: Run no exposed internal types validation
run: |
output="$(yarn embedding-sdk:docs:generate:pure --emit none 2>&1)" || {
if [[ "$output" == *"not included in the documentation"* ]]; then
echo "$output"
exit 1
fi
}
- name: Comment on PR if docs need update
uses: ./.github/actions/notify-pull-request
if: success() || failure()
with:
remove-previous-comment: true
add-new-comment: ${{ job.status == 'failure' }}
message: "📝 One or more internal Metabase types were accidentally exported from the `@metabase/embedding‑sdk‑react` package in this pull request.<br/><br/>Publishing these types would change the public API and may drastically change generated SDK documentation.<br/><br/>Please update the code so internal types remain private and the public API stays unchanged."
include-log: true
sdk-e2e-tests:
uses: ./.github/workflows/e2e-component-tests-embedding-sdk.yml
needs: [build]
secrets: inherit
with:
cached-embedding-sdk-dist-artifact-name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
e2e-component-tests-embedding-sdk-cross-version:
if: ${{ startsWith(inputs.branch, 'release-x.') }}
uses: ./.github/workflows/e2e-component-tests-embedding-sdk-cross-version.yml
secrets: inherit
cross-version-for-breaking-changes:
if: github.event_name == 'pull_request' && startsWith(inputs.branch, 'release-x.')
uses: ./.github/workflows/e2e-cross-version-for-breaking-changes.yml
secrets: inherit
with:
fe-ref: ${{ github.base_ref }}
be-ref: ${{ github.head_ref }}
embedding-sdk-tests-result:
needs:
- embedding-sdk-cli-snippets-type-check
- embedding-sdk-docs-snippets-type-check
- embedding-sdk-no-exposed-internal-types-validate
- sdk-e2e-tests
- e2e-component-tests-embedding-sdk-cross-version
if: always() && !cancelled()
runs-on: ubuntu-latest
timeout-minutes: 5

View File

@@ -6,6 +6,9 @@ on:
skip:
type: boolean
default: false
skip-lint:
type: boolean
default: false
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-frontend
@@ -13,7 +16,7 @@ concurrency:
jobs:
fe-lint:
if: ${{ !inputs.skip }}
if: ${{ !inputs.skip-lint }}
runs-on: ubuntu-22.04
timeout-minutes: 20
steps:

View File

@@ -13,7 +13,7 @@ on:
- "frontend/src/metabase-lib/expressions/**"
jobs:
fe-fuzz-tokenizer:
fe-fuzz-lexifier:
runs-on: ubuntu-22.04
timeout-minutes: 15
steps:
@@ -24,10 +24,10 @@ jobs:
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: "cljs"
- run: yarn test-unit frontend/src/metabase-lib/v1/expressions/tokenizer/fuzz.unit.spec.ts
- run: yarn test-unit frontend/src/metabase-lib/v1/expressions/pratt/fuzz.lexifier.unit.spec.ts
env:
MB_FUZZ: 1
name: Run fuzz testing on the tokenizer
name: Run fuzz testing on the lexifier
fe-fuzz-compiler:
runs-on: ubuntu-22.04
@@ -44,3 +44,19 @@ jobs:
env:
MB_FUZZ: 1
name: Run fuzz testing on the custom expression compiler
fe-fuzz-string-quoting:
runs-on: ubuntu-22.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: "cljs"
- run: yarn test-unit frontend/src/metabase-lib/v1/expressions/fuzz.string.unit.spec.ts
env:
MB_FUZZ: 1
name: Run fuzz testing on the custom expression string quoter

27
.github/workflows/mage.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: Mage Tests
on:
pull_request:
paths: ["mage/**", "test/mage/**"]
jobs:
# run mage tests even if the rest of be isnt needed
mage-tests:
runs-on: ubuntu-22.04
name: Mage
steps:
- uses: actions/checkout@v4
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
with:
m2-cache-key: 'kondo'
- name: Setup Babashka
uses: turtlequeue/setup-babashka@v1.7.0
with:
babashka-version: 1.12.197
- name: Check bb runs
run: bb --version
- name: bb task list
run: bb tasks
- name: Run mage tests
run: bb ./test/mage/runtests.clj

View File

@@ -19,4 +19,4 @@ jobs:
with:
m2-cache-key: lint-migrations
- name: Verify Liquibase Migrations
run: ./bin/lint-migrations-file.sh
run: ./bin/mage lint-migrations

View File

@@ -15,6 +15,7 @@ on:
- release-x.52.x
- release-x.53.x
- release-x.54.x
- metabot-v3-main
concurrency:
# We want to ensure only one job is running at a time per branch because
@@ -391,7 +392,7 @@ jobs:
run: |
echo //registry.npmjs.org/:_authToken=${{ secrets.NPM_RELEASE_TOKEN }} > .npmrc
# Please keep the value in sync with `inputs.branch`'s release branch
npm publish --tag ${{fromJson('{"master": "nightly", "release-x.51.x": "51-stable", "release-x.52.x": "52-stable", "release-x.53.x": "53-stable", "release-x.54.x": "54-stable"}')[inputs.branch]}}
npm publish --tag ${{fromJson('{"master": "nightly", "release-x.51.x": "51-stable", "release-x.52.x": "52-stable", "release-x.53.x": "53-stable", "release-x.54.x": "54-stable", "metabot-v3-main": "55-metabot"}')[inputs.branch]}}
- name: Add `latest` tag to the latest release branch (`release-x.54.x`) deployment
if: ${{ inputs.branch == 'release-x.54.x' }}

View File

@@ -359,6 +359,29 @@ jobs:
runs-on: ubuntu-22.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: release
- name: Prepare build scripts
run: cd ${{ github.workspace }}/release && yarn && yarn build
- name: Find milestone
id: find-milestone
uses: actions/github-script@v7
with:
script: | # js
const { findMilestone } = require('${{ github.workspace }}/release/dist/index.cjs');
const version = '${{ inputs.version }}';
const milestone = await findMilestone({
github,
owner: context.repo.owner,
repo: context.repo.repo,
version,
}).catch(console.error);
console.log("Milestone:", milestone.number);
core.setOutput('milestone', milestone.number);
- uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
@@ -372,6 +395,10 @@ jobs:
event_type: 'create-release-issues',
client_payload: {
version: enterpriseVersion,
runId: '${{ github.run_id }}',
releaseSha: '${{ inputs.commit }}',
userName: '${{ github.actor }}',
milestone: '${{ steps.find-milestone.outputs.milestone }}',
}
});
@@ -416,6 +443,7 @@ jobs:
- name: Publish draft release notes to github
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
result-encoding: string
script: | # js
const {

View File

@@ -15,6 +15,9 @@ jobs:
timeout-minutes: 5
outputs:
e2e_all: ${{ steps.changes.outputs.e2e_all }}
e2e_all_files: ${{ steps.changes.outputs.e2e_all_files }}
e2e_specs: ${{ steps.changes.outputs.e2e_specs }}
e2e_specs_files: ${{ steps.changes.outputs.e2e_specs_files }}
backend_all: ${{ steps.changes.outputs.backend_all }}
frontend_all: ${{ steps.changes.outputs.frontend_all }}
frontend_sources: ${{ steps.changes.outputs.frontend_sources }}
@@ -25,6 +28,8 @@ jobs:
id: changes
with:
token: ${{ github.token }}
# comma separated list of files
list-files: csv
filters: .github/file-paths.yaml
static-viz-files-changed:
@@ -79,6 +84,7 @@ jobs:
secrets: inherit
with:
skip: ${{ needs.files-changed.outputs.frontend_all != 'true' }}
skip-lint: ${{ needs.files-changed.outputs.frontend_all != 'true' && needs.files-changed.outputs.e2e_specs != 'true' }}
e2e-tests:
needs: files-changed
@@ -86,3 +92,8 @@ jobs:
secrets: inherit
with:
skip: ${{ needs.files-changed.outputs.e2e_all != 'true' }}
# here we pass result from files-changed, which is a list of files, comma separated
# e.g. e2e/test/scenarios/onboarding/command-palette.cy.spec.js,e2e/test/scenarios/question/document-title.cy.spec.js
# e2e_all_files includes all changes which trigger all e2e tests, if the list of changes files is included in the
# list of changed specs files, then only specs are changed and we can run only those specs
specs: ${{ needs.files-changed.outputs.e2e_all_files == needs.files-changed.outputs.e2e_specs_files && needs.files-changed.outputs.e2e_specs_files || '' }}

View File

@@ -24,6 +24,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
@@ -53,6 +54,8 @@ jobs:
-e=uz
- name: Prepare translation resources
env:
GITHUB_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
run: | # sh
git config user.name github-actions
git config user.email github-actions@github.com
@@ -85,6 +88,8 @@ jobs:
- name: Open PR
id: create_pr
env:
GITHUB_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
run: | # sh
DATE=$(date +'%Y-%m-%d')
@@ -103,7 +108,7 @@ jobs:
- name: Auto approve PR
uses: juliangruber/approve-pull-request-action@v1
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
github-token: ${{ secrets.GITHUB_TOKEN }}
number: ${{ steps.create_pr.outputs.pr_number }}
- name: Enable Pull Request Automerge

View File

@@ -1,12 +1,14 @@
name: Build + Docker Uberjar
# This workflow builds an uberjar and pushes it to dockerhub for any branch, either on-demand,
# or automatically for the listed branches
on:
push:
branches:
- "master"
- metabot-v3-second-try
- master
- feature-visualizer
- "internal-tools"
- internal-tools
paths-ignore:
# config files
- ".**"
@@ -23,16 +25,63 @@ on:
description: "Optional full-length commit SHA-1 hash"
jobs:
get-container-info:
runs-on: ubuntu-22.04
timeout-minutes: 5
name: Get container info
outputs:
editions: ${{ toJson(fromJson(steps.info.outputs.result).editions) }}
ee: ${{ toJson(fromJson(steps.info.outputs.result).ee) }}
oss: ${{ toJson(fromJson(steps.info.outputs.result).oss) }}
steps:
- name: Get docker repo and tag
id: info
uses: actions/github-script@v7
with:
script: | # js
const branch = '${{ github.head_ref || github.ref_name }}';
const owner = '${{ github.repository_owner }}';
console.log(`Branch: ${branch}`);
if (branch === "master") {
return {
editions: ["ee", "oss"],
ee: {
repo: `${owner}/metabase-enterprise-head`,
tag: "latest"
},
oss: {
repo: `${owner}/metabase-head`,
tag: "latest"
}
};
}
return {
editions: ["ee"],
ee: {
repo: `${owner}/metabase-dev`,
tag: branch.replaceAll("/", "-"), // slashes make docker sad
},
};
- name: Print output
run: |
echo "${{ steps.info.outputs.result }}"
build:
needs: get-container-info
name: Build MB ${{ matrix.edition }}
runs-on: ubuntu-22.04
timeout-minutes: 15
strategy:
matrix:
edition: [ee, oss]
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
env:
MB_EDITION: ${{ matrix.edition }}
INTERACTIVE: false
SKIP_LICENSES: true # faster builds for dev
steps:
- name: Check out the code
uses: actions/checkout@v4
@@ -50,16 +99,16 @@ jobs:
- name: Prepare uberjar artifact
uses: ./.github/actions/prepare-uberjar-artifact
with:
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
check_jar_health:
check-jar-health:
runs-on: ubuntu-22.04
name: Is ${{ matrix.edition }} (java ${{ matrix.java-version }}) healthy?
needs: build
needs: [build, get-container-info]
timeout-minutes: 10
strategy:
matrix:
edition: [ee, oss]
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
java-version: [21]
steps:
- name: Prepare JRE (Java Run-time Environment)
@@ -72,286 +121,51 @@ jobs:
- uses: actions/download-artifact@v4
name: Retrieve uberjar artifact
with:
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
- name: Launch uberjar
run: >-
java --add-opens java.base/java.nio=ALL-UNNAMED -jar ./target/uberjar/metabase.jar &
- name: Wait for Metabase to start
run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
containerize_test_and_push_container:
runs-on: ubuntu-22.04
name: Containerize ${{ matrix.edition }}
needs: check_jar_health
containerize:
needs: [check-jar-health, get-container-info]
strategy:
matrix:
edition: [ee, oss, ee-extra]
fail-fast: false
services:
registry:
image: registry:2
ports:
- 5000:5000
permissions:
id-token: write
contents: read
security-events: write
steps:
- name: Extract and clean branch name
shell: bash
run: echo "branch=$(echo $GITHUB_REF_NAME | sed 's/[^-._a-zA-Z0-9]/-/g')" >> $GITHUB_OUTPUT
id: extract_branch
- name: Verify the intended tag of the container image
run: echo "Container image will be tagged as ${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}"
- name: Check out the code (Dockerfile needed)
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.commit }}
- name: Download uploaded artifacts to insert into container
if: ${{ matrix.edition != 'ee-extra' }}
uses: actions/download-artifact@v4
with:
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
path: bin/docker/
- name: Download uploaded artifacts to insert into container
if: ${{ matrix.edition == 'ee-extra' }}
uses: actions/download-artifact@v4
with:
name: metabase-ee-${{ github.sha }}-uberjar
path: bin/docker/
- name: Move the ${{ matrix.edition }} uberjar to the context dir
run: mv bin/docker/target/uberjar/metabase.jar bin/docker/.
- name: Add partner drivers to the container
if: ${{ matrix.edition == 'ee-extra' }}
uses: ./.github/actions/build-ee-extra
with:
iam-role: ${{ secrets.METABASE_EE_EXTRA_IAM_ROLE }}
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2.5.0
with:
driver-opts: network=host
- name: Build ${{ matrix.edition }} container
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
network: host
tags: localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: true
push: true
- name: Launch ${{ matrix.edition }} container
run: docker run --rm -dp 3000:3000 localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}
timeout-minutes: 5
- name: Is Docker running?
run: docker ps
- name: Wait for Metabase to start and reach 100% health
run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
timeout-minutes: 3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
uses: ./.github/workflows/containerize-jar.yml
secrets: inherit
with:
artifact-name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
commit: ${{ github.event.inputs.commit || github.sha }}
repo: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).repo }}
tag: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).tag }}
release: "false"
- name: Retag and push images if master (ee) - should be cached at this point
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee' }}
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
network: host
tags: ${{ github.repository_owner }}/metabase-enterprise-head:latest
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: false
push: true
# TODO: remove when we're done testing metabot
- name: Retag and push images if metabot-v3-second-try (ee) - should be cached at this point
if: ${{ (github.ref_name == 'metabot-v3-second-try') && matrix.edition == 'ee' }}
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
network: host
tags: ${{ github.repository_owner }}/metabase-enterprise-head:metabot
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: false
push: true
- name: Retag and push images if master (oss) - should be cached at this point
if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
network: host
tags: ${{ github.repository_owner }}/metabase-head:latest
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: false
push: true
- name: Retag and push images if master (ee-extra) - should be cached at this point
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee-extra' }}
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
network: host
tags: ${{ secrets.METABASE_EE_EXTRA_CONTAINER_REGISTRY }}/metabase-enterprise-head:latest
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: false
push: true
- name: Retag and push images if dev branch - should be cached at this point
if: ${{ !(startsWith(github.ref_name,'master') || startsWith(github.ref_name,'backport')) && matrix.edition == 'ee-extra' }}
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
network: host
tags: ${{ github.repository_owner }}/metabase-dev:${{ steps.extract_branch.outputs.branch }}
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: false
push: true
- name: Run Trivy vulnerability scanner if master (ee)
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee' }}
uses: aquasecurity/trivy-action@0.29.0
env:
TRIVY_OFFLINE_SCAN: true
with:
image-ref: docker.io/${{ github.repository_owner }}/metabase-enterprise-head:latest
format: sarif
output: trivy-results.sarif
version: "v0.57.1"
- name: Run Trivy vulnerability scanner if master (oss)
if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
uses: aquasecurity/trivy-action@0.29.0
env:
TRIVY_OFFLINE_SCAN: true
with:
image-ref: docker.io/${{ github.repository_owner }}/metabase-head:latest
format: sarif
output: trivy-results.sarif
version: "v0.57.1"
- name: Run Trivy vulnerability scanner if dev branch
if: ${{ !(startsWith(github.ref_name,'master') || startsWith(github.ref_name,'backport')) && matrix.edition == 'ee' }}
uses: aquasecurity/trivy-action@0.29.0
env:
TRIVY_OFFLINE_SCAN: true
with:
version: "v0.57.1"
image-ref: docker.io/${{ github.repository_owner }}/metabase-dev:${{ steps.extract_branch.outputs.branch }}
format: sarif
output: trivy-results.sarif
- name: Upload Trivy scan results to GitHub Security tab if master (ee)
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee' }}
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "trivy-results.sarif"
- name: Upload Trivy scan results to GitHub Security tab if master (oss)
if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "trivy-results.sarif"
- name: Upload Trivy scan results to GitHub Security tab if dev branch
if: ${{ !(startsWith(github.ref_name,'master') || startsWith(github.ref_name,'backport')) && matrix.edition == 'ee' }}
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "trivy-results.sarif"
containerize_multi_arch:
runs-on: ubuntu-22.04
name: Containerize multi-arch ${{ matrix.edition }}
needs: check_jar_health
run-trivy:
needs: [get-container-info, containerize]
strategy:
matrix:
edition: [ee, oss]
services:
registry:
image: registry:2
ports:
- 5000:5000
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
runs-on: ubuntu-22.04
name: Run Trivy vulnerability scanner
steps:
- name: Extract and clean branch name
shell: bash
run: echo "branch=$(echo $GITHUB_REF_NAME | sed 's/[^-._a-zA-Z0-9]/-/g')" >> $GITHUB_OUTPUT
id: extract_branch
- name: Verify the intended tag of the container image
run: echo "Container image will be tagged as ${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}"
- name: Check out the code (Dockerfile needed)
- name: Check out the code
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.commit }}
- name: Download uploaded artifacts to insert into container
uses: actions/download-artifact@v4
ref: ${{ github.event.inputs.commit || github.sha }}
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.29.0
env:
TRIVY_OFFLINE_SCAN: true
repo: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).repo }}
tag: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).tag }}
with:
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
path: bin/docker/
- name: Move the ${{ matrix.edition }} uberjar to the context dir
run: mv bin/docker/target/uberjar/metabase.jar bin/docker/.
# We need it for multi-arch build
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
image-ref: docker.io/${{ env.repo }}:${{ env.tag }}
format: sarif
output: trivy-results.sarif
version: "v0.57.1"
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v3
with:
platforms: "arm64"
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2.5.0
with:
driver-opts: network=host
# Build experimental ubuntu-based images only for master
- name: Build ${{ matrix.edition }} Ubuntu based multi-arch container
uses: docker/build-push-action@v3
with:
context: bin/docker/.
platforms: linux/amd64,linux/arm64
file: bin/docker/Dockerfile_ubuntu
network: host
tags: localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}-ubuntu
build-args: |
GIT_COMMIT_SHA=${{ github.sha }}
no-cache: true
push: true
- name: Launch ${{ matrix.edition }} Ubuntu based container
run: docker run --rm -dp 3001:3000 localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}-ubuntu
timeout-minutes: 5
- name: Is Docker with Ubuntu running?
run: docker ps
- name: Wait for Ubuntu-based Metabase container to start and reach 100% health
run: while ! curl 'http://localhost:3001/api/health' | grep '{"status":"ok"}'; do sleep 1; done
timeout-minutes: 3
- name: Login to Docker Hub
if: ${{ github.ref_name == 'master' }}
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Push experimental ubuntu image only for versions based on a master
- name: Install regctl
if: ${{ github.ref_name == 'master' }}
uses: regclient/actions/regctl-installer@main
with:
release: "v0.4.7"
- name: Switch regctl to point to localhost:5000 via http
if: ${{ github.ref_name == 'master' }}
run: regctl registry set --tls disabled localhost:5000
- name: Retag and push ubuntu-based images if master (ee)
if: ${{ (matrix.edition == 'ee') && (github.ref_name == 'master') }}
run: regctl image copy localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-ee-ubuntu ${{ github.repository_owner }}/metabase-enterprise-head:latest-ubuntu
- name: Retag and push ubuntu-based images if master (oss)
if: ${{ (matrix.edition == 'oss') && (github.ref_name == 'master') }}
run: regctl image copy localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-oss-ubuntu ${{ github.repository_owner }}/metabase-head:latest-ubuntu
sarif_file: "trivy-results.sarif"

5
.gitignore vendored
View File

@@ -39,9 +39,13 @@
/docs/**/node_modules
/docs/**/package.json
/docs/**/yarn.lock
/docs/embedding/sdk/api/
/frontend/test/snapshots/*
/e2e/snapshots/*
/e2e/tmp/*
!/e2e/tmp/db_dumps
/e2e/tmp/db_dumps/*
!/e2e/tmp/db_dumps/.gitkeep
/lein-plugins/*/target
/local
/locales/metabase-*.pot
@@ -70,6 +74,7 @@
/storybook-static
/target
/test-report-*
/temp
**/cli-snippets-tmp/**
\#*\#
bin/node_modules/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

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