Compare commits
48 Commits
split-sdk-
...
load-stats
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0815d3471 | ||
|
|
6b27c064dc | ||
|
|
1c5ba041d6 | ||
|
|
86c23eaf5e | ||
|
|
1447d9cf97 | ||
|
|
90688e49a7 | ||
|
|
60f2668137 | ||
|
|
503c3bf068 | ||
|
|
a6de42f467 | ||
|
|
c998859487 | ||
|
|
a491bd11be | ||
|
|
0a30b63176 | ||
|
|
f1ce332568 | ||
|
|
1690028d0f | ||
|
|
0c76874681 | ||
|
|
a6be073fb2 | ||
|
|
cb4541b965 | ||
|
|
463fb9355b | ||
|
|
791b649cc0 | ||
|
|
085418edb8 | ||
|
|
1118c3e897 | ||
|
|
6e74e41eaf | ||
|
|
38404fd9df | ||
|
|
8a7cd79f47 | ||
|
|
f3685652d3 | ||
|
|
08497ded2f | ||
|
|
bfe0b19738 | ||
|
|
a155c1f4ee | ||
|
|
9f48230b57 | ||
|
|
503349c6ae | ||
|
|
4d60c4bcf5 | ||
|
|
d9f905b7da | ||
|
|
36f273d523 | ||
|
|
38cda45f69 | ||
|
|
fc18a66b6c | ||
|
|
433561ad5b | ||
|
|
3c23f921e2 | ||
|
|
7f4883cc49 | ||
|
|
667d038d46 | ||
|
|
19df422bbd | ||
|
|
9fff12013e | ||
|
|
4bc6ccb00c | ||
|
|
81049d6069 | ||
|
|
85ce065045 | ||
|
|
dcb85ae924 | ||
|
|
3403f82c0a | ||
|
|
95306c12fc | ||
|
|
5d1e1ad8f1 |
@@ -149,8 +149,7 @@ ms/NonBlankString ;; Non-empty string
|
||||
ms/BooleanValue ;; String "true"/"false" or boolean
|
||||
ms/MaybeBooleanValue ;; BooleanValue or nil
|
||||
ms/TemporalString ;; ISO-8601 date/time string (for REQUEST params only!)
|
||||
ms/Map ;; Any map
|
||||
ms/JSONString ;; JSON-encoded string
|
||||
ms/OpaqueJSONObject ;; JSON object whose keys are not ours to declare; string-keyed
|
||||
ms/PositiveNum ;; Positive number
|
||||
ms/IntGreaterThanOrEqualToZero ;; 0 or positive
|
||||
```
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
query-processor
|
||||
search
|
||||
settings
|
||||
users
|
||||
util
|
||||
warehouses}
|
||||
:model-exports #{:model/Action}
|
||||
@@ -1446,6 +1447,7 @@
|
||||
transforms
|
||||
transforms-base
|
||||
util
|
||||
warehouse-schema
|
||||
warehouses}
|
||||
:model-exports #{:model/AiUsageLog
|
||||
:model/Metabot
|
||||
@@ -1596,6 +1598,7 @@
|
||||
parameters
|
||||
permissions
|
||||
premium-features
|
||||
queries
|
||||
query-processor
|
||||
request
|
||||
session
|
||||
@@ -1887,6 +1890,7 @@
|
||||
graph
|
||||
lib
|
||||
lib-be
|
||||
lib-metric
|
||||
metrics
|
||||
models
|
||||
parameters
|
||||
@@ -2709,6 +2713,7 @@
|
||||
driver
|
||||
events
|
||||
lib
|
||||
lib-be
|
||||
model-persistence
|
||||
models
|
||||
permissions
|
||||
@@ -2997,6 +3002,7 @@
|
||||
query-processor
|
||||
segments
|
||||
settings
|
||||
types
|
||||
util
|
||||
warehouse-schema}
|
||||
:model-imports #{:model/Card
|
||||
|
||||
2
.github/file-paths.yaml
vendored
@@ -159,6 +159,8 @@ project_backend_checks:
|
||||
- "modules/**/*.cljc"
|
||||
- "modules/**/*.cljs"
|
||||
- "**deps.edn"
|
||||
- ".clj-kondo/{src,test}/**/*.{clj,cljc,cljs}"
|
||||
- "{resources,test_resources,test_config}/**/*.{clj,cljc,cljs}"
|
||||
- ".clj-kondo/config.edn"
|
||||
- ".clj-kondo/config/modules/config.edn"
|
||||
- ".github/team.json"
|
||||
|
||||
4
.github/scripts/bundle-size-stats-prepare.ts
vendored
@@ -200,7 +200,9 @@ export function main() {
|
||||
// The last plotted point, as slim rows: [{ bundle, kind, rawBytes, gzipBytes, brotliBytes }].
|
||||
previous: readJson<CacheRow[]>(env.LAST) || [],
|
||||
threshold: Number(env.MIN_DELTA_PERCENT ?? 1),
|
||||
date: new Date().toISOString().slice(0, 10), // YYYY-MM-DD
|
||||
// The commit's own time rather than the day it was measured, so the merges
|
||||
// of one day keep their order on the chart.
|
||||
date: new Date(env.COMMIT_TIMESTAMP || Date.now()).toISOString(),
|
||||
commit: (env.HEAD_SHA || "").slice(0, 12),
|
||||
commitMessage: (env.COMMIT_MESSAGE || "").split("\n")[0], // subject line only
|
||||
version: readVersion(env.VERSION_PROPS),
|
||||
|
||||
9
.github/scripts/upload-bundle-load-stats.ts
vendored
@@ -31,16 +31,20 @@ interface Condition {
|
||||
interface CommitStamp {
|
||||
sha: string;
|
||||
subject: string;
|
||||
/** ISO 8601, in UTC. */
|
||||
timestamp: string;
|
||||
}
|
||||
|
||||
type LoadTimeRow = Record<string, string | number>;
|
||||
|
||||
function buildRows(
|
||||
conditions: Condition[],
|
||||
{ sha, subject }: CommitStamp,
|
||||
{ sha, subject, timestamp }: CommitStamp,
|
||||
): LoadTimeRow[] {
|
||||
return conditions.map((condition) => ({
|
||||
Date: new Date().toISOString().slice(0, 10),
|
||||
// The commit's own time rather than the day it was measured, so the merges
|
||||
// of one day keep their order and a backfilled row lands on its commit.
|
||||
Date: timestamp,
|
||||
// Truncated the same way the bundle-size table does, so the two join.
|
||||
Commit: sha.slice(0, 12),
|
||||
// The stats table carries a free-text Description column. Populate it with
|
||||
@@ -77,6 +81,7 @@ async function main() {
|
||||
const rows = buildRows(conditions, {
|
||||
sha: process.env.HEAD_SHA || "",
|
||||
subject: process.env.COMMIT_MESSAGE || "",
|
||||
timestamp: new Date(process.env.COMMIT_TIMESTAMP || Date.now()).toISOString(),
|
||||
});
|
||||
|
||||
console.table(rows);
|
||||
|
||||
44
.github/workflows/bundle-size-stats.yml
vendored
@@ -4,25 +4,54 @@ name: Bundle Size Stats
|
||||
# emitted JS) plus the bundle-stats and embedding-sdk artifacts, measures
|
||||
# initial/total bundle sizes, and appends them to eng-stats-importer.
|
||||
|
||||
# Triggered by "Run tests", which is the workflow that builds the uberjar on a
|
||||
# master merge.
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["Build Uberjar"]
|
||||
workflows: ["Run tests"]
|
||||
types: [completed]
|
||||
# Master only: releases form non-linear lines whose deltas are meaningless,
|
||||
# so their sizes are backfilled separately rather than logged here.
|
||||
branches: [master]
|
||||
workflow_call:
|
||||
inputs:
|
||||
commit:
|
||||
description: "Commit SHA to measure."
|
||||
type: string
|
||||
required: false
|
||||
default: ""
|
||||
|
||||
concurrency:
|
||||
group: bundle-size-stats-${{ github.event.workflow_run.head_sha }}
|
||||
group: bundle-size-stats-${{ inputs.commit || github.event.workflow_run.head_sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# "Run tests" concludes `failure` on master more often than `success`, from
|
||||
# jobs that have nothing to do with the jar, so its conclusion is not a usable
|
||||
# gate. The artifact is one: the uberjar job publishes it, and a docs-only
|
||||
# merge that skipped that job publishes none.
|
||||
uberjar-built:
|
||||
if: ${{ github.repository == 'metabase/metabase' }}
|
||||
runs-on: ${{ vars.SLIM_RUNNER_KEY }}
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
found: ${{ steps.probe.outputs.fetch-hit }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- id: probe
|
||||
uses: ./.github/actions/fetch-artifact
|
||||
with:
|
||||
commit: ${{ inputs.commit || github.event.workflow_run.head_sha }}
|
||||
edition: ee
|
||||
download: false
|
||||
|
||||
bundle-size-stats:
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' && github.repository == 'metabase/metabase' }}
|
||||
needs: [uberjar-built]
|
||||
if: ${{ needs.uberjar-built.outputs.found == 'true' }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 15
|
||||
env:
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
HEAD_SHA: ${{ inputs.commit || github.event.workflow_run.head_sha }}
|
||||
# Only record a data point when a bundle's as-served size (brotli where the
|
||||
# build ships .br, else gzip) moved by at least this percent vs the last
|
||||
# plotted point, keeping the chart to real changes.
|
||||
@@ -31,12 +60,12 @@ jobs:
|
||||
- name: Check out the code
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ github.event.workflow_run.head_sha }}
|
||||
ref: ${{ env.HEAD_SHA }}
|
||||
- uses: ./.github/actions/prepare-node-bun
|
||||
- name: Download EE uberjar
|
||||
uses: ./.github/actions/fetch-artifact
|
||||
with:
|
||||
commit: ${{ github.event.workflow_run.head_sha }}
|
||||
commit: ${{ env.HEAD_SHA }}
|
||||
edition: ee
|
||||
extract-path: temp/uberjar
|
||||
- name: Extract front-end bundles from uberjar
|
||||
@@ -105,10 +134,11 @@ jobs:
|
||||
# Passed via env (not interpolated into the shell) so the commit
|
||||
# message can't inject commands; the script keeps only the subject.
|
||||
COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
|
||||
COMMIT_TIMESTAMP: ${{ github.event.workflow_run.head_commit.timestamp }}
|
||||
run: bun ./.github/scripts/bundle-size-stats-prepare.ts
|
||||
- name: Import sizes (with deltas) into Stats
|
||||
id: upload
|
||||
if: steps.prepare.outputs.significant == 'true'
|
||||
if: ${{ steps.prepare.outputs.significant == 'true' && inputs.commit == '' }}
|
||||
env:
|
||||
ROWS: artifacts/upload-rows.json
|
||||
ENG_STATS_URL: ${{ secrets.ENG_STATS_URL }}
|
||||
|
||||
6
.github/workflows/docs-links.yml
vendored
@@ -32,3 +32,9 @@ jobs:
|
||||
fail: true
|
||||
args: docs --config ./.lychee/config.toml --offline
|
||||
format: markdown
|
||||
|
||||
# lychee can't read the YAML nav, so this script renders it as markdown first. lychee is on PATH
|
||||
# from the step above.
|
||||
- name: Check nav.yml links
|
||||
if: ${{ !cancelled() }}
|
||||
run: docs/util/check-links.sh nav
|
||||
|
||||
154
.github/workflows/lint.security.yml
vendored
@@ -36,6 +36,7 @@ jobs:
|
||||
uses: github/codeql-action/analyze@v4
|
||||
|
||||
trivy:
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -68,8 +69,157 @@ jobs:
|
||||
sarif_file: trivy-results-${{ matrix.edition }}.sarif
|
||||
category: trivy-${{ matrix.edition }}
|
||||
|
||||
# Generate pom.xml files for all Maven projects
|
||||
snyk-generate-poms:
|
||||
name: Generate pom.xml files
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
- name: Generate all pom.xml
|
||||
run: .github/scripts/write-poms.sh
|
||||
- name: Upload pom files
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: pom-files
|
||||
path: |
|
||||
pom.xml
|
||||
modules/drivers/*/pom.xml
|
||||
|
||||
# Yarn/NPM projects that don't need pom files
|
||||
snyk-frontend-projects:
|
||||
name: ${{ matrix.project.name }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
matrix:
|
||||
project:
|
||||
- name: Main Frontend (bun w/ yarn.lock)
|
||||
file: yarn.lock
|
||||
package-manager: yarn
|
||||
category: main-frontend-bun
|
||||
- name: Release Helper
|
||||
file: release/yarn.lock
|
||||
package-manager: yarn
|
||||
category: release-helper
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
|
||||
with:
|
||||
bun-version-file: 'package.json'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Snyk doesn't support bun.lock yet, so we generate yarn.lock and scan that.
|
||||
# Bun has a bug where it normalizes "< 3.0.0" to "< 3" in alias entries
|
||||
# but not in dependency specs, causing Snyk to fail matching dependencies.
|
||||
# The sed commands fix this inconsistency. Bun also names aliased entries
|
||||
# after the aliased package instead of the alias, which the script fixes.
|
||||
# Both continue on error to let Snyk report parsing issues directly rather
|
||||
# than failing on the workaround.
|
||||
- name: Generate yarn.lock
|
||||
if: matrix.project.file == 'yarn.lock'
|
||||
run: |
|
||||
bun install --yarn
|
||||
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
|
||||
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
|
||||
- name: Generate release/yarn.lock
|
||||
if: matrix.project.file == 'release/yarn.lock'
|
||||
run: |
|
||||
bun install --yarn
|
||||
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
|
||||
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
|
||||
working-directory: release
|
||||
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
|
||||
- name: Run snyk test
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=${{ matrix.project.package-manager }} --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
|
||||
- name: Upload results
|
||||
uses: github/codeql-action/upload-sarif@v4
|
||||
with:
|
||||
sarif_file: snyk-${{ matrix.project.category }}.sarif
|
||||
category: ${{ matrix.project.category }}
|
||||
|
||||
# Maven projects that need pom files
|
||||
snyk-maven-projects:
|
||||
needs: snyk-generate-poms
|
||||
name: ${{ matrix.project.name }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
matrix:
|
||||
project:
|
||||
- name: Main Backend (maven)
|
||||
file: pom.xml
|
||||
category: main-backend-maven
|
||||
- name: Driver - Athena
|
||||
file: modules/drivers/athena/pom.xml
|
||||
category: driver-athena
|
||||
- name: Driver - BigQuery Cloud SDK
|
||||
file: modules/drivers/bigquery-cloud-sdk/pom.xml
|
||||
category: driver-bigquery-cloud-sdk
|
||||
- name: Driver - ClickHouse
|
||||
file: modules/drivers/clickhouse/pom.xml
|
||||
category: driver-clickhouse
|
||||
- name: Driver - Databricks
|
||||
file: modules/drivers/databricks/pom.xml
|
||||
category: driver-databricks
|
||||
- name: Driver - Druid JDBC
|
||||
file: modules/drivers/druid-jdbc/pom.xml
|
||||
category: driver-druid-jdbc
|
||||
- name: Driver - Hive-like
|
||||
file: modules/drivers/hive-like/pom.xml
|
||||
category: driver-hive-like
|
||||
- name: Driver - MongoDB
|
||||
file: modules/drivers/mongo/pom.xml
|
||||
category: driver-mongo
|
||||
- name: Driver - Oracle
|
||||
file: modules/drivers/oracle/pom.xml
|
||||
category: driver-oracle
|
||||
- name: Driver - Presto JDBC
|
||||
file: modules/drivers/presto-jdbc/pom.xml
|
||||
category: driver-presto-jdbc
|
||||
- name: Driver - Redshift
|
||||
file: modules/drivers/redshift/pom.xml
|
||||
category: driver-redshift
|
||||
- name: Driver - Snowflake
|
||||
file: modules/drivers/snowflake/pom.xml
|
||||
category: driver-snowflake
|
||||
- name: Driver - SparkSQL
|
||||
file: modules/drivers/sparksql/pom.xml
|
||||
category: driver-sparksql
|
||||
- name: Driver - SQL Server
|
||||
file: modules/drivers/sqlserver/pom.xml
|
||||
category: driver-sqlserver
|
||||
- name: Driver - Starburst
|
||||
file: modules/drivers/starburst/pom.xml
|
||||
category: driver-starburst
|
||||
- name: Driver - Vertica
|
||||
file: modules/drivers/vertica/pom.xml
|
||||
category: driver-vertica
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
|
||||
- name: Download pom files
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: pom-files
|
||||
- name: Run snyk test
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=maven --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
|
||||
|
||||
- name: Upload results
|
||||
uses: github/codeql-action/upload-sarif@v4
|
||||
with:
|
||||
sarif_file: snyk-${{ matrix.project.category }}.sarif
|
||||
category: ${{ matrix.project.category }}
|
||||
|
||||
notify:
|
||||
needs: [codeql, trivy]
|
||||
needs: [codeql, trivy, snyk-frontend-projects, snyk-maven-projects]
|
||||
if: ${{ failure() && github.repository == 'metabase/metabase' }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 5
|
||||
@@ -94,6 +244,8 @@ jobs:
|
||||
const scans = [
|
||||
['CodeQL', '${{ needs.codeql.result }}'],
|
||||
['Trivy', '${{ needs.trivy.result }}'],
|
||||
['Snyk (frontend)', '${{ needs.snyk-frontend-projects.result }}'],
|
||||
['Snyk (maven)', '${{ needs.snyk-maven-projects.result }}'],
|
||||
];
|
||||
const failed = scans.filter(([, result]) => result === 'failure').map(([name]) => name);
|
||||
|
||||
|
||||
128
.github/workflows/report.update-e2e-timings.yml
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
name: Update E2E Timings
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
days_back:
|
||||
description: "Number of days to look back for timing artifacts"
|
||||
type: number
|
||||
default: 7
|
||||
required: false
|
||||
schedule:
|
||||
# Run weekly on Sundays at 6 AM UTC
|
||||
- cron: "0 6 * * 0"
|
||||
|
||||
jobs:
|
||||
collect-and-average-timings:
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
DAYS_BACK: ${{ inputs.days_back || 7 }}
|
||||
steps:
|
||||
- name: Generate GitHub App Token
|
||||
uses: actions/create-github-app-token@v1
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version: 22
|
||||
|
||||
- name: Collect and average timing data
|
||||
id: collect-timings
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const { collectAndAverageTimings } = require('${{ github.workspace }}/.github/scripts/average-e2e-timings.js');
|
||||
const result = await collectAndAverageTimings({
|
||||
github,
|
||||
context,
|
||||
token: '${{ steps.app-token.outputs.token }}',
|
||||
daysBack: ${{ env.DAYS_BACK }},
|
||||
existingTimingsPath: 'e2e/support/timings.json'
|
||||
});
|
||||
|
||||
core.setOutput('artifact-count', result.artifactCount);
|
||||
|
||||
- name: Configure git and commit changes
|
||||
id: commit
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
git add e2e/support/timings.json
|
||||
# Check if anything changed before commit/push
|
||||
if git diff --cached --quiet; then
|
||||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||
echo "Timing data is unchanged; skipping the pull request"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
DATE=$(date +%Y%m%d-%H%M%S)
|
||||
BRANCH_NAME="update-e2e-timings-$DATE"
|
||||
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
|
||||
echo "Branch name will be: $BRANCH_NAME"
|
||||
|
||||
git checkout -b "$BRANCH_NAME"
|
||||
git commit -m "update e2e timings $DATE" --no-verify
|
||||
git push -u origin "$BRANCH_NAME"
|
||||
|
||||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Create Pull Request
|
||||
id: create_pr
|
||||
if: steps.commit.outputs.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
run: |
|
||||
BODY=$(cat <<'EOF'
|
||||
## Summary
|
||||
This PR updates the E2E test timing data with averaged values from recent test runs.
|
||||
|
||||
## Details
|
||||
- Collected data from the last **${{ env.DAYS_BACK }} days** of test runs
|
||||
- Averaged timing data from **${{ steps.collect-timings.outputs.artifact-count }}** test runs
|
||||
|
||||
## Generated automatically
|
||||
🤖 This PR was created automatically by the `update-e2e-timings` workflow.
|
||||
The timing data helps cypress-split optimize test distribution across parallel jobs.
|
||||
|
||||
Co-Authored-By: GitHub Actions <actions@github.com>
|
||||
EOF
|
||||
)
|
||||
|
||||
URL=$(gh pr create \
|
||||
--base master \
|
||||
--head "$BRANCH_NAME" \
|
||||
--title "[chore] Update E2E test timings with recent data" \
|
||||
--body "$BODY" \
|
||||
--label ".CI & Tests" \
|
||||
--label "no-backport" \
|
||||
--reviewer metabase/devexp)
|
||||
|
||||
PR_NUMBER=${URL##*/}
|
||||
|
||||
echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Approve and Merge the PR
|
||||
if: steps.commit.outputs.changed == 'true'
|
||||
env:
|
||||
# uses a different token than the token that created the PR so we can approve and merge it
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
PR_NUMBER: ${{ steps.create_pr.outputs.pr_number }}
|
||||
shell: bash
|
||||
run: |
|
||||
gh pr review --approve "$PR_NUMBER"
|
||||
gh pr merge --squash --auto "$PR_NUMBER"
|
||||
165
.github/workflows/snyk.yml
vendored
@@ -1,165 +0,0 @@
|
||||
name: "Snyk"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- "release-**"
|
||||
paths:
|
||||
- "**/deps.edn"
|
||||
- "**/package.json"
|
||||
- ".github/workflows/snyk.yml"
|
||||
- ".github/scripts/write-poms.sh"
|
||||
- ".github/scripts/fix-yarn-lock-aliases.ts"
|
||||
schedule:
|
||||
- cron: "0 5 * * *"
|
||||
|
||||
jobs:
|
||||
# Generate pom.xml files for all Maven projects
|
||||
generate-poms:
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
name: Generate pom.xml files
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
- name: Generate all pom.xml
|
||||
run: .github/scripts/write-poms.sh
|
||||
- name: Upload pom files
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: pom-files
|
||||
path: |
|
||||
pom.xml
|
||||
modules/drivers/*/pom.xml
|
||||
|
||||
# Yarn/NPM projects that don't need pom files
|
||||
frontend-projects:
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
name: ${{ matrix.project.name }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
strategy:
|
||||
matrix:
|
||||
project:
|
||||
- name: Main Frontend (bun w/ yarn.lock)
|
||||
file: yarn.lock
|
||||
package-manager: yarn
|
||||
category: main-frontend-bun
|
||||
- name: Release Helper
|
||||
file: release/yarn.lock
|
||||
package-manager: yarn
|
||||
category: release-helper
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
|
||||
with:
|
||||
bun-version-file: 'package.json'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Snyk doesn't support bun.lock yet, so we generate yarn.lock and scan that.
|
||||
# Bun has a bug where it normalizes "< 3.0.0" to "< 3" in alias entries
|
||||
# but not in dependency specs, causing Snyk to fail matching dependencies.
|
||||
# The sed commands fix this inconsistency. Bun also names aliased entries
|
||||
# after the aliased package instead of the alias, which the script fixes.
|
||||
# Both continue on error to let Snyk report parsing issues directly rather
|
||||
# than failing on the workaround.
|
||||
- name: Generate yarn.lock
|
||||
if: matrix.project.file == 'yarn.lock'
|
||||
run: |
|
||||
bun install --yarn
|
||||
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
|
||||
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
|
||||
- name: Generate release/yarn.lock
|
||||
if: matrix.project.file == 'release/yarn.lock'
|
||||
run: |
|
||||
bun install --yarn
|
||||
sed -i -E 's/< ([0-9]+)\.0\.0"/< \1"/g; s/< ([0-9]+)\.0"/< \1"/g' yarn.lock || true
|
||||
bun ${{ github.workspace }}/.github/scripts/fix-yarn-lock-aliases.ts || true
|
||||
working-directory: release
|
||||
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
|
||||
- name: Run snyk test
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=${{ matrix.project.package-manager }} --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
|
||||
- name: Upload results
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: snyk-${{ matrix.project.category }}.sarif
|
||||
category: ${{ matrix.project.category }}
|
||||
|
||||
# Maven projects that need pom files
|
||||
maven-projects:
|
||||
needs: generate-poms
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
name: ${{ matrix.project.name }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
strategy:
|
||||
matrix:
|
||||
project:
|
||||
- name: Main Backend (maven)
|
||||
file: pom.xml
|
||||
category: main-backend-maven
|
||||
- name: Driver - Athena
|
||||
file: modules/drivers/athena/pom.xml
|
||||
category: driver-athena
|
||||
- name: Driver - BigQuery Cloud SDK
|
||||
file: modules/drivers/bigquery-cloud-sdk/pom.xml
|
||||
category: driver-bigquery-cloud-sdk
|
||||
- name: Driver - ClickHouse
|
||||
file: modules/drivers/clickhouse/pom.xml
|
||||
category: driver-clickhouse
|
||||
- name: Driver - Databricks
|
||||
file: modules/drivers/databricks/pom.xml
|
||||
category: driver-databricks
|
||||
- name: Driver - Druid JDBC
|
||||
file: modules/drivers/druid-jdbc/pom.xml
|
||||
category: driver-druid-jdbc
|
||||
- name: Driver - Hive-like
|
||||
file: modules/drivers/hive-like/pom.xml
|
||||
category: driver-hive-like
|
||||
- name: Driver - MongoDB
|
||||
file: modules/drivers/mongo/pom.xml
|
||||
category: driver-mongo
|
||||
- name: Driver - Oracle
|
||||
file: modules/drivers/oracle/pom.xml
|
||||
category: driver-oracle
|
||||
- name: Driver - Presto JDBC
|
||||
file: modules/drivers/presto-jdbc/pom.xml
|
||||
category: driver-presto-jdbc
|
||||
- name: Driver - Redshift
|
||||
file: modules/drivers/redshift/pom.xml
|
||||
category: driver-redshift
|
||||
- name: Driver - Snowflake
|
||||
file: modules/drivers/snowflake/pom.xml
|
||||
category: driver-snowflake
|
||||
- name: Driver - SparkSQL
|
||||
file: modules/drivers/sparksql/pom.xml
|
||||
category: driver-sparksql
|
||||
- name: Driver - SQL Server
|
||||
file: modules/drivers/sqlserver/pom.xml
|
||||
category: driver-sqlserver
|
||||
- name: Driver - Starburst
|
||||
file: modules/drivers/starburst/pom.xml
|
||||
category: driver-starburst
|
||||
- name: Driver - Vertica
|
||||
file: modules/drivers/vertica/pom.xml
|
||||
category: driver-vertica
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: snyk/actions/setup@9adf32b1121593767fc3c057af55b55db032dc04 # v1.0.0
|
||||
- name: Download pom files
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: pom-files
|
||||
- name: Run snyk test
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=maven --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
|
||||
|
||||
- name: Upload results
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: snyk-${{ matrix.project.category }}.sarif
|
||||
category: ${{ matrix.project.category }}
|
||||
31
.github/workflows/test.bundle-load-stats.yml
vendored
@@ -8,17 +8,15 @@ name: Bundle Load Stats
|
||||
# signed-in user alone, so seeding content would not change a single byte of the
|
||||
# document this measures.
|
||||
|
||||
# Triggered by "Run tests", which is the workflow that builds the uberjar on a
|
||||
# master merge.
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["Build Uberjar"]
|
||||
workflows: ["Run tests"]
|
||||
types: [completed]
|
||||
# Master only: a release forms a non-linear line whose times cannot be
|
||||
# compared against the commit before it.
|
||||
branches: [master]
|
||||
# A `workflow_run` workflow always runs the copy on the default branch, so a
|
||||
# change here cannot be tried out before it merges. The call lets a PR run
|
||||
# this branch's copy against the uberjar CI already built. A called run
|
||||
# measures and reports; it does not write rows to Stats.
|
||||
workflow_call:
|
||||
inputs:
|
||||
commit:
|
||||
@@ -32,8 +30,28 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# "Run tests" concludes `failure` on master more often than `success`, from
|
||||
# jobs that have nothing to do with the jar, so its conclusion is not a usable
|
||||
# gate. The artifact is one: the uberjar job publishes it, and a docs-only
|
||||
# merge that skipped that job publishes none.
|
||||
uberjar-built:
|
||||
if: ${{ github.repository == 'metabase/metabase' }}
|
||||
runs-on: ${{ vars.SLIM_RUNNER_KEY }}
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
found: ${{ steps.probe.outputs.fetch-hit }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- id: probe
|
||||
uses: ./.github/actions/fetch-artifact
|
||||
with:
|
||||
commit: ${{ inputs.commit || github.event.workflow_run.head_sha }}
|
||||
edition: ee
|
||||
download: false
|
||||
|
||||
bundle-load-stats:
|
||||
if: ${{ github.repository == 'metabase/metabase' && (inputs.commit != '' || github.event.workflow_run.conclusion == 'success') }}
|
||||
needs: [uberjar-built]
|
||||
if: ${{ needs.uberjar-built.outputs.found == 'true' }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
@@ -102,6 +120,7 @@ jobs:
|
||||
# Passed via env (not interpolated into the shell) so the commit
|
||||
# message can't inject commands; the script keeps only the subject.
|
||||
COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
|
||||
COMMIT_TIMESTAMP: ${{ github.event.workflow_run.head_commit.timestamp }}
|
||||
ENG_STATS_URL: ${{ secrets.ENG_STATS_URL }}
|
||||
API_KEY: ${{ secrets.ENG_STATS_API_KEY }}
|
||||
run: bun .github/scripts/upload-bundle-load-stats.ts
|
||||
|
||||
103
.github/workflows/update-e2e-timings.yml
vendored
@@ -1,103 +0,0 @@
|
||||
name: Update E2E Timings
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
days_back:
|
||||
description: "Number of days to look back for timing artifacts"
|
||||
type: number
|
||||
default: 7
|
||||
required: false
|
||||
schedule:
|
||||
# Run weekly on Sundays at 6 AM UTC
|
||||
- cron: "0 6 * * 0"
|
||||
|
||||
jobs:
|
||||
collect-and-average-timings:
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
DAYS_BACK: ${{ inputs.days_back || 7 }}
|
||||
steps:
|
||||
- name: Generate GitHub App Token
|
||||
uses: actions/create-github-app-token@v1
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version: 22
|
||||
|
||||
- name: Collect and average timing data
|
||||
id: collect-timings
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const { collectAndAverageTimings } = require('${{ github.workspace }}/.github/scripts/average-e2e-timings.js');
|
||||
const result = await collectAndAverageTimings({
|
||||
github,
|
||||
context,
|
||||
token: '${{ steps.app-token.outputs.token }}',
|
||||
daysBack: ${{ env.DAYS_BACK }},
|
||||
existingTimingsPath: 'e2e/support/timings.json'
|
||||
});
|
||||
|
||||
core.setOutput('artifact-count', result.artifactCount);
|
||||
|
||||
- name: Set up git configuration
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
BRANCH_NAME="update-e2e-timings-$(date +%Y%m%d-%H%M%S)"
|
||||
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
|
||||
echo "Branch name will be: $BRANCH_NAME"
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
branch: ${{ env.BRANCH_NAME }}
|
||||
base: master
|
||||
commit-message: |
|
||||
Update E2E test timings with averaged data
|
||||
|
||||
Collected timing data from ${{ env.DAYS_BACK }} days of test runs.
|
||||
All specs with timing data were included (simple averages).
|
||||
|
||||
🤖 Generated automatically by update-e2e-timings workflow
|
||||
|
||||
Co-Authored-By: GitHub Actions <actions@github.com>
|
||||
committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
|
||||
author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
|
||||
title: "[chore] Update E2E test timings with recent data"
|
||||
body: |
|
||||
## Summary
|
||||
This PR updates the E2E test timing data with averaged values from recent test runs.
|
||||
|
||||
## Details
|
||||
- Collected data from the last **${{ env.DAYS_BACK }} days** of test runs
|
||||
- Averaged timing data from **${{ steps.collect-timings.outputs.artifact-count }}** test runs
|
||||
|
||||
## Generated automatically
|
||||
🤖 This PR was created automatically by the `update-e2e-timings` workflow.
|
||||
The timing data helps cypress-split optimize test distribution across parallel jobs.
|
||||
|
||||
Co-Authored-By: GitHub Actions <actions@github.com>
|
||||
labels: |
|
||||
.CI & Tests
|
||||
no-backport
|
||||
add-paths: e2e/support/timings.json
|
||||
team-reviewers: |
|
||||
devexp
|
||||
@@ -1,5 +1,16 @@
|
||||
accept = ["200..=204", "429"]
|
||||
exclude = ["\\.html(#.*)?$"]
|
||||
exclude = [
|
||||
"\\.html(#.*)?$",
|
||||
# Liquid templates ({{page.version}}) in docs/embedding/sdk are rendered by the docs site, not here.
|
||||
"%7B%7B",
|
||||
# Bot-blocked: 403 for anything that isn't a browser.
|
||||
"^https://(www|dev)\\.mysql\\.com/",
|
||||
"^https://platform\\.deepseek\\.com/",
|
||||
# Login-walled: redirects forever between console and auth.
|
||||
"^https://console\\.mistral\\.ai/",
|
||||
# GitHub renders issue comments client-side, so lychee can't see #issuecomment anchors.
|
||||
"^https://github\\.com/.+/issues/\\d+#issuecomment-",
|
||||
]
|
||||
exclude_path = ["docs/util", "docs/embedding/sdk/api"]
|
||||
no_progress = true
|
||||
include_fragments = "full"
|
||||
|
||||
70
bun.lock
@@ -81,7 +81,7 @@
|
||||
"crc-32": "^1.2.2",
|
||||
"cron-expression-validator": "^1.0.20",
|
||||
"cronstrue": "^2.11.0",
|
||||
"csv-parse": "^5.5.6",
|
||||
"csv-parse": "^7.0.2",
|
||||
"csv-stringify": "^6.5.0",
|
||||
"d3": "^7.9.0",
|
||||
"d3-scale": "^4.0.2",
|
||||
@@ -103,7 +103,7 @@
|
||||
"inflection": "^1.7.1",
|
||||
"inquirer-toggle": "^1.0.1",
|
||||
"js-cookie": "3.0.7",
|
||||
"js-yaml": "^4.3.1",
|
||||
"js-yaml": "^4.3.2",
|
||||
"json5": "^2.2.2",
|
||||
"jspdf": "^4.2.1",
|
||||
"kbar": "0.1.0-beta.45",
|
||||
@@ -389,13 +389,13 @@
|
||||
"debug": "^4.3.4",
|
||||
"esbuild": "^0.28.1",
|
||||
"js-cookie": "^3.0.7",
|
||||
"js-yaml": "^4.3.1",
|
||||
"js-yaml": "^4.3.2",
|
||||
"lodash": "^4.18.1",
|
||||
"on-headers": "^1.1.0",
|
||||
"prosemirror-model": "^1.25.4",
|
||||
"prosemirror-state": "^1.4.4",
|
||||
"prosemirror-view": "^1.40.1",
|
||||
"qs": "6.15.2",
|
||||
"qs": "6.16.0",
|
||||
"redux": "5.0.1",
|
||||
"webpack": "5.105.0",
|
||||
},
|
||||
@@ -2612,7 +2612,7 @@
|
||||
|
||||
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
|
||||
|
||||
"csv-parse": ["csv-parse@5.5.6", "", {}, "sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A=="],
|
||||
"csv-parse": ["csv-parse@7.0.2", "", {}, "sha512-uKZghv9UmPkMVLYy//KZ9HFAIJsl7wkhoEdIL0+rhuSY9pZQlhaeGEDPIe+/w7eh81MOql8Q/9+inAGWG6ZHYA=="],
|
||||
|
||||
"csv-stringify": ["csv-stringify@6.5.0", "", {}, "sha512-edlXFVKcUx7r8Vx5zQucsuMg4wb/xT6qyz+Sr1vnLrdXqlLD1+UKyWNyZ9zn6mUW1ewmGxrpVwAcChGF0HQ/2Q=="],
|
||||
|
||||
@@ -2888,7 +2888,7 @@
|
||||
|
||||
"es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="],
|
||||
|
||||
"es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
|
||||
|
||||
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
|
||||
|
||||
@@ -3598,7 +3598,7 @@
|
||||
|
||||
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||
|
||||
"js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="],
|
||||
"js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="],
|
||||
|
||||
"jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="],
|
||||
|
||||
@@ -4450,7 +4450,7 @@
|
||||
|
||||
"qrcode-generator": ["qrcode-generator@2.0.4", "", {}, "sha512-mZSiP6RnbHl4xL2Ap5HfkjLnmxfKcPWpWe/c+5XxCuetEenqmNFf1FH/ftXPCtFG5/TDobjsjz6sSNL0Sr8Z9g=="],
|
||||
|
||||
"qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="],
|
||||
"qs": ["qs@6.16.0", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA=="],
|
||||
|
||||
"querystring": ["querystring@0.2.0", "", {}, "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="],
|
||||
|
||||
@@ -5886,6 +5886,8 @@
|
||||
|
||||
"caching-transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="],
|
||||
|
||||
"call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"camel-case/tslib": ["tslib@2.2.0", "", {}, "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="],
|
||||
@@ -5988,6 +5990,8 @@
|
||||
|
||||
"default-require-extensions/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="],
|
||||
|
||||
"define-data-property/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"define-data-property/gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="],
|
||||
|
||||
"define-properties/has-property-descriptors": ["has-property-descriptors@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.1.1" } }, "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="],
|
||||
@@ -6038,16 +6042,12 @@
|
||||
|
||||
"enhanced-resolve/tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
|
||||
|
||||
"es-abstract/es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
|
||||
|
||||
"es-abstract/is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
|
||||
|
||||
"es-abstract/object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
|
||||
|
||||
"es-abstract/which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="],
|
||||
|
||||
"es-define-property/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"es-get-iterator/call-bind": ["call-bind@1.0.2", "", { "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="],
|
||||
|
||||
"es-get-iterator/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
@@ -6164,8 +6164,6 @@
|
||||
|
||||
"formik/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||
|
||||
"get-intrinsic/es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
|
||||
|
||||
"gettext-parser/readable-stream": ["readable-stream@4.4.2", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA=="],
|
||||
|
||||
"gettext-parser/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
@@ -6186,6 +6184,8 @@
|
||||
|
||||
"handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
||||
|
||||
"has-property-descriptors/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"has-tostringtag/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
|
||||
|
||||
"hash-base/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
@@ -6598,6 +6598,8 @@
|
||||
|
||||
"public-encrypt/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"qs/side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="],
|
||||
|
||||
"randombytes/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"randomfill/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
@@ -7284,6 +7286,8 @@
|
||||
|
||||
"data-urls/whatwg-url/tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="],
|
||||
|
||||
"deep-equal/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"deep-equal/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
|
||||
|
||||
"deep-equal/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
@@ -7316,6 +7320,8 @@
|
||||
|
||||
"deep-equal/which-typed-array/gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="],
|
||||
|
||||
"define-data-property/es-define-property/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"define-data-property/gopd/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"define-properties/has-property-descriptors/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
@@ -7342,12 +7348,6 @@
|
||||
|
||||
"detective-typescript/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
|
||||
|
||||
"es-define-property/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
|
||||
"es-define-property/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
|
||||
|
||||
"es-define-property/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
|
||||
|
||||
"es-get-iterator/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
|
||||
"es-get-iterator/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
|
||||
@@ -7408,6 +7408,8 @@
|
||||
|
||||
"global-prefix/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"has-property-descriptors/es-define-property/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"htmlparser2/domhandler/domelementtype": ["domelementtype@2.2.0", "", {}, "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="],
|
||||
|
||||
"htmlparser2/domutils/dom-serializer": ["dom-serializer@1.3.2", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig=="],
|
||||
@@ -7444,6 +7446,8 @@
|
||||
|
||||
"is-typed-array/es-abstract/call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="],
|
||||
|
||||
"is-typed-array/es-abstract/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"is-typed-array/es-abstract/es-set-tostringtag": ["es-set-tostringtag@2.0.2", "", { "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" } }, "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q=="],
|
||||
|
||||
"is-typed-array/es-abstract/es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="],
|
||||
@@ -7506,6 +7510,8 @@
|
||||
|
||||
"is-typed-array/es-abstract/which-typed-array": ["which-typed-array@1.1.14", "", { "dependencies": { "available-typed-arrays": "^1.0.6", "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.1" } }, "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg=="],
|
||||
|
||||
"is-weakset/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"is-weakset/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
|
||||
|
||||
"is-weakset/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
@@ -7594,6 +7600,8 @@
|
||||
|
||||
"jsdom/whatwg-url/tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="],
|
||||
|
||||
"json-stable-stringify/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"json-stable-stringify/call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"json-stable-stringify/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
|
||||
@@ -7690,6 +7698,8 @@
|
||||
|
||||
"oas-resolver/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||
|
||||
"object-is/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"object-is/call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"object-is/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
|
||||
@@ -7732,6 +7742,8 @@
|
||||
|
||||
"public-encrypt/parse-asn1/asn1.js": ["asn1.js@5.4.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" } }, "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA=="],
|
||||
|
||||
"qs/side-channel/side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="],
|
||||
|
||||
"raw-body/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
||||
|
||||
"react-docgen/@types/babel__core/@types/babel__traverse": ["@types/babel__traverse@7.14.2", "", { "dependencies": { "@babel/types": "^7.3.0" } }, "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA=="],
|
||||
@@ -7892,6 +7904,8 @@
|
||||
|
||||
"which-typed-array/es-abstract/call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="],
|
||||
|
||||
"which-typed-array/es-abstract/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"which-typed-array/es-abstract/es-set-tostringtag": ["es-set-tostringtag@2.0.2", "", { "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" } }, "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q=="],
|
||||
|
||||
"which-typed-array/es-abstract/es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="],
|
||||
@@ -8050,6 +8064,8 @@
|
||||
|
||||
"assert/call-bind/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
|
||||
|
||||
"assert/object.assign/call-bind/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"assert/object.assign/call-bind/get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="],
|
||||
|
||||
"assert/object.assign/call-bind/set-function-length": ["set-function-length@1.2.1", "", { "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" } }, "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="],
|
||||
@@ -8090,6 +8106,12 @@
|
||||
|
||||
"deep-equal/regexp.prototype.flags/set-function-name/has-property-descriptors": ["has-property-descriptors@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.1.1" } }, "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="],
|
||||
|
||||
"define-data-property/es-define-property/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
|
||||
"define-data-property/es-define-property/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
|
||||
|
||||
"define-data-property/es-define-property/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
|
||||
|
||||
"define-data-property/gopd/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
|
||||
"define-data-property/gopd/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
|
||||
@@ -8122,6 +8144,12 @@
|
||||
|
||||
"fork-ts-checker-webpack-plugin/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
|
||||
|
||||
"has-property-descriptors/es-define-property/get-intrinsic/has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="],
|
||||
|
||||
"has-property-descriptors/es-define-property/get-intrinsic/has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="],
|
||||
|
||||
"has-property-descriptors/es-define-property/get-intrinsic/hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="],
|
||||
|
||||
"htmlparser2/domutils/dom-serializer/domelementtype": ["domelementtype@2.0.2", "", {}, "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA=="],
|
||||
|
||||
"inquirer-toggle/@inquirer/core/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
|
||||
@@ -8246,6 +8274,8 @@
|
||||
|
||||
"jsx-ast-utils/array-includes/es-abstract/call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="],
|
||||
|
||||
"jsx-ast-utils/array-includes/es-abstract/es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="],
|
||||
|
||||
"jsx-ast-utils/array-includes/es-abstract/es-set-tostringtag": ["es-set-tostringtag@2.0.2", "", { "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" } }, "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q=="],
|
||||
|
||||
"jsx-ast-utils/array-includes/es-abstract/es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="],
|
||||
|
||||
12
deps.edn
@@ -32,8 +32,8 @@
|
||||
com.clojure-goes-fast/jvm-hiccup-meter {:mvn/version "0.1.1"} ; Monitor GC pauses and other system-induced pauses.
|
||||
com.draines/postal {:mvn/version "2.0.5" ; SMTP library
|
||||
:exclusions [com.sun.mail/jakarta.mail]}
|
||||
com.fasterxml.jackson.core/jackson-core {:mvn/version "2.21.5"} ; pinned: cheshire pulls 2.21.1 which has resource exhaustion vuln
|
||||
com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.21.5"} ; pinned: snowplow pulls 2.13.3 which has DoS vulns
|
||||
com.fasterxml.jackson.core/jackson-core {:mvn/version "2.21.6"} ; pinned: cheshire pulls 2.21.1 which has resource exhaustion vuln
|
||||
com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.21.6"} ; pinned: snowplow pulls 2.13.3 which has DoS vulns
|
||||
com.fasterxml.woodstox/woodstox-core {:mvn/version "7.1.1"} ; trans dep of commons-codec
|
||||
; Detect the charset in uploaded CSV files
|
||||
com.github.albfernandez/juniversalchardet {:mvn/version "2.5.0"}
|
||||
@@ -161,10 +161,10 @@
|
||||
org.clojure/tools.namespace {:mvn/version "1.5.0"}
|
||||
org.clojure/tools.reader {:mvn/version "1.5.2"}
|
||||
org.clojure/tools.trace {:mvn/version "0.8.0"} ; function tracing
|
||||
org.eclipse.jetty/jetty-server {:mvn/version "12.1.11"}
|
||||
org.eclipse.jetty/jetty-unixdomain-server {:mvn/version "12.1.11"}
|
||||
org.eclipse.jetty.ee9/jetty-ee9-servlet {:mvn/version "12.1.11"}
|
||||
org.eclipse.jetty.ee9.websocket/jetty-ee9-websocket-jetty-server {:mvn/version "12.1.11"}
|
||||
org.eclipse.jetty/jetty-server {:mvn/version "12.1.13"}
|
||||
org.eclipse.jetty/jetty-unixdomain-server {:mvn/version "12.1.13"}
|
||||
org.eclipse.jetty.ee9/jetty-ee9-servlet {:mvn/version "12.1.13"}
|
||||
org.eclipse.jetty.ee9.websocket/jetty-ee9-websocket-jetty-server {:mvn/version "12.1.13"}
|
||||
org.eclipse.jgit/org.eclipse.jgit {:mvn/version "7.3.0.202506031305-r"}; Java implementation of Git version control system
|
||||
org.flatland/ordered {:mvn/version "1.15.12"} ; ordered maps & sets
|
||||
org.graalvm.polyglot/js-community {:mvn/version "25.0.1" :extension "pom"} ; JavaScript engine
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
(api.macros/defendpoint :get "/preview-card/:id"
|
||||
"Get HTML rendering of a Card with `id`."
|
||||
[{:keys [id]} :- [:map
|
||||
[{:keys [id]} :- [:map {:closed true}
|
||||
[:id ms/PositiveInt]]]
|
||||
(let [card (api/read-check :model/Card id)
|
||||
result (pulse-card-query-results card)]
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
This endpoint relies on a custom middleware defined in `metabase.channel.render.core/style-tag-nonce-middleware` to
|
||||
allow the style tag to render properly, given our Content Security Policy setup."
|
||||
[{:keys [id]} :- [:map
|
||||
[{:keys [id]} :- [:map {:closed true}
|
||||
[:id ms/PositiveInt]]]
|
||||
(api/read-check :model/Dashboard id)
|
||||
{:status 200
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
(api.macros/defendpoint :get "/preview-card-info/:id"
|
||||
"Get JSON object containing HTML rendering of a Card with `id` and other information."
|
||||
[{:keys [id]} :- [:map
|
||||
[{:keys [id]} :- [:map {:closed true}
|
||||
[:id ms/PositiveInt]]]
|
||||
(let [card (api/read-check :model/Card id)
|
||||
result (pulse-card-query-results card)
|
||||
@@ -90,9 +90,9 @@
|
||||
|
||||
(api.macros/defendpoint :get "/preview-card-png/:id"
|
||||
"Get PNG rendering of a Card with `id`. Optionally specify `width` as a query parameter."
|
||||
[{:keys [id]} :- [:map
|
||||
[{:keys [id]} :- [:map {:closed true}
|
||||
[:id ms/PositiveInt]]
|
||||
{:keys [width]} :- [:map
|
||||
{:keys [width]} :- [:map {:closed true}
|
||||
[:width {:optional true} [:maybe ms/PositiveInt]]]]
|
||||
(let [card (api/read-check :model/Card id)
|
||||
result (pulse-card-query-results card)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
(api.macros/defendpoint :get "/:type/"
|
||||
"Gets all records of the given type.
|
||||
Any parameters passed will be used for equals filters"
|
||||
[{:keys [type]} :- [:map [:type ms/NonBlankString]]
|
||||
[{:keys [type]} :- [:map {:closed true} [:type ms/NonBlankString]]
|
||||
query-args]
|
||||
(filter (fn [obj]
|
||||
(every? (fn [[query-k query-v]]
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
(api.macros/defendpoint :get "/:type/:id"
|
||||
"Returns an existing record"
|
||||
[{:keys [type id]} :- [:map
|
||||
[{:keys [type id]} :- [:map {:closed true}
|
||||
[:type ms/NonBlankString]
|
||||
[:id ms/PositiveInt]]]
|
||||
(-> (api/check-404 (t2/query-one {:select [:id :content]
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
(api.macros/defendpoint :post "/:type/"
|
||||
"Create a new record."
|
||||
[{:keys [type]} :- [:map
|
||||
[{:keys [type]} :- [:map {:closed true}
|
||||
[:type ms/NonBlankString]]
|
||||
_query-params
|
||||
body]
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
(api.macros/defendpoint :put "/:type/:id"
|
||||
"Updates an existing record."
|
||||
[{:keys [type id]} :- [:map
|
||||
[{:keys [type id]} :- [:map {:closed true}
|
||||
[:type ms/NonBlankString]
|
||||
[:id ms/PositiveInt]]
|
||||
_query-params
|
||||
@@ -88,21 +88,19 @@
|
||||
|
||||
(api.macros/defendpoint :delete "/:type/:id"
|
||||
"Deletes an existing record."
|
||||
[{:keys [type id]} :- [:map
|
||||
[{:keys [type id]} :- [:map {:closed true}
|
||||
[:type ms/NonBlankString]
|
||||
[:id ms/PositiveInt]]
|
||||
_query-params
|
||||
body]
|
||||
(api/check-404 (t2/delete! (prototype-table) id))
|
||||
|
||||
{:id id})
|
||||
|
||||
(api.macros/defendpoint :delete "/:type/all"
|
||||
"Deletes all records of this type. Helpful for resetting to a clean state."
|
||||
[{:keys [type]} :- [:map
|
||||
[{:keys [type]} :- [:map {:closed true}
|
||||
[:type ms/NonBlankString]]
|
||||
_query-params
|
||||
body]
|
||||
(t2/delete! (prototype-table) :type type)
|
||||
|
||||
{:message "All records deleted" :type type})
|
||||
|
||||
63
dev/test/metabase/core/namespace_uniqueness_test.clj
Normal file
@@ -0,0 +1,63 @@
|
||||
(ns metabase.core.namespace-uniqueness-test
|
||||
"Tests that no namespace is declared by more than one file on a single platform's classpath.
|
||||
|
||||
When two files declare the same namespace, `require` loads whichever the classpath reaches first and
|
||||
the other file's vars never exist. Nothing fails: the shadowed file's tests simply never run.
|
||||
|
||||
An EE test that would otherwise take the same `metabase.*` name as its OSS counterpart is named with an
|
||||
`-ee-test` suffix -- see [[metabase.notification.payload.core-ee-test]] and
|
||||
[[metabase.notification.payload.execute-ee-test]]."
|
||||
(:require
|
||||
[clojure.java.classpath :as classpath]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[clojure.test :refer :all]
|
||||
[clojure.tools.namespace.file :as ns.file]
|
||||
[clojure.tools.namespace.find :as ns.find]
|
||||
[clojure.tools.namespace.parse :as ns.parse]
|
||||
[metabase.util :as u]))
|
||||
|
||||
(set! *warn-on-reflection* true)
|
||||
|
||||
(def ^:private project-root
|
||||
(str (.getCanonicalPath (io/file ".")) "/"))
|
||||
|
||||
(defn- relative-path [^java.io.File file]
|
||||
(let [path (.getCanonicalPath file)]
|
||||
(if (str/starts-with? path project-root)
|
||||
(subs path (count project-root))
|
||||
path)))
|
||||
|
||||
(defn- declarations
|
||||
"Every `[namespace relative-path]` pair `platform` can load from the classpath directories.
|
||||
|
||||
`platform` is [[ns.find/clj]] or [[ns.find/cljs]]; each includes `.cljc`, so a `.cljc` file is
|
||||
reported under both. `local/src` is skipped: the `:dev` profile puts it on the classpath precisely so a
|
||||
developer can shadow a project namespace locally."
|
||||
[platform]
|
||||
(for [dir (remove #(str/starts-with? (relative-path %) "local/")
|
||||
(classpath/classpath-directories))
|
||||
file (ns.find/find-sources-in-dir dir platform)
|
||||
;; The classpath includes source directories we do not control.
|
||||
:let [decl (try
|
||||
(ns.file/read-file-ns-decl file (:read-opts platform))
|
||||
(catch Exception _ nil))]
|
||||
;; Some classpath .clj files have no ns form, e.g. resources/data_readers.clj.
|
||||
:when decl]
|
||||
[(ns.parse/name-from-ns-decl decl) (relative-path file)]))
|
||||
|
||||
(defn- collisions
|
||||
"Namespaces `platform` can load from more than one file, as `{namespace [path ...]}`."
|
||||
[platform]
|
||||
(into (sorted-map)
|
||||
(keep (fn [[ns-symb paths]]
|
||||
(when (next paths)
|
||||
[ns-symb (vec (sort paths))])))
|
||||
(u/group-by first second (declarations platform))))
|
||||
|
||||
(deftest ^:parallel no-duplicate-namespaces-test
|
||||
(doseq [[platform-name platform] {"clj" ns.find/clj, "cljs" ns.find/cljs}]
|
||||
(testing (str "no namespace is declared by two " platform-name " files\n"
|
||||
"Rename one of them -- see this namespace's docstring for the convention used when an"
|
||||
" EE test shadows its OSS counterpart.")
|
||||
(is (= {} (collisions platform))))))
|
||||
@@ -20,7 +20,7 @@ For significant feature additions, it is expected that discussion will have take
|
||||
|
||||
## Contributor License Agreement
|
||||
|
||||
We don't like getting sued, so before merging any pull request, we'll need each person contributing code to sign a [Contributor License Agreement](https://docs.google.com/a/metabase.com/forms/d/1oV38o7b9ONFSwuzwmERRMi9SYrhYeOrkbmNaq9pOJ_E/viewform).
|
||||
We don't like getting sued, so before merging any pull request, we'll need each person contributing code to sign a [Contributor License Agreement](https://docs.google.com/a/metabase.com/forms/d/e/1FAIpQLSfc9GWyJ3F9U_4NzHLeTblgtog1FKtG3CjLshE4FAAKSdvNoQ/viewform).
|
||||
|
||||
## What we're trying to build
|
||||
|
||||
@@ -69,7 +69,7 @@ If there are tests missing, code style concerns or specific architectural issues
|
||||
|
||||
## Ways to help
|
||||
|
||||
The starting point would be to get familiar with Metabase the product, and know your way around. If you're using it at work, that's great! If not, [download Metabase](https://www.metabase.com/start/oss/) and play around with it. Read the docs and generally get a feel for the flow of the product.
|
||||
The starting point would be to get familiar with Metabase the product, and know your way around. If you're using it at work, that's great! If not, [download Metabase](https://www.metabase.com/start/oss) and play around with it. Read the docs and generally get a feel for the flow of the product.
|
||||
|
||||
Here are some ways you can help, in order of increasing coordination + interaction with us:
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ Run as a JAR, using Docker, or on [Metabase Cloud](https://store.metabase.com/ch
|
||||
|
||||
Once installed, set up your Metabase and connect to your data.
|
||||
|
||||
### [Getting started](https://www.metabase.com/learn/metabase-basics/getting-started/index)
|
||||
### [Getting started](https://www.metabase.com/learn/metabase-basics/getting-started)
|
||||
|
||||
With your data connected, get started asking questions, creating dashboards, and sharing your work.
|
||||
|
||||
@@ -131,21 +131,21 @@ Metabase's reference documentation.
|
||||
### Data modeling
|
||||
|
||||
- [Data modeling overview](./data-modeling/start.md)
|
||||
- [Models](./data-modeling/models.md)
|
||||
- [Model persistence](./data-modeling/model-persistence.md)
|
||||
- [Metrics](./data-modeling/metrics.md)
|
||||
- [Table metadata admin settings](./data-modeling/metadata-editing.md)
|
||||
- [Field types](./data-modeling/semantic-types.md)
|
||||
- [Formatting defaults](./data-modeling/formatting.md)
|
||||
- [Working with JSON](./data-modeling/json-unfolding.md)
|
||||
- [Segments](./data-modeling/segments.md)
|
||||
- [Models](./data-modeling/models/models.md)
|
||||
- [Model persistence](./data-modeling/models/model-persistence.md)
|
||||
- [Metrics](./data-modeling/semantic-layer/metrics.md)
|
||||
- [Table metadata admin settings](./data-modeling/metadata/metadata-editing.md)
|
||||
- [Field types](./data-modeling/metadata/semantic-types.md)
|
||||
- [Formatting defaults](./data-modeling/metadata/formatting.md)
|
||||
- [Working with JSON](./data-modeling/metadata/json-unfolding.md)
|
||||
- [Segments](./data-modeling/semantic-layer/segments.md)
|
||||
|
||||
### Actions
|
||||
|
||||
- [Actions overview](./actions/start.md)
|
||||
- [Introduction to actions](./actions/introduction.md)
|
||||
- [Basic actions](./actions/basic.md)
|
||||
- [Custom actions](./actions/custom.md)
|
||||
- [Actions overview](./data-modeling/models/actions/start.md)
|
||||
- [Introduction to actions](./data-modeling/models/actions/introduction.md)
|
||||
- [Basic actions](./data-modeling/models/actions/basic.md)
|
||||
- [Custom actions](./data-modeling/models/actions/custom.md)
|
||||
|
||||
### AI
|
||||
|
||||
@@ -329,8 +329,8 @@ Contribute to the Metabase open source project!
|
||||
|
||||
Data jargon explained.
|
||||
|
||||
### [Metabase Experts](https://www.metabase.com/partners/)
|
||||
### [Metabase Experts](https://www.metabase.com/partners)
|
||||
|
||||
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners/).
|
||||
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners).
|
||||
|
||||
<!-- bump 2 -->
|
||||
|
||||
@@ -23,7 +23,7 @@ Here's a non-exhaustive list of things Metabot can help with:
|
||||
- [Edit SQL directly in the native editor](#inline-sql-editing).
|
||||
- [Analyze a chart](#analyze-charts-with-metabot).
|
||||
- [Fix errors in SQL code](#have-metabot-fix-sql-queries).
|
||||
- [Generate transforms](../data-studio/transforms/transforms-overview.md#use-metabot-to-generate-code-for-transforms)
|
||||
- [Generate transforms](../data-modeling/transforms/transforms-overview.md#use-metabot-to-generate-code-for-transforms)
|
||||
- [Generate charts in documents](../documents/introduction.md)
|
||||
- [Answer questions from Slack](./metabot-slack.md).
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ Supported models:
|
||||
|
||||
Credentials:
|
||||
|
||||
- **API key** (required). [Where do I find this?](https://console.anthropic.com/settings/keys) You can also set it with the environment variable `MB_LLM_ANTHROPIC_API_KEY`.
|
||||
- **API key** (required). [Where do I find this?](https://platform.claude.com/settings/keys) You can also set it with the environment variable `MB_LLM_ANTHROPIC_API_KEY`.
|
||||
- **API base URL** (advanced). Defaults to `https://api.anthropic.com`. You can also set it with the environment variable `MB_LLM_ANTHROPIC_API_BASE_URL`.
|
||||
|
||||
## OpenAI
|
||||
@@ -265,7 +265,7 @@ Metabase lists whichever models your vLLM server is serving, so what you can pic
|
||||
|
||||
Credentials:
|
||||
|
||||
- **API base URL** (required). Your server's OpenAI-compatible API. It should end in /v1. You can also set it with the environment variable `MB_LLM_VLLM_API_BASE_URL`.
|
||||
- **API base URL** (required). Your server's OpenAI-compatible API. It should end in /v1. Metabase must be able to reach it: self-hosted, a server on your private network or on this machine needs MB_LLM_ALLOWED_NETWORKS. You can also set it with the environment variable `MB_LLM_VLLM_API_BASE_URL`.
|
||||
- **API key**. Only needed if you started your server with --api-key. You can also set it with the environment variable `MB_LLM_VLLM_API_KEY`.
|
||||
|
||||
## Metabase AI service
|
||||
|
||||
@@ -147,7 +147,7 @@ The **Enable Embedded Metabot** toggle turns embedded Metabot on or off. The tog
|
||||
|
||||
_Available on both the Internal and Embedded tabs, configured independently._
|
||||
|
||||
Admins on Pro and Enterprise plans can tell Metabot to only work with [models](../data-modeling/models.md) and [metrics](../data-modeling/metrics.md) that have been [verified](../exploration-and-organization/content-verification.md).
|
||||
Admins on Pro and Enterprise plans can tell Metabot to only work with [models](../data-modeling/models/models.md) and [metrics](../data-modeling/semantic-layer/metrics.md) that have been [verified](../exploration-and-organization/content-verification.md).
|
||||
|
||||
Restricting Metabot to verified models and metrics (and only models and metrics) helps Metabot produce more reliable answers, since you know someone has at least vetted the data Metabot can use.
|
||||
|
||||
@@ -169,7 +169,7 @@ If you're embedding the Metabot component in an app, you can point embedded Meta
|
||||
|
||||
Picking **Our analytics** is the same as picking no collection at all, so pick something narrower if you want the scoping to do anything. And once you set a collection, tables drop out of embedded Metabot's search results, so pick a collection with the metrics and models you want people building on.
|
||||
|
||||
This setting narrows where embedded Metabot searches; it's _not_ a substitute for setting permissions. Embedded Metabot can still read and query anything the person using it has permissions for. Embedded Metabot can also see the items that person viewed recently, whichever collection those live in. Restricting Metabot to [verified content](#verified-content) narrows those recent items to verified, official, and [Library](../data-studio/library.md) content, but it doesn't confine them to the collection you picked. To control what data people can get to in an embed, set [data permissions](../permissions/embedding.md). See also [Set up AI chat in Metabase](../embedding/ai-chat.md#set-up-ai-chat-in-metabase).
|
||||
This setting narrows where embedded Metabot searches; it's _not_ a substitute for setting permissions. Embedded Metabot can still read and query anything the person using it has permissions for. Embedded Metabot can also see the items that person viewed recently, whichever collection those live in. Restricting Metabot to [verified content](#verified-content) narrows those recent items to verified, official, and [Library](../data-modeling/semantic-layer/library.md) content, but it doesn't confine them to the collection you picked. To control what data people can get to in an embed, set [data permissions](../permissions/embedding.md). See also [Set up AI chat in Metabase](../embedding/ai-chat.md#set-up-ai-chat-in-metabase).
|
||||
|
||||
### Prompt suggestions
|
||||
|
||||
@@ -197,9 +197,9 @@ The best thing you can do to improve Metabot's performance is to prep your data
|
||||
|
||||
### Add descriptions for your data and content
|
||||
|
||||
Add descriptions to your [models](../data-modeling/models.md#add-metadata-to-columns-in-a-model), [metrics](../data-modeling/metrics.md), [dashboards](../dashboards/introduction.md), and [questions](../questions/introduction.md). Write descriptions to provide context, define terms, and explain business logic.
|
||||
Add descriptions to your [models](../data-modeling/models/models.md#add-metadata-to-columns-in-a-model), [metrics](../data-modeling/semantic-layer/metrics.md), [dashboards](../dashboards/introduction.md), and [questions](../questions/introduction.md). Write descriptions to provide context, define terms, and explain business logic.
|
||||
|
||||
Admins can also curate [table metadata](../data-modeling/metadata-editing.md) by adding descriptions for tables and their fields.
|
||||
Admins can also curate [table metadata](../data-modeling/metadata/metadata-editing.md) by adding descriptions for tables and their fields.
|
||||
|
||||
For example, here's a decent description for an ID field that provides additional context for the data:
|
||||
|
||||
@@ -213,7 +213,7 @@ You can even ask Metabot to write descriptions for you. But Metabot will only ha
|
||||
|
||||
Make sure the semantic types for each field accurately describe the field's "meaning". For example, if you have a field like `created_at`, you'd want the column type to be Creation date.
|
||||
|
||||
Metabase will try to set semantic types automatically, but you should confirm that each field has the relevant semantic type. See [Data types and semantic types](../data-modeling/semantic-types.md). You can also set semantic types for [models](../data-modeling/models.md#add-metadata-to-columns-in-a-model).
|
||||
Metabase will try to set semantic types automatically, but you should confirm that each field has the relevant semantic type. See [Data types and semantic types](../data-modeling/metadata/semantic-types.md). You can also set semantic types for [models](../data-modeling/models/models.md#add-metadata-to-columns-in-a-model).
|
||||
|
||||
### Define domain-specific terms in the glossary
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ A profile is the configuration Metabot uses for a conversation: which prompt, wh
|
||||
| `SQL` | SQL writing only. Used by [inline SQL editing](./metabot.md#inline-sql-editing) and similar surfaces. |
|
||||
| `Slackbot` | The persona behind [Metabot in Slack](./metabot-slack.md). |
|
||||
| `Embedding` | The Metabot persona used inside [embedded Metabase](../embedding/start.md). |
|
||||
| `Transforms codegen` | Generates [transform](../data-studio/transforms/transforms-overview.md), SQL, or Python. |
|
||||
| `Transforms codegen` | Generates [transform](../data-modeling/transforms/transforms-overview.md), SQL, or Python. |
|
||||
| `Documents` | Generates content inside [Documents](../documents/start.md). |
|
||||
|
||||
## Conversations
|
||||
|
||||
15460
docs/api.json
generated
@@ -14,7 +14,7 @@ redirect_from:
|
||||
|
||||
By default, Metabase will automatically provision a domain name for your Metabase that ends in metabaseapp.com (e.g., yourcompany.metabaseapp.com).
|
||||
|
||||
[Pro and Enterprise](https://www.metabase.com/pricing/) plans allow you to add a custom domain. Setting a custom domain will update your instance's [Site URL](../configuring-metabase/settings.md#site-url). The Site URL is used for things like creating links in emails, auth redirects, and in some embedding scenarios.
|
||||
[Pro and Enterprise](https://www.metabase.com/pricing) plans allow you to add a custom domain. Setting a custom domain will update your instance's [Site URL](../configuring-metabase/settings.md#site-url). The Site URL is used for things like creating links in emails, auth redirects, and in some embedding scenarios.
|
||||
|
||||
## Add a custom domain to your Metabase
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ redirect_from:
|
||||
|
||||
# Limitations of Metabase Cloud
|
||||
|
||||
There are some limitations that could impact your migration to Metabase Cloud. These limitations apply to all [Metabase Cloud plans](https://www.metabase.com/pricing/).
|
||||
There are some limitations that could impact your migration to Metabase Cloud. These limitations apply to all [Metabase Cloud plans](https://www.metabase.com/pricing).
|
||||
|
||||
## Metabase Cloud only supports official databases
|
||||
|
||||
|
||||
@@ -67,13 +67,13 @@ Before executing the migration script, you may need to set the environment varia
|
||||
|
||||
The script will upload your application data to your new Metabase Cloud instance. If all goes well, the script will print `Done!`.
|
||||
|
||||
If anything goes sideways, follow any prompts the script outputs. If you're still stuck, [send us an email](https://www.metabase.com/help/) and we'll help you troubleshoot.
|
||||
If anything goes sideways, follow any prompts the script outputs. If you're still stuck, [send us an email](https://www.metabase.com/help) and we'll help you troubleshoot.
|
||||
|
||||
## After migrating to Metabase Cloud
|
||||
|
||||
After a successful upload, some finishing touches and a restart are done automatically in a couple of minutes, and then you can log into your shiny new Metabase Cloud instance. You should see all of your questions and dashboards just as you did in your self-hosted instance.
|
||||
|
||||
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.developers.google.com/) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
|
||||
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.cloud.google.com/apis/dashboard) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
|
||||
- **For Pro and Enterprise customers using SAML SSO**, you'll need to update your settings with your identity provider to change the Redirect URL and the Base URL to your new Metabase Cloud URL, otherwise your identity provider will still redirect people to your old (and shut down) Metabase instance. See [Authenticating with SAML](../../people-and-groups/authenticating-with-saml.md).
|
||||
|
||||
## Tell your team about the new Metabase address
|
||||
@@ -92,4 +92,4 @@ We'll take care of your Metabase and keep it up to date from here on out. Welcom
|
||||
|
||||
## Need help?
|
||||
|
||||
If you have any questions, just [send us an email](https://www.metabase.com/help/).
|
||||
If you have any questions, just [send us an email](https://www.metabase.com/help).
|
||||
|
||||
@@ -76,7 +76,7 @@ If the default version on Metabase Cloud is the same or lower than your current
|
||||
|
||||
## Follow up after the migration
|
||||
|
||||
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.developers.google.com/) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
|
||||
- **If you're using Google Sign-in**, you'll need to go to [Google Developers Console](https://console.cloud.google.com/apis/dashboard) and add your new Metabase Cloud URL to the Authorized JavaScript Origins of the Google Auth Client ID.
|
||||
- **For Pro and Enterprise customers using SAML SSO**, you'll need to update your settings with your identity provider to change the Redirect URL and the Base URL to your new Metabase Cloud URL, otherwise your identity provider will still redirect people to your old Metabase instance. See [Authenticating with SAML](../../people-and-groups/authenticating-with-saml.md) for details on how to set these URLs.
|
||||
|
||||
### Tell your team about the new Metabase address
|
||||
@@ -93,4 +93,4 @@ If you were self-hosting via a third-party, be sure to clean up and cancel any s
|
||||
|
||||
## Need help?
|
||||
|
||||
If you run into any trouble, just [send us an email](https://www.metabase.com/help/).
|
||||
If you run into any trouble, just [send us an email](https://www.metabase.com/help-premium).
|
||||
|
||||
@@ -20,7 +20,7 @@ You should follow along with the [migration guide](./guide.md). Once you downloa
|
||||
|
||||
## Install Heroku CLI for your OS
|
||||
|
||||
To get shell access, follow the instructions for your operating system to [install the Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).
|
||||
To get shell access, follow the instructions for your operating system to [install the Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli).
|
||||
|
||||
### Get shell access to your Heroku server
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ Under the hood, Metabase Cloud Storage uses [ClickHouse](https://www.metabase.co
|
||||
|
||||
### Writing SQL queries on data stored in Metabase Cloud Storage
|
||||
|
||||
For the SQL dialect supported by ClickHouse, check out [ClickHouse's SQL reference](https://clickhouse.com/docs/en/sql-reference).
|
||||
For the SQL dialect supported by ClickHouse, check out [ClickHouse's SQL reference](https://clickhouse.com/docs/reference/syntax).
|
||||
|
||||
## How to get Metabase Cloud Storage
|
||||
|
||||
@@ -54,7 +54,7 @@ To add storage to an existing instance, use the following steps.
|
||||
|
||||
## Metabase Cloud Storage pricing
|
||||
|
||||
Pricing depends on how much data you need to store. See the Storage section on our [pricing page](https://www.metabase.com/pricing/).
|
||||
Pricing depends on how much data you need to store. See the Storage section on our [pricing page](https://www.metabase.com/pricing).
|
||||
|
||||
### Increase Metabase Cloud Storage
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ _Admin > Settings > Appearance_
|
||||
|
||||
Appearance settings give admins the option to whitelabel Metabase to match your company’s branding.
|
||||
|
||||
If you're looking for date, time, number, or currency formatting, see [Formatting defaults](../data-modeling/formatting.md).
|
||||
If you're looking for date, time, number, or currency formatting, see [Formatting defaults](../data-modeling/metadata/formatting.md).
|
||||
|
||||
## Changing Metabase's appearance
|
||||
|
||||
@@ -130,9 +130,9 @@ Keep in mind that if you hide documentation links, people using your Metabase mi
|
||||
|
||||
### Help link in the settings menu
|
||||
|
||||
The Settings menu (the "grid" menu in the upper right of your Metabase) includes a **Help** option that links to a [Metabase help page](https://www.metabase.com/help/) by default. You can change this menu Help item by selecting one of the following options:
|
||||
The Settings menu (the "grid" menu in the upper right of your Metabase) includes a **Help** option that links to a [Metabase help page](https://www.metabase.com/help) by default. You can change this menu Help item by selecting one of the following options:
|
||||
|
||||
- Link to [Metabase help](https://www.metabase.com/help/) (default)
|
||||
- Link to [Metabase help](https://www.metabase.com/help) (default)
|
||||
- Hide it (the Settings menu won't display the Help option at all).
|
||||
- Go to a custom destination. Enter a URL that the Settings menu's Help option should link to. Valid URLs include http, https, and mailto URLs.
|
||||
|
||||
@@ -188,6 +188,5 @@ Metabase will display this illustration when searches don't return any results.
|
||||
|
||||
## Further reading
|
||||
|
||||
- [Customer-facing analytics](https://www.metabase.com/learn/metabase-basics/embedding).
|
||||
- [Embedding introduction](../embedding/start.md).
|
||||
- [Brand your Metabase](https://www.metabase.com/docs/latest/configuring-metabase/appearance).
|
||||
|
||||
@@ -178,4 +178,4 @@ If you're using Metabase Cloud, cached question results will be saved to Metabas
|
||||
|
||||
## Further reading
|
||||
|
||||
- [Model persistence](../data-modeling/model-persistence.md)
|
||||
- [Model persistence](../data-modeling/models/model-persistence.md)
|
||||
|
||||
@@ -27,7 +27,7 @@ The map tile server sets the background imagery for pin and grid maps. It's not
|
||||
To change the map tile server:
|
||||
|
||||
1. Go to **Admin > Settings > Maps**.
|
||||
2. Under **Map tile server URL**, enter the URL template for your tile server.
|
||||
2. Under **Map tile server public URL**, enter the URL template for your tile server.
|
||||
|
||||
### Use a raster tile URL template
|
||||
|
||||
|
||||
@@ -1318,6 +1318,21 @@ When set to `true`, users who log in via LDAP will automatically get a Metabase
|
||||
|
||||
The array of last two ISO8601 dates when an admin dismissed the license token missing banner.
|
||||
|
||||
### `MB_LLM_ALLOWED_NETWORKS`
|
||||
|
||||
- Type: keyword
|
||||
- Default: `external-only`
|
||||
- Environment variable only: you can't set this in the Admin settings or in a [configuration file](./config-file.md).
|
||||
|
||||
Controls which networks Metabase may connect to for LLM provider base URLs. Set through the environment only; on Metabase Cloud the default applies.
|
||||
Options:
|
||||
- external-only (default; only globally reachable public addresses)
|
||||
- allow-private (external + private networks but NOT loopback or link-local)
|
||||
- allow-all (no restrictions).
|
||||
The Metabase AI service and LLM proxy are deployment configuration and may always use private addresses.
|
||||
|
||||
Set this when a self-hosted vLLM server is on your private network (allow-private) or on this machine (allow-all). There is no admin UI for it, and a value stored in the application database is ignored. With a JVM-wide HTTP(S) proxy, Metabase checks destination addresses available through local DNS; the deployment proxy must enforce destination restrictions on its outbound connections. Proxy-only DNS is supported. Metabase enforces destination addresses at connection time for direct requests.
|
||||
|
||||
### `MB_LLM_ANTHROPIC_API_BASE_URL`
|
||||
|
||||
- Type: string
|
||||
@@ -1628,7 +1643,6 @@ Backed by the openrouter connection in the admin AI settings provider list: read
|
||||
|
||||
- Type: json
|
||||
- Default: `[]`
|
||||
- [Configuration file name](./config-file.md): `llm-providers`
|
||||
|
||||
JSON array of configured LLM provider connections. Each entry has a `key` (a URL-safe slug identifying the connection), a `type` (the provider type, e.g. `anthropic`), a display `name`, and a `config` map of that provider type's credential fields.
|
||||
|
||||
@@ -1770,7 +1784,7 @@ Controls which networks Metabase may connect to for map tile servers.
|
||||
- Default: `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`
|
||||
- [Configuration file name](./config-file.md): `map-tile-server-url`
|
||||
|
||||
The map tile server URL template used in map visualizations, for example from OpenStreetMaps or MapBox.
|
||||
The map tile server URL template used in map visualizations, for example from OpenStreetMaps or MapBox. This URL is visible to clients, so do not include private keys.
|
||||
|
||||
### `MB_MCP_APPS_CORS_CUSTOM_ORIGINS`
|
||||
|
||||
@@ -2174,7 +2188,7 @@ Git synchronization type - :read-write or :read-only.
|
||||
- Default: `null`
|
||||
- [Configuration file name](./config-file.md): `remote-sync-url`
|
||||
|
||||
The location of your git repository, e.g. https://github.com/acme-inco/metabase.git.
|
||||
The location of your git repository, e.g. `https://github.com/acme-inco/metabase.git`.
|
||||
|
||||
### `MB_REPORT_TIMEZONE`
|
||||
|
||||
@@ -2500,7 +2514,7 @@ Value for the session cookie's `SameSite` directive.
|
||||
|
||||
See [Embedding Metabase in a different domain](../embedding/full-app-embedding.md#embedding-metabase-in-a-different-domain).
|
||||
Read more about [Full app embedding](../embedding/full-app-embedding.md).
|
||||
Learn more about [SameSite cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite).
|
||||
Learn more about [SameSite cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#samesitesamesite-value).
|
||||
|
||||
### `MB_SESSION_COOKIES`
|
||||
|
||||
@@ -2964,7 +2978,7 @@ Note: Users with row or column security restrictions will never see suggestions.
|
||||
|
||||
Controls which networks Metabase may connect to for warehouse connections.
|
||||
Options:
|
||||
- external-only (only globally routable public addresses)
|
||||
- external-only (only globally reachable public addresses)
|
||||
- allow-private (external + private networks but NOT loopback or link-local)
|
||||
- allow-all (no restrictions).
|
||||
Defaults to external-only on Metabase Cloud and allow-all when self-hosted.
|
||||
@@ -3519,4 +3533,4 @@ Setting `MB_JETTY_SKIP_SNI=true` (the default setting) turns off the Server Name
|
||||
Type: string<br>
|
||||
Default: `null`
|
||||
|
||||
Base-64 encoded public key for this sites SSL certificate. Specify this to enable HTTP Public Key Pinning. Using HPKP is no longer recommended. See http://mzl.la/1EnfqBf for more information.
|
||||
Base-64 encoded public key for this sites SSL certificate. Specify this to enable HTTP Public Key Pinning. Using HPKP is no longer recommended. See https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Certificate_Transparency for more information.
|
||||
|
||||
@@ -145,5 +145,4 @@ When configuring [guest embeds](../embedding/guest-embedding.md), you can select
|
||||
## Further reading
|
||||
|
||||
- [Customizing Metabase's appearance](./appearance.md)
|
||||
- [Customer-facing analytics](https://www.metabase.com/learn/metabase-basics/embedding)
|
||||
- [Embedding documentation](../embedding/start.md)
|
||||
|
||||
@@ -16,7 +16,7 @@ Admins can update the localization settings for the instance:
|
||||
|
||||
These localization settings allow you to set global language and formatting defaults for dates, times, numbers, and currencies.
|
||||
|
||||
People can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/formatting.md).
|
||||
People can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/metadata/formatting.md).
|
||||
|
||||
## Instance settings
|
||||
|
||||
@@ -79,7 +79,7 @@ This setting doesn't affect [SQL queries](../questions/native-editor/writing-sql
|
||||
|
||||
You can configure the default formatting for dates and times.
|
||||
|
||||
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/formatting.md).
|
||||
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/metadata/formatting.md).
|
||||
|
||||
To configure default date and time format settings:
|
||||
|
||||
@@ -96,7 +96,7 @@ _Admin > Settings > Localization_
|
||||
|
||||
Some people use commas to separate thousands places, and others use periods. You can configure which camp you belong to.
|
||||
|
||||
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/formatting.md).
|
||||
Note that people can also override these localization options for specific fields or questions. For more info, see [Formatting](../data-modeling/metadata/formatting.md).
|
||||
|
||||
To configure default separator settings:
|
||||
|
||||
@@ -107,7 +107,7 @@ To configure default separator settings:
|
||||
|
||||
_Admin > Settings > Localization_
|
||||
|
||||
You can choose how currency fields should be displayed by default (you can configure _which_ fields should be displayed as currency in table metadata or in question formatting setting, see [Formatting](../data-modeling/formatting.md))
|
||||
You can choose how currency fields should be displayed by default (you can configure _which_ fields should be displayed as currency in table metadata or in question formatting setting, see [Formatting](../data-modeling/metadata/formatting.md))
|
||||
|
||||
Note that people can also override these localization options for specific fields or questions.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ redirect_from:
|
||||
|
||||
# Setting up Metabase
|
||||
|
||||
This guide will help you set up Metabase once you’ve gotten it installed. If you haven’t installed Metabase yet, you can [get Metabase here](https://metabase.com/pricing/).
|
||||
This guide will help you set up Metabase once you’ve gotten it installed. If you haven’t installed Metabase yet, you can [get Metabase here](https://www.metabase.com/pricing).
|
||||
|
||||
Start Metabase up for the first time and you’ll see this screen:
|
||||

|
||||
@@ -60,7 +60,7 @@ For more on connecting to databases, see [Adding and managing databases](../data
|
||||
|
||||
If you're self-hosting Metabase on the [Pro](https://www.metabase.com/product/pro) or [Enterprise](https://www.metabase.com/product/enterprise) plan, Metabase will prompt you for your license. This step is just a convenience. You don't need to enter your license here; you can [activate your license](../installation-and-operation/activating-the-enterprise-edition.md) at any time. Just know that all of your Pro and Enterprise features won't work until you've activated your license.
|
||||
|
||||
If you're running Pro on [Metabase Cloud](https://www.metabase.com/cloud/), we'll handle this step for you. Your Pro features should already be available.
|
||||
If you're running Pro on [Metabase Cloud](https://www.metabase.com/cloud), we'll handle this step for you. Your Pro features should already be available.
|
||||
|
||||
## Usage data preferences
|
||||
|
||||
@@ -90,8 +90,8 @@ The providers you set up in AI settings power Metabase's built-in AI functionali
|
||||
|
||||
## Getting started with Metabase
|
||||
|
||||
For a tutorial on getting up and running with questions and dashboards, head over to [Learn Metabase](https://www.metabase.com/learn/metabase-basics/getting-started/).
|
||||
For a tutorial on getting up and running with questions and dashboards, head over to [Learn Metabase](https://www.metabase.com/learn/metabase-basics/getting-started).
|
||||
|
||||
---
|
||||
|
||||
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners/){:target="\_blank"}.
|
||||
If you’d like more technical resources to set up your data stack with Metabase, connect with a [Metabase Expert](https://www.metabase.com/partners){:target="\_blank"}.
|
||||
|
||||
@@ -61,7 +61,7 @@ By default, Metabase attempts to make field and table names more readable by cha
|
||||
|
||||
If you re-enable this setting, Metabase will run a [scan](../databases/sync-scan.md#how-database-scans-work) against your database to review your table and column names again.
|
||||
|
||||
To manually label field or table names in Metabase, check out the [Table Metadata](../data-modeling/metadata-editing.md) section in your admin panel. Metadata in the Table Metadata can be further curated in [models](../data-modeling/models.md).
|
||||
To manually label field or table names in Metabase, check out the [Table Metadata](../data-modeling/metadata/metadata-editing.md) section in your admin panel. Metadata in the Table Metadata can be further curated in [models](../data-modeling/models/models.md).
|
||||
|
||||
## Enable X-rays
|
||||
|
||||
|
||||
@@ -4,17 +4,17 @@ title: Actions on dashboards
|
||||
|
||||
# Actions on dashboards
|
||||
|
||||
You can add buttons to dashboards to perform [actions](../actions/start.md) like creating or updating records, and combine them with dashboard [filters](./filters.md).
|
||||
You can add buttons to dashboards to perform [actions](../data-modeling/models/actions/start.md) like creating or updating records, and combine them with dashboard [filters](./filters.md).
|
||||
|
||||

|
||||
|
||||
## Create an action
|
||||
|
||||
To add an action button to a dashboard, you'll first need to create an action on a model. See [Model actions](../actions/introduction.md).
|
||||
To add an action button to a dashboard, you'll first need to create an action on a model. See [Model actions](../data-modeling/models/actions/introduction.md).
|
||||
|
||||
## Add an action button to a dashboard
|
||||
|
||||
Once you've [created an action](../actions/introduction.md), you can add a button to a dashboard to perform that action:
|
||||
Once you've [created an action](../data-modeling/models/actions/introduction.md), you can add a button to a dashboard to perform that action:
|
||||
|
||||
1. Visit a dashboard page and click the **pencil** icon to start editing the dashboard.
|
||||
2. Click on the **box with a mouse pointer** to add an action.
|
||||
@@ -54,9 +54,9 @@ To connect an action field to a filter on a dashboard:
|
||||
|
||||
While you can add actions to dashboards and use them in your Metabase, actions won't work on dashboards accessed via [public links](./introduction.md#sharing-dashboards-with-public-links), or dashboards in guest embeds.
|
||||
|
||||
If you want people outside of your Metabase to use an action, you can create a [public form for an action](../actions/custom.md#make-public), or expose actions via [modular embedding](../embedding/modular-embedding.md) with SSO or [full app embedding](../embedding/full-app-embedding.md).
|
||||
If you want people outside of your Metabase to use an action, you can create a [public form for an action](../data-modeling/models/actions/custom.md#make-public), or expose actions via [modular embedding](../embedding/modular-embedding.md) with SSO or [full app embedding](../embedding/full-app-embedding.md).
|
||||
|
||||
## Further reading
|
||||
|
||||
- [Actions](../actions/start.md)
|
||||
- [Actions](../data-modeling/models/actions/start.md)
|
||||
- [Editable tables](../data-modeling/editable-tables.md)
|
||||
|
||||
@@ -265,9 +265,9 @@ To change the operator for a dashboard filter:
|
||||
|
||||
You can set a widget to display options as a dropdown menu, search box, or input box.
|
||||
|
||||
[Metadata settings](../data-modeling/metadata-editing.md#filtering) for the filtered column, including [variable settings in native queries](../questions/native-editor/filter-widgets.md#dropdown-menu-and-search), can also affect the filter's appearance.
|
||||
[Metadata settings](../data-modeling/metadata/metadata-editing.md#filtering) for the filtered column, including [variable settings in native queries](../questions/native-editor/filter-widgets.md#dropdown-menu-and-search), can also affect the filter's appearance.
|
||||
|
||||
For example, if the column you're connecting a filter to is configured in the [metadata settings](../data-modeling/metadata-editing.md#filtering) to display a search box instead of a dropdown, that metadata setting will take precedence.
|
||||
For example, if the column you're connecting a filter to is configured in the [metadata settings](../data-modeling/metadata/metadata-editing.md#filtering) to display a search box instead of a dropdown, that metadata setting will take precedence.
|
||||
|
||||
To configure filter input type:
|
||||
|
||||
@@ -284,8 +284,8 @@ A list of all the possible values in a column. People can use checkboxes to sele
|
||||
|
||||
If you're not seeing the **Dropdown list** option and your dashboard filter is based on a column from a:
|
||||
|
||||
- Table or model built with the query builder: an admin will need to [enable the dropdown widget](../data-modeling/metadata-editing.md#changing-a-search-box-filter-to-a-dropdown-filter) for that column from Metabase's **Admin settings**.
|
||||
- Model built with a SQL query: go to your [model's metadata settings](../data-modeling/models.md#add-metadata-to-columns-in-a-model), find your column, and set the **Database column this maps to**.
|
||||
- Table or model built with the query builder: an admin will need to [enable the dropdown widget](../data-modeling/metadata/metadata-editing.md#changing-a-search-box-filter-to-a-dropdown-filter) for that column from Metabase's **Admin settings**.
|
||||
- Model built with a SQL query: go to your [model's metadata settings](../data-modeling/models/models.md#add-metadata-to-columns-in-a-model), find your column, and set the **Database column this maps to**.
|
||||
|
||||
#### Search box
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ Once you select the column that contains the value you want to pass, the sidebar
|
||||
|
||||
In the example above, when a user clicks on the **Orders by product category** card, Metabase will pass the clicked `Product -> Category` to the destination dashboard ("Interactive Dashboard"), which will then filter its cards by that `Category`.
|
||||
|
||||
You can also send the currently selected value of a dashboard filter on the current dashboard to the destination. In [some plans](https://www.metabase.com/pricing/), you can pass a user attribute provided by SSO to the destination, too. Those user attributes will show up as options when you click on one of the destination's filters (provided the values are compatible with that filter).
|
||||
You can also send the currently selected value of a dashboard filter on the current dashboard to the destination. In [some plans](https://www.metabase.com/pricing), you can pass a user attribute provided by SSO to the destination, too. Those user attributes will show up as options when you click on one of the destination's filters (provided the values are compatible with that filter).
|
||||
|
||||
When displaying questions as tables, you can select different click behaviors for different columns in the table. You can also modify the contents of the cells in a given column, replacing the value with custom text. For example, if you had a column that listed categories, you could change the text in the cell to read: "Click for details about {% raw %}{{Category}}{% endraw %}", where `Category` is the name of your column.
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ To provide values for the variable, you'll need to add a filter to the dashboard
|
||||
|
||||
## Iframe cards
|
||||
|
||||
[Iframes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) allow you to nest one HTML page in another HTML page. With iframe cards in Metabase, you can embed a webpage in your dashboard. You can embed:
|
||||
[Iframes](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe) allow you to nest one HTML page in another HTML page. With iframe cards in Metabase, you can embed a webpage in your dashboard. You can embed:
|
||||
|
||||
- Spreadsheets or surveys for data entry or workflows
|
||||
- Videos or slides for contextualizing and storytelling on dashboards
|
||||
@@ -325,7 +325,7 @@ If your Metabase administrator has enabled [public sharing](../embedding/public-
|
||||
|
||||

|
||||
|
||||
Public links can be viewed by anyone, even if they don't have access to Metabase. You can also use the public embedding code to embed your question or dashboard in a simple web page or blog post. Check out examples of simple apps with embedded dashboards in our [embedding-reference-apps repository](https://github.com/metabase/embedding-reference-apps). To learn more about [embedding](../embedding/introduction.md), check out our article on [How to use Metabase to deliver analytics to your customers](https://www.metabase.com/learn/metabase-basics/embedding/overview), as well as an article on how to combine branding, Single Sign-On, full app embedding, and row and column security to deliver [multi-tenant, self-service analytics](https://www.metabase.com/learn/metabase-basics/embedding/multi-tenant-self-service-analytics).
|
||||
Public links can be viewed by anyone, even if they don't have access to Metabase. You can also use the public embedding code to embed your question or dashboard in a simple web page or blog post. Check out examples of simple apps with embedded dashboards in our [embedding-reference-apps repository](https://github.com/metabase/static-embedding-reference-apps). To learn more about [embedding](../embedding/introduction.md), check out how to combine branding, Single Sign-On, full app embedding, and row and column security to deliver [multi-tenant, self-service analytics](../embedding/tenants.md).
|
||||
|
||||
Admins can also [create an account](../people-and-groups/managing.md#creating-an-account) for someone and point them to a specific dashboard or question. On a dashboard or question, click the **Sharing** icon and select **Invite someone to view this**.
|
||||
|
||||
@@ -356,7 +356,7 @@ There is one important limitation with the `fullscreen` option: for security rea
|
||||
|
||||
## Dashboard version history
|
||||
|
||||
For [questions](../questions/start.md), dashboards, and [models](../data-modeling/models.md), Metabase keeps a version history for the previous fifteen versions of that item.
|
||||
For [questions](../questions/start.md), dashboards, and [models](../data-modeling/models/models.md), Metabase keeps a version history for the previous fifteen versions of that item.
|
||||
|
||||
See [History](../exploration-and-organization/history.md).
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ You can only link dashboard filters that are wired to database columns (not cust
|
||||
Filters can only be linked when they're connected to columns that have an explicit relationship in the table metadata. By relationship, we mean that the columns should be either:
|
||||
|
||||
- In the same table.
|
||||
- In two different tables that have a foreign key relationship specified in the [table metadata](../data-modeling/metadata-editing.md).
|
||||
- In two different tables that have foreign key relationships to one or more intermediate tables, as specified in the [table metadata](../data-modeling/metadata-editing.md).
|
||||
- In two different tables that have a foreign key relationship specified in the [table metadata](../data-modeling/metadata/metadata-editing.md).
|
||||
- In two different tables that have foreign key relationships to one or more intermediate tables, as specified in the [table metadata](../data-modeling/metadata/metadata-editing.md).
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
title: Data studio
|
||||
summary: Data Studio provides tools to shape and track your data so everyone can trust the numbers.
|
||||
redirect_from:
|
||||
- /docs/latest/data-studio/overview
|
||||
- /docs/latest/data-studio/start
|
||||
- /docs/latest/data-modeling/overview
|
||||
---
|
||||
|
||||
# Data Studio
|
||||
@@ -17,17 +19,17 @@ Data Studio provides tools to shape and track your data so everyone can trust th
|
||||
|
||||
## What's in Data Studio
|
||||
|
||||
- **[Library](./library.md)**\*: A curated space for your organization's most trusted analytics content—tables, metrics, and SQL snippets that your data team recommends.
|
||||
- **[Managing tables](./managing-tables.md)**: Add table metadata to make tables easier to work with.
|
||||
- **[Segments](./segments.md)**: Create saved filters on tables so people can use consistent definitions when building queries.
|
||||
- **[Measures](./measures.md)**: Create saved aggregations on tables so people can use consistent calculations when building queries.
|
||||
- **[Schema viewer](./schema-viewer.md)**\*: Visualize relationships between tables as an entity-relationship diagram (ERD).
|
||||
- **[Dependency graph](./dependencies/graph.md)**\*: A visual map of how your content connects, so you can understand the impact of changes before you make them. To find content with broken dependencies, see [Dependency diagnostics](../monitor/dependency-diagnostics.md).
|
||||
- **[Replace data sources](./dependencies/replace-data-sources.md)**\*: Swap out a table or model across all content that uses it, in one operation.
|
||||
- **[Library](semantic-layer/library.md)**\*: A curated space for your organization's most trusted analytics content—tables, metrics, and SQL snippets that your data team recommends.
|
||||
- **[Managing tables](./metadata/managing-tables.md)**: Add table metadata to make tables easier to work with.
|
||||
- **[Segments](./semantic-layer/segments.md)**: Create saved filters on tables so people can use consistent definitions when building queries.
|
||||
- **[Measures](semantic-layer/measures.md)**: Create saved aggregations on tables so people can use consistent calculations when building queries.
|
||||
- **[Schema viewer](./tools/schema-viewer.md)**\*: Visualize relationships between tables as an entity-relationship diagram (ERD).
|
||||
- **[Dependency graph](./tools/graph.md)**\*: A visual map of how your content connects, so you can understand the impact of changes before you make them. To find content with broken dependencies, see [Dependency diagnostics](../monitor/dependency-diagnostics.md).
|
||||
- **[Replace data sources](./tools/replace-data-sources.md)**\*: Swap out a table or model across all content that uses it, in one operation.
|
||||
- **[Transforms](./transforms/transforms-overview.md)**: Wrangle your data in Metabase, write the query results back to your database, and reuse them in Metabase as sources for new queries.
|
||||
- **[Glossary](../exploration-and-organization/data-model-reference.md#glossary)**: Define terms relevant to your business, both for people and agents trying to understand your data.
|
||||
|
||||
\* Available on [Pro and Enterprise plans](https://www.metabase.com/pricing/).
|
||||
\* Available on [Pro and Enterprise plans](https://www.metabase.com/pricing).
|
||||
|
||||
## Permissions for Data Studio
|
||||
|
||||
@@ -73,7 +73,7 @@ If you try to delete a row that has foreign key references from other tables, yo
|
||||
|
||||
## Editable table data vs. actions
|
||||
|
||||
Metabase offers two ways to modify data in your database: **editable table data** and [actions](../actions/introduction.md).
|
||||
Metabase offers two ways to modify data in your database: **editable table data** and [actions](../data-modeling/models/actions/introduction.md).
|
||||
|
||||
### When to use editable tables
|
||||
|
||||
@@ -94,4 +94,4 @@ Use actions to:
|
||||
- Give non-admins the ability to modify data.
|
||||
- Add a button to a dashboard to trigger a form or query.
|
||||
|
||||
See [actions](../actions/introduction.md).
|
||||
See [actions](../data-modeling/models/actions/introduction.md).
|
||||
|
||||
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
BIN
docs/data-modeling/images/data-studio.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 617 KiB After Width: | Height: | Size: 617 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
BIN
docs/data-modeling/images/drill-lens.png
Normal file
|
After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 461 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 232 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
BIN
docs/data-modeling/images/transform-codegen.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
@@ -3,13 +3,14 @@ title: Formatting defaults
|
||||
summary: Configure how dates, numbers, currencies, and text display in Metabase at global, field, and question levels.
|
||||
redirect_from:
|
||||
- /docs/latest/administration-guide/19-formatting-settings
|
||||
- /docs/latest/data-modeling/formatting
|
||||
---
|
||||
|
||||
# Formatting defaults
|
||||
|
||||
People all around the world use Metabase, and everyone has different preferences for how dates, times, numbers, and currencies should be formatted and displayed. Metabase lets you customize these formatting options at three different levels:
|
||||
|
||||
1. **Global**. Set global defaults in Admin -> Settings -> [Localization](../configuring-metabase/localization.md).
|
||||
1. **Global**. Set global defaults in Admin -> Settings -> [Localization](../../configuring-metabase/localization.md).
|
||||
2. **Field**. Set field (column) defaults in Admin -> Table Metadata. Field defaults override global defaults.
|
||||
3. **Question**. Set formatting defaults for individual questions in the visualization settings of that question. Question defaults override global and field defaults.
|
||||
|
||||
@@ -166,7 +167,7 @@ Lets you put a symbol, word, etc. after this number (e.g., "dollars", "%", "unit
|
||||
|
||||
Currency field formatting settings include all the same options as in the global formatting section, as well as all the options that Number fields have.
|
||||
|
||||
See [Currency formatting options](../questions/visualizations/table.md#currency-formatting-options).
|
||||
See [Currency formatting options](../../questions/visualizations/table.md#currency-formatting-options).
|
||||
|
||||
## Question-level formatting
|
||||
|
||||
@@ -174,17 +175,17 @@ You can also override all formatting settings in any specific saved question or
|
||||
|
||||
Formatting options vary depending on the type of visualization:
|
||||
|
||||
- [Combo chart](../questions/visualizations/line-bar-and-area-charts.md#combo-charts)
|
||||
- [Detail](../questions/visualizations/detail.md)
|
||||
- [Funnel](../questions/visualizations/funnel.md)
|
||||
- [Gauge](../questions/visualizations/gauge.md)
|
||||
- [Line, Bar, and area charts](../questions/visualizations/line-bar-and-area-charts.md)
|
||||
- [Maps](../questions/visualizations/map.md)
|
||||
- [Numbers](../questions/visualizations/numbers.md)
|
||||
- [Pie or donut chart](../questions/visualizations/pie-or-donut-chart.md)
|
||||
- [Pivot table](../questions/visualizations/pivot-table.md)
|
||||
- [Progress bar](../questions/visualizations/progress-bar.md)
|
||||
- [Scatter plot or bubble chart](../questions/visualizations/scatterplot-or-bubble-chart.md)
|
||||
- [Tables](../questions/visualizations/table.md)
|
||||
- [Trend](../questions/visualizations/trend.md)
|
||||
- [Waterfall chart](../questions/visualizations/waterfall-chart.md)
|
||||
- [Combo chart](../../questions/visualizations/line-bar-and-area-charts.md#combo-charts)
|
||||
- [Detail](../../questions/visualizations/detail.md)
|
||||
- [Funnel](../../questions/visualizations/funnel.md)
|
||||
- [Gauge](../../questions/visualizations/gauge.md)
|
||||
- [Line, Bar, and area charts](../../questions/visualizations/line-bar-and-area-charts.md)
|
||||
- [Maps](../../questions/visualizations/map.md)
|
||||
- [Numbers](../../questions/visualizations/numbers.md)
|
||||
- [Pie or donut chart](../../questions/visualizations/pie-or-donut-chart.md)
|
||||
- [Pivot table](../../questions/visualizations/pivot-table.md)
|
||||
- [Progress bar](../../questions/visualizations/progress-bar.md)
|
||||
- [Scatter plot or bubble chart](../../questions/visualizations/scatterplot-or-bubble-chart.md)
|
||||
- [Tables](../../questions/visualizations/table.md)
|
||||
- [Trend](../../questions/visualizations/trend.md)
|
||||
- [Waterfall chart](../../questions/visualizations/waterfall-chart.md)
|
||||
@@ -1,6 +1,8 @@
|
||||
---
|
||||
title: Working with JSON
|
||||
summary: Learn how to unfold JSON columns into separate fields that you can filter on in the query builder.
|
||||
redirect_from:
|
||||
- /docs/latest/data-modeling/json-unfolding
|
||||
---
|
||||
|
||||
# Working with JSON
|
||||
@@ -11,32 +13,32 @@ With [some databases](#databases-that-support-json-unfolding), Metabase can unfo
|
||||
|
||||
Here is a table with a column that contains JSON.
|
||||
|
||||

|
||||

|
||||
|
||||
Metabase can unfold that JSON column so that each key in the JSON object gets its own column in the table. Here are the unfolded fields of the table with the JSON column pictured above:
|
||||
|
||||

|
||||

|
||||
|
||||
And here are the values as seen in the table:
|
||||
|
||||

|
||||

|
||||
|
||||
This unfolding allows you to filter for values found in the original JSON object.
|
||||
|
||||
Metabase can also unfold nested JSON objects, but it doesn't unfold arrays. If a key contains an array, Metabase keeps that array as a single field.
|
||||
|
||||
Metabase will prefix the unfolded column names with the name of the original column that contained the JSON. You can change the column names in **Admin** > [Table metadata](metadata-editing.md), or by creating a [model](./models.md) and editing the column metadata.
|
||||
Metabase will prefix the unfolded column names with the name of the original column that contained the JSON. You can change the column names in **Admin** > [Table metadata](./metadata-editing.md), or by creating a [model](../models/models.md) and editing the column metadata.
|
||||
|
||||
## Databases that support JSON unfolding
|
||||
|
||||
- [BigQuery](../databases/connections/bigquery.md): automatically enabled, applies to `STRUCT` types only.
|
||||
- [BigQuery](../../databases/connections/bigquery.md): automatically enabled, applies to `STRUCT` types only.
|
||||
|
||||
If your data is stored in the [STRUCT data type](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type) in BigQuery, you can query the table's nested fields. This is enabled by default. However, Metabase won't unfold JSON stored in BigQuery as the `JSON` type. This is because in BigQuery, nested fields are _part of the table definition itself_, so when Metabase syncs with your BigQuery database, it'll be able to get metadata about any of your tables, including tables with nested fields. Querying nested fields, however, doesn't extend to arrays (REPEATED (STRUCT)) in BigQuery.
|
||||
|
||||
- [Druid (JDBC)](../databases/connections/druid.md)
|
||||
- [MongoDB](../databases/connections/mongodb.md): automatically enabled for all nested fields.
|
||||
- [MySQL](../databases/connections/mysql.md)
|
||||
- [PostgreSQL](../databases/connections/postgresql.md)
|
||||
- [Druid (JDBC)](../../databases/connections/druid.md)
|
||||
- [MongoDB](../../databases/connections/mongodb.md): automatically enabled for all nested fields.
|
||||
- [MySQL](../../databases/connections/mysql.md)
|
||||
- [PostgreSQL](../../databases/connections/postgresql.md)
|
||||
|
||||
## Toggling JSON unfolding for a database
|
||||
|
||||
@@ -71,7 +73,7 @@ If performance degrades, or you'd rather keep the JSON contained in the original
|
||||
7. In the **Behavior** section, locate the **Unfold JSON** option and select **Yes** or **No**. If the column was unfolded, Metabase will have hidden this JSON column from view, so if you want the JSON column to be visible again, you'll need to change the column's visibility to **Everywhere**.
|
||||
8. Scroll to the top and click the **Filter values** button and select **Re-scan this field**.
|
||||
|
||||

|
||||

|
||||
|
||||
## For JSON unfolding to work, the column's data type must be JSON
|
||||
|
||||
@@ -79,4 +81,4 @@ For example, if you upload a CSV with JSON in it, you might need to update the d
|
||||
|
||||
## Filtering JSON
|
||||
|
||||
In the [query builder](../questions/query-builder/editor.md), Metabase can't parse JSON in columns, so you can only filter by "Is empty" or "Not empty".
|
||||
In the [query builder](../../questions/query-builder/editor.md), Metabase can't parse JSON in columns, so you can only filter by "Is empty" or "Not empty".
|
||||
@@ -2,14 +2,16 @@
|
||||
title: Managing tables
|
||||
summary: See all the tables in your Metabase, edit and sync metadata, edit column types, set visibility, publish tables, and more.
|
||||
redirect_from:
|
||||
- /docs/latest/data-studio/managing-tables
|
||||
- /docs/latest/data-studio/data-structure
|
||||
- /docs/latest/data-modeling/managing-tables
|
||||
---
|
||||
|
||||
# Managing tables
|
||||
|
||||
_Data Studio > Tables_
|
||||
|
||||

|
||||

|
||||
|
||||
You can manage table settings metadata to make it easier for people to work with your data in **Data Studio > Tables**.
|
||||
|
||||
@@ -40,23 +42,23 @@ You can search for table names, but the search will only match beginnings of wor
|
||||
|
||||
You can also filter tables by attributes like owners, visibility, or source - for example, if you wanted to find all hidden tables, or all tables created from CSV uploads.
|
||||
|
||||
You can set [table attributes](#table-attributes), [edit metadata](#table-and-field-metadata), [publish the table](#publishing-and-unpublishing-tables) or create [segments](./segments.md) or [measures](./measures.md) on the table. You can also select tables in bulk to publish or assign attributes (including visibility) to multiple tables at once.
|
||||
You can set [table attributes](#table-attributes), [edit metadata](#table-and-field-metadata), [publish the table](#publishing-and-unpublishing-tables) or create [segments](../semantic-layer/segments.md) or [measures](../semantic-layer/measures.md) on the table. You can also select tables in bulk to publish or assign attributes (including visibility) to multiple tables at once.
|
||||
|
||||
## Publishing and unpublishing tables
|
||||
|
||||
_Data Studio > Tables > Details_
|
||||
|
||||

|
||||

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

|
||||

|
||||
|
||||
The **Table metadata settings only affect the way Metabase displays the data. None of the settings change the data in your database.**
|
||||
|
||||
Admins can grant access to these metadata settings to other groups. See [table metadata permissions](../permissions/data.md#manage-table-metadata-permissions).
|
||||
Admins can grant access to these metadata settings to other groups. See [table metadata permissions](../../permissions/data.md#manage-table-metadata-permissions).
|
||||
|
||||
## Table settings
|
||||
|
||||
@@ -28,11 +29,11 @@ You can search for tables, or use the tree navigation to find each of your conne
|
||||
|
||||
To edit a table's display name or description in the table metadata tab, click into the box that contains the current table name or description and edit it. Changes will be saved automatically once you click out of the box.
|
||||
|
||||
Descriptions are displayed in Metabase's [data reference](../exploration-and-organization/data-model-reference.md) and tooltips when viewing the table. Descriptions help people find the right table for their use case.
|
||||
Descriptions are displayed in Metabase's [data reference](../../exploration-and-organization/data-model-reference.md) and tooltips when viewing the table. Descriptions help people find the right table for their use case.
|
||||
|
||||
### Table sync options
|
||||
|
||||
Actions you can take to refresh the schema or field values. For more, check out [syncs and scans](../databases/sync-scan.md).
|
||||
Actions you can take to refresh the schema or field values. For more, check out [syncs and scans](../../databases/sync-scan.md).
|
||||
|
||||
#### Sync table schema
|
||||
|
||||
@@ -61,7 +62,7 @@ You can sort the fields in a table in different ways:
|
||||
|
||||
You can toggle the visibility of a table by clicking on the **eye** icon next to the table name in the left sidebar navigation tree in the Table metadata tab.
|
||||
|
||||
**Hidden tables** won't show up in the [query builder](../questions/query-builder/editor.md) or [data reference](../exploration-and-organization/data-model-reference.md). **But this is not a permissions feature**: hidden tables can still be used in SQL questions if someone knows the name of the table. For example, `SELECT * FROM table_name` from the [SQL editor](../questions/native-editor/writing-sql.md) would return results. To prevent people from writing queries against specific tables, see [data permissions](../permissions/data.md).
|
||||
**Hidden tables** won't show up in the [query builder](../../questions/query-builder/editor.md) or [data reference](../../exploration-and-organization/data-model-reference.md). **But this is not a permissions feature**: hidden tables can still be used in SQL questions if someone knows the name of the table. For example, `SELECT * FROM table_name` from the [SQL editor](../../questions/native-editor/writing-sql.md) would return results. To prevent people from writing queries against specific tables, see [data permissions](../../permissions/data.md).
|
||||
|
||||
To hide **all of the tables in a database** (say, if you've migrated to a new database), click on the **eye** icon next to the database name in the sidebar.
|
||||
|
||||
@@ -73,9 +74,9 @@ Fields are also known as Columns (see the [difference between fields and columns
|
||||
|
||||
## Field name and description
|
||||
|
||||
To change the _global_ display name of a column in Metabase, click on the name of the column. For example, you could display "auth.user" as "User" to make the column more readable. People can also use [models](./models.md) to give columns a display name that's local to the model.
|
||||
To change the _global_ display name of a column in Metabase, click on the name of the column. For example, you could display "auth.user" as "User" to make the column more readable. People can also use [models](../models/models.md) to give columns a display name that's local to the model.
|
||||
|
||||
To add a description, click into the box below the column name. Descriptions are displayed in the [data reference](../exploration-and-organization/data-model-reference.md) to help people interpret the column's values. You should consider adding a description if your column contains:
|
||||
To add a description, click into the box below the column name. Descriptions are displayed in the [data reference](../../exploration-and-organization/data-model-reference.md) to help people interpret the column's values. You should consider adding a description if your column contains:
|
||||
|
||||
- Abbreviations or codes
|
||||
- Zeroes, nulls, or blank values
|
||||
@@ -83,7 +84,7 @@ To add a description, click into the box below the column name. Descriptions are
|
||||
|
||||
## Field preview
|
||||
|
||||

|
||||

|
||||
|
||||
Click the preview button to see sample data from that field.
|
||||
|
||||
@@ -116,7 +117,7 @@ If you want Metabase to treat a text or number column as a datetime column, you
|
||||
For example, say you have a "Created At" column with a string [data type](https://www.metabase.com/learn/grow-your-data-skills/data-fundamentals/data-types-overview) in your database. If you want to:
|
||||
|
||||
- Create relative date filters, such as "Created At = Last week".
|
||||
- Use "Created At" with formulas like [datetimeAdd](../questions/query-builder/expressions/datetimeadd.md).
|
||||
- Use "Created At" with formulas like [datetimeAdd](../../questions/query-builder/expressions/datetimeadd.md).
|
||||
|
||||
You can cast that string to a Date type.
|
||||
|
||||
@@ -145,7 +146,7 @@ Casting options include:
|
||||
- Float->Integer
|
||||
- Datetime->Date
|
||||
|
||||
If Metabase doesn't support the casting option you need, you can [create a SQL question](../questions/native-editor/writing-sql.md#starting-a-new-sql-query) that casts the data and [save it as a model](./models.md#create-a-model-from-a-saved-question), or create a view directly in your database.
|
||||
If Metabase doesn't support the casting option you need, you can [create a SQL question](../../questions/native-editor/writing-sql.md#starting-a-new-sql-query) that casts the data and [save it as a model](../models/models.md#create-a-model-from-a-saved-question), or create a view directly in your database.
|
||||
|
||||
## Field metadata
|
||||
|
||||
@@ -153,11 +154,11 @@ _Admin > Table Metadata > Database > Table > Field_
|
||||
|
||||
### Semantic type
|
||||
|
||||
You can change the [semantic type](../data-modeling/semantic-types.md) to give people more context and enable additional functionality, such as displaying text as an image (if the text is an image URL). Another example: you could set an Integer as a "Score" so people have a better idea what those integers indicate.
|
||||
You can change the [semantic type](./semantic-types.md) to give people more context and enable additional functionality, such as displaying text as an image (if the text is an image URL). Another example: you could set an Integer as a "Score" so people have a better idea what those integers indicate.
|
||||
|
||||
The semantic types you can choose from depend on the data type. If none of the options describe the values in the column, you can set this setting to "No semantic type".
|
||||
|
||||
See [semantic types](../data-modeling/semantic-types.md).
|
||||
See [semantic types](./semantic-types.md).
|
||||
|
||||
## Field behavior
|
||||
|
||||
@@ -167,23 +168,23 @@ _Admin > Table Metadata > Database > Table > Field_
|
||||
|
||||
- **Everywhere**: By default, users can see all of the columns in a table.
|
||||
- **Only in detail views**: The detail view is the view you see when you expand a single row in a table. This will hide lengthy text from question results. This setting is applied by default if a column's values have an average length of more than 50 characters. For example, you could use this setting on a column like "Customer Comments" if you already have a column for "Customer Rating".
|
||||
- **Do not include**: Columns won't show up in the query builder or data reference. You can set this option on sensitive columns (such as PII) or irrelevant columns. But this visibility option is a simple omit/hide option; **it's not a permissions feature**. These columns are still accessible for people with native query privileges; they can write `SELECT hidden_column FROM table` or `SELECT * FROM table` in the [SQL editor](../questions/native-editor/writing-sql.md) and they'll be able to view these fields and their values.
|
||||
- **Do not include**: Columns won't show up in the query builder or data reference. You can set this option on sensitive columns (such as PII) or irrelevant columns. But this visibility option is a simple omit/hide option; **it's not a permissions feature**. These columns are still accessible for people with native query privileges; they can write `SELECT hidden_column FROM table` or `SELECT * FROM table` in the [SQL editor](../../questions/native-editor/writing-sql.md) and they'll be able to view these fields and their values.
|
||||
|
||||
To restrict what data people can view and query, see [data permissions](../permissions/data.md).
|
||||
To restrict what data people can view and query, see [data permissions](../../permissions/data.md).
|
||||
|
||||
### Filtering
|
||||
|
||||
The **Filtering** setting changes a column's default [filter widget](../dashboards/filters.md). Options include:
|
||||
The **Filtering** setting changes a column's default [filter widget](../../dashboards/filters.md). Options include:
|
||||
|
||||
- **Search box**: Display a search box and suggest autocompletions for values in that column that match the search term(s).
|
||||
- **A list of all values**: Display a search box, as well as a dropdown menu with checkboxes for values. If the number of distinct values exceeds 1000, however, Metabase will instead display a search box. See [Changing a search box filter to a dropdown filter](#changing-a-search-box-filter-to-a-dropdown-filter).
|
||||
- **Plain input box**: Display a search box, but don't suggest autocompletions.
|
||||
|
||||
The settings here will also affect dashboard filters. For example, if you set this to plain input box, you won't be able to set up a dashboard filter that has a dropdown menu. See [dropdown list](../dashboards/filters.md#dropdown-list).
|
||||
The settings here will also affect dashboard filters. For example, if you set this to plain input box, you won't be able to set up a dashboard filter that has a dropdown menu. See [dropdown list](../../dashboards/filters.md#dropdown-list).
|
||||
|
||||
#### Changing a search box filter to a dropdown filter
|
||||
|
||||
The dropdown filter widget can be finicky, because Metabase needs to run a [scan](../databases/sync-scan.md#how-database-scans-work) to get the list of values for the dropdown menu. If you're having trouble:
|
||||
The dropdown filter widget can be finicky, because Metabase needs to run a [scan](../../databases/sync-scan.md#how-database-scans-work) to get the list of values for the dropdown menu. If you're having trouble:
|
||||
|
||||
1. Set the [Semantic type](#semantic-type) to "Category".
|
||||
2. Set [Filtering](#filtering) to "A list of all values".
|
||||
@@ -221,4 +222,4 @@ See [Working with JSON](./json-unfolding.md).
|
||||
## Further reading
|
||||
|
||||
- [Keeping your analytics organized](https://www.metabase.com/learn/metabase-basics/administration/administration-and-operation/same-page)
|
||||
- [Data modeling tutorials](https://www.metabase.com/learn/metabase-basics/getting-started/models)
|
||||
- [Data modeling tutorials](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/models)
|
||||
@@ -3,6 +3,7 @@ title: "Data types and semantic types"
|
||||
redirect_from:
|
||||
- /docs/latest/users-guide/field-types
|
||||
- /docs/latest/data-modeling/field-types
|
||||
- /docs/latest/data-modeling/semantic-types
|
||||
summary: "Metabase uses both data and semantic types to understand how to format and visualize your data."
|
||||
---
|
||||
|
||||
@@ -10,14 +11,14 @@ summary: "Metabase uses both data and semantic types to understand how to format
|
||||
|
||||
Metabase distinguishes between two types of column metadata: data types and field types.
|
||||
|
||||
- [**Data types**](#data-types) are the underlying column type as defined in your database, like `Date` or `Text`. Metabase reads the data types during the [database sync process](../databases/sync-scan.md).
|
||||
- [**Data types**](#data-types) are the underlying column type as defined in your database, like `Date` or `Text`. Metabase reads the data types during the [database sync process](../../databases/sync-scan.md).
|
||||
- [**Semantic types**](#semantic-types), also called **field types**, are labels that describe how the data should be interpreted. For example, if you have a column with a data type of `Text` that you use to store emails, you can add a semantic type of `Email` to let people (and Metabase) know what kind of text the column stores.
|
||||
|
||||
Data and semantic types determine how Metabase formats the data, which charts are available, how the filters work, and other functionality.
|
||||
|
||||
## Data types
|
||||
|
||||
Data types are the underlying column types as defined in your database. Metabase reads the data types during the [database sync process](../databases/sync-scan.md). Because Metabase connects to many different databases, it uses its own type hierarchy under the hood, so that it can, for example, handle date fields in databases as different as PostgreSQL and MongoDB.
|
||||
Data types are the underlying column types as defined in your database. Metabase reads the data types during the [database sync process](../../databases/sync-scan.md). Because Metabase connects to many different databases, it uses its own type hierarchy under the hood, so that it can, for example, handle date fields in databases as different as PostgreSQL and MongoDB.
|
||||
|
||||
The main data types in Metabase:
|
||||
|
||||
@@ -42,7 +43,7 @@ You can think of semantic types as adding meaning and context to a field to comm
|
||||
|
||||
- **Entity key.** Used to indicate that the field uniquely identifies each row. Could be a Product ID, serial number, etc.
|
||||
|
||||
- **Foreign key.** Used to refer to an Entity key of another table to connect data from different tables that are related. For example, in a Products table, you might have a Customer ID field that points to a Customers table, where Customer ID is the Entity key. If you want to use [linked filters on dashboards](../dashboards/linked-filters.md), you must set up foreign key relationships.
|
||||
- **Foreign key.** Used to refer to an Entity key of another table to connect data from different tables that are related. For example, in a Products table, you might have a Customer ID field that points to a Customers table, where Customer ID is the Entity key. If you want to use [linked filters on dashboards](../../dashboards/linked-filters.md), you must set up foreign key relationships.
|
||||
|
||||
### Semantic types for numeric fields
|
||||
|
||||
@@ -95,13 +96,13 @@ You can think of semantic types as adding meaning and context to a field to comm
|
||||
|
||||
## Editing data and semantic types
|
||||
|
||||
Admins, and people with [permission to manage table metadata](../permissions/data.md#manage-table-metadata-permissions), can cast data types and edit semantic types in the Admin's Table Metadata tab.
|
||||
Admins, and people with [permission to manage table metadata](../../permissions/data.md#manage-table-metadata-permissions), can cast data types and edit semantic types in the Admin's Table Metadata tab.
|
||||
|
||||
### Cast data types
|
||||
|
||||
Data types can't be edited in Metabase directly, but you can cast certain [data types to different types](./metadata-editing.md#cast-to-a-specific-data-type) so that, for example, Metabase will interpret a text data type as a date type.
|
||||
|
||||
Changes made in Table Metadata apply across your entire Metabase. However, if you build a query in the query builder, you can use type casting custom expressions like [`date()`](../questions/query-builder/expressions-list.md#date) or [`integer()`](../questions/query-builder/expressions-list.md#integer) to cast a string to a different type just in your query.
|
||||
Changes made in Table Metadata apply across your entire Metabase. However, if you build a query in the query builder, you can use type casting custom expressions like [`date()`](../../questions/query-builder/expressions-list.md#date) or [`integer()`](../../questions/query-builder/expressions-list.md#integer) to cast a string to a different type just in your query.
|
||||
|
||||
### Semantic types don't change the data types
|
||||
|
||||
@@ -124,8 +125,8 @@ Formatting settings from Table Metadata settings will be applied across your Met
|
||||
| Latitude/Longitude | Displayed as coordinates, e.g., `0.00000000° N` |
|
||||
| Email | Display as a `mailto` link |
|
||||
| URL | Can format as a clickable link |
|
||||
| Image URL | Can display as an image. See [table format settings](../questions/visualizations/table.md#display-as) |
|
||||
| Avatar URL | Can display as avatar circle image. See [table format settings](../questions/visualizations/table.md#display-as) |
|
||||
| Image URL | Can display as an image. See [table format settings](../../questions/visualizations/table.md#display-as) |
|
||||
| Avatar URL | Can display as avatar circle image. See [table format settings](../../questions/visualizations/table.md#display-as) |
|
||||
| Field containing JSON | In detail view, display as prettified JSON |
|
||||
| Entity and Foreign key | Highlighted in table view |
|
||||
|
||||
@@ -153,7 +154,7 @@ Additionally, if you use location semantic types:
|
||||
|
||||
### Extract values from columns
|
||||
|
||||
For some fields, you can quickly extract values from columns using [shortcuts in table view](../questions/visualizations/table.md#extract-domain-subdomain-host-or-path) or in the [custom expression editor](../questions/query-builder/expressions.md) in the query builder:
|
||||
For some fields, you can quickly extract values from columns using [shortcuts in table view](../../questions/visualizations/table.md#extract-domain-subdomain-host-or-path) or in the [custom expression editor](../../questions/query-builder/expressions.md) in the query builder:
|
||||
|
||||
| Group by data type | Extract |
|
||||
| ------------------- | --------------------------------------- |
|
||||
@@ -163,11 +164,11 @@ For some fields, you can quickly extract values from columns using [shortcuts in
|
||||
|
||||
### X-rays
|
||||
|
||||
When you [X-ray](../exploration-and-organization/x-rays.md) a table, model, or entity, Metabase considers both the data type and the field type to display different charts that summarize that data.
|
||||
When you [X-ray](../../exploration-and-organization/x-rays.md) a table, model, or entity, Metabase considers both the data type and the field type to display different charts that summarize that data.
|
||||
|
||||
### Field Filters
|
||||
|
||||
Knowing what field types are and how they work is helpful when using [field filters](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/sql-in-metabase/field-filters), as you can only create field filters for [certain field types](../questions/native-editor/field-filters.md#when-to-use-a-field-filter-variable-vs-a-basic-variable).
|
||||
Knowing what field types are and how they work is helpful when using [field filters](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/sql-in-metabase/field-filters), as you can only create field filters for [certain field types](../../questions/native-editor/field-filters.md#when-to-use-a-field-filter-variable-vs-a-basic-variable).
|
||||
|
||||
### JSON unfolding
|
||||
|
||||
@@ -175,12 +176,12 @@ See [Working with JSON](./json-unfolding.md).
|
||||
|
||||
## Set semantic types in models to enable people to explore results with the query builder
|
||||
|
||||
You can set field types for [models](./models.md), which helps Metabase understand how to work with data in models built using SQL. If you set each column type in a SQL model, people will be able to explore that model using the query builder and drill-through menus.
|
||||
You can set field types for [models](../models/models.md), which helps Metabase understand how to work with data in models built using SQL. If you set each column type in a SQL model, people will be able to explore that model using the query builder and drill-through menus.
|
||||
|
||||
With records that include integer entity keys, you can also configure text fields in models to [surface individual records in search](./models.md#surface-individual-records-in-search-by-matching-against-this-column).
|
||||
With records that include integer entity keys, you can also configure text fields in models to [surface individual records in search](../models/models.md#surface-individual-records-in-search-by-matching-against-this-column).
|
||||
|
||||
## Further Reading
|
||||
|
||||
- [Exploring data with Metabase's data browser](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/data-browser).
|
||||
- [Data reference](../../exploration-and-organization/data-model-reference.md).
|
||||
- [The Table Metadata page: editing metadata](./metadata-editing.md).
|
||||
- [Field Filters: create smart filter widgets for SQL questions](https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/sql-in-metabase/field-filters).
|
||||
@@ -1,5 +1,7 @@
|
||||
---
|
||||
title: Basic actions
|
||||
redirect_from:
|
||||
- /docs/latest/actions/basic
|
||||
---
|
||||
|
||||
# Basic actions
|
||||
@@ -10,7 +12,7 @@ If you only want to give people the option to update a subset of columns, or upd
|
||||
|
||||
## Creating basic actions
|
||||
|
||||
Once actions are enabled, you can create basic actions on a new or existing [model](../data-modeling/models.md) that only wraps a single database table.
|
||||
Once actions are enabled, you can create basic actions on a new or existing [model](../../../data-modeling/models/models.md) that only wraps a single database table.
|
||||
|
||||
1. Select a model and click on the **info** button, then click on **Model detail**.
|
||||
2. On the model detail page, click on the **Actions** tab.
|
||||
@@ -54,7 +56,7 @@ When setting up actions on a dashboard, you can either prompt the person to fill
|
||||
|
||||
The Update basic action requires you to pass a value for the entity key.
|
||||
|
||||
See [Actions in dashboards](../dashboards/actions.md).
|
||||
See [Actions in dashboards](../../../dashboards/actions.md).
|
||||
|
||||
## Archiving basic actions
|
||||
|
||||
@@ -70,4 +72,4 @@ If you have basic actions enabled for a model, you can click on an individual re
|
||||
|
||||
- [Introduction to actions](./introduction.md)
|
||||
- [Custom actions](./custom.md)
|
||||
- [Actions in dashboards](../dashboards/actions.md)
|
||||
- [Actions in dashboards](../../../dashboards/actions.md)
|
||||
@@ -1,5 +1,7 @@
|
||||
---
|
||||
title: Custom actions
|
||||
redirect_from:
|
||||
- /docs/latest/actions/custom
|
||||
---
|
||||
|
||||
# Custom actions
|
||||
@@ -12,7 +14,7 @@ Write SQL to update records in your databases.
|
||||
|
||||
> You must be in a group with Native query editing access to create an action.
|
||||
|
||||
1. First, [create a model](../data-modeling/models.md).
|
||||
1. First, [create a model](../../../data-modeling/models/models.md).
|
||||
2. Visit the model and click on the **info** button.
|
||||
3. Click the **Actions** tab.
|
||||
|
||||
@@ -155,4 +157,4 @@ FROM prospects;
|
||||
|
||||
- [Introduction to actions](./introduction.md)
|
||||
- [Basic actions](./basic.md)
|
||||
- [Actions in dashboards](../dashboards/actions.md)
|
||||
- [Actions in dashboards](../../../dashboards/actions.md)
|
||||
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 395 KiB After Width: | Height: | Size: 395 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
@@ -1,5 +1,7 @@
|
||||
---
|
||||
title: Introduction to actions
|
||||
redirect_from:
|
||||
- /docs/latest/actions/introduction
|
||||
---
|
||||
|
||||
# Introduction to actions
|
||||
@@ -12,7 +14,7 @@ title: Introduction to actions
|
||||
|
||||
**Actions** are entities in Metabase that let you build custom forms and business logic.
|
||||
|
||||
Actions let you write parameterized SQL that writes back to your database. Actions can be attached to [buttons on dashboards](../dashboards/actions.md) to create custom workflows. You can even publicly share the parameterized forms that actions generate to collect data.
|
||||
Actions let you write parameterized SQL that writes back to your database. Actions can be attached to [buttons on dashboards](../../../dashboards/actions.md) to create custom workflows. You can even publicly share the parameterized forms that actions generate to collect data.
|
||||
|
||||
Here are a few ideas for what you can do with actions:
|
||||
|
||||
@@ -20,20 +22,20 @@ Here are a few ideas for what you can do with actions:
|
||||
- Let team members remove redundant data.
|
||||
- Create a customer feedback form and embed it on your website.
|
||||
|
||||
Actions must be added to a [model](../data-modeling/models.md), but actions only run on the raw tables that back those models (so actions will never edit your [model definition](../data-modeling/models.md#edit-a-models-query)).
|
||||
Actions must be added to a [model](../../../data-modeling/models/models.md), but actions only run on the raw tables that back those models (so actions will never edit your [model definition](../../../data-modeling/models/models.md#edit-a-models-query)).
|
||||
|
||||
If you're an admin who just wants to edit data in your tables, check out [Editable table data](../data-modeling/editable-tables.md).
|
||||
If you're an admin who just wants to edit data in your tables, check out [Editable table data](../../../data-modeling/editable-tables.md).
|
||||
|
||||
## Enabling actions for a database
|
||||
|
||||
For actions to work, you'll first need to do the following two things:
|
||||
|
||||
1. **Enable model actions for the database connection**. To enable actions for a database connection, admins should click on the **grid** icon in the upper right and navigate to **Admin** > **Databases**, then click on the database you want to create actions for. On the right side of the connection settings form, toggle the **Model actions** option. For actions to work, the database user account (the account you're using to connect to the database) must have [write permissions](../databases/users-roles-privileges.md#privileges-to-enable-actions-and-editable-table-data). And for now, actions are only supported on PostgreSQL and MySQL databases.
|
||||
1. **Enable model actions for the database connection**. To enable actions for a database connection, admins should click on the **grid** icon in the upper right and navigate to **Admin** > **Databases**, then click on the database you want to create actions for. On the right side of the connection settings form, toggle the **Model actions** option. For actions to work, the database user account (the account you're using to connect to the database) must have [write permissions](../../../databases/users-roles-privileges.md#privileges-to-enable-actions-and-editable-table-data). And for now, actions are only supported on PostgreSQL and MySQL databases.
|
||||
2. **Create at least one model from that database.** Actions are associated with models, so you'll need to have created (or have access to) at least one model before you can start creating actions.
|
||||
|
||||
## Who can use actions
|
||||
|
||||
- **To create or edit an action**, a person must be in a group with [Native query editing](../permissions/data.md) privileges for the relevant database.
|
||||
- **To create or edit an action**, a person must be in a group with [Native query editing](../../../permissions/data.md) privileges for the relevant database.
|
||||
- **To run an action**, all you need is view access to the action's model or dashboard (or a link to a public action).
|
||||
|
||||
## Types of actions
|
||||
@@ -47,9 +49,9 @@ There are two types of actions:
|
||||
|
||||
There are multiple ways to run actions:
|
||||
|
||||
- [From the model details page](../data-modeling/models.md#model-details) by clicking the **run** button.
|
||||
- [From the model details page](../../../data-modeling/models/models.md#model-details) by clicking the **run** button.
|
||||
- From a [public form](./custom.md#make-public) of an action.
|
||||
- From a [button on dashboard](../dashboards/actions.md).
|
||||
- From a [button on dashboard](../../../dashboards/actions.md).
|
||||
|
||||
## Actions change data in tables, which affect models
|
||||
|
||||
@@ -64,10 +66,10 @@ Before using actions in production, consider playing around with actions on some
|
||||
- If caching is enabled for the relevant table or model, you may not see the effects of an action in Metabase until Metabase refreshes the data (though you can always manually refresh the data).
|
||||
- When creating records on a table that lacks an automatically generated primary key, you'll need to input an available ID (i.e., an ID not already in use by another record).
|
||||
- You can't "undo" actions. You can, however, create and run an action to recreate a deleted record, or change an updated record back to its original values (provided you know the original values).
|
||||
- Actions are unavailable for public dashboards and dashboards in [guest embeds](../embedding/guest-embedding.md). To use actions in embeds, you can use [modular embedding](../embedding/modular-embedding.md) with SSO or [full app embedding](../embedding/full-app-embedding.md).
|
||||
- Actions are unavailable for public dashboards and dashboards in [guest embeds](../../../embedding/guest-embedding.md). To use actions in embeds, you can use [modular embedding](../../../embedding/modular-embedding.md) with SSO or [full app embedding](../../../embedding/full-app-embedding.md).
|
||||
|
||||
## Further reading
|
||||
|
||||
- [Basic actions](./basic.md)
|
||||
- [Custom actions](./custom.md)
|
||||
- [Actions in dashboards](../dashboards/actions.md)
|
||||
- [Actions in dashboards](../../../dashboards/actions.md)
|
||||
@@ -1,7 +1,9 @@
|
||||
---
|
||||
title: Actions overview
|
||||
redirect_from:
|
||||
- /docs/latest/data-modeling/models/actions/start
|
||||
- /docs/latest/actions
|
||||
- /docs/latest/actions/start
|
||||
---
|
||||
|
||||
# Actions overview
|
||||
@@ -22,6 +24,6 @@ Metabase will create basic actions that auto-track a model's schema.
|
||||
|
||||
Write SQL to create new actions.
|
||||
|
||||
## [Actions on dashboards](../dashboards/actions.md)
|
||||
## [Actions on dashboards](../../../dashboards/actions.md)
|
||||
|
||||
Add actions on dashboards as buttons that you can pass filter values to.
|
||||
@@ -1,16 +1,18 @@
|
||||
---
|
||||
title: Model persistence
|
||||
redirect_from:
|
||||
- /docs/latest/data-modeling/model-persistence
|
||||
---
|
||||
|
||||
# Model persistence
|
||||
|
||||
> Prefer [Transforms](../data-studio/transforms/transforms-overview.md) instead of model persistence. Model persistence remains supported for now, but it will be deprecated in future versions of Metabase. You can [convert models to transforms in bulk](../data-studio/transforms/query-transforms.md#convert-models-to-transforms).
|
||||
> Prefer [Transforms](../transforms/transforms-overview.md) instead of model persistence. Model persistence remains supported for now, but it will be deprecated in future versions of Metabase. You can [convert models to transforms in bulk](../transforms/query.md#convert-models-to-transforms).
|
||||
|
||||
Metabase can persist the results of your models so that your models (and the questions based on those models) load faster.
|
||||
|
||||
Metabase will store model results in tables in a bespoke schema in your data warehouse (not the Metabase application database). When people ask questions based on your models, Metabase will use the tables with the stored results instead of re-running the model's query.
|
||||
|
||||
> Model persistence doesn't work with [row and column security](../permissions/row-and-column-security.md) or [impersonation](../permissions/impersonation.md).
|
||||
> Model persistence doesn't work with [row and column security](../../permissions/row-and-column-security.md) or [impersonation](../../permissions/impersonation.md).
|
||||
|
||||
## Databases that support model persistence
|
||||
|
||||
@@ -20,7 +22,7 @@ Currently, model persistence is only available for the following databases:
|
||||
- MySQL
|
||||
- Redshift
|
||||
|
||||
Model persistence doesn't work with [row and column security](../permissions/row-and-column-security.md) or [impersonation](../permissions/impersonation.md).
|
||||
Model persistence doesn't work with [row and column security](../../permissions/row-and-column-security.md) or [impersonation](../../permissions/impersonation.md).
|
||||
|
||||
## Turn on model persistence in Metabase
|
||||
|
||||
@@ -36,7 +38,7 @@ To turn on model persistence for your Metabase, go to **Admin** > **Performance*
|
||||
|
||||
You can set models to refresh based on one of the default frequencies (every 1 hour, 2 hours, etc.), or select the **Custom** option to use [cron syntax](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html) to specify your own update frequency.
|
||||
|
||||
The cron scheduler uses the [default instance report Timezone](../configuring-metabase/localization.md#set-default-instance-report-timezone) if selected. Otherwise the scheduler will use the System Timezone (which defaults to GMT in [Metabase Cloud](https://www.metabase.com/cloud/)).
|
||||
The cron scheduler uses the [default instance report Timezone](../../configuring-metabase/localization.md#set-default-instance-report-timezone) if selected. Otherwise the scheduler will use the System Timezone (which defaults to GMT in [Metabase Cloud](https://www.metabase.com/cloud/)).
|
||||
|
||||
We recommend scheduling your models to refresh on a frequency that makes sense with how often your source tables update with new data.
|
||||
|
||||
@@ -60,7 +62,7 @@ By default, new models on the database will _not_ be persisted. You need to [Tur
|
||||
|
||||
{% include plans-blockquote.html feature="Individual model persistence" %}
|
||||
|
||||
You can also toggle persistence on or off for individual models. When viewing a model, click on the **...** in the upper right and select **Edit settings**. Toggle **Persist model data** on (you'll need [Curate access](../permissions/collections.md#curate-access) to the model's collection to do this).
|
||||
You can also toggle persistence on or off for individual models. When viewing a model, click on the **...** in the upper right and select **Edit settings**. Toggle **Persist model data** on (you'll need [Curate access](../../permissions/collections.md#curate-access) to the model's collection to do this).
|
||||
|
||||
Toggling persistence for individual models is useful for models with data that updates at different frequencies than the schedule you set for other models in that database, or for models that are used more or less than other models in that database.
|
||||
|
||||
@@ -70,11 +72,11 @@ To refresh a model's results, go to the model and click on the three-dot menu (*
|
||||
|
||||
## View model persistence logs
|
||||
|
||||
You can view the logs for model persistence in **Monitor** > **Model persistence log**. See [Model persistence log](../monitor/model-persistence-log.md).
|
||||
You can view the logs for model persistence in **Monitor** > **Model persistence log**. See [Model persistence log](../../monitor/model-persistence-log.md).
|
||||
|
||||
## Difference between persisted models and caching
|
||||
|
||||
Persisted models differ from [cached results](../configuring-metabase/caching.md):
|
||||
Persisted models differ from [cached results](../../configuring-metabase/caching.md):
|
||||
|
||||
- **Models are persisted in your data warehouse; cached results are stored in the application database**. Metabase stores cached results in its application database. Metabase persists models in your connected data warehouse as tables.
|
||||
- **Metabase refreshes model results and invalidates cached results**. Metabase will refresh results of models according to the schedule you set. That is, Metabase will re-run the model's query and store the results in your data warehouse. For cached results of saved questions and dashboards, Metabase won't run the queries automatically; it will cache results when people view the question or dashboard, and invalidate the cached results according to the caching policy you set.
|
||||
@@ -82,4 +84,4 @@ Persisted models differ from [cached results](../configuring-metabase/caching.md
|
||||
## Further reading
|
||||
|
||||
- [Models](./models.md)
|
||||
- [Caching policies](../configuring-metabase/caching.md)
|
||||
- [Caching policies](../../configuring-metabase/caching.md)
|
||||
@@ -1,12 +1,13 @@
|
||||
---
|
||||
title: "Models"
|
||||
redirect_from:
|
||||
- /docs/latest/data-modeling/models
|
||||
- /docs/latest/users-guide/models
|
||||
---
|
||||
|
||||
# Models
|
||||
|
||||
> Consider using [Transforms](../data-studio/transforms/transforms-overview.md) instead of models. You can [convert models to transforms in bulk](../data-studio/transforms/query-transforms.md#convert-models-to-transforms).
|
||||
> Consider using [Transforms](../transforms/transforms-overview.md) instead of models. You can [convert models to transforms in bulk](../transforms/query.md#convert-models-to-transforms).
|
||||
|
||||
Models curate data from one or more tables (from the same database) to anticipate the kinds of questions people will ask of the data. You can think of them as derived tables, or a special kind of saved question meant to be used as the starting point for new questions. You can base a model on a SQL or query builder question, which means you can include custom, calculated columns in your model.
|
||||
|
||||
@@ -38,7 +39,7 @@ First, search for models that already exist. If you can't find one that meets yo
|
||||
- [from scratch](#create-a-model-from-scratch), or
|
||||
- [from a saved question](#create-a-model-from-a-saved-question).
|
||||
|
||||
Models you create are automatically [pinned to the current collection](../exploration-and-organization/collections.md#pinned-items).
|
||||
Models you create are automatically [pinned to the current collection](../../exploration-and-organization/collections.md#pinned-items).
|
||||
|
||||
### Create a model from scratch
|
||||
|
||||
@@ -49,7 +50,7 @@ Now choose either the query builder or a native query (if you want to use SQL).
|
||||
|
||||
Next, select your data, create your query, and save it.
|
||||
|
||||
Models you create are automatically [pinned to the current collection](../exploration-and-organization/collections.md#pinned-items).
|
||||
Models you create are automatically [pinned to the current collection](../../exploration-and-organization/collections.md#pinned-items).
|
||||
|
||||
### Create a model from a saved question
|
||||
|
||||
@@ -57,17 +58,17 @@ Models you create are automatically [pinned to the current collection](../explor
|
||||
2. Save the question.
|
||||
3. Click on the **...** > **Turn this into a model**.
|
||||
|
||||

|
||||

|
||||
|
||||
## Model details
|
||||
|
||||
To view a model's details, visit the model and click on the **info** button in the upper right. Here you'll see several tabs:
|
||||
|
||||
- **Overview**: Includes the description, Creator and Last Editor, and the list of fields included in the model. As well as the model's [Entity ID](../installation-and-operation/serialization.md#metabase-uses-entity-ids-to-identify-metabase-items).
|
||||
- **Overview**: Includes the description, Creator and Last Editor, and the list of fields included in the model. As well as the model's [Entity ID](../../installation-and-operation/serialization.md#metabase-uses-entity-ids-to-identify-metabase-items).
|
||||
- **History**: Lists changes to the model, and by whom.
|
||||
- **Relationships**: Lists which questions use the model, and which tables the model is linked to.
|
||||
- **Actions**: Lists actions created based on the model.
|
||||
- **Insights**: Info about the [model's usage](../usage-and-performance-tools/usage-analytics.md). Only visible to admins on a [Pro or Enterprise plan](https://www.metabase.com/pricing/).
|
||||
- **Insights**: Info about the [model's usage](../../usage-and-performance-tools/usage-analytics.md). Only visible to admins on a [Pro or Enterprise plan](https://www.metabase.com/pricing/).
|
||||
|
||||
## Add metadata to columns in a model
|
||||
|
||||
@@ -91,7 +92,7 @@ For models based on SQL queries, you can tell Metabase if the column has the sam
|
||||
|
||||
You can set the [column type][column-type]. The default is "No special type".
|
||||
|
||||
If your model is based on a SQL query and you want people to be able to explore the results with the query builder, you'll need to set the [column type](./semantic-types.md) for each column in your model.
|
||||
If your model is based on a SQL query and you want people to be able to explore the results with the query builder, you'll need to set the [column type](../metadata/semantic-types.md) for each column in your model.
|
||||
|
||||
### This column should appear in...
|
||||
|
||||
@@ -127,13 +128,13 @@ You can edit a model's query by clicking on the down arrow next to the model's n
|
||||
|
||||
When you save changes to a model, Metabase will try to detect whether your changes would break any other entities that depend on that model. For example, if you remove a column from the model, but other questions based on that model rely on that column, Metabase will warn you that those downstream questions will break.
|
||||
|
||||

|
||||

|
||||
|
||||
Currently, Metabase will look for broken column references. If you rename or remove a column, Metabase will likely flag the change as breaking downstream entities. But Metabase can't detect other types of changes like changing the column type or computation logic as breaking changes.
|
||||
|
||||
## Model list view
|
||||
|
||||

|
||||

|
||||
|
||||
List view helps you explore records one by one instead of sorting through big tables. You can customize the layout to highlight the most important fields.
|
||||
|
||||
@@ -145,11 +146,11 @@ To view a model as a list:
|
||||
4. Navigate to the **Settings** tab.
|
||||
5. Under "What should the default view of this data be?", toggle to **List**.
|
||||
|
||||

|
||||

|
||||
|
||||
### Customize model list view
|
||||
|
||||

|
||||

|
||||
|
||||
You can customize how the data appears by clicking **Customize the List layout**.
|
||||
|
||||
@@ -174,7 +175,7 @@ Click **Done** to save your changes.
|
||||
|
||||
See [asking questions][question].
|
||||
|
||||
## [Refer to a model in the SQL query editor](../questions/native-editor/referencing-saved-questions-in-queries.md)
|
||||
## [Refer to a model in the SQL query editor](../../questions/native-editor/referencing-saved-questions-in-queries.md)
|
||||
|
||||
You can refer to a model in a SQL query just like you can refer to a saved question:
|
||||
|
||||
@@ -200,19 +201,19 @@ You can also use the data reference sidebar to browse the models available. To o
|
||||
|
||||
## Model version history
|
||||
|
||||
For [questions](../questions/start.md), [dashboards](../dashboards/start.md), and models, Metabase keeps a version history for the previous fifteen versions of that item. You can view changes and revert to previous versions.
|
||||
For [questions](../../questions/start.md), [dashboards](../../dashboards/start.md), and models, Metabase keeps a version history for the previous fifteen versions of that item. You can view changes and revert to previous versions.
|
||||
|
||||
See [History](../exploration-and-organization/history.md).
|
||||
See [History](../../exploration-and-organization/history.md).
|
||||
|
||||
## Delete a model
|
||||
|
||||
You can move outdated or unneeded models to trash, or delete them permanently. Deleting a model will affect questions that use it as a data source.
|
||||
|
||||
See [Deleting and restoring items](../exploration-and-organization/delete-and-restore.md).
|
||||
See [Deleting and restoring items](../../exploration-and-organization/delete-and-restore.md).
|
||||
|
||||
## Verifying a model
|
||||
|
||||
See [content verification](../exploration-and-organization/content-verification.md).
|
||||
See [content verification](../../exploration-and-organization/content-verification.md).
|
||||
|
||||
## Model persistence
|
||||
|
||||
@@ -220,20 +221,20 @@ See [Model persistence](./model-persistence.md)
|
||||
|
||||
## Convert a model to a transform
|
||||
|
||||
[Transforms](../data-studio/transforms/transforms-overview.md) are the successor to models. Transforms create a persistent table in your database that refreshes on a schedule, instead of running the query live each time. Metabase will be gradually phasing out models in favor of transforms.
|
||||
[Transforms](../transforms/transforms-overview.md) are the successor to models. Transforms create a persistent table in your database that refreshes on a schedule, instead of running the query live each time. Metabase will be gradually phasing out models in favor of transforms.
|
||||
|
||||
If you're an admin, you can convert existing models to transforms one at a time. Conversion creates a transform from the model's query, runs it to produce the output table, and then updates all questions and dashboards that used the model to use the transform's table instead. The model itself becomes a saved question.
|
||||
|
||||
See [Convert existing models to transforms](../data-studio/transforms/query-transforms.md#convert-models-to-transforms).
|
||||
See [Convert existing models to transforms](../transforms/query.md#convert-models-to-transforms).
|
||||
|
||||
## Further reading
|
||||
|
||||
- [Models in Metabase][learn-models]
|
||||
- [Troubleshooting models][troubleshooting-models].
|
||||
|
||||
[column-type]: ./semantic-types.md
|
||||
[column-type]: ../metadata/semantic-types.md
|
||||
[cte]: https://www.metabase.com/learn/sql/working-with-sql/sql-cte
|
||||
[measures-dimensions]: https://www.metabase.com/learn/grow-your-data-skills/data-fundamentals/dimensions-and-measures
|
||||
[question]: ../questions/start.md
|
||||
[learn-models]: https://www.metabase.com/learn/metabase-basics/getting-started/models
|
||||
[troubleshooting-models]: ../troubleshooting-guide/models.md
|
||||
[question]: ../../questions/start.md
|
||||
[learn-models]: https://www.metabase.com/learn/metabase-basics/querying-and-dashboards/models
|
||||
[troubleshooting-models]: ../../troubleshooting-guide/models.md
|
||||
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |